You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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了,其实还有个不用改太多代码的方法——从日志中提取自定义指标:

  1. 在你的特定代码块里,打日志的时候加一个固定的标记字段,比如:
    import logging
    logging.info("特定代码块执行完成", extra={"event": "my_code_block_executed"})
    
  2. 登录Stackdriver Monitoring控制台,进入「指标」→「创建指标」;
  3. 数据源选择「日志」,然后编写日志过滤器:jsonPayload.event="my_code_block_executed";
  4. 设置指标类型为「计数」,然后保存即可。

这种方式不需要引入额外的监控客户端依赖,也不用处理指标描述符的创建,适合快速实现。

常见问题排查

  • 权限错误:检查服务账号是否有Monitoring Metric Writer角色,本地测试是否正确设置了环境变量;
  • 指标看不到:Stackdriver指标有1-5分钟的延迟,等几分钟再看,或者检查时间范围是否选对;
  • 重复创建指标报错:把create_custom_metric()函数只执行一次,之后注释掉即可。

内容的提问来源于stack exchange,提问作者Matthias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:13:24