Prometheus(3)监控指标

数据模型

Prometheus以时间序列的形式存储所有的数据,每一个指标数据都包含:

  • 指标名称
  • 一些标签
  • 对应的数据(64位浮点数据)
  • 时间戳(精确到毫秒)

比如监控CPU的一条记录node_cpu{cpu="cpu0",mode="idle"} 666666.6666

  • node_cpu 监控的指标为节点的CPU使用时间,单位是秒
  • cpu="cpu0"mode="idle" 标记CPU为CPU0,并且模式是idle模式的数据
  • 666666.6666 cpu0的空闲时间,单位是秒

使用者可以自定义指标和标签,但是名称需要满足一些规则:

  • 指标名称 [a-zA-Z_:][a-zA-Z0-9_:]*
  • 标签名称 [a-zA-Z_][a-zA-Z0-9_]*
  • 标签的值可以包含Unicode字符

指标类型

数据指标主要有四种类型:

  • Counter 计数
  • Gauge 数值
  • Histogram 直方图
  • Summary 统计

Counter

counter是一个累计型的指标,仅仅支持递增或者重置为0,通常用来统计事件发生的数量,比如请求、错误或者完成的任务的数量,或者某个数值的变化率。

只增不减,一般在指标后面加上_total作为后缀。

Gauge

Gauge是一个纯数值类型的指标,能够随时增大或者变小。

Gauge可以用来测量某些指标,比如温度,或者当前CPU的使用量。

Histogram

Histogram直方图会对特定buckets内的一些采样数据进行统计,比如收集并且统计一段时间内的请求时间并且计算平均值。

一个直方图通常会有一个基础指标名称basename,用来抓取的指标数据通常是在这个basename后面增加后缀。

  • 在buckets内的累计型计数器,basename_bucket{le="上限值"}

  • 在buckets内的数据总值,basename_sum

  • 在buckets内的事件总数量,basename_count,等同于上面的basename_bucket{le="+Inf"}

比如我们希望能获取http请求的直方图,在io.micrometer组件中有一个http_server_requests_seconds的指标,通过抓取可以看到下面的数据。

1
2
3
4
5
6
# GET /actuator/health接口返回200的请求耗时为0.003秒,也就是3毫秒
http_server_requests_seconds{exception="None", method="Get", status="200", uri="/actuator/health"} 0.003
# GET /actuator/health接口返回200请求的请求数量为10个
http_server_requests_seconds_count{exception="None", method="Get", status="200", uri="/actuator/health"} 10.0
# GET /actuator/health接口返回200请求的总耗时是351.271864943秒
http_server_requests_seconds_sum{exception="None", method="Get", status="200", uri="/actuator/health"} 351.271864943

Summary

和直方图histogram类似,也是计算一段时间内的样本数据。

但是它并不是计算指定buckets内数值,而是计算滑动窗口内的样本数值。

命名习惯

假设采样数据指标metric叫做x,如果x是histogram或者summary类型则必须满足以下条件:

  • 采样数据的总和表示为x_sum
  • 采样数据的总量应该是x_count
  • summary类型的采样数据的quantile应该表示为x{quantile=”y”}
  • histogram类型采样分区统计数据将表示为x_bucket{le=”y”}
  • histogram类型的采样必须包含x_bucket{le=”+Inf”},他的值等于x_count的值
  • summary和histogram中quantile和le必须按从小到大的顺序排列