如何在GCP中自定义发送至PagerDuty的事件摘要?
自定义GCP告警发送至PagerDuty的事件摘要方法
完全可以对发送到PagerDuty的告警摘要进行自定义控制,主要有两种实用方案:
方案一:直接在告警策略中配置自定义通知内容
- 编辑或创建GCP告警策略时,进入「通知渠道」设置,选择已配置的PagerDuty渠道后,找到自定义通知内容的高级选项(部分服务的告警配置里,该选项可能藏在「通知设置」的展开面板中)。
- 你可以直接编写易懂的摘要文本,还能插入GCP提供的内置变量来动态填充告警细节,比如:
$resource.label.instance_name:告警关联的实例名称$metric.display_name:监控指标的显示名称$condition.value:当前指标的触发值$condition.threshold:告警阈值
举个例子,把默认的晦涩摘要替换成:实例[$resource.label.instance_name]的$metric.display_name超出阈值$condition.threshold%,当前值为$condition.value%,这样接收方一眼就能看懂告警核心信息。
方案二:通过Cloud Functions/Pub/Sub做中间处理(适合复杂场景)
如果需要更灵活的逻辑(比如根据告警类型动态生成不同风格的摘要、添加业务专属上下文),可以通过以下流程实现:
- 将GCP告警的目标通知渠道设置为Pub/Sub主题,让原始告警事件先发送到该主题。
- 创建Cloud Functions订阅这个Pub/Sub主题,编写代码解析原始告警的JSON payload,提取关键字段后重新构造符合需求的摘要。
- 调用PagerDuty的Events API,把自定义后的事件发送到PagerDuty。
示例Python代码片段:
import requests import json def process_gcp_alert(event, context): # 解析Pub/Sub传入的原始告警数据 alert_data = json.loads(event['data'].decode('utf-8')) incident_details = alert_data.get('incident', {}) resource_labels = alert_data.get('resource', {}).get('labels', {}) # 提取关键信息 instance_name = resource_labels.get('instance_name', '未知实例') metric_name = incident_details.get('condition', {}).get('metric', {}).get('displayName', '未知指标') current_value = incident_details.get('condition', {}).get('value', 'N/A') threshold = incident_details.get('condition', {}).get('thresholdValue', 'N/A') # 构造自定义摘要 custom_summary = f"GCP业务告警:{instance_name}的{metric_name}触发阈值,当前值{current_value},阈值{threshold}" # 发送到PagerDuty pagerduty_payload = { "routing_key": "YOUR_PAGERDUTY_ROUTING_KEY", "event_action": "trigger", "payload": { "summary": custom_summary, "source": "GCP监控系统", "severity": "critical" } } requests.post( "https://events.pagerduty.com/v2/enqueue", headers={"Content-Type": "application/json"}, json=pagerduty_payload )
注意事项
- 使用自定义通知内容时,要确认所用变量在当前告警的payload中存在,避免出现空值或无效信息。
- 采用Cloud Functions方案时,需给函数配置足够的IAM权限:允许读取Pub/Sub消息,同时允许调用PagerDuty的API。
内容的提问来源于stack exchange,提问作者Gratus D.
相关产品推荐
相关产品推荐

