4. PagerDuty 集成配置:监控系统与 Webhook/API 对接
将监控系统(Prometheus、Datadog、Zabbix)与 PagerDuty 集成,是构建可观测性事件响应链路的核心环节。本章聚焦三种主流监控工具的集成配置方法,涵盖 Webhook 推送、API 驱动、以及事件去重与路由策略。
4.1 集成架构总览
PagerDuty 通过 Event API(v2)接收外部监控系统的事件。监控系统作为事件源,将告警封装为 JSON 负载,通过 Webhook 或直接 API 调用发送至 PagerDuty 的集成端点。PagerDuty 根据集成密钥(Integration Key)将事件路由到对应的服务,触发通知、升级策略和响应流程。
4.2 Prometheus + Alertmanager → PagerDuty
Prometheus 通过 Alertmanager 的 Webhook Receiver 将告警转发至 PagerDuty。推荐使用 PagerDuty 官方提供的 pagerduty-receiver 或直接配置 webhook_configs。
4.2.1 配置步骤
- 在 PagerDuty 创建服务:进入 Services → New Service,输入服务名称,选择 "Prometheus" 作为集成类型,复制生成的 Integration Key。
- 配置 Alertmanager:编辑
alertmanager.yml,添加 PagerDuty 接收器。
# alertmanager.yml 示例
route:
receiver: 'pagerduty-critical'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'pagerduty-critical'
webhook_configs:
- url: 'https://events.pagerduty.com/v2/enqueue'
send_resolved: true
http_config:
headers:
Content-Type: application/json
# 使用模板生成事件负载
body: |
{
"routing_key": "YOUR_INTEGRATION_KEY",
"event_action": "trigger",
"payload": {
"summary": "{{ .GroupLabels.alertname }}",
"severity": "critical",
"source": "{{ .GroupLabels.instance }}",
"custom_details": {
"description": "{{ .CommonAnnotations.description }}",
"runbook_url": "{{ .CommonAnnotations.runbook_url }}"
}
}
}
send_resolved: true 让 PagerDuty 自动关闭已恢复的告警。在 Alertmanager 模板中,通过 .GroupLabels 和 .CommonAnnotations 传递丰富的上下文信息,便于值班人员快速定位。
4.3 Datadog → PagerDuty 集成
Datadog 提供原生 PagerDuty 集成,支持自动创建/更新/关闭事件。集成方式分为 OAuth 应用集成 和 Webhook 手动集成 两种。
4.3.1 OAuth 集成(推荐)
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | Datadog → Integrations → PagerDuty | 点击 "Install" 并授权 OAuth |
| 2 | 选择 PagerDuty 服务 | 将 Datadog 服务映射到 PagerDuty 服务 |
| 3 | 配置 Monitor 通知 | 在 Monitor 消息中添加 @pagerduty 触发 |
4.3.2 Webhook 手动集成
当 OAuth 不可用时,可使用 Datadog Webhook 集成直接调用 PagerDuty Event API。
# Datadog Webhook 配置示例
name: pagerduty-webhook
url: https://events.pagerduty.com/v2/enqueue
payload:
routing_key: "YOUR_INTEGRATION_KEY"
event_action: "trigger"
payload:
summary: "$EVENT_TITLE"
severity: "$SEVERITY"
source: "$HOSTNAME"
custom_details:
monitor_id: "$MONITOR_ID"
monitor_url: "$MONITOR_URL"
tags: "$TAGS"
headers:
Content-Type: application/json
$SEVERITY 变量取值可能为 "error"、"warning"、"info"、"success"。PagerDuty 接受的 severity 为 "critical"、"error"、"warning"、"info"。建议在 Webhook 模板中做映射转换,例如:"severity": "$SEVERITY" == "error" ? "critical" : "$SEVERITY"。
4.4 Zabbix → PagerDuty 集成
Zabbix 通过 Action + Script 或 Webhook 媒体类型(Zabbix 5.0+)与 PagerDuty 对接。推荐使用 Zabbix 内置的 Webhook 媒体类型,无需额外脚本。
4.4.1 使用 Zabbix Webhook 媒体类型
- 导入媒体类型:Administration → Media types → Import,导入 PagerDuty 官方提供的 XML 模板。
- 配置参数:设置
pagerduty_routing_key、pagerduty_event_source、pagerduty_severity。 - 关联用户:将媒体类型分配给 Zabbix 用户,并填入用户的 PagerDuty 集成密钥。
- 配置 Action:在 Action 中设置条件,触发时发送消息到 PagerDuty。
4.4.2 传统 Script 方式(Zabbix 4.x)
#!/bin/bash
# pagerduty_alert.sh - Zabbix AlertScript
INTEGRATION_KEY="$1"
EVENT_SUMMARY="$2"
SEVERITY="$3"
HOST="$4"
curl -X POST https://events.pagerduty.com/v2/enqueue \
-H "Content-Type: application/json" \
-d '{
"routing_key": "'"$INTEGRATION_KEY"'",
"event_action": "trigger",
"payload": {
"summary": "'"$EVENT_SUMMARY"'",
"severity": "'"$SEVERITY"'",
"source": "'"$HOST"'"
}
}'
4.5 事件去重与路由策略
PagerDuty 的 Deduplication Key(dedup_key)是控制事件去重和关联的核心字段。相同 dedup_key 的事件会被 PagerDuty 视为同一事件的不同状态更新,避免重复告警。
4.5.1 去重键生成策略
| 监控系统 | 推荐 dedup_key 生成方式 | 示例 |
|---|---|---|
| Prometheus | {{ .GroupLabels.alertname }}-{{ .GroupLabels.instance }} |
HighCPUUsage-web-01 |
| Datadog | $MONITOR_ID-$HOSTNAME |
123456-web-01 |
| Zabbix | {TRIGGER.ID}-{HOST.HOST} |
7890-web-01 |
4.6 集成验证与故障排查
- 使用
curl手动发送测试事件到 PagerDuty Event API,确认返回status: "success"。 - 在 PagerDuty 的 "Incidents" 页面检查事件是否到达,确认 severity、summary 字段正确。
- 检查监控系统的 Webhook 日志,确认 HTTP 200 响应和延迟。
- 验证 resolved 事件能否自动关闭 PagerDuty 事件。
# 手动测试 PagerDuty Event API
curl -X POST https://events.pagerduty.com/v2/enqueue \
-H "Content-Type: application/json" \
-d '{
"routing_key": "YOUR_INTEGRATION_KEY",
"event_action": "trigger",
"payload": {
"summary": "Test alert from curl",
"severity": "info",
"source": "testing-tool"
}
}'
# 预期响应:{"status":"success","message":"Event processed","dedup_key":"..."}
- 事件未到达:检查集成密钥是否正确,监控系统网络是否能访问
events.pagerduty.com。 - 事件重复:未设置 dedup_key 或 dedup_key 生成规则不唯一。
- severity 不匹配:PagerDuty 只接受 critical/error/warning/info,其他值会被降级为 info。
- Webhook 超时:PagerDuty 要求 30 秒内响应,超时会导致事件丢失。
4.7 安全与密钥管理
集成密钥(Integration Key)是敏感凭证,泄露后可能导致恶意告警或服务中断。建议遵循以下安全实践:
- 密钥轮换:每 90 天在 PagerDuty 服务设置中重新生成集成密钥。
- 最小权限:每个监控系统使用独立的集成密钥,避免跨服务复用。
- 加密存储:在配置管理工具(Ansible、Terraform)中使用加密变量或 Vault 存储密钥。
- 审计日志:启用 PagerDuty 审计日志,监控集成密钥的使用情况。
pagerduty_service_integration 资源管理集成密钥,通过 CI/CD 管道自动部署和轮换,减少人工操作风险。