深入浅出Prometheus:原理、应用、源码与拓展详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 深入Prometheus设计

2.1 指标

每种监控系统都有自己对指标的一套定义和规范,指标的数据格式将直接影响对数据的采集和存储,所以定义指标时需要充分考虑通用性和扩展性。下面将详细介绍Prometheus的指标定义、分类和样本。

2.1.1 Prometheus的指标定义

Prometheus的所有监控指标(Metric)被统一定义为

指标定义涉及指标名称和标签这两部分,下面分别对这两部分进行讲解。

1.指标名称(metric name)

指标名称用于说明指标的含义,例如http_request_total代表HTTP的请求总数。

指标名称必须由字面、数值下画线或者冒号组成,符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*,其中的冒号指标不能用于exporter。

2.标签(label)

标签可体现指标的维度特征,用于过滤和聚合。它通过标签名(label name)和标签值(label value)这种键值对的形式,形成多种维度。

例如,对于指标 http_request_total,可以有{status="200",method="POST"}和{status="200",method="GET"}这两个标签。在需要分别获取GET和POST返回200的请求时,可分别使用上述两种指标;在需要获取所有返回200的请求时,可以通过http_request_total{status="200"}完成数据的聚合,非常便捷和通用。

指标的某些标签是以“__”开头的,这些标签是在Prometheus系统内部使用的。在形式上,http_request_total{status="200"} 和 {__name__="http_request_total",status="200"}代表相同的指标。Prometheus 指标采用标签的方式能够很好地与容器结合,无论是原生Docker还是Kubernetes,都通过标签关联资源。

2.1.2 Prometheus的指标分类

Prometheus指标分为Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)和Summary(摘要)这4类,下面对这4类进行讲解。

1.Counter

Counter是计数器类型,它的特点是只增不减,例如机器启动时间、HTTP访问量等。

如图2-1所示的HTTP请求总量随着时间的推移只增不减。

图2-1

Counter 具有很好的不相关性,不会因为机器重启而置0。我们在使用 Counter指标时,通常会结合 rate()方法获取该指标在某个时间段的变化率,例如,“HTTP请求总量”指标就属于典型的Counter指标,通过对它进行rate()操作,可以得出请求的变化率,如图2-2所示为HTTP的每秒请求数。

图2-2

2.Gauge

Gauge是仪表盘,表征指标的实时变化情况,可增可减,例如CPU和内存的使用量、网络 I/O 大小等,大部分监控数据都是 Gauge 类型的。如图2-3所示是内存使用量监控图,内存使用量随着时间的推移不断变化。

图2-3

3.Summary

Summary 同 Histogram 一样,都属于高级指标,用于凸显数据的分布状况。如果需要了解某个时间段内请求的响应时间,则通常使用平均响应时间,但这样做无法体现数据的长尾效应。例如,一个HTTP服务器的正常响应时间是30ms,但有很少几次请求耗时3s,通过平均响应时间很难甄别长尾效应,这时可以通过Histogram或者Summary展现。Histogram和Summary这两种指标类型在本质上是可以相互转化的。

这里先了解一下数据分位:φ代表分位数,0≤φ≤1,分位数是在N个观测值中按数量φ·N排序的观测值。例如,0.9分位数代表第90%位置上的数,如果总数是100个,那么将是第90个数。

Summary是采样点分位图统计,用于得到数据的分布情况。例如,如果在要统计的班级中,有90%学生的成绩低于93分,有95%学生的成绩低于96分,则采用Summary能够更好地展示数据的分布情况。

在Prometheus内部,Prometheus_tsdb_wal_fsync_duration_seconds指标的类型为Summary,它记录了Prometheus Server中WAL写入磁盘的同步时间:

从而得出有50%的同步时间低于0.012 352 463s,有90%的同步时间低于0.014 458 005s。

如图2-4所示为HTTP请求耗时的分位图,可以看到有90%的请求低于250ms。

图2-4

我们可以将Summary看作客户端分位,它的优势是无须消耗服务端资源,但缺点也很明显:首先,与 Histogram 采用 Counter 计数器统计的方式相比,Summary会消耗更多的资源;其次,通过Summary计算的指标不能再获取平均数或者关联其他指标等,所以Summary指标一般只适用于独立的监控指标,例如垃圾回收时间等。

4.Histogram

Histogram反映了某个区间内的样本个数,通过{le="上边界"}指定这个范围内的样本数。Prometheus中表示每个本地存储序列保存的chunk数量的指标prometheus_local_storage_series_chunks_persisted就属于Histogram指标类型,如下所示:

可以看到,小于1.6384e+06个chunk的序列有260个,小于6.5536e+06个chunk的序列有780个。

2.1.3 Prometheus数据样本

Prometheus采集的数据样本都是以时间序列保存的,每个样本都由三部分组成:指标、样本值、时间戳。2.1.2节已经对指标进行了介绍。样本值(64位浮点数)和时间戳(精确到 ms)的组合代表在这个时间点采集到的监控数值。可以将一个指标的样本数据保存到一起,横轴代表时间,纵轴代表指标序列,如图2-5所示。

图2-5

如图2-5所示的每一行都代表由一个指标组成的时间序列,每个点都代表一个监控数值,这些时序数据首先被保存在内存中,然后被批量刷新到磁盘。在后面的章节中会详细介绍指标存储相关的内容。