脚本如何触发异常指标告警

wen 实用脚本 28

本文目录导读:

脚本如何触发异常指标告警

  1. 方案一:脚本直接调用告警 API(主动推送 - 最常用)
  2. 方案二:脚本输出特定信号,由外部系统采集(被动模式)
  3. 方案三:脚本作为告警规则的“数据计算引擎”
  4. 方案四:日志异常检测 + 告警(间接触发)

实现脚本触发异常指标告警,通常有主动推送被动采集两种模式,核心思路是:脚本扮演“数据生产者”或“决策者”,将异常信号发送给告警系统。

以下是几种主流的实现方案:

脚本直接调用告警 API(主动推送 - 最常用)

这是最直接的方式,脚本检测到异常后,直接调用监控系统(如 Prometheus Alertmanager、Zabbix、阿里云/腾讯云监控)的 API 发送告警。

适用场景:Prometheus + Alertmanager、自研监控系统、云厂商监控。

流程示例(使用 Python + Prometheus Alertmanager):

  1. 脚本逻辑:监控某个业务指标(如接口耗时、日志错误数、数据库连接池)。
  2. 检测到异常:指标超过阈值。
  3. 发起 HTTP 请求:向 Alertmanager 的 API 接口发送告警。
import requests
import json
def send_alert_to_alertmanager(alert_name, severity, summary, description):
    """发送告警到 Prometheus Alertmanager"""
    alertmanager_url = "http://your-alertmanager:9093/api/v1/alerts"
    payload = [{
        "labels": {
            "alertname": alert_name,
            "severity": severity,  # critical, warning, info
            "instance": "your_server_ip"
        },
        "annotations": {
            "summary": summary,
            "description": description
        },
        "startsAt": "2023-01-01T00:00:00.000Z" # 可自动生成
    }]
    headers = {'Content-Type': 'application/json'}
    response = requests.post(alertmanager_url, data=json.dumps(payload), headers=headers)
    print(f"Alert sent, status: {response.status_code}")
# 在你的脚本逻辑中调用
if some_metric > critical_threshold:
    send_alert_to_alertmanager(
        alert_name="HighErrorRate",
        severity="critical",
        summary="错误率超过警戒线",
        description=f"当前错误率 {some_metric}%,阈值 {critical_threshold}%"
    )
  • 优点:实时性强,控制权在脚本手里。
  • 缺点:需要网络权限,需要了解目标 Alertmanager 的地址。

替代方案

  • Zabbix:脚本通过 zabbix_sender 命令行工具发送数据。
    # 脚本逻辑后
    zabbix_sender -z zabbix-server -s "HostName" -k "trapper.key" -o "Error count: 100"
  • 调用企业微信/钉钉/飞书 Webhook:直接发送告警到聊天群。

脚本输出特定信号,由外部系统采集(被动模式)

脚本本身不直接发告警,而是将运行结果(如状态、指标值)写入特定文件日志标准输出,再由外部监控工具(Prometheus、Telegraf、Fluentd)采集并触发告警。

适用场景:Prometheus HTTP/Node Exporter、Zabbix Agent、容器化环境(K8s)。

流程示例(Prometheus 模式):

  1. 脚本启动一个 HTTP 服务,暴露 /metrics 端点。
  2. 脚本更新指标:在内部检测到异常时,更新一个 Prometheus Gauge。
  3. Prometheus 定期拉取:如果指标值异常,Prometheus 会在 Alertmanager 中触发告警规则。
from prometheus_client import start_http_server, Gauge
import time
# 定义一个自定义指标
error_rate = Gauge('my_app_error_rate', 'Current error rate')
def monitor_logic():
    while True:
        # 模拟检测异常
        current_rate = get_current_error_rate() # 你的检测逻辑
        error_rate.set(current_rate)
        if current_rate > 0.9:
            print("指标很高,会被 Prometheus 抓取到异常值")
            # 注意:这里不直接发告警,数值留给 Prometheus 规则判断
        time.sleep(5)
if __name__ == '__main__':
    start_http_server(8000) # 启动 metrics 端口
    monitor_logic()
  • 优点:标准、可扩展,适合微服务/云原生环境。
  • 缺点:脚本需要持续运行(或定期被调度)。

脚本作为告警规则的“数据计算引擎”

在监控系统中配置告警规则,但规则依赖脚本的退出码(Exit Code)标准输出(Stdout)

适用场景Nagios/ICINGA、Zabbix(Script Monitor)、Grafana SLO。

流程示例(Nagios 风格):

  1. 编写检查脚本
    • 状态正常 → exit 0,输出 "OK: All fine"
    • 出现警告 → exit 1,输出 "WARNING: ..."
    • 出现严重告警 → exit 2,输出 "CRITICAL: ..."
    • 未知错误 → exit 3
  2. 监控系统(如 Nagios、Zabbix)定期执行该脚本。
  3. 触发告警:当退出码为 1 或 2 时,系统自动告警。
# check_disk.py
import sys
disk_usage = 90 # 假设值
if disk_usage > 95:
    print(f"CRITICAL - Disk usage {disk_usage}%")
    sys.exit(2)
elif disk_usage > 80:
    print(f"WARNING - Disk usage {disk_usage}%")
    sys.exit(1)
else:
    print("OK - Disk usage normal")
    sys.exit(0)
  • 优点:脚本与监控系统解耦,兼容传统平台。
  • 缺点:告警频率受监控系统轮询周期影响。

日志异常检测 + 告警(间接触发)

脚本将异常或疑似问题写入结构化日志(JSON 格式),通过日志采集系统(ELK、Loki、Splunk)分析后触发告警。

适用场景:日志量大的系统、非关键业务、希望利用现有日志平台。

  1. 脚本记录异常日志
    {"level": "ERROR", "timestamp": "...", "message": "订单处理失败", "error_code": 500}
  2. 日志平台(如 Grafana Loki + LogQL):配置告警规则,匹配“消息内容包含 'ERROR' 且 error_code >= 500”。
  3. 触发通知:如果日志在某时间段内出现指定模式,发送告警。

方案核心 优点 缺点 推荐场景
直接调用 API 实时、灵活、控制权高 需网络权限、可能增加脚本复杂度 自定义业务告警、高实时性需求
暴露 /metrics 标准化、可扩展、云原生 需要持续运行/被拉取 Prometheus 生态、容器化环境
退出码/Stdout 简单、兼容性强 告警粒度有限、轮询有延迟 传统监控系统、基础设施巡检
写入日志 低入侵、利用现有基础 延迟最高、依赖日志系统规则 非关键告警、全量审计、事后分析

建议

  • 如果你在 K8s 或使用 Prometheus:优先用 方案二(/metrics)
  • 如果你只有简单脚本且需要快速通知:用 方案一(调用 Webhook 或 Alertmanager API)
  • 如果你沿用 Zabbix 或 Nagios:用 方案三(Exit Code)

需要针对某个具体工具(如阿里云监控、钉钉机器人)写示例吗?或者想了解如何在脚本中进行降噪(比如在 5 分钟内只发一次告警)?

抱歉,评论功能暂时关闭!