共计 3841 个字符,预计需要花费 10 分钟才能阅读完成。
前段时间使用 Prometheus,其中的 PromQL 还是很厉害的查询语法,现在总结下其中的数据查询规则。为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheus 定义了 4 种不同的指标类型 (metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。
返回的样本数据中,其注释中也包含了该样本的类型。例如:
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
Counter:只增不减的计数器
Counter 类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。常见的监控指标,如 http_requests_total,node_cpu 都是 Counter 类型的监控指标。一般在定义 Counter 类型指标的名称时推荐使用_total 作为后缀。
样记录值:每个时刻对应的总数,因此随着时间增加该值递增或不变。
Counter 的应用
最近 10 分钟 cpu 时间增加量:
increase(node_cpu_seconds_total[10m])
最近 10 分钟 cpu 的增长率(增量 / 时间间隔):
rate(node_cpu_seconds_total[10m])
最近 10 分钟 cpu 的增长率(该时间段的最后两个值之差 / 时间间隔):i
irate(node_cpu_seconds_total[10m])
cpu 时间排名前 10 的:
topk(10,node_cpu_seconds_total)
Gauge:可增可减的仪表盘
与 Counter 不同,Gauge 类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是 Gauge 类型的监控指标。
样记录值:每个抓取时刻对应的设置值,因此没有设置值即 0。
Gauge 的应用
Gauge 用法比较单一,一般直接展示即可,也可做预测。
最近 10 分钟的变化情况 :
delta(node_load1[10m])
预测系统磁盘空间在 4 个小时之后的剩余情况:
predict_linear(node_filesystem_free{job="node"}[1h], 4 * 3600)
Histogram 和 Summary 分析数据分布情况
Histogram 和 Summary 主用用于统计和分析样本的分布情况。
这两个指标类型拥有 Counter 的全部功能,都有_sum 记录值之和,_count 记录值的个数,其独特的功能是拥有获取数据分布情况的能力。
Histogram
- 由 Prometheus server 计算分布,这也是使用 Histogram 的情况比 Summary 多的原因。
- 分桶标签‘le’
- 使用 quantile 函数查看分为数值
metrics 样例
# HELP ts_http_seconds_bucket web http response time in seconds
# TYPE ts_http_seconds_bucket histogram
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="1"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="2"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="4"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="8"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="16"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="32"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="64"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="128"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="512"} 0
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="1024"} 877
ts_http_seconds_bucket_bucket{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200",le="+Inf"} 1062
ts_http_seconds_bucket_sum{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200"} 1.19617e+06
ts_http_seconds_bucket_count{error="false",method="put",path="/app/tri",serverName="Java-application",stage="beta",statusCode="200"} 1062
Summary
- 由 Prometheus client 计算分布
- 分布标签 ‘quantile’
metrics 样例
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.161e-05
go_gc_duration_seconds{quantile="0.25"} 2.1318e-05
go_gc_duration_seconds{quantile="0.5"} 3.4168e-05
go_gc_duration_seconds{quantile="0.75"} 5.7184e-05
go_gc_duration_seconds{quantile="1"} 0.000319401
go_gc_duration_seconds_sum 0.720901663
go_gc_duration_seconds_count 15197
内置基础统计函数
-
sum
(求和) -
min
(最小值) -
max
(最大值) -
avg
(平均值) -
stddev
(标准差) -
stdvar
(标准方差) -
count
(计数) -
count_values
(对 value 进行计数) -
bottomk
(后 n 条时序) -
topk
(前 n 条时序) -
quantile
(分位数)
都是基于瞬时向量计算。比如 sum 函数,返回当前指标所选序当前时刻的最大值。其余函数同理。