前言
大部分情况下,Prometheus周期性调用HTTP接口获取监控数据。某些情况下,主机无法暴露接口,或者不需要频繁推送数据,可以使用pushgateway进行主动数据上报。
此外,对于主动上报的数据,本文还将讨论Prometheus的告警设置。
什么是Pushagateway
PushGateway 作为 Prometheus 生态中的一个重要一员,它允许任何客户端向其 Push 符合规范的自定义监控指标,在结合 Prometheus 统一收集监控。
配置Pushgateway
使用docker的方式配置后运行,9091端口便是push入口
docker pull prom/pushgateway
docker run -d --name=pg -p 9091:9091 prom/pushgateway
接入Prometheus
打开prometheus.yml文件,在scrape_configs内添加下面配置:
- job_name: pushgateway
static_configs:
- targets: ['127.0.0.1:9091']
labels:
instance: pushgateway
重启Promtheus后,Promtheus Server便会定期从Pushgateway拉取数据。
如何推送数据至Pushgateway
假设某服务器上存在一个后台进程,它会周期性检测机器的状态,当发生异常时,则推送数据至Pushgateway。
在Bash脚本中,我们可以使用curl命令完成推送。
#!/bin/bash
# 定义 Pushgateway 地址和端口
pushgateway="127.0.0.1:9091"
# 定义指标名称和值
metric_name="memory_used"
metric_value=70
# 定义错误变量
error=1
# 判断是否推送指标
if [ "$error" -eq 1 ]; then
# 拼接推送指标的字符串
data="$metric_name $metric_value"
# 发送指标数据到 Pushgateway
echo -n "$data" | curl --data-binary @- "$pushgateway/metrics/job/my_job"
fi
bash中,推送的URL为127.0.0.1:9091/metrics/job/my_job。其中job为tag_name,my_job为tag_value。我们可以以此类推添加多个tag。
比如127.0.0.1:9091/metrics/job/test_job/instance/local/就是添加了{job:test_job, instance:local}两个tag。
如何删除Pushgateway上的数据
类似地,使用curl就能完成删除的指令。
curl -X DELETE 127.0.0.1:9091/metrics/job/test_job/instance/local
被动上报与主动上报
上面讨论了Pushgateway的上报方式,也就是主动上报的形式。那么,普通HTTP接口和Pushgateway的区别是什么呢?
上报方式 | 简述 | 优点 | 缺点 |
被动上报/pull | 客户端使用library,变成exporter,然后prometheus server定时从exporter pull数据。 | 某一个节点挂了,时序缺失,Prometheus能感知到 | 无 |
主动上报/push | 使用pushgateway,所有客户端push数据到pushgateway,然后prometheus server定时从pushgateway pull数据。 | 解决客户端无法暴露接口等安全问题 | 如果某一个上报方挂了,pushgateway无法感知上报方的状态 |
总的说来,被动上报(pull)更好,也是官方推荐的数据上报方式,但push方式能解决上报难问题,具体问题要具体分析。
设置告警规则
在yml中配置告警规则
groups:
- name: Prometheus.rules
rules:
- alert: Memory Usage Too High
expr: memory_used{job="test_job", instance="local"} > 70
for: 2m
labels:
severity: critical
annotations:
title: 'Memory Usage Too High'
description: "memory used too high"
- alert:告警规则的名称;
- expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件;
- for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending;
- labels:自定义标签,允许用户指定要附加到告警上的一组附加标签;
- annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager;
因此,上面的告警规则定义了,当内存使用高于70%且持续2分钟时,便会发出警告。
另外,prometheus.yml中需要配置好rule文件的路径
rule_files:
[ - <filepath_glob> ... ]
告警规则例子
groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: |
sum(avg without (cpu)(irate(node_cpu{mode!='idle'}[5m]))) by (instance) > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} CPU usage high"
description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
- alert: hostMemUsageAlert
expr: |
(node_memory_MemTotal - node_memory_MemAvailable) / node_memory_MemTotal > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} MEM usage high"
description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
上面展示的告警规则为
- 当CPU 最近5分钟内的平均使用率高于85%且保持了1分钟后,发出告警
- 当内存使用率高于85%后且保持了1分钟后,发出告警
告警方式
prometheus.yml只是定义了规则,“告警”这一动作还需由AlertManager进行。AlertManager可以通过邮件、即时通讯软件等方式发送告警。另外,AlertManager还拥有丰富的自定义功能,管理告警间隔、告警分组、receiver分组、告警路由等等。
下面是一个最简单的邮件发送告警,通过SMTP配置发送者,receivers中配置接收者。
global:
smtp_smarthost: 'smtp.163.com:25'
smtp_from: 'xxx@163.com'
smtp_auth_username: 'xxx@163.com'
smtp_auth_password: 'xxxxxx' # 邮箱的授权密码
smtp_require_tls: false
templates:
- '/alertmanager/template/*.tmpl'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 10m
receiver: default-receiver
receivers:
- name: 'default-receiver'
email_configs:
- to: 'xxx@qq.com'
html: '{ alert.html }'
headers: { Subject: "Prometheus[WARN] 内存使用过高!!!" }