在 HelloWorld 应用与 PagerDuty 集成时,关键步骤是:在 PagerDuty 控制台创建服务并为该服务生成 Events API(集成键),在应用端用该集成键通过 Events API v2 发送触发(trigger)与解决(resolve)事件;同时做好本地测试、日志记录和重试策略,以保证告警可靠到达并能被正确关联与处理。

为什么要把 HelloWorld 应用接入 PagerDuty
简单来说,把应用的告警接入 PagerDuty 可以让运维和开发在问题发生时及时收到通知、明确负责人并记录事件生命周期。对于一个 HelloWorld 级别的示例应用,这个过程也正是学习告警设计、事件格式与自动化响应的最短路径。
你会学到什么(高层次)
- PagerDuty 的核心概念:服务、集成键(integration key / routing key)、事件类型(trigger/acknowledge/resolve)。
- 如何创建服务、生成 Events API v2 的集成键。
- 如何从 HelloWorld 应用通过 HTTP 请求发送事件,并用示例代码(curl、Python、Node.js)验证。
- 常见错误、调试方法与生产化建议(去重、速率限制、重试等)。
先理解几个概念(用最朴素的语言)
如果把告警系统当作邮局:
- 服务(Service)就像收件人地址簿里的条目,你告诉 PagerDuty:这类告警应交给谁或哪些值班组处理。
- 集成键 / routing key是邮寄地址上的门牌号,有了它才能把信(事件)投递到正确的服务。
- 事件(Event)是你发出的信,内部包含标题、优先级、时间戳、唯一标识等信息。
- 触发(trigger)代表“发生问题”,解决(resolve)代表“问题已结束”,还有确认(acknowledge)等状态。
准备工作(你需要什么)
- 一个 PagerDuty 帐号(有管理员权限更便于创建服务和 API 密钥)。
- HelloWorld 应用的代码编辑权限(可以发 HTTP 请求)。
- 可以运行 curl 或者 Python / Node 环境用于测试。
| 项 | 用途 |
| PagerDuty 账号 | 管理控制台创建服务、查看事件、配置通知规则 |
| Events API 集成键 | 发送事件的必须凭证(Routing Key) |
| 应用侧 HTTP 客户端 | 向 PagerDuty Events API 发出 POST 请求 |
在 PagerDuty 上创建服务并生成集成键(按步骤)
这里按最常见的控制台操作顺序说明:
- 登录 PagerDuty 控制台,进入 Configuration → Services(或 Services → Service Directory)。
- 点击“Create Service”或“New Service”。
- 填写服务名称(例如 HelloWorld Service),选择服务类型与响应规则(默认即可,后续可调整)。
- 在 Integrations 区域添加一个新的 Integration,选择 Events API v2 类型(或名称含“Events API v2”)。
- 创建后你会看到一个 Integration Key(也叫 Routing Key 或eric key),把它复制并妥善保管。
注意:如果你没有看到 Events API v2 选项,可能是账号权限或计划限制,联系管理员或升级计划。
事件格式与发送规则(Events API v2 快速说明)
Events API v2 使用 JSON 的请求体,最基本的字段包括:routing_key、event_action、payload(包含summary、source、severity 等)。下面是一个最小可用的结构:
{
"routing_key": "YOUR_INTEGRATION_KEY",
"event_action": "trigger",
"payload": {
"summary": "Example problem",
"source": "helloworld-app",
"severity": "error"
}
}
字段说明(简明):
- routing_key:前面生成的集成键。
- event_action:trigger / acknowledge / resolve。
- payload.summary:简短的告警标题,建议包含关键失败点。
- payload.source:告警来源,通常是主机名或应用名。
- payload.severity:info / warning / error / critical(用于通知策略)。
从 HelloWorld 应用发送事件:示例与说明
下面给出三种常见方式:curl、Python(requests)和 Node.js(fetch/axios)。代码都很短,只为演示基本流程。
1) 使用 curl
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":"HelloWorld failed to start","source":"helloworld-app","severity":"error"}}'
如果返回 202 Accepted 即表示 PagerDuty 已接收事件;响应体会有事件的 id,可以记录以便后续关联。
2) Python 示例(requests)
import requests, json
url = 'https://events.pagerduty.com/v2/enqueue'
data = {
"routing_key": "YOUR_INTEGRATION_KEY",
"event_action": "trigger",
"payload": {
"summary": "HelloWorld failed to start",
"source": "helloworld-app",
"severity": "error"
}
}
r = requests.post(url, json=data, timeout=5)
print(r.status_code, r.text)
3) Node.js 示例(fetch / axios)
// 使用 node-fetch 或内置 fetch(Node 18+)
const fetch = require('node-fetch');
const url = 'https://events.pagerduty.com/v2/enqueue';
const body = {
routing_key: 'YOUR_INTEGRATION_KEY',
event_action: 'trigger',
payload: { summary: 'HelloWorld failed to start', source: 'helloworld-app', severity: 'error' }
};
fetch(url, { method: 'POST', body: JSON.stringify(body), headers: { 'Content-Type':'application/json' } })
.then(r => r.text().then(t => console.log(r.status, t)))
.catch(e => console.error(e));
测试与验证(如何确认事件确实到达)
- 在 PagerDuty 控制台的 Incidents 页面查看是否出现新的事件。
- 检查返回的 HTTP 状态码与响应体(正常应为 202 并包含 dedup_key 或 id)。
- 在应用端记录请求响应与 Event ID,便于事后排查。
常见错误与排查思路
遇到问题别慌,按下面顺序排查比较快:
- 返回 400:通常是 JSON 格式错误或缺少 routing_key。检查字段拼写与 JSON 格式。
- 返回 401/403:集成键不正确或无权限,确认使用的是 Events API 的集成键,而不是 REST API 的令牌。
- 请求超时/网络错误:检查防火墙、代理与 DNS;可能需要允许出站到 events.pagerduty.com。
- 事件没有在控制台出现:检查 event_action 是否为 trigger,且 payload.summary 不为空;另外看是否被另一个规则过滤或路由到其它服务。
进一步的调试技巧
- 在发送请求时带上一个临时的 unique key(例如 timestamp 或 UUID)放在 payload 或 dedup_key 中,便于在控制台搜索。
- 查看 PagerDuty 的 Integration 日志(如果可用),部分企业版会提供更详细的接收日志。
- 用 Postman 或 curl 在本地先发出单次请求,确认 API 与密钥无误,再集成到应用中。
生产化建议(把 HelloWorld 的练习变成可靠流程)
- 幂等与去重:为相同告警使用相同的 dedup_key 或 routing 标识,避免重复告警泛滥。
- 重试策略:在发送失败时采用指数退避重试,并记录失败次数与时间戳。
- 速率控制:PagerDuty 对事件有速率限制,批量告警时需要聚合或限流,避免被短时间内拒绝。
- 日志与审计:保存每次发包的请求体与响应以便问题发生时能快速回溯。
- 敏感信息:不要把密码或密钥放在 payload.summary 中;routing key 应存放在安全配置或环境变量中。
进阶:双向集成与自动化响应
当告警进入 PagerDuty 后,它会产生一个 incident id,你可以在 HelloWorld 应用或自动化脚本中查询或调用 PagerDuty 的 REST API 来获取事件状态,进而实现自动扩容、回滚或其他修复动作。这里涉及到 REST API 的认证(Bearer token),以及更复杂的权限管理,适合在熟悉 Events API 的基础上再深入。
一个简单的自动化思路(伪代码)
当探针检测到错误:
发送 trigger 事件到 PagerDuty
如果返回 202:
记录 incident id
启动本地修复脚本(如重启服务)
如果修复成功:
发送 resolve 事件到 PagerDuty,包含 dedup_key/incident id
这样一来,PagerDuty 的事件记录既反映了告警触发,也能跟踪到自动化修复的过程。
一些你可能会遇到的细节问题(边做边遇到)
- 在多租户或多个环境(prod/staging)中,记得为每个环境创建独立的服务与集成键,避免环境间干扰。
- 如果你的应用运行在容器或无状态环境,确保 routing key 存在于安全的配置系统(例如 Kubernetes Secret 或云端密钥管理)。
- 发生大规模故障时,速率限制会变成瓶颈,提前设计告警降噪或聚合策略能节省大量人力。
常用字段参考表(便于复制粘贴)
| 字段 | 说明 |
| routing_key | Events API 的集成键,必须 |
| event_action | trigger / acknowledge / resolve |
| payload.summary | 简短的告警标题(必填建议) |
| payload.source | 告警来源,比如应用名或主机名 |
| payload.severity | info / warning / error / critical |
最后几点实用的小贴士(真香提示)
- 不要把所有日志都当成告警;先用本地规则过滤再发事件。
- 把告警信息写得有“可操作性”——说清楚发生了什么、在什么时间、在哪个组件,从而减少来回问问题的时间。
- 为重复出现的低优先级问题考虑用 dashboard 而不是持续告警,免得团队被打扰疲劳。
写到这里,想起当初把一个最基础的 HelloWorld 接入 PagerDuty 时,最费时间的不是写请求,而是把告警的含义和去重逻辑想清楚——系统越简单,后期越省心。你可以先把最小可行的触发流程做通,之后逐步增加幂等、重试和自动化,慢慢把它变成可靠的告警中枢。