🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] Prometheus定义了4中不同的指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。 在NodeExporter返回的样本数据中,其注释中也包含了该样本的类型。例如: ``` # 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"} 927490.95node_cpu_seconds_total{cpu="0",mode="iowait"} 27.74... ``` 上面的就是counter类型的指标。 ## **Counter:只增不减的计数器** Counter类型的指标数据,只增不减(除非系统发生重置)。常见的有`node_cpu_seconds_total{cpu="x",mode="idle"}`,它表示的意思是序号为`x`的cpu从开机到当前的这段时间内,cpu处于空闲(`idle`)状态的时间总和。 ## **Gauge:可增可减的仪表盘** Gauge类型的指标数据,可增可减,比如内存剩余量`node_memory_MemAvailable` ## **Histogram:直方图** Histogram一个典型的使用场景就是HTTP请求的响应时间。假设一个HTTP服务器xxx有如下的指标: ``` # HELP xxx_http_request_duration_seconds Histogram of latencies for HTTP requests. # TYPE xxx_http_request_duration_seconds histogram xxx_http_request_duration_seconds_bucket{verb="GET", le="0.1"} 10 xxx_http_request_duration_seconds_bucket{verb="GET", le="0.2"} 20 xxx_http_request_duration_seconds_bucket{verb="GET", le="0.3"} 30 xxx_http_request_duration_seconds_bucket{verb="GET", le="+Inf"} 30 xxx_http_request_duration_seconds_sum{verb="GET"} 4.5 xxx_http_request_duration_seconds_count{verb="GET"} 30 ``` 首先看最后一行,它代表的意思是 ``` # 从该HTTP服务起来开始,总共接收到了30个GET请求 xxx_http_request_duration_seconds_count{verb="GET"} 30 ``` 然后再看倒数第二行,它代表的意思是 ``` # 这30个GET请求的响应时间总和为4.5秒 xxx_http_request_duration_seconds_sum{verb="GET"} 4.5 ``` 然后再来看第一行数据,它代表的意思是 ``` # 这30个GET请求中,响应时间小于等于0.1秒的请求有10个 xxx_http_request_duration_seconds_bucket{verb="GET", le="0.1"} 10 ``` 然后再来看第二行数据,它代表的意思是 ``` # 这30个GET请求中,响应时间小于等于0.2秒的请求有20个 xxx_http_request_duration_seconds_bucket{verb="GET", le="0.2"} 20 ``` 需要注意的是,上面的这20个请求是包含了响应时间小于等于0.1秒那10个,也就是说,响应时间在`(0.1, 02]`秒之间的GET请求数也是10个。 再来看第四行数据,它代表的意思是 ``` # 这30个GET请求中,响应时间小于等于无穷大(+Inl表示无穷大)的请求个数为30个 xxx_http_request_duration_seconds_bucket{verb="GET", le="+Inf"} 30 ``` 从上面的分析可以看出,Histogram根据响应时间把请求划分到了若干个区间,它是一种累积直方图。 这种指标会有一个问题,就是有时没有办法做精确统计。比如,我们要计算50%(即15个)的GET请求小于哪个时间,怎么求?我们知道`(0, 0.1]`秒内有10个请求,`(0.1, 0.2]`秒内有10个请求,但是`(0.1, 0.2]`之间的10个请求的响应时间我们是没办法准确知道的,怎么办?prometheus有一个统计函数`histogram_quantile`,它认为在一个时间区间内的样本是线性分布的。即它会认为`(0.1, 0.15]`和`(0.15, 0.2]`区间内各5个。所以该函数统计出来的50%的GET请求小于等于0.15秒。 在上面的指标中,`xxx_http_request_duration_seconds_sum`表示总用时,一般用来统计平均响应时间才会用到。 ## **Summary:摘要** 与 Histogram 类型类似,但它直接存储了分位数(quantile),相当于HTTP服务自已本身已经做了一次统计。如下: ``` # HELP xxx_http_request_duration_seconds Summary of latencies for HTTP requests. # TYPE xxx_http_request_duration_seconds summary xxx_http_request_duration_seconds{verb="GET", quantile="0.5"} 0.12 xxx_http_request_duration_seconds{verb="GET", quantile="0.9"} 0.22 xxx_http_request_duration_seconds{verb="GET", quantile="0.99"} 0.25 xxx_http_request_duration_seconds_sum{verb="GET"} 4.5 xxx_http_request_duration_seconds_count{verb="GET"} 30 ``` 上面第一行指标,它的意思是: ``` # 50%的GET请求,响应时间小于等于0.12秒 xxx_http_request_duration_seconds{verb="GET", quantile="0.5"} 0.12 ``` 我们会发现,它统计的时间和前面的`histogram_quantile`计算的时间会不一样。这是正常的,比如按响应时间升序排序,假设第15个请求的响应时间为0.12秒,那么50%的请求的响应时间是小于等于0.12秒的。 一般来说,对同一个指标(比如GET请求响应时间),HTTP服务一般不会同时提供Histogram和Summary两类数据。 ## **参考** * https://fuckcloudnative.io/prometheus/2-concepts/metric_types.html