GCP中基于Cloud Run日志创建监控仪表盘的替代方案咨询
解决GCP监控仪表盘历史数据问题的可行方案
1. 用BigQuery持久化日志+对接监控
- 给Cloud Logging配置日志导出,把包含
testRecord字段的日志全量导出到BigQuery。只要历史日志还在Cloud Logging的保留期内,就能一次性导出,之后新日志会自动同步过去。 - 在BigQuery里写SQL做累加计算,比如按小时聚合
totalAmount的总和:
SELECT TIMESTAMP_TRUNC(timestamp, HOUR) as time_hour, SUM(CAST(JSON_EXTRACT_SCALAR(json_payload, '$.testRecord.totalAmount') AS FLOAT64)) as total_amount_sum FROM `你的项目ID.你的数据集.你的日志表` GROUP BY time_hour ORDER BY time_hour
- 把这个BigQuery查询结果接入Cloud Monitoring:通过自定义查询数据源创建指标,之后就能在仪表盘中展示完整的累加数据了。
2. 代码里直接上报自定义监控指标
- 在Cloud Run服务里集成Cloud Monitoring的客户端库,每次事件触发写日志的时候,同时把
totalAmount和totalvalue的值上报到自定义监控指标里。 - 举个Python的例子:
import time from google.cloud import monitoring_v3 def report_metric(project_id, service_name, revision_name, amount): client = monitoring_v3.MetricServiceClient() project_name = client.project_path(project_id) series = monitoring_v3.TimeSeries() series.metric.type = "custom.googleapis.com/test_record/total_amount" series.resource.type = "cloud_run_revision" series.resource.labels["service_name"] = service_name series.resource.labels["revision_name"] = revision_name point = series.points.add() point.value.double_value = amount now = time.time() point.interval.end_time.seconds = int(now) point.interval.end_time.nanos = int((now - int(now)) * 10**9) client.create_time_series(project_name, [series]) # 事件触发时调用 report_metric("你的项目ID", "你的Cloud Run服务名", "你的版本名", 2.00)
- 这种方式从代码上线后就能实时收集数据,历史数据可以写个脚本批量读旧日志,计算后补报到监控里。
3. Cloud Functions补全历史数据+实时同步
- 先把历史日志导出到Cloud Storage或者BigQuery,写个Cloud Functions脚本遍历这些日志,把
totalAmount的累加值补报到自定义监控指标。 - 之后配置日志触发的Cloud Functions,每次有新日志就自动提取字段值更新监控指标,保证数据不中断。
内容的提问来源于stack exchange,提问作者sagar verma
相关产品推荐
相关产品推荐

