数据模型

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 网络使用率 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

prometheus 网络使用率 prometheus数据协议_配置文件_02

可以看到,之前部署的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']