grafana上流量监控告警

思路:

  • Prometheus 采集防火墙网卡流量(一般通过 node_exporter 或 snmp_exporter 获取网络接口指标)。

  • 写一个 Prometheus 规则,判断上行带宽速率是否超过 90 Mbps。

  • 将规则丢给 Alertmanager 发出告警。

  • Grafana 用来展示和验证。

SNMP 的指标名字一般是 ifHCInOctets / ifHCOutOctets,在 Prometheus 里通常会变成:

  • ifHCInOctets{ifDescr="wan0"} → 接口入向字节数(累计值)

  • ifHCOutOctets{ifDescr="wan0"} → 接口出向字节数(累计值)

我们要监控 上行流量,就是 ifHCOutOctets

 

1. PromQL 表达式

将字节数速率换算成 Mbps:

(rate(ifHCOutOctets{ifDescr="wan0"}[1m]) * 8) / 1000000 > 90

解释:

  • rate(...[1m]) → 过去 1 分钟的平均速率(单位:B/s)。

  • 8 → 转换成 bit/s。

  • 1000000 → 转换成 Mbps。

  • 大于 90 → 阈值 90 Mbps。


2. Prometheus 告警规则

/etc/prometheus/rules/traffic_rules.yml 写:

groups:
- name: firewall-snmp-rules
  rules:
  - alert: HighUploadTraffic
    expr: (rate(ifHCOutOctets{ifDescr="wan0"}[1m]) * 8) / 1000000 > 90
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "防火墙上行流量过高"
      description: "接口 wan0 上行流量持续超过 90 Mbps 已超过 1 分钟"

然后在 prometheus.yml 引入:

rule_files: - "rules/*.yml"

重启 Prometheus。


3. Alertmanager 通知

例如邮件告警(/etc/alertmanager/alertmanager.yml):

route:
  receiver: 'mail'

receivers:
- name: 'mail'
  email_configs:
  - to: "yourmail@example.com"
    from: "alert@example.com"
    smarthost: "smtp.example.com:587"
    auth_username: "alert@example.com"
    auth_password: "yourpassword"

4. Grafana 展示

在 Grafana 查询里用:

 
(rate(ifHCOutOctets{ifDescr="wan0"}[1m]) * 8) / 1000000

面板单位设置为 Mbps,即可实时查看上行速率。


Alertmanager 企业微信告警配置示例:

1. 获取 Webhook 地址

  • 在企业微信群 → 添加机器人 → 得到一个 URL,比如:

     
    https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx

2. Alertmanager 配置

/etc/alertmanager/alertmanager.yml 中写:

 
global:
  resolve_timeout: 5m

route:
  receiver: 'wecom'
  group_wait: 10s
  group_interval: 1m
  repeat_interval: 5m

receivers:
- name: 'wecom'
  webhook_configs:
  - url: 'http://127.0.0.1:5001'
    send_resolved: true

  

⚠️ 注意:Alertmanager 不直接支持企业微信机器人,所以我们要用一个 中间转发程序(比如 wechat-alertalertmanager-wechat-webhook,或者自己写一个简单的 Python/Go 脚本)来把 Alertmanager 的 webhook 消息转成企业微信格式。


3. 转发脚本示例(Python)

假设 Alertmanager 调用本地 http://127.0.0.1:5001,我们写个 Python 脚本把消息转发到企业微信:

from flask import Flask, request
import requests
import json

app = Flask(__name__)

# 企业微信机器人 Webhook
WECHAT_WEBHOOK = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"

@app.route('/', methods=['POST'])
def wecom_alert():
    data = request.json
    alerts = data.get("alerts", [])
    for alert in alerts:
        status = alert.get("status")
        labels = alert.get("labels", {})
        annotations = alert.get("annotations", {})
        summary = annotations.get("summary", "Prometheus 告警")
        description = annotations.get("description", "")

        message = f"""
        告警状态: {status}
        告警名称: {labels.get('alertname')}
        严重程度: {labels.get('severity')}
        摘要: {summary}
        描述: {description}
        """

        payload = {
            "msgtype": "text",
            "text": {
                "content": message
            }
        }

        requests.post(WECHAT_WEBHOOK, data=json.dumps(payload))
    return "ok"

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5001)

运行:

pip install flask requests
python wecom_webhook.py

4. 效果

  • Prometheus 触发告警 → Alertmanager 调用 http://127.0.0.1:5001 → Python 脚本转发到企业微信群 → 手机实时收到告警消息。


 

 编写systemd service 文件,让企业微信告警转发脚本在 CentOS7 上后台常驻运行:

1. 假设路径

  • Python 脚本路径:/opt/wecom/wecom_webhook.py

  • Python 环境:系统自带 /usr/bin/python3


2. systemd Service 文件

创建 /etc/systemd/system/wecom-alert.service

[Unit]
Description=WeCom Alertmanager Webhook Forwarder
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/wecom/wecom_webhook.py
WorkingDirectory=/opt/wecom
Restart=always
RestartSec=5
User=nobody
Group=nobody

[Install]
WantedBy=multi-user.target

3. 权限与目录

# 创建目录
mkdir -p /opt/wecom

# 把脚本放进去
cp wecom_webhook.py /opt/wecom/

# 给 nobody 用户访问权限(也可以改成专门的用户)
chown -R nobody:nobody /opt/wecom


4. 重新加载 systemd

systemctl daemon-reexec
systemctl enable wecom-alert
systemctl start wecom-alert

5. 查看状态 & 日志

systemctl status wecom-alert -l
journalctl -u wecom-alert -f

这样Python 转发程序就会随系统启动,并且崩溃后自动重启。

posted @ 2025-09-18 16:04  一口吃条鱼  阅读(82)  评论(0)    收藏  举报