数据模型
prometheus将所有数据存储为时间序列:属于相同 metric名称和相同标签组(键值对)的时间戳值流。
metric(指标) 和 标签
每一个时间序列都是由其 metric名称和一组标签(键值对)组成唯一标识。metric名称代表了被监控系统的一般特征(如 http_requests_total
代表接收到的HTTP请求总数)。它可能包含ASCII字母和数字,以及下划线和冒号,它必须匹配正则表达式
[a-zA-Z_:][a-zA-Z0-9_:]*
标签给prometheus建立了多维度数据模型:对于相同的 metric名称,标签的任何组合都可以标识该 metric的特定维度实例(例如:所有使用POST方法到 /api/tracks 接口的HTTP请求)。查询语言会基于这些维度进行过滤和聚合。更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列。
标签名称可能包含ASCII字母、数字和下划线,它必须匹配正则表达式
[a-zA-Z_][a-zA-Z0-9_]*
另外,以双下划线__
开头的标签名称仅供内部使用。
指标名称
通常用于描述系统上要测定的某个特征,例如,htp_requcsts_total表示接收到的HTTP请求总数,支持使用字母、数字、下划线和冒号,且必须能匹配RE2规范的正则表达式。
Metric Name的表示方式有两种,后一种通常用于Prometheus内部:
Prometheus部署配置
系统 | IP地址 | 软件安装 | 节点node |
CentOS 7 | 10.0.0.14 | prometheus | node1 |
CentOS 7 | 10.0.0.15 | altermanager | node2 |
CentOS 7 | 10.0.0.16 | grafana | node3 |
下载prometheus
# 官网下载地址:https://prometheus.io/download/
wget https://github.com/prometheus/prometheus/releases/download/v2.28.1/prometheus-2.28.1.linux-amd64.tar.gz
# 解压缩
tar -xf prometheus-2.28.1.linux-amd64.tar.gz -C /usr/local/
# 重命名
cd /usr/local/ && mv prometheus-2.28.1.linux-amd64 prometheus
# 设置软链接
ln -s /usr/local/prometheus/prometheus /usr/bin/prometheus
配置systemd管理prometheus
# 创建prometheus用户
useradd -M -s /sbin/nologin prometheus
# 修改权限
chown -R prometheus:prometheus /usr/local/prometheus
# 编辑prometheus.service文件
vim /usr/lib/systemd/system/prometheus.service
示例文件1
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
WorkingDirectory=/usr/local/prometheus/
ExecStart=/usr/local/prometheus/prometheus
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -KILL $MAINPID
Type=simple
KillMode=control-group
Restart=on-failure
RestartSec=15s
[Install]
WantedBy=multi-user.target
示例文件 2
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
Environment="GOMAXPROCS=4"
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus \
--storage.tsdb.retention=30d \
--web.console.libraries=/usr/local/prometheus/console_libraries \
--web.console.templates=/usr/local/prometheus/consoles \
--web.listen-address=0.0.0.0:9090 \
--web.read-timeout=5m \
--web.max-connections=30 \
--query.max-concurrency=50 \
--query.timeout=2m \
# 开启热重启
--web.enable-lifecycle
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
NoNewPrivileges=true
LimitNOFILE=infinity
ReadWriteDirectories=/usr/local/prometheus
ProtectSystem=full
SyslogIdentifier=prometheus
Restart=always
[Install]
WantedBy=multi-user.target
配置alerting
:
启动好alertmanager后,还需要配置prometheus才能通过alertmanager告警。
vim /usr/local/prometheus/prometheus.yml #更改 alerting 内容
alerting:
alertmanagers:
- static_configs:
- targets:
- "10.0.0.15:9093"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['10.0.0.14:9090']
- job_name: 'nodes'
static_configs:
- targets: ['10.0.0.14:9100','10.0.0.15:9100','10.0.0.16:9100']
- job_name: 'alertmanager'
static_configs:
- targets: ['10.0.0.15:9093']
# 重启prometheus或者重载配置文件
systemctl restart prometheus 或者 systemctl reload prometheus
访问prometheus页面,Status
→ Targets
可以看到,之前部署的alertmanager状态是UP,说明运行正常。
至此,alertmanager部署完成。但alertmanager还需要进一步配置通知路由和通知接收者。
AlertManager配置
alertmanager通过命令行标志和配置文件进行配置。命令行标志配置不可变的系统参数时,配置文件定义禁止规则,通知路由和通知接收器。
alertmanager的配置文件alertmanager.yml
,它主要分以下几个配置块:
全局配置 global 通知模板 templates 路由配置 route 接收器配置 receivers 抑制配置 inhibit_rules
全局配置 global
:
global
指定在所有其他配置上下文中有效的参数。还用作其他配置部分的默认设置。
global:
# 默认的SMTP头字段
[ smtp_from: <tmpl_string> ]
# 默认的SMTP smarthost用于发送电子邮件,包括端口号
# 端口号通常是25,对于TLS上的SMTP,端口号为587
# Example: smtp.example.org:587
[ smtp_smarthost: <string> ]
# 要标识给SMTP服务器的默认主机名
[ smtp_hello: <string> | default = "localhost" ]
# SMTP认证使用CRAM-MD5,登录和普通。如果为空,Alertmanager不会对SMTP服务器进行身份验证
[ smtp_auth_username: <string> ]
# SMTP Auth using LOGIN and PLAIN.
[ smtp_auth_password: <secret> ]
# SMTP Auth using PLAIN.
[ smtp_auth_identity: <string> ]
# SMTP Auth using CRAM-MD5.
[ smtp_auth_secret: <secret> ]
# 默认的SMTP TLS要求
# 注意,Go不支持到远程SMTP端点的未加密连接
[ smtp_require_tls: <bool> | default = true ]
# 用于Slack通知的API URL
[ slack_api_url: <secret> ]
[ victorops_api_key: <secret> ]
[ victorops_api_url: <string> | default = "https://alert.victorops.com/integrations/generic/20131114/alert/" ]
[ pagerduty_url: <string> | default = "https://events.pagerduty.com/v2/enqueue" ]
[ opsgenie_api_key: <secret> ]
[ opsgenie_api_url: <string> | default = "https://api.opsgenie.com/" ]
[ wechat_api_url: <string> | default = "https://qyapi.weixin.qq.com/cgi-bin/" ]
[ wechat_api_secret: <secret> ]
[ wechat_api_corp_id: <string> ]
# 默认HTTP客户端配置
[ http_config: <http_config> ]
# 如果告警不包括EndsAt,则ResolveTimeout是alertmanager使用的默认值,在此时间过后,如果告警没有更新,则可以声明警报已解除
# 这对Prometheus的告警没有影响,它们包括EndsAt
[ resolve_timeout: <duration> | default = 5m ]
通知模板 templates
:
templates
指定了从其中读取自定义通知模板定义的文件,最后一个文件可以使用一个通配符匹配器,如templates/*.tmpl
templates:
[ - <filepath> ... ]
路由配置 route
:
route
定义了路由树中的节点及其子节点。如果未设置,则其可选配置参数将从其父节点继承。
每个告警都会在已配置的顶级路由处进入路由树,该路由树必须与所有告警匹配(即没有任何已配置的匹配器),然后它会遍历子节点。如果continue
设置为false,它将在第一个匹配的子项之后停止;如果continue
设置为true,则告警将继续与后续的同级进行匹配。如果告警与节点的任何子节点都不匹配(不匹配的子节点或不存在子节点),则根据当前节点的配置参数来处理告警。
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
接收器配置 receivers
:
receivers
是一个或多个通知集成的命名配置。建议通过webhook接收器实现自定义通知集成。
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
抑制规则配置 inhibit_rules
:
当存在与另一组匹配器匹配的告警(源)时,抑制规则会使与一组匹配器匹配的告警(目标)“静音”。目标和源告警的equal列表中的标签名称都必须具有相同的标签值。
在语义上,缺少标签和带有空值的标签是相同的。因此,如果equal源告警和目标告警都缺少列出的所有标签名称,则将应用抑制规则。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
默认配置示例:
vim /usr/local/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']