Prometheus的数据格式

官网

image-20240927143707966

  • Prometheus中 每个时间序列都由指标名称(Metric Name)和标签(Label)来唯一标识 格式为

    <metric name>{<label name>=<label value>, ...}
    
    • 指标名称: 通常用于描述系统上要测量的某个特征
    • 如: http_requests_total表示接收到的HTTP请求总数
    • 支持使用字母、数字、下划线和冒号 且必须能匹配RE2规范的正则表达式
    • 标签: 键值型数据 附加在指标名称之上 从而让指标能够支持多维度特征 可选
    • 如: http_requests_total{method="GET"}http_request_total{method="POST"}代表两个不同的时间序列
    • 标签名称可使用字母、数字和下划线 切必须能匹配RE2规范的正则表达式
    • _ _ 为前缀的名称为Prometheus系统预留使用
    • Metric Name的表示方式有两种
    • 后一种通常用于Prometheus内部

image-20240927144238692


prometheus的指标类型

## 指标类型
gauge:瞬时值,当前最新的值


Gauges是最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态。
例如:我们想衡量一个待处理队列中任务的个数,这个个数是会变化的。
当我们要监控硬盘容量或者内存的使用量,那么就应该使用Gauges的metrics格式来衡量,因为硬盘的容量
或者内存的使用量是随时间的推移,不断瞬时且无规则变化的。
这种变化没有规律,当前是多少,采集回来的就是多少。


counter:计数器类型
Counters就是计数器,从数据量0开始积累计算,在理想情况下,只能是永远的增长,不会降低(一些特殊情
况另说,比如说粉丝数,未必就是只增不减.)。
比如统计一小时,一天,一周,一个月的用户的访问量,这就是一个累加的操作。


histograms:是统计数据的分布情况。比如最小值,最大值,中间值,还有中位数。
# 举个例子:
如果我们想通过监控的方式抓取当天nginx的access.log,并且想监控用户的访问服务出现的故障时间,我
们应该怎么做呢?
# 错误解决方案:
把日志每行的"http_response_time"数值统统采集下来,然后计算一下总的平均值。这是毫无意义的,因
为故障发生时间可能只有一小段时间,比如网络延迟放生在12:30-12:40之间,其它时间都是正常的,如果计
算总的平均值,则结果看起来会很正常,无法触发报警功能,运维人员可能也不知道这件事情发生了。
# 正确解决方案:
通过Histograms函数,可以分别统计出全部用户的响应时间在0.05秒,1秒,2秒,5秒,10秒的量。这样运维
人员就能根据这个值进行报警,分析这些时间的产生原因,从而避免以后类似的问题发生。


summary:
因为histogram在客户端就是简单的分桶计数,在prometheus服务端基于这么有限的数据做百分位估算,所
以的确不是很准确,summary就是解决百分位准确的问题而来的。
我们可以简单理解summary是Histogram的扩展类型,如果想要清除的了解histograms和summary的更多
细节,可自行查阅相关的文档。

image-20240927144413747

  • PromQL主要有四个指标类型 它们主要由Prometheus的客户端库使用
    • Counter: 计数器 单调递增 除非重置(如: 服务器或进程重启)
    • Gauge: 仪表盘 可增可减的数据
    • Histogram: 直方图 将时间单位内的数据划分成不同的时间段 并各自评估其样本个数及样本值之和 因而可计算出分位数
    • 可用于分析因异常值而引起的平均值过大的问题
    • 分位数计算要使用专用的histogram_quantile函数
    • Summary: 类似直方图 但客户端会直接计算并上报分位数
  • Prometheus Server并不使用类型信息 而是将所有数据展平为时间序列
Counter和Gauge
  • 通常 Counter的总数并没有直接作用 而使需要借助于rate、topk、increase和irate等函数来生成样本数据的变化状况(增长率)

    • rate(hrrp_requests_total[2h]) 获取2小时内 该指标下各时间序列上的http总请求数的增长速率
    • topk(3, http_requests_total) 获取该指标下http请求总数排名前3的时间序列
    • irate(http_request_total[2h]) 高灵敏度函数 用于计算指标的瞬时速率
    • 基于样本范围内的最后两个样本进行计算 相较于rate函数来说 irate更适合用于短期时间范围内的变化速率分析
  • Gauge用于存储其值可增可减的指标样本数据 常用于进行求和、取平均值、最小值、最大值等聚合计算 也会经常结合PromQL的predict_linear和delta函数使用

    • predict_linear(v range-vector, t, scaler)函数可以预测时间序列v在t秒后的值 它通过线性回归的方式来预测样本数据的Gauge变化趋势
    • delta(v range-vector)函数计算范围向量中每个时间序列元素的第一个值与最后一个值之差 从而展示不同时间点上的样本值差值

一个prometheus的指标实例

10.0.0.201:9100/metrics

# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 158882.38
node_cpu_seconds_total{cpu="0",mode="iowait"} 10.94
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 0.8
node_cpu_seconds_total{cpu="0",mode="softirq"} 45.62
node_cpu_seconds_total{cpu="0",mode="steal"} 0
node_cpu_seconds_total{cpu="0",mode="system"} 1228.05
node_cpu_seconds_total{cpu="0",mode="user"} 837.11
node_cpu_seconds_total{cpu="1",mode="idle"} 158747.88
node_cpu_seconds_total{cpu="1",mode="iowait"} 7.02
node_cpu_seconds_total{cpu="1",mode="irq"} 0
node_cpu_seconds_total{cpu="1",mode="nice"} 0.75
node_cpu_seconds_total{cpu="1",mode="softirq"} 39.26
node_cpu_seconds_total{cpu="1",mode="steal"} 0
node_cpu_seconds_total{cpu="1",mode="system"} 1237.68
node_cpu_seconds_total{cpu="1",mode="user"} 899.26

### 数据类型
# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
### 数据类型
# TYPE node_cpu_seconds_total counter
### key labels value
node_cpu_seconds_total{cpu="0",mode="idle"} 158882.38
node_cpu_seconds_total{cpu="0",mode="iowait"} 10.94
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 0.8
node_cpu_seconds_total{cpu="0",mode="softirq"} 45.62
node_cpu_seconds_total{cpu="0",mode="steal"} 0
node_cpu_seconds_total{cpu="0",mode="system"} 1228.05
node_cpu_seconds_total{cpu="0",mode="user"} 837.11
node_cpu_seconds_total{cpu="1",mode="idle"} 158747.88
node_cpu_seconds_total{cpu="1",mode="iowait"} 7.02
node_cpu_seconds_total{cpu="1",mode="irq"} 0
node_cpu_seconds_total{cpu="1",mode="nice"} 0.75
node_cpu_seconds_total{cpu="1",mode="softirq"} 39.26
node_cpu_seconds_total{cpu="1",mode="steal"} 0
node_cpu_seconds_total{cpu="1",mode="system"} 1237.68
node_cpu_seconds_total{cpu="1",mode="user"} 899.26