如何将Stackdriver Error Reporting的错误出现次数转为监控计数器指标?
实现Stackdriver Error Reporting错误次数到Monitoring计数器的方案
完全可以实现你想要的需求——把Error Reporting中每个产品的错误出现次数转化为Stackdriver Monitoring的计数器指标,每次错误发生时自动递增。下面是具体的实现步骤和方案:
核心思路
利用Cloud Logging与Cloud Functions的联动,或者在错误上报的代码中直接集成Monitoring API,将每次错误事件转化为自定义监控指标的计数增量。这样既能保留Error Reporting的错误详情管理能力,又能借助Monitoring的告警、仪表盘功能和运维团队的现有集成流程对接。
方案一:通过Cloud Functions实时触发(无侵入代码)
这个方案不需要修改业务代码,借助Error Reporting的日志自动同步到Cloud Logging的特性,用Cloud Functions监听日志事件并更新监控指标:
1. 创建自定义监控指标
首先在Stackdriver Monitoring中创建一个计数器类型的自定义指标:
- 指标ID:比如
custom.googleapis.com/error_reporting/error_occurrences - 添加标签:
product(用于区分不同产品的错误) - 资源类型选择
global即可
2. 创建Cloud Function并配置触发源
- 触发源选择Cloud Logging,过滤条件设置为匹配Error Reporting的日志:
logName="projects/[你的项目ID]/logs/clouderrorreporting.googleapis.com%2Ferrors" - 给Cloud Function的服务账号添加
Monitoring Metric Writer角色,确保它有权限写入监控指标
3. 编写函数逻辑(Node.js示例)
const { MonitoringServiceClient } = require('@google-cloud/monitoring'); const client = new MonitoringServiceClient(); exports.incrementErrorCounter = async (event) => { // 解析日志内容 const logEntry = JSON.parse(Buffer.from(event.data, 'base64').toString()); // 从日志中提取产品标识(根据你的实际日志结构调整,比如从resource.labels或jsonPayload中取) const product = logEntry.jsonPayload.serviceContext.service || 'unknown_product'; const projectId = process.env.GCP_PROJECT; const projectPath = client.projectPath(projectId); // 构建监控指标的时间序列数据 const timeSeries = [{ metric: { type: 'custom.googleapis.com/error_reporting/error_occurrences', labels: { product } }, resource: { type: 'global', labels: { project_id: projectId } }, points: [{ interval: { endTime: { seconds: Date.now() / 1000 } }, value: { int64Value: '1' } }] }]; // 写入监控指标 try { await client.createTimeSeries({ name: projectPath, timeSeries }); console.log(`Successfully incremented counter for product: ${product}`); } catch (err) { console.error('Failed to write to Monitoring:', err); } };
方案二:代码中直接集成(更高效)
如果你的业务代码是通过Error Reporting客户端库上报错误的,可以在上报错误的同时直接调用Monitoring API递增计数器,减少中间环节:
Python示例代码
import time from google.cloud import error_reporting from google.cloud import monitoring_v3 # 初始化客户端 error_client = error_reporting.Client() monitoring_client = monitoring_v3.MetricServiceClient() project_name = f"projects/{error_client.project}" def report_error(product): try: # 模拟业务代码抛出错误 raise RuntimeError("Sample business error") except Exception as e: # 上报到Error Reporting error_client.report_exception() # 递增监控计数器 series = monitoring_v3.TimeSeries() series.metric.type = "custom.googleapis.com/error_reporting/error_occurrences" series.metric.labels["product"] = product series.resource.type = "global" series.resource.labels["project_id"] = error_client.project # 设置计数增量为1 point = series.points.add() point.value.int64_value = 1 now = time.time() point.interval.end_time.seconds = int(now) point.interval.end_time.nanos = int((now - int(now)) * 10**9) # 写入指标 monitoring_client.create_time_series(name=project_name, time_series=[series])
后续集成与使用
完成上述配置后,你可以:
- 在Stackdriver Monitoring中创建仪表盘,按
product标签拆分,展示各产品的错误次数趋势 - 配置告警规则:比如当某个产品的错误次数在5分钟内超过10次时,触发邮件/短信/运维工具的通知
- 利用Monitoring的API将指标数据同步到运维团队的现有监控平台
内容的提问来源于stack exchange,提问作者Sebastian Buehnemann
相关产品推荐
相关产品推荐

