本文目录导读:

实现脚本触发异常指标告警,通常有主动推送和被动采集两种模式,核心思路是:脚本扮演“数据生产者”或“决策者”,将异常信号发送给告警系统。
以下是几种主流的实现方案:
脚本直接调用告警 API(主动推送 - 最常用)
这是最直接的方式,脚本检测到异常后,直接调用监控系统(如 Prometheus Alertmanager、Zabbix、阿里云/腾讯云监控)的 API 发送告警。
适用场景:Prometheus + Alertmanager、自研监控系统、云厂商监控。
流程示例(使用 Python + Prometheus Alertmanager):
- 脚本逻辑:监控某个业务指标(如接口耗时、日志错误数、数据库连接池)。
- 检测到异常:指标超过阈值。
- 发起 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 模式):
- 脚本启动一个 HTTP 服务,暴露
/metrics端点。 - 脚本更新指标:在内部检测到异常时,更新一个 Prometheus Gauge。
- 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 风格):
- 编写检查脚本:
- 状态正常 →
exit 0,输出 "OK: All fine" - 出现警告 →
exit 1,输出 "WARNING: ..." - 出现严重告警 →
exit 2,输出 "CRITICAL: ..." - 未知错误 →
exit 3
- 状态正常 →
- 监控系统(如 Nagios、Zabbix)定期执行该脚本。
- 触发告警:当退出码为 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)分析后触发告警。
适用场景:日志量大的系统、非关键业务、希望利用现有日志平台。
- 脚本记录异常日志:
{"level": "ERROR", "timestamp": "...", "message": "订单处理失败", "error_code": 500} - 日志平台(如 Grafana Loki + LogQL):配置告警规则,匹配“消息内容包含 'ERROR' 且 error_code >= 500”。
- 触发通知:如果日志在某时间段内出现指定模式,发送告警。
| 方案核心 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 直接调用 API | 实时、灵活、控制权高 | 需网络权限、可能增加脚本复杂度 | 自定义业务告警、高实时性需求 |
| 暴露 /metrics | 标准化、可扩展、云原生 | 需要持续运行/被拉取 | Prometheus 生态、容器化环境 |
| 退出码/Stdout | 简单、兼容性强 | 告警粒度有限、轮询有延迟 | 传统监控系统、基础设施巡检 |
| 写入日志 | 低入侵、利用现有基础 | 延迟最高、依赖日志系统规则 | 非关键告警、全量审计、事后分析 |
建议:
- 如果你在 K8s 或使用 Prometheus:优先用 方案二(/metrics)。
- 如果你只有简单脚本且需要快速通知:用 方案一(调用 Webhook 或 Alertmanager API)。
- 如果你沿用 Zabbix 或 Nagios:用 方案三(Exit Code)。
需要针对某个具体工具(如阿里云监控、钉钉机器人)写示例吗?或者想了解如何在脚本中进行降噪(比如在 5 分钟内只发一次告警)?