数据模型
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']