配置文件
和 K8s 一样,prometheus 也是一个配置驱动的系统,了解配置是关键,后面的小节会覆盖不少细节,现在暂时粗略预览整个配置文件的结构:
在 prometheus GitHub 仓库里有一份推荐参考的配置文件,写配置时感到迷惑可以看看。
基本流程
Prometheus Server 收集 exporter 或 job 的数据,推送到 Alertmanager;同时,Grafana 和 API 客户端可以使用 PromQL 向 Prometheus Server 查询数据。
要对对象进行监控,首先要在监控目标设置 exporter,常见例子有 node_exporter
。
Exporter
要知道 node_exporter
暴露了怎样的数据,在正确安装 node_exporter
后,可以通过 http://192.168.41.128:9100/metrics
访问 metric 的内容,大概会像这样:
不只是 node_exporter
,所有 exporter 输出的数据都符合这样格式,其中包含三类内容:
# HELP
开头的是帮助信息
# TYPE
开头的是 metric 类型,也就是上面提到的 Counter、Gauge、Histogram、Summary
- 其他的都是实际需要使用的数据,结构包括 metric 本体、值、时间戳(可以没有默认当前时间),用 EBNF 表示为如下架构:
数据格式先说到这,接着需要在 scrape_configs
属性中配置 job,分类抓取 exporter:
Record rule
可以使用 record rule(不知道该如何翻译,暂且叫做“记录规则”吧)聚合成新的信息,聚合输出的规则格式是用一个 groups
指定一组 rule_group
。
rule_group
再包含一组 rule:
rule 格式则是这样的,重点,敲黑板:
对于记录规则的名称,在官方文档有一些建议。
按照 groups、rule_group、rule 三层结构,把 rule 组合保存到 prometheus.rules.yml
文件,就是这样的:
再在 Prometheus 配置中使用 rule 配置文件:
rule 的 record
是聚合得来的新纪录的名称;expr
是聚合规则,其使用的便是 prometheus 的一大重点 PromQL。
PromQL
表达式由四种类型组成:
- Instant vector 瞬时向量
- Range vector 区间向量
- Scalar 纯量
- String 字符串
选择器:
- 瞬时选择,最简单的选择只需要使用 metric 的名称,也可以用
{}
筛选标签
- 区间选择
[]
- 时间偏移
Offset
- 指定时间
@
Subquery 返回一个区间向量:
<instant_query> '[' <range> ':' [<resolution>] ']' [ @ <float_literal> ] [ offset <duration> ]
操作符:
- 二元操作符,包括算术运算(
+-*/%^
)和比较(== != > < >= <=
)两类
- 聚合操作符,
sum
、max
、topk
等,更多请看文档
函数:看文档
The Four Golden Signals:
- Latency
- Traffic
- Errors
- Saturation
引用自 Google SRE book
一个比较靠谱的 PromQL 中文说明。可以在 promlens 分析和测试你的 PromQL。
Alert rule
除了聚合新信息还可以编写告警规则(alert rule),它的格式如下:
包含三层结构的一个例子:
在 annotations 中可以使用模板语法。
AlertManager
为了在 AlertManager 查看告警,需要在配置文件中关联 AlertManager:
AlertManager 除了提供基本的告警通知能力以外,还主要提供了如:分组、抑制以及静默等告警特性。
Alertmanager 本身也有配置,文档在此,暂不展开。
Glossary
Metric
结构 = Metric names + labels
这是一个例子:
Metric 类型:
- Counter
- Gauge
- Histogram
- Summary
Job
一个 exporter 就是一个 target,job 是相同逻辑 target 的集合。
Time series
数据会以 Time series 的形式存入 TSDB(时序数据库)。
参考