[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
- (一)快速开始
- 安装Prometheus
- 使用NodeExporter采集数据
- AlertManager进行告警
- Grafana数据可视化
- (二)探索PromQL
- 理解时间序列
- Metrics类型
- 初识PromQL
- PromQL操作符
- PromQL内置函数
- rate和irate
- 常见指标的PromQL
- 主机CPU使用率
- 主机内存使用率
- 主机磁盘使用率
- 主机磁盘IO
- 主机网络IO
- API的响应时间
- (三)Promtheus告警处理
- 自定义告警规则
- 示例-对主机进行监控告警
- 部署AlertManager
- 告警的路由与分组
- 使用Receiver接收告警信息
- 集成邮件系统
- 屏蔽告警通知
- 扩展阅读
- AlertManager的API
- Prometheus发送告警机制
- 实践:接收Prometheus的告警
- 实践:AlertManager
- (四)监控Kubernetes集群
- 部署Prometheus
- Kubernetes下的服务发现
- 监控Kubernetes集群
- 监控Kubelet的运行状态
- 监控Pod的资源(cadvisor)
- 监控K8s主机的资源
- KubeStateMetrics
- K8S及ETCD常见监控指标
- ETCD监控指标
- Kube-apiserver监控指标
- (五)其他
- Prometheus的relabel-config
- Target的Endpoint
- Prometheus的其他配置
- (六)BlackboxExporter
- 安装
- BlackboxExporter的应用场景
- 在Promtheus中使用BlackboxExporter
- 参考