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
相关产品推荐
相关产品推荐

