Skip to content

Upstream documentation

1. Metric介绍

指标监控是不同的,因为它不假设情况可以用固定状态来解释。相反,它将您带入您的系统并提供数十个指标,然后您可以分析和理解这些指标

metrics是一种对采样数据的总称(metrics并不代表某一种具体的数据格式是一种对于度量计算单位的抽象)

每个metrics数据都包含几个部分:指标名称标签采样数据

指标名称

用于描述收集指标的性质,其名称应该具有语义化,可以较直观的表示一个度量的指标。名称格式可包括ASCII字符、数字、下划线和冒号

node_cpu_seconds_total
node_network_receive_bytes_total
node_cpu_seconds_total
node_network_receive_bytes_total

标签

时间序列标签为key/value格式,它们给Prometheus数据模型提供了维度,通过标签可以区分不同的实例

node_network_receive_bytes_total{device="eth0"} #表示eth0网卡的数据
node_network_receive_bytes_total{device="eth0"} #表示eth0网卡的数据

通过标签Prometheus可以在不同维度上对一个或一组数据进行查询处理。标签名称由 ASCII 字符,数字,以及下划线组成, 其中__开头属于 Prometheus 保留,标签的值可以是任何 Unicode 字符,支持中文。标签可来自被监控的资源,也可由Prometheus通过relabel在抓取期间之后添加。

采样数据

按照某个时序以时间维度采集的数据,其值包含:

一个float64值

一个毫秒级的unix时间戳

除了实际采样数据/读数(reading)之外,每个指标都有一个HELP和一个TYPE部分。在TYPE中,您可以看到度量的类型)

prom_metric_sample

1.1 Metric包含哪些

Name ,Timestamp ,Labels ,Value ,Type

Prometheus的时间序列统一使用以下格式来表示

bash
<metric name>{<label name>=<label value>, ...}
<metric name>{<label name>=<label value>, ...}

1.Labels

标签用于将元数据添加到量度。这可以用来进行区分,例如,通过添加状态代码、URI 处理程序、函数名称......

2.Type

Counter类型

counter类型的指标与计数器一样,会按照某个趋势一直变化(一般是增加),我们往往用它记录服务请求总量、错误总数等

如下图展示就是一个counter类型的metrics数据采集,采集的是Prometheus的接口访问量,可看到数值一直在向上增加

image-20250213153918059

基于counter类型的数据,我们可以清楚某些事件发生的次数,由于数据是以时序的方式进行存储,我们也可以轻松了解该事件产生的速率变化。

例如,通过rate()函数,获取api请求量每分钟的增长率:rate(apiserver_request_total[1m])

Gauge类型

与Counter不同,Gauge类型的指标用于展示瞬时的值,与时间没有关系,可增可减。该类型值可用来记录CPU使用率、内存使用率等参数,用来反映目标在某个时间点的状态。

image-20250213154204200

Gauge指标简单且易于理解,对于该类型的指标,我们可以直观的查看目标在当前的状态。

node_memory_MemFree_bytes
node_memory_MemFree_bytes

Histogram类型

尽管能够通过 gauge 监控可增可减的值,并可以在查询时求出其一段时间内的平均值,但是对于一些典型的场景是请求时延、响应数据量大小等,平均值可能并不能很好地反映问题(此类场景,对于开发者更关注的或许是 P90/P95/P99 等)。Histogram 可以解决这个问题,它并不是记录一个值的变化情况,而是将被观测到的值划分进某一个区间中,称为桶(Bucket)。

Histogram 会在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(Bucket)中。可以观察到指标在各个不同的区间范围的分布情况,可以观察到请求耗时在各个桶的分布

image-20250213154806098

Histogram可用于请求耗时、响应时间等数据的统计,例如,指标prometheus_http_request_duration_seconds_bucket即为Histogram类型。

yml
# 样例计算1:
  sum(rate(http_request_duration_seconds_bucket{le="0.3"}[5m])) by (job)
/
  sum(rate(http_request_duration_seconds_count[5m])) by (job)

# 样例计算2:
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

# 样本数据
# HELP prometheus_http_request_duration_seconds Histogram of latencies for HTTP requests.
# TYPE prometheus_http_request_duration_seconds histogram
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.1"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.2"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.4"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="1"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="3"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="8"} 1
# 样例计算1:
  sum(rate(http_request_duration_seconds_bucket{le="0.3"}[5m])) by (job)
/
  sum(rate(http_request_duration_seconds_count[5m])) by (job)

# 样例计算2:
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

# 样本数据
# HELP prometheus_http_request_duration_seconds Histogram of latencies for HTTP requests.
# TYPE prometheus_http_request_duration_seconds histogram
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.1"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.2"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.4"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="1"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="3"} 1
prometheus_http_request_duration_seconds_bucket{handler="/",le="8"} 1

Summary

Summary 也是用来做统计分析的,可用于统计一段时间内数据采样结果 ,如中位数(quantile=0.5)、9分位数(quantile=0.9)等,和 Histogram 区别在于,Summary 直接存储的就是百分位数,如下所示:可以直观的观察到样本的中位数,如 P90P99

image-20250213154921737

yml
# HELP prometheus_engine_query_duration_seconds Query timings
# TYPE prometheus_engine_query_duration_seconds summary
prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.5"} 8.844e-06
prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.9"} 2.8198e-05
prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.99"} 0.000123539
# HELP prometheus_engine_query_duration_seconds Query timings
# TYPE prometheus_engine_query_duration_seconds summary
prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.5"} 8.844e-06
prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.9"} 2.8198e-05
prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.99"} 0.000123539

官方给出的完整的比较区分

  • Counter(计数器):表示一个单调递增的值,如请求总数、错误总数等。它只能增加,不能减少(除非系统重启)
  • Gauge(仪表盘):表示一个可以任意增减的值,如当前内存使用量、CPU 利用率等
  • Histogram(直方图):表示一组数据的分布情况,如请求延迟的分布。它包含多个 bucket(桶),每个 bucket 对应一个值范围,以及落入该范围的样本数量
  • Summary(摘要):与直方图类似,也表示一组数据的分布情况,但它提供了更精确的分位数(如中位数、95% 分位数等)计算