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

Google Cloud新手:如何解决监控Client报错并获取GCE实例指标

获取GCE实例监控指标的解决方案

你碰到的module 'google.cloud.monitoring' has no attribute 'Client'错误,是因为Google Cloud Monitoring的Python客户端库已经更新到v4版本,旧版的monitoring.Client接口被废弃了,现在得用MetricServiceClient来查询监控数据。

1. 安装必要依赖

先安装所需的GCP客户端库:

pip install google-cloud-monitoring google-cloud-compute

2. 整合实例列表与监控查询代码

下面是结合你现有实例列表代码,查询每个实例CPU使用率、网络发送/接收字节数的完整实现:

from typing import Iterable
from google.cloud import compute_v1
from google.cloud import monitoring_v3
from google.protobuf.timestamp_pb2 import Timestamp
import datetime

def list_instances(project_id: str, zone: str) -> Iterable[compute_v1.Instance]:
    """列出指定项目和区域下的所有GCE实例"""
    instance_client = compute_v1.InstancesClient()
    instance_list = instance_client.list(project=project_id, zone=zone)
    return instance_list

def get_instance_metrics(project_id: str, instance_id: str, zone: str, metric_type: str):
    """查询指定实例的指定监控指标"""
    client = monitoring_v3.MetricServiceClient()
    project_name = f"projects/{project_id}"

    # 设置查询时间范围:默认取过去1小时的数据
    end_time = datetime.datetime.utcnow()
    start_time = end_time - datetime.timedelta(hours=1)

    # 转换为GCP要求的Timestamp格式
    start_ts = Timestamp()
    start_ts.FromDatetime(start_time)
    end_ts = Timestamp()
    end_ts.FromDatetime(end_time)

    # 构建查询过滤器,精准匹配实例和指标
    filter_str = f'''
        metric.type = "{metric_type}"
        AND resource.labels.instance_id = "{instance_id}"
        AND resource.labels.zone = "{zone}"
    '''

    # 执行指标查询
    results = client.list_time_series(
        request={
            "name": project_name,
            "filter": filter_str,
            "interval": {"start_time": start_ts, "end_time": end_ts},
            "view": monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL,
        }
    )

    # 提取最新的指标数据点
    for time_series in results:
        for point in time_series.points:
            # 根据指标类型选择对应的值类型(使用率是浮点,字节数是整数)
            value = point.value.double_value if metric_type.endswith('utilization') else point.value.int64_value
            return {
                "instance_id": instance_id,
                "metric_name": metric_type.split('/')[-1],
                "value": value,
                "timestamp": point.interval.end_time.ToDatetime()
            }
    return None

if __name__ == "__main__":
    # 替换成你的项目ID和区域
    PROJECT_ID = "your-project-id"
    ZONE = "us-west3-b"

    # 获取目标区域的实例列表
    instances = list_instances(PROJECT_ID, ZONE)

    # 定义要查询的原生监控指标
    target_metrics = [
        "compute.googleapis.com/instance/cpu/utilization",
        "compute.googleapis.com/instance/network/sent_bytes_count",
        "compute.googleapis.com/instance/network/received_bytes_count"
    ]

    # 遍历每个实例,查询所有指标
    for instance in instances:
        instance_id = instance.id
        print(f"\n实例ID: {instance_id}")
        for metric_type in target_metrics:
            metric_data = get_instance_metrics(PROJECT_ID, instance_id, ZONE, metric_type)
            if metric_data:
                print(f"  {metric_data['metric_name']}: {metric_data['value']} (采集时间: {metric_data['timestamp']})")
            else:
                print(f"  {metric_type.split('/')[-1]}: 无可用数据")

关键说明

  • 保留了你原有的list_instances函数,用于获取指定区域的实例列表
  • get_instance_metrics函数负责单个实例的指标查询,支持自定义时间范围(修改timedelta参数即可)
  • 使用GCP内置的系统指标,无需创建自定义指标,直接调用原生监控数据
  • 权限要求:运行代码的服务账号需要拥有Monitoring Viewer和Compute Viewer权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:44:59