这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
什么是 Prometheus?
Prometheus 是系统监控和告警工具包,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。
数据模型
Prometheus 所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB)。
每一条时间序列由指标名称(Metrics Name)以及一组标签(键值对)唯一标识。其中指标的名称(metric name)可以反映被监控样本的含义(例如,http_requests_total
— 表示当前系统接收到的 HTTP 请求总量),指标名称只能由 ASCII 字符、数字、下划线以及冒号组成,同时必须匹配正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*
。
例如,指标名称为 api_http_requests_total
,标签为 method="POST"
和 handler="/messages"
的时间序列可以表示为:
1 | ini复制代码api_http_requests_total{method="POST", handler="/messages"} |
指标类型
Counter(计数器)
Counter 类型代表一种样本数据单调递增(f(x) 随着 x 的增大而增大)的指标,即只增不减,除非监控系统发生了重置。例如,你可以使用 counter 类型的指标来表示服务的请求数、已完成的任务数、错误发生的次数等。counter 主要有两个方法:
1 | scss复制代码//将counter值加1. |
Counter 类型数据可以让用户方便的了解事件产生的速率的变化,在 PromQL 内置的相关操作函数可以提供相应的分析,比如以 HTTP 应用请求量来进行说明:
1 | scss复制代码//通过rate()函数获取HTTP请求量的增长率 |
Guage(仪表盘)
Guage 类型代表一种样本数据可以任意变化的指标,即可增可减。guage 通常用于像温度或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如:当前并发请求的数量。
对于 Gauge 类型的监控指标,通过 PromQL 内置函数 delta() 可以获取样本在一段时间内的变化情况,例如,计算 CPU 温度在两小时内的差异:
1 | ini复制代码dalta(cpu_temp_celsius{host="zeus"}[2h]) |
你还可以通过PromQL 内置函数 predict_linear() 基于简单线性回归的方式,对样本数据的变化趋势做出预测。例如,基于 2 小时的样本数据,来预测主机可用磁盘空间在 4 个小时之后的剩余情况:
1 | ini复制代码predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0 |
Histogram(直方图)
在大多数情况下人们都倾向于使用某些量化指标的平均值,例如 CPU 的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统 API 调用的平均响应时间为例:如果大多数 API 请求都维持在 100ms 的响应时间范围内,而个别请求的响应时间需要 5s,那么就会导致某些 WEB 页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。
为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 0-10ms 之间的请求数有多少而 10-20ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 和 Summary 都是为了能够解决这样问题的存在,通过 Histogram 和 Summary 类型的监控指标,我们可以快速了解监控样本的分布情况。
Histogram 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
Histogram 类型的样本会提供三种指标(假设指标名称为 <basename>
):
- 样本的值分布在 bucket 中的数量,命名为
<basename>_bucket{le="<上边界>"}
。解释的更通俗易懂一点,这个值表示指标值小于等于上边界的所有样本数量。
1 | ini复制代码 // 在总共2次请求当中。http 请求响应时间 <=0.005 秒 的请求次数为0 |
- 所有样本值的大小总和,命名为
<basename>_sum
。
1 | ini复制代码 // 实际含义: 发生的2次 http 请求总的响应时间为 13.107670803000001 秒 |
- 样本总数,命名为
<basename>_count
。值和<basename>_bucket{le="+Inf"}
相同。
1 | ini复制代码 // 实际含义: 当前一共发生了 2 次 http 请求 |
Summary(摘要)
与 Histogram 类型类似,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。
Summary 类型的样本也会提供三种指标(假设指标名称为 ):
- 样本值的分位数分布情况,命名为
<basename>{quantile="<φ>"}
。
1 | ini复制代码 // 含义:这 12 次 http 请求中有 50% 的请求响应时间是 3.052404983s |
- 所有样本值的大小总和,命名为
<basename>_sum
。
1 | ini复制代码 // 含义:这12次 http 请求的总响应时间为 51.029495508s |
- 样本总数,命名为
<basename>_count
。
1 | ini复制代码 // 含义:当前一共发生了 12 次 http 请求 |
现在可以总结一下 Histogram 与 Summary 的异同:
- 它们都包含了
<basename>_sum
和<basename>_count
指标。 - Histogram 需要通过
<basename>_bucket
来计算分位数,而 Summary 则直接存储了分位数的值。
关于 Summary 与 Histogram 的详细用法,请参考 histograms and summaries。
安装及使用
示例配置文件:
1 | yaml复制代码global: |
完整配置选项说明,请查看配置文档
使用以下脚本启动 Prometheus:
1 | bash复制代码#!/bin/bash |
本文转载自: 掘金