GCP自定义指标(User defined metric)无数据接收/显示求助
Google Cloud自定义指标无数据显示排查与修复
核心问题分析
你的代码存在几个关键错误,导致数据无法在Monitoring UI中显示:
- 指标标签不匹配:创建指标描述符时仅定义了
TestLabel标签,但推送时间序列时额外添加了function和data标签。自定义指标的标签必须严格与描述符定义一致,额外标签会导致数据被直接丢弃。 - 项目名称格式错误:Google Cloud API要求项目名称参数必须为
projects/[你的项目ID]格式,而非直接使用项目ID字符串。 - 函数调用参数不匹配:
create_time_series函数定义仅接受2个参数,但调用时传入了3个参数,实际运行会触发参数错误(可能是代码复制遗漏导致)。
修复后的代码示例
from google.cloud import monitoring_v3 from google.api_core import metric_pb2 as ga_metric from google.api_core import label_pb2 as ga_label import time # 初始化客户端 client = monitoring_v3.MetricServiceClient() # 正确的项目名称格式 project_name = f"projects/你的实际项目ID" # 创建指标描述符(仅需执行一次) descriptor = ga_metric.MetricDescriptor() descriptor.type = "custom.googleapis.com/rs_metric_test" descriptor.metric_kind = ga_metric.MetricDescriptor.MetricKind.GAUGE descriptor.value_type = ga_metric.MetricDescriptor.ValueType.DOUBLE descriptor.description = "This is a simple example of a custom metric." # 仅添加预定义的标签 labels = ga_label.LabelDescriptor() labels.key = "TestLabel" labels.value_type = ga_label.LabelDescriptor.ValueType.STRING labels.description = "This is a test label" descriptor.labels.append(labels) descriptor = client.create_metric_descriptor( name=project_name, metric_descriptor=descriptor ) print(f"Created {descriptor.name}.") # 推送时间序列函数 def create_time_series(client, test_label_value, metric_value): series = monitoring_v3.TimeSeries() series.metric.type = "custom.googleapis.com/rs_metric_test" series.resource.type = "global" series.resource.labels["project_id"] = "你的实际项目ID" # 仅使用指标描述符中定义的标签 series.metric.labels["TestLabel"] = test_label_value # 简化时间戳生成 now = time.time() end_time = monitoring_v3.Timestamp(seconds=int(now), nanos=int((now - int(now)) * 10**9)) interval = monitoring_v3.TimeInterval(end_time=end_time) point = monitoring_v3.Point(interval=interval, value={"double_value": metric_value}) series.points = [point] # 使用正确格式的项目名称 client.create_time_series(name=project_name, time_series=[series]) print("time series created") # 正确调用函数(参数数量匹配) replay_metric_client = monitoring_v3.MetricServiceClient() # 示例:传入TestLabel的值和要记录的指标数值 create_time_series(replay_metric_client, "test label for testing", 3.14)
额外排查步骤
- 确认指标描述符存在:在Cloud Monitoring控制台的「指标库」中搜索
custom.googleapis.com/rs_metric_test,检查是否存在且标签定义正确。 - 检查权限:确保Cloud Function使用的服务账号拥有
Monitoring Metric Writer角色(或包含monitoring.timeSeries.create权限的自定义角色)。 - 等待数据延迟:自定义指标数据通常需要5-10分钟才能在UI中显示,不要立即查看。
- 查看函数日志:在Cloud Function的日志页面搜索
monitoring相关条目,排查是否有隐藏的权限或格式错误。
内容的提问来源于stack exchange,提问作者Rudolph Sargenti
相关产品推荐
相关产品推荐

