一、基本介绍
(一)、简述
Prometheus是一套开源的系统监控和报警框架,Prometheus在2016年加入了 Cloud Native Computing Foundation,这是继Kubernetes之后的第二个托管项目。
普罗米修斯
(二)、监控目的
系统指标变化趋势分析
保证业务持续性运行
故障分析和定位
数据可视化
(三)、特征
多维数据模型,其中包含通过度量标准名称和键/值对标识的时间序列数据
灵活的查询语言,PromQL
不依赖分布式存储,可单节点部署
数据采集通过HTTP协议,使用pull模式拉取数据
可以通过pushgateway组件使用push模式推送数据
通过服务发现或者静态配置发现目标
多种图形和仪表盘支持
(四)、架构和组件
prometheus server组件
数据采集和存储时序数据
client libraries组件
用于采集应用程序代码库
pushgateway组件
支持短期jobs,由job推送到Pushgateway,再通过Pushgateway暴露给Prometheus
exporters组件
用于暴露第三方服务采集指标
alertmanager组件
对prometheus告警进行分组、抑制、静默等功能
通过服务发现,自动发现监控目标
grafana、api clients
(五)、使用场景
prometheus非常适合记录任何纯数字时间序列。它既适合以机器为中心的监视,也适合于高度动态的面向服务的体系结构的监视。在微服务世界中,其对多维数据收集和查询的支持是一种特别的优势。
不适合100%准确性的要求,例如按请求计费
二、基本概念
(一)、数据模型
指标名称和标签
每一条时间序列由指标名称(Metrics Name)以及一组标签(键值对)唯一标识。其中指标的名称(metric name)可以反映被监控样本的含义
通过使用标签,Prometheus 开启了强大的多维数据模型:对于相同的指标名称,通过不同标签列表的集合,会形成特定的度量维度实例。该查询语言在这些指标和标签列表的基础上进行过滤和聚合。改变任何度量指标上的任何标签值(包括添加或删除指标),都会创建新的时间序列。
在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:
指标(metric):指标名称和描述当前样本特征的 labelsets;
时间戳(timestamp):一个精确到毫秒的时间戳;
样本值(value): 一个 folat64 的浮点型数据表示当前样本的值。
# 通过如下表达方式表示指定指标名称和指定标签集合的时间序列:
<metric name>{<label name>=<label value>, ...}
api_http_requests_total{method="POST", handler="/messages"}
(二)、指标类型
Counter计数器
Counter 类型代表一种样本数据单调递增的指标,即只增不减,除非监控系统发生了重置。
Guage仪表盘
Guage 类型代表一种样本数据可以任意变化的指标,即可增可减。guage 通常用于像温度或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如:当前并发请求的数量。
Histogram直方图
Histogram 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
Histogram 类型的样本会提供三种指标:
1. 样本的值分布在 bucket 中的数量,命名为 <basename>_bucket{le="<上边界>"}。(指标值小于等于上边界的所有样本数量)
2. 所有样本值的大小总和,命名为 <basename>_sum。
3. 样本总数,命名为 <basename>_count。值和 <basename>_bucket{le="+Inf"} 相同。
Summary摘要
与 Histogram 类型类似,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。
Summary 类型的样本也会提供三种指标:
1. 样本值的分位数分布情况,命名为 <basename>{quantile="<φ>"}。
2. 所有样本值的大小总和,命名为 <basename>_sum。
3. 样本总数,命名为 <basename>_count。
三、部署安装
(一)、prometheus
# https://prometheus.io/download/
wget https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz
tar -zxvf prometheus-2.23.0.linux-amd64.tar.gz -C /opt/ && mv /opt/prometheus-2.23.0.linux-amd64 /opt/prometheus
创建用户、目录
# 创建用户
useradd prometheus -s /sbin/nologin -M
# 数据目录
mkdir -pv /data/prometheus
chown -R prometheus.prometheus /data/prometheus/
配置systemd服务
# 创建prometheus服务
vi /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.target
[Service]
Type=simple
Environment="GOMAXPROCS=8"
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/opt/prometheus/prometheus \
--config.file=/opt/prometheus/prometheus.yml \
--storage.tsdb.path=/data/prometheus \
--storage.tsdb.retention.time=30d \
--storage.tsdb.retention.size=0 \
--web.console.libraries=/opt/prometheus/console_libraries \
--web.console.templates=/opt/prometheus/consoles \
--web.listen-address=0.0.0.0:9090 \
--web.external-url=
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
NoNewPrivileges=true
LimitNOFILE=infinity
ReadWriteDirectories=/data/prometheus
ProtectSystem=full
SyslogIdentifier=prometheus
Restart=always
[Install]
WantedBy=multi-user.target
# 指定配置文件地址
--config.file=/opt/prometheus/prometheus.yml \
# 持久化存储目录
--storage.tsdb.path=/data/prometheus \
# 持久化存储时间,默认15天
--storage.tsdb.retention.time=30d \
# 存储块可以使用的最大字节数,默认为0或者禁用
--storage.tsdb.retention.size=0 \
# 控制台库目录的路径
--web.console.libraries=/opt/prometheus/console_libraries \
# 控制台模板目录的路径
--web.console.templates=/opt/prometheus/consoles \
# 监听IP和端口
--web.listen-address=0.0.0.0:9090 \
# 外部访问地址,默认为缺省值组件会自动派生
--web.external-url=
systemctl start prometheus
systemctl status prometheus
systemctl stop prometheus
systemctl restart prometheus
systemctl reload prometheus
# 开机自启动
systemctl enable prometheus
# 关闭自启动
systemctl disable prometheus
# web访问地址
http://localhost:9090
# metrics访问地址
http://localhost:9090/metrics
(二)、node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
tar -zxvf node_exporter-1.0.0.linux-amd64.tar.gz -C /opt/ && mv /opt/node_exporter-1.0.1.linux-amd64 /opt/node_exporter
创建用户和目录
# 创建用户
useradd node_exporter -s /sbin/nologin -M
# 数据目录
mkdir -pv /data/node_exporter
chown -R node_exporter.node_exporter /data/node_exporter/
配置systemd服务
# 创建node_exporter服务
vi /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/opt/node_exporter/node_exporter \
--collector.systemd \
--collector.textfile \
--collector.textfile.directory=/data/node_exporter \
--web.listen-address=0.0.0.0:9100
SyslogIdentifier=node_exporter
Restart=always
PrivateTmp=yes
ProtectHome=yes
NoNewPrivileges=yes
ProtectSystem=full
[Install]
WantedBy=multi-user.target
systemctl start node_exporter
systemctl status node_exporter
systemctl stop node_exporter
systemctl restart node_exporter
# 开机自启动
systemctl enable node_exporter
# 关闭自启动
systemctl disable node_exporter
# metrics访问
http://localhost:9100/metrics
prometheus采集node_exporter
# prometheus.yml配置job_name
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
# 检验配置文件
/opt/prometheus/promtool check config /opt/prometheus/prometheus.yml
# 重载服务
systemctl reload prometheus
# 访问targets,查看job状态是否"OK"
http://localhost:9090/targets
# 查询收集数据
http://localhost:9090/graph
# 查询条件
# 查看系统信息
node_uname_info
(三)、grafana
wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-7.3.6-1.x86_64.rpm
yum localinstall grafana-7.3.6-1.x86_64.rpm -y
systemctl start grafana-server
# 开机自启动
systemctl enable grafana-server
#访问地址 默认用户:密码(admin:admin)
http://localhost:3000
# 新增datasources,配置Prometheus
# HTTP中url
http://localhost:9090
# 导入node_exporter仪表盘
https://grafana.com/grafana/dashboards/8919
# dashboards => Manage => import => 8919 => Load
(四)、alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /opt/ && mv /opt/alertmanager-0.21.0.linux-amd64 /opt/alertmanager
创建用户和目录
# 创建用户
useradd alertmanager -s /sbin/nologin -M
# 数据目录
mkdir -pv /data/alertmanager
chown -R alertmanager.alertmanager /data/alertmanager/
配置systemd服务
vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=Prometheus Alertmanager
After=network.target
[Service]
Type=simple
User=alertmanager
Group=alertmanager
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/opt/alertmanager/alertmanager \
--config.file=/opt/alertmanager/alertmanager.yml \
--storage.path=/data/alertmanager \
--web.listen-address=0.0.0.0:9093 \
--web.external-url=http://0.0.0.0:9093/
SyslogIdentifier=alertmanager
Restart=always
[Install]
WantedBy=multi-user.target
# 配置文件路径
--config.file=/opt/alertmanager/alertmanager.yml \
# 数据存储路径
--storage.path=/data/alertmanager \
--web.listen-address=0.0.0.0:9093 \
--web.external-url=http://0.0.0.0:9093/
systemctl start alertmanager
# 开机自启动
systemctl enable alertmanager
prometheus集成alertmanager
# 修改prometheus.yml
vim /opt/prometheus/prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
# 重载prometheus服务
systemctl reload prometheus
# 访问地址
http://localhost:9093
# 告警页
http://localhost:9093/#/alerts
# 静默页
http://localhost:9093/#/silences
# 状态页
http://localhost:9093/#/status
(五)、webhook-dingtalk
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
tar -zxvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz -C /opt/ && mv /opt/prometheus-webhook-dingtalk-1.4.0.linux-amd64 /opt/prometheus-webhook-dingtalk
# 创建用户
useradd webhook-dingtalk -s /sbin/nologin -M
配置systemd服务
vim /usr/lib/systemd/system/prometheus-webhook-dingtalk.service
[Unit]
Description=prometheus-webhook-dingtalk
After=network-online.target
[Service]
User=webhook-dingtalk
Group=webhook-dingtalk
ExecStart=/opt/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/opt/prometheus-webhook-dingtalk/config.yml --web.enable-ui
Restart=on-failure
[Install]
WantedBy=multi-user.target
创建钉钉机器人
#【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】
# webhook地址
https://oapi.dingtalk.com/robot/send?access_token=xxx
# 安全设置
# 例如:自定义关键字
vim /opt/prometheus-webhook-dingtalk/config.yml
timeout: 5s
templates:
- /opt/prometheus-webhook-dingtalk/template.tmpl
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=xxxx
vim /opt/prometheus-webhook-dingtalk/template.tmpl
{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}
{{ define "default.__text_alert_list" }}{{ range . }}
**告警级别:** \[{{ .Labels.severity | upper }}\]
**告警部门:** \[{{ .Annotations.department }}\]
**告警目标:** \[{{ .Annotations.summary }}\]
**目标描述:** \[{{ .Annotations.instancedesc }}\]
**告警详情:** {{ .Annotations.description }}
{{ end }}{{ end }}
{{/* Default */}}
{{ define "default.title" }}{{ template "__subject" . }}{{ end }}
{{ define "default.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]**
{{ if gt (len .Alerts.Firing) 0 -}}
**告警状态:** [触发告警]
{{ template "default.__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
{{ template "default.__text_alert_list" .Alerts.Resolved }}
**恢复通知:** [<font color="#00dd00">告警已恢复正常</font><br />]
{{- end }}
{{- end }}
systemctl start prometheus-webhook-dingtalk
# 开机自启动
systemctl enable prometheus-webhook-dingtalk
systemctl status prometheus-webhook-dingtalk
集成alertmanager组件
# 修改配置
# vim /opt/alertmanager/alertmanager.yml
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'webhook1'
receivers:
- name: 'webhook1'
webhook_configs:
- url: 'http://localhost:8060/dingtalk/webhook1/send'
send_resolved: true
# 检验配置文件
/opt/alertmanager/amtool check-config /opt/alertmanager/alertmanager.yml
systemctl reload alertmanager
(六)、告警
开启规则配置
# 修改配置文件
# vim /opt/prometheus/prometheus.yml
rule_files:
- "rules/*.yml"
# 创建规则目录
mkdir -pv /opt/prometheus/rules
配置规则文件
# 新增global规则文件
vi /opt/prometheus/rules/general.yml
groups:
- name: general.rules
rules:
- alert: 服务器宕机告警
expr: up{job=~"node_exporter|node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }}"
department: "{{ $labels.department }}"
instancedesc: "{{ $labels.desc }}"
description: "该服务器已经停止了2分钟以上,请及时处理。"
# 验证配置文件
/opt/prometheus/promtool check config /opt/prometheus/prometheus.yml
# 重载服务
systemctl reload prometheus
测试验证告警
# 停止/启动目标服务
systemctl stop node_exporter
systemctl start node_exporter
# 验证alerts状态
http://localhost:9090/alerts
# 查看钉钉群告警/恢复消息
四、文件配置
(一)、全局配置
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
rule_files:
- "rules/*.yml"
# 抓取目标的频率,默认1m
scrape_interval
# 抓取请求超时时间,默认10s
scrape_timeout
# 评估告警规则的频率,默认1m
evaluation_interval
# alertmanagers组件地址
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
[ - <alertmanager_config> ... ]
# 规则文件
rule_files:
[ - <filepath_glob> ... ]
(二)、抓取文件配置
scrape_configs:
# 静态配置
- job_name: 'node_exporter'
static_configs:
- targets: ['127.0.0.1:9100']
# file_sd文件动态配置
- file_sd_configs:
- files: ['./file_sd/node/node.yml']
refresh_interval: 8s
job_name: 'node'
metrics_path: /metrics
relabel_configs:
- source_labels: [__address__]
regex: (.*)
target_label: instance
replacement: $1
- source_labels: [__address__]
regex: (.*)
target_label: __address__
replacement: $1:9100
基于static_configs静态配置
# 静态配置指定的目标
targets:
[ - '<host>' ]
# 自定义标签
labels:
[ <labelname>: <labelvalue> ... ]
relabel_configs自定义标签
# 默认标签
# targets中配置的值
__address__
# 配置中取值,默认值 "/metrics"
__metrics_path__
# 配置中取值,默认值 "http"
__scheme__
# 重定义标签__address__
instance
# 从已有的标签选择值的源标签组;多个标签,使用separator分隔;
# regex匹配源标签里的值
# 动作为replace, keep, 和 drop
# 源标签
[ source_labels: '[' <labelname> [, ...] ']' ]
# 多个源标准的分割值
[ separator: <string> | default = ; ]
# 在替换操作中,regex匹配的的值需要写入结果值的标签。
# 对于替换操作是强制性的
[ target_label: <labelname> ]
# 正则表达式匹配源标签的值
[ regex: <regex> | default = (.*) ]
# 源标签取hash的模块
[ modulus: <int> ]
# 要替换的匹配分组号和值
[ replacement: <string> | default = $1 ]
# 基于正则匹配的操作动作
[ action: <relabel_action> | default = replace ]
# relabel_action 值
replace: 正则匹配源标签的值用来替换目标标签。如果regex不匹配,则不进行替换。
keep: 如果正则没有匹配到源标签,删除targets
drop: 如果正则匹配到源标签,删除targets
hashmod: 设置目标标签值为源标签值的hash值
labelmap: 正则匹配所有标签名; 将匹配的标签的值复制到由replacement提供的标签名
labeldrop: 正则匹配所有标签名;匹配则移除标签;
labelkeep: 正则匹配所有标签名;不匹配的标签会被移除;
# node示例
relabel_configs:
- source_labels: [__address__]
regex: (.*)
target_label: __address__
replacement: $1:9100
# java微服务示例
relabel_configs:
- source_labels: [contextpath]
regex: (.*)
target_label: __metrics_path__
replacement: $1/actuator/prometheus
基于file_sd_configs动态配置
# 获取目标的文件模式(json/yaml)
files:
[ - <filename_pattern> ... ]
# 重新读取文件的频率,默认为5m
[ refresh_interval: <duration> | default = 5m ]
# JSON json 文件模式
[ { "targets": [ "<host>", ... ], "labels": { "<labelname>": "<labelvalue>", ... } }, ... ]
# YAML yaml 文件模式
- targets: [ - '<host>' ] labels: [ <labelname>: <labelvalue> ... ]
- file_sd_configs:
- files: ['./file_sd/node/node.yml']
refresh_interval: 8s
job_name: 'node'
metrics_path: /metrics
# 主机node.yml
- labels:
desc: testnode
department: test
targets:
- 127.0.0.1
# java服务app.yml
- labels:
contextpath: /demo
application: demo
desc: demo
targets:
- 127.0.0.1:8055
基于eureka_sd_configs动态配置
# eureka服务器地址
server: <string>
# 重新读取应用系统的频率,默认30s
[ refresh_interval: <duration> | default = 30s ]
scrape_configs:
- job_name: 'test-app'
eureka_sd_configs:
- server: http://127.0.0.1:1111/eureka
relabel_configs:
- source_labels: [__meta_eureka_app_instance_metadata_prometheus_scrape]
action: keep
regex: true
- source_labels: [__meta_eureka_app_instance_metadata_prometheus_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
# spring boot配置
# application.yaml
eureka:
instance:
metadataMap:
"prometheus.scrape": "true"
"prometheus.path": "/demo/actuator/prometheus"
"prometheus.port": "8055"
# 重定义标签配置描述
1. prometheus.scrape
仅重新标记该应用程序示例
2. prometheus.path
基于应用程序自定义度量路径的重新标记示例
3. prometheus.port
示例重新标记以仅获取应用程序所需的单个端口
(三)、规则文件配置
groups:
- name: example
rules:
# 5分钟实例无法正常访问
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
# 10分钟内请求延迟时间大于1s
- alert: APIHighRequestLatency
expr: api_http_request_latencies_second{quantile="0.5"} > 1
for: 10m
annotations:
summary: "High request latency on {{ $labels.instance }}"
description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
groups
groups:
[ - <rule_group> ]
rule_group
# 组名,值唯一
name: <string>
# 评估规则的频率,默认为全局配置evaluation_interval的值
[ interval: <duration> | default = global.evaluation_interval ]
rules:
[ - <rule> ... ]
# 告警名
alert: <string>
# PromQL表达式
# 挂起/触发告警
expr: <string>
# 持续时间后触发告警
[ for: <duration> | default = 0s ]
labels:
[ <labelname>: <tmpl_string> ]
annotations:
[ <labelname>: <tmpl_string> ]
(四)、远程读写配置
# 远程存储 influxdb
remote_write:
- url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
remote_read:
- url: "http://localhost:8086/api/v1/prom/read?db=prometheus"
remote_write
# 远程地址
url: <string>
# 其他参数参考地址
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
remote_read
# 远程地址
url: <string>
# 其他参数参考地址
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
五、告警管理
(一)、用途
(二)、配置
global: # 全局配置
resolve_timeout: 5m # 解决报警时间间隔
# 分发的规则
route:
group_by: ['alertname','department']
group_wait: 10s
group_interval: 10s
repeat_interval: 40m
receiver: 'webhook1'
routes:
# webhook1
- receiver: 'webhook1'
group_wait: 10s
continue: true
# webhook2
- receiver: 'webhook2'
group_wait: 10s
# 标签匹配
match_re:
department: demo|demo1
# 接受者,可以是邮箱,wechat或者web接口等等
receivers:
# 钉钉告警
- name: 'webhook2'
webhook_configs:
- url: 'http://localhost:8060/dingtalk/webhook2/send'
send_resolved: true
# 默认通知
- name: 'webhook1'
webhook_configs:
- url: 'http://localhost:8060/dingtalk/webhook1/send'
send_resolved: true
# 抑制的规则
inhibit_rules:
- source_match:
severity: 'critical'
target_match_re:
severity: 'warning|major'
equal: ['alertname', 'dev', 'instance']
global全局配置
global:
# 邮件告警全局配置
[ smtp_from: <tmpl_string> ]
[ smtp_smarthost: <string> ]
[ smtp_hello: <string> | default = "localhost" ]
[ smtp_auth_username: <string> ]
[ smtp_auth_password: <secret> ]
[ smtp_auth_identity: <string> ]
[ smtp_auth_secret: <secret> ]
[ smtp_require_tls: <bool> | default = true ]
# 微信告警全局配置
[ wechat_api_url: <string> | default = "https://qyapi.weixin.qq.com/cgi-bin/" ]
[ wechat_api_secret: <secret> ]
[ wechat_api_corp_id: <string> ]
# 解决报警时间间隔
[ resolve_timeout: <duration> | default = 5m ]
templates消息模板
{{ define "wps.html" }}
<table border="1">
<tr><td>报警项</td>
<td>地址</td>
<td>描述</td>
{{ range $i, $alert := .Alerts }}
<tr><td>{{ index $alert.Labels "alertname" }}</td>
<td>{{ index $alert.Labels "instance" }}</td>
<td>{{ index $alert.Annotations "description" }}</td>
{{ end }}
</table>
{{ end }}
route路由分发规则
# 默认接收者
[ receiver: <string> ]
# 分组依据
[ group_by: '[' <labelname>, ... ']' ]
# 是否继续匹配后续同级节点
[ continue: <boolean> | default = false ]
# 告警必须一组等于匹配器才能匹配节点
match:
[ <labelname>: <labelvalue>, ... ]
# 告警必须满足一组正则表达式匹配器才能匹配节点
match_re:
[ <labelname>: <regex>, ... ]
# 发送组通知的初始等待时间,默认30s
[ group_wait: <duration> | default = 30s ]
# 发送新告警之前需要等待的时间,默认5分钟
[ group_interval: <duration> | default = 5m ]
# 发送成功后,重复发送间隔时间,默认4小时
[ repeat_interval: <duration> | default = 4h ]
# 子路由
routes:
[ - <route> ... ]
receivers 消息接收配置
# 接收者唯一名称
name: <string>
# 多个通知的集成配置,推送使用webhook方式
email_configs:
[ - <email_config>, ... ]
pagerduty_configs:
[ - <pagerduty_config>, ... ]
pushover_configs:
[ - <pushover_config>, ... ]
slack_configs:
[ - <slack_config>, ... ]
opsgenie_configs:
[ - <opsgenie_config>, ... ]
webhook_configs:
[ - <webhook_config>, ... ]
victorops_configs:
[ - <victorops_config>, ... ]
wechat_configs:
[ - <wechat_config>, ... ]
webhook_configs配置
# 是否通知已处理的告警,默认通知
[ send_resolved: <boolean> | default = true ]
# webhook的api地址
url: <string>
# http配置,默认读取全局http_config配置
[ http_config: <http_config> | default = global.http_config ]
# 单个webhook的最大告警数
# 默认为0,表示发送所有告警
[ max_alerts: <int> | default = 0 ]
inhibit_rules抑制规则配置
# 告警在匹配器中将被静默
target_match:
[ <labelname>: <labelvalue>, ... ]
# 告警在正则表达式匹配器中将被静默
target_match_re:
[ <labelname>: <regex>, ... ]
# 必须有一组等于匹配器,抑制才能生效
source_match:
[ <labelname>: <labelvalue>, ... ]
# 必须满足一组正则表达式匹配器,抑制才是生效
source_match_re:
[ <labelname>: <regex>, ... ]
# 只有源和目标中的值必须相等的标签,抑制才能生效
[ equal: '[' <labelname>, ... ']' ]
六、PromQL
(一)、简述
Prometheus 提供了一种功能表达式语言 PromQL,允许用户实时选择和汇聚时间序列数据。表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部系统通过 HTTP API 调用。
http_requests_total
http_requests_total{job="apiserver", handler="/api/comments"}
http_requests_total{job="apiserver", handler="/api/comments"}[5m]
(二)、表达式语言数据类型
一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。
一组时间序列,每个时间序列包含一段时间范围内的样本数据。
一个浮点型的数据值。
一个简单的字符串值。
(三)、字面量
1. 字符串可以用单引号、双引号或反引号指定为文字常量。
2. PromQL 遵循与 Go 相同的转义规则。在单引号或双引号中,用反斜杠来表示转义序列,后面可以跟 a, b, f, n, r, t, v 或 \。特殊字符可以使用八进制(\nnn)或者十六进制(\xnn,\unnnn 和 \Unnnnnnnn)。
3. 与 Go 不同,Prometheus 不会对反引号内的换行符进行转义。
标量浮点值可以字面上写成 [-](digits)[.(digits)] 的形式。
(四)、时间序列过滤器
瞬时向量过滤器
1. 瞬时向量过滤器允许在指定的时间戳内选择一组时间序列和每个时间序列的单个样本值。
2. 可以通过向花括号({})里附加一组标签来进一步过滤时间序列。
3. PromQL 还支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配。总共有以下几种标签匹配运算符:
= 完全相同
!= 不相同
=~ 相匹配
!~ 不匹配
4. 没有指定标签的标签过滤器会选择该指标名称的所有时间序列。
5. 所有的 PromQL 表达式必须至少包含一个指标名称,或者一个不会匹配到空字符串的标签({job=~".*"})过滤器。
区间向量过滤器
1. 区间向量与瞬时向量的工作方式类似,唯一的差异在于在区间向量表达式中我们需要定义时间选择的范围,时间范围通过时间范围选择器 [] 进行定义,以指定应为每个返回的区间向量样本值中提取多长的时间范围。
2. 时间范围通过数字来表示,单位可以使用以下其中之一的时间单位:
3. 示例
# 5分钟内http_requests_total指标,job标签值为prometheus的所有时间序列
http_requests_total{job="prometheus"}[5m]
时间位移操作
1. 位移操作的关键字为 offset
2. 示例
# 瞬时向量-当前查询时间过去5分钟的http_requests_total值:
http_requests_total offset 5m
# 区间向量-http_requests_total一周前的5分钟之内的HTTP请求量的增长率:
rate(http_requests_total[5m] offset 1w)
(五)、操作符
二元运算符
1. 算数运算
+ - * / % ^ 等
2. 布尔运算
== != > < >= <=
3. 逻辑运算
and or unless
4. 运算符优先级,从高到底:
^, *, /, %, + , - , ==, !=, <=, <, >=, > , and, unless , or
1. 描述
向量与向量之间进行运算操作时会基于默认的匹配规则:依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃。
2. 一对一匹配
vector1 <operator> vector2
# ignoring可以在匹配时忽略某些便签
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
# on将匹配行为限定在某些便签之内
<vector expr> <bin-op> on(<label list>) <vector expr>
3. 多对一/一对多匹配
# 修饰符
<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>
sum (求和)
min (最小值)
max (最大值)
avg (平均值)
stddev (标准差)
stdvar (标准差异)
count (计数)
count_values (对 value 进行计数)
bottomk (样本值最小的 k 个元素)
topk (样本值最大的k个元素)
quantile (分布统计)
(六)、内置函数
irate()
1. 用于计算区间向量的增长率。但是其反应出的是瞬时增长率。irate 函数是通过区间向量中最后两个两本数据来计算区间向量的增长速率,它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。
2. 示例
# 区间向量中每个时间序列过去 5 分钟内最后两个样本数据的 HTTP 请求数的增长率
irate(http_requests_total{job="api-server"}[5m])
label_join()
1. label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...) 函数可以将时间序列 v 中多个标签 src_label 的值,通过 separator 作为连接符写入到一个新的标签 dst_label 中。可以有多个 src_label 标签。
2. 示例(新加foo标签,标签值为"etcd,etcd-k8s")
label_join(up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"}, "foo", ",", "job", "service")
rate()
1. rate(v range-vector) 函数可以直接计算区间向量 v 在时间窗口内平均增长速率,它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。该函数的返回结果不带有度量指标,只有标签列表。
2. rate() 函数返回值类型只能用计数器,在长期趋势分析或者告警中推荐使用这个函数。
3. 示例
# 区间向量中每个时间序列过去 5 分钟内 HTTP 请求数的每秒增长率
rate(http_requests_total[5m])
sort()/sort_desc()
sort(v instant-vector) 函数对向量按元素的值进行升序排序
sort_desc(v instant-vector) 函数对向量按元素的值进行降序排序
1. abs() 绝对值
2. absent() 如果传递给它的向量参数具有样本数据,则返回空向量;如果传递的向量参数没有样本数据,则返回不带度量指标名称且带有标签的时间序列,且样本值为1。
3. ceil() 所有元素的样本值向上四舍五入到最接近的整数
4. floor() 与 ceil() 函数相反,将 v 中所有元素的样本值向下四舍五入到最接近的整数。