Google Cloud:Python应用自定义Stackdriver指标实现疑问
嘿,我来帮你搞定这个Stackdriver自定义指标的问题!既然你的日志已经正常写入了,那咱们离目标不远啦。我之前也踩过官方示例的坑,发现是因为文档里的示例可能用的是旧版客户端,现在官方推荐用v3版本的SDK,这大概率是你遇到问题的核心原因,下面一步步给你理顺:
解决Stackdriver自定义指标创建问题的实操指南
一、先换用新版SDK(官方旧示例的坑)
你看到的官方示例里的from google.cloud import monitoring是旧版v2客户端,现在已经被弃用了,官方推荐使用monitoring_v3,这可能是你代码跑不通的关键原因。先安装正确的依赖:
pip install google-cloud-monitoring
(没错,包名还是这个,但内部API已经升级到v3了)
二、权限先搞对,避免踩坑
不管用哪种方式,权限是第一步:
- 如果你的应用跑在GCE/GKE/Cloud Run这些GCP服务上,默认服务账号一般已经有
Monitoring Metric Writer权限,不用额外配置; - 如果是本地测试或者自建服务器,需要设置环境变量指向你的服务账号密钥文件:
同时确保这个服务账号绑定了export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json"Monitoring Metric Writer角色,不然会报权限错误。
三、完整可运行代码示例(针对特定代码块)
下面是针对“统计特定代码块执行次数”的完整代码,包含指标描述符创建(只需要跑一次)和指标数据上报(在代码块里调用):
from google.cloud import monitoring_v3 import time # 替换成你的GCP项目ID PROJECT_ID = "your-project-id-here" PROJECT_NAME = f"projects/{PROJECT_ID}" # 初始化v3客户端 client = monitoring_v3.MetricServiceClient() # ------------------------------ # 1. 创建自定义指标描述符(只需要执行一次!) # ------------------------------ def create_custom_metric(): descriptor = monitoring_v3.MetricDescriptor() # 自定义指标的唯一标识,必须以custom.googleapis.com/开头 descriptor.type = "custom.googleapis.com/my_specific_code_block_runs" # 指标类型:CUMULATIVE是累加计数,DELTA是增量,GAUGE是瞬时值 descriptor.metric_kind = monitoring_v3.MetricKind.CUMULATIVE # 值类型:这里统计次数用INT64,也可以用DOUBLE descriptor.value_type = monitoring_v3.ValueType.INT64 descriptor.description = "统计我的特定代码块执行次数" descriptor.display_name = "特定代码块执行次数" try: client.create_metric_descriptor(name=PROJECT_NAME, metric_descriptor=descriptor) print("自定义指标描述符创建成功!") except Exception as e: # 如果指标已经存在,忽略这个错误 if "Already Exists" in str(e): print("指标描述符已经存在,跳过创建") else: raise e # ------------------------------ # 2. 在特定代码块中上报指标数据 # ------------------------------ def record_code_block_execution(): # 构建时间序列数据 series = monitoring_v3.TimeSeries() series.metric.type = "custom.googleapis.com/my_specific_code_block_runs" # 资源类型:如果是全局指标用"global",如果是GCE实例用"gce_instance",按需调整 series.resource.type = "global" series.resource.labels["project_id"] = PROJECT_ID # 添加一个数据点:每次执行加1 point = monitoring_v3.Point() 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) series.points.append(point) # 上报数据到Stackdriver client.create_time_series(name=PROJECT_NAME, time_series=[series]) # ------------------------------ # 你的业务代码 # ------------------------------ def my_specific_code_block(): """这是你要监控的特定代码块""" print("正在执行我的特定代码块...") # 在这里调用指标上报函数 record_code_block_execution() # 其他业务逻辑... # 先执行一次创建指标描述符(之后可以注释掉) create_custom_metric() # 测试调用代码块 my_specific_code_block()
四、更省心的方案:从日志提取指标
既然你已经有日志写入Stackdriver了,其实还有个不用改太多代码的方法——从日志中提取自定义指标:
- 在你的特定代码块里,打日志的时候加一个固定的标记字段,比如:
import logging logging.info("特定代码块执行完成", extra={"event": "my_code_block_executed"}) - 登录Stackdriver Monitoring控制台,进入「指标」→「创建指标」;
- 数据源选择「日志」,然后编写日志过滤器:
jsonPayload.event="my_code_block_executed"; - 设置指标类型为「计数」,然后保存即可。
这种方式不需要引入额外的监控客户端依赖,也不用处理指标描述符的创建,适合快速实现。
常见问题排查
- 权限错误:检查服务账号是否有
Monitoring Metric Writer角色,本地测试是否正确设置了环境变量; - 指标看不到:Stackdriver指标有1-5分钟的延迟,等几分钟再看,或者检查时间范围是否选对;
- 重复创建指标报错:把
create_custom_metric()函数只执行一次,之后注释掉即可。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

