指标是用来衡量性能、消耗、效率和许多其他软件属性随时间的变化趋势。它们允许工程师通过警报和仪表盘来监控一系列测量值的演变(如CPU或内存或磁盘使用量、请求持续时间、延迟等)。指标在IT监控领域有着悠久的历史,并被工程师广泛使用,与日志和链路追踪一起被用来检测系统是否有不符合预期的表现。
在其最基本的形式中,一个指标数据点是由以下三个部分构成:
- 一个指标名称
- 收集该数据点的时间戳
- 一个由数字表示的测量值
Prometheus收集的指标有四种,作为其暴露格式的一部分
-
Counters
-
Gauges
-
Histograms
-
Summaries
指标类型
从存储上来讲所有的监控指标都是相同的,但是在不同的场景下这些指标又有一些细微的差异。
例如,在 Node Exporter 返回的样本中指标 node_load
反应的是当前系统的负载状态 ,随着时间的变化这个指标返回的样本数据是在不断变化的(gauge类型,反应的是当前的状态)。]
而指标 node_cpu_seconds_total
所获取到的样本数据却不同,它是一个持续增大的值(counter类型), 因为其反应的是CPU 的累计使用时间,从理论上讲只要系统不关机,这个值是会一直变大。
为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheus 定义了 4 种不同的指标类型:Counter(计数器)
、Gauge(仪表盘)、Histogram(直方图)
、Summary(摘要)
。
在 node-exporter(后面会详细讲解)返回的样本数据中,其注释中也包含了该样本的类型。例如:
# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="cpu0",mode="idle"} 362812.7890625
Gauge 可增可减的仪表盘
与使用 Counter指标时不同,rate和delta函数对Gauge没有意义。然而计算特定时间序列的平均数、最大值、最小值或百分比的函数经常与 Gauge一起使用。
与 Counter
不同,Gauge
(可增可减的仪表盘)类型的指标侧重于反应系统的当前状态,因此这类指标的样本数据可增可减,不像counter是一直增长的。
常见指标如 node_memory_MemFree_bytes
(当前主机空闲的内存大小)、node_memory_MemAvailable_bytes
(可用内存大小)都是 Gauge
类型的监控指标。
由于 Gauge 指标仍然带有时间戳存储,所有我们可以看到随时间变化的值,通常可以直接把它们绘制出来,这样就可以看到值本身而不是变化率了 ,通过 Gauge
指标,用户可以直接查看系统的当前状态。
在绘制图行查看状态的时候,直接使用指标值就可以绘制出来,因为本身就表示当前的状态。
这些简单的指标类型都只是为每个样本获取一个数字 ,但 Prometheus 的强大之处在于如何让你跟踪它们,比如我们绘制了两张图,一个是 HTTP 请求的变化率,另一个是分配的 gauge 类型的实际内存,**直接从图上就可以看出这两个之间有一种关联性,当请求出现峰值的时候,内存的使用也会出现峰值,但是我们仔细观察也会发现在峰值过后,内存使用量并没有恢复到峰值前的水平,整体上它在逐渐增加,这表明很可能应用程序中存在内存泄露的问题,**通过这些简单的指标就可以帮助我们找到这些可能存在的问题。
对于 Gauge
类型的监控指标,通过 PromQL
内置函数 delta()
可以获取样本在一段时间范围内的变化情况。例如,计算 CPU 温度在两个小时内的差异:
delta(cpu_temp_celsius{host="zeus"}[2h])
还可以直接使用 predict_linear()
对数据的变化趋势进行预测。例如,预测系统磁盘空间在 4 个小时之后的剩余情况:这个函数是用来做预测的,predict_linear()
这个函数对于磁盘空间来说的话是非常有用的,因为磁盘在实际使用的过程当中一下子就增长起来了,这是一个缓慢的过程,所以可以根据这个函数来判断4个小时之后磁盘剩余的情况,根据这个情况就可以提前去将磁盘空间清理或者扩容。
predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)
仪表(Gauge) 补充
Gauge 指标用于可以任意增加或减少的测量。这是你可能更熟悉的指标类型,因为即使没有经过额外处理的实际值也是有意义的,它们经常被使用到。例如,测量温度、CPU和内存使用的指标,或者队列的大小都是Gauge。
例如,为了测量一台主机的内存使用情况,我们可以使用一个Gauge指标,比如:
HELP node_memory_used_bytes Total memory used in the node in bytes # TYPE node_memory_used_bytes gauge
node_memory_used_bytes{hostname="host1.domain.com"} 943348382
上面的指标表明,在测量时,节点 host1.domain.com 使用的内存约为 900 MB。该指标的值是有意义的,不需要任何额外的计算,因为它告诉我们该节点上消耗了多少内存。
与使用 Counter指标时不同,rate和delta函数对Gauge没有意义。然而,计算特定时间序列的平均数、最大值、最小值或百分比的函数经常与 Gauge一起使用。
avg_over_time(range-vector) 指定时间间隔内范围向量所有元素样本值的平均值
在 Prometheus 中,这些函数的名称是avg_over_time、max_over_time、min_over_time和quantile_over_time。要计算过去10分钟内在host1.domain.com 上使用的平均内存,你可以这样做:
avg_over_time(node_memory_used_bytes{hostname="host1.domain.com"}[10m])
要使用 Prometheus 客户端库在 Python 中创建一个 Gauge 指标,你可以这样做:
from prometheus_client import Gauge memory_used = Gauge( 'node_memory_used_bytes', 'Total memory used in the node in bytes', ['hostname'] ) memory_used.labels(hostname='host1.domain.com').set(943348382)
avg_over_time(probe_duration_seconds{job=~"job", instance=\~"instance"}[1m])
avg_over_time(probe_dns_lookup_time_seconds{job=~"job", instance=\~"instance"}[1m])