Prometheus组件架构
- Prometheus Server: 采用
PULL模式收集和存储时间序列数据。 - Client Library: 客户端库,生成 metrics。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
- Push Gateway: 提供
PUSH模式。主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,jobs 可以直接向 Push Gateway metrics。 - Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。如 node-exporter
- Alertmanager: 提供告警。从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
Prometheus组件安装
1. docker镜像包下载
docker pull prom/node-exporter
docker pull prom/prometheus
2. 启动node-exporter,用于机器系统数据收集
docker run -d -p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
--net="host" \
prom/node-exporter
启动成功即可访问:http://localhost:9100/metrics 页面展示的即是收集到的数据指标
3. 启动 pushgateway
docker pull prom/pushgateway
docker run -d -p 9091:9091 prom/pushgateway
4. 启动 alertmanager
配置 alertmanager.yml 配置文件
global:
resolve_timeout: 5m #处理超时时间,默认为5min
smtp_smarthost: 'xxxxxx' # 邮箱smtp服务器代理
smtp_from: 'xxxxxx' # 发送邮箱名称
smtp_auth_username: 'xxxxxx' # 邮箱名称
smtp_auth_password: 'xxxxxx' #邮箱密码
# 定义模板信心
templates:
- '/etc/alertmanager/templates/*.html'
route:
receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称
group_wait: 10s
group_interval: 1m
repeat_interval: 1m
group_by: ['alertname']
receivers:
- name: 'email' # 警报
email_configs: # 邮箱配置
- to: 'xxxxx@163.com' # 接收警报的email配置
html: '{{ template "test.html" . }}' # 设定邮箱的内容模板
headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
dockerfile如下:
FROM prom/alertmanager
ADD test.html /etc/alertmanager/templates/
ADD alertmanager.yml /etc/alertmanager/
启动 alertmanager:
docker run -d -p 9093:9093 my-alerts
5. 启动prometheus
新建 prometheus.yml 文件,配置 告警服务 和 告警规则,监听 pushgateway 的 scrape
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# 告警服务配置
alerting:
alertmanagers:
- static_configs:
- targets: ['test.host.com:9093'] # alertmanager部署地址
# 告警规则配置
rule_files:
- "alertmanager_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
# 添加 pushgateway 的 scrape
- job_name: pushgateway
static_configs:
- targets: ['test.host.com:9091'] # pushgateway部署地址
labels:
instance: pushgateway
⚠ 注意yaml文件格式,各种缩紧必须格式化!
配置 alertmanager_rules.yml 规则文件:
此处监控 flink 可用的task slot个数,小于 10个则告警
groups:
- name: test-rules
rules:
- alert: LowAvailableSlot # 告警名称
expr: flink_jobmanager_taskSlotsAvailable{job="pushgateway"} < 10 # 告警的判定条件,参考Prometheus高级查询来设定
for: 10s # 满足告警条件持续时间多久后,才会发送告警
labels: #标签项
team: flink
annotations: # 解析项,详细解释告警信息
summary: "{{$labels.instance}}: 资源告警"
description: "{{$labels.instance}}: job {{$labels.job}} 可用 slot 不足10个 "
dockerfile如下:
FROM prom/prometheus
ADD prometheus.yml /etc/prometheus/
ADD alertmanager_rules.yml /etc/prometheus/
启动 prometheus :
docker run -d -p 9090:9090 my-prometheus