GCP虚拟机监控数据CSV记录脚本故障排查求助
GCP VM监控数据采集脚本故障排查
需补充的关键信息
请提供以下内容以精准定位问题:
- 脚本运行时的完整错误输出
- 采集监控数据的Bash脚本代码(完整或关键片段)
常见故障点及排查方案
1. Cloud Monitoring API权限缺失
- 验证当前账号权限:
gcloud projects get-iam-policy YOUR_PROJECT_ID --filter="bindings.members:$(gcloud config get-value account)" --format="value(bindings.role)" - 若未返回
roles/monitoring.viewer或更高权限,执行授权:gcloud projects add-iam-policy-binding YOUR_PROJECT_ID --member=user:$(gcloud config get-value account) --role=roles/monitoring.viewer
2. 监控指标名称错误
GCP监控指标命名需严格匹配,常用正确指标:
- CPU使用率:
compute.googleapis.com/instance/cpu/utilization - 内存使用率(需安装Cloud Monitoring Agent):
agent.googleapis.com/memory/percent_used - 磁盘使用率(需安装Cloud Monitoring Agent):
agent.googleapis.com/disk/percent_used - 无Agent时备选:内存用量
compute.googleapis.com/instance/memory/bytes_used、磁盘用量compute.googleapis.com/instance/disk/bytes_used
3. 时间范围参数无效
近5分钟时间范围需符合RFC3339 UTC标准,正确构造方式:
START_TIME=$(date -u -d "5 minutes ago" +%Y-%m-%dT%H:%M:%SZ) END_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)
检查脚本中时间格式是否正确,是否误用本地时间而非UTC时间。
4. VM资源关联逻辑错误
确保脚本获取的VM名称、区域与监控查询的资源标签完全匹配:
- 正确获取VM列表的命令:
gcloud compute instances list --project=YOUR_PROJECT_ID --format="value(name, zone)" - 监控查询需通过
resource.labels.instance_name和resource.labels.zone精准定位VM。
5. CSV输出格式异常
排查CSV生成逻辑:
- 字段含逗号时需用双引号包裹,避免分隔符冲突
- 避免重复输出表头或空行
- 处理指标查询返回的空值(如VM无监控数据时填充
N/A)
修正后的核心代码示例
#!/bin/bash PROJECT_ID="your-project-id" START_TIME=$(date -u -d "5 minutes ago" +%Y-%m-%dT%H:%M:%SZ) END_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ) # 初始化CSV表头 echo "VM名称,区域,CPU使用率(%),内存使用率(%),磁盘使用率(%)" > vm_metrics.csv # 遍历所有VM实例 while read -r VM_NAME ZONE; do # 查询CPU平均使用率 CPU_USAGE=$(gcloud monitoring query gql --project="$PROJECT_ID" --start-time="$START_TIME" --end-time="$END_TIME" \ "SELECT mean(value) FROM compute.googleapis.com/instance/cpu/utilization \ WHERE resource.labels.instance_name = '$VM_NAME' AND resource.labels.zone = '$ZONE'" \ --format="value(queryResult.timeSeries.points.value.doubleValue)") # 查询内存使用率(依赖Cloud Monitoring Agent) MEM_USAGE=$(gcloud monitoring query gql --project="$PROJECT_ID" --start-time="$START_TIME" --end-time="$END_TIME" \ "SELECT mean(value) FROM agent.googleapis.com/memory/percent_used \ WHERE resource.labels.instance_name = '$VM_NAME' AND resource.labels.zone = '$ZONE'" \ --format="value(queryResult.timeSeries.points.value.doubleValue)") # 查询磁盘使用率(依赖Cloud Monitoring Agent) DISK_USAGE=$(gcloud monitoring query gql --project="$PROJECT_ID" --start-time="$START_TIME" --end-time="$END_TIME" \ "SELECT mean(value) FROM agent.googleapis.com/disk/percent_used \ WHERE resource.labels.instance_name = '$VM_NAME' AND resource.labels.zone = '$ZONE'" \ --format="value(queryResult.timeSeries.points.value.doubleValue)") # 处理空值 CPU_USAGE=${CPU_USAGE:-"N/A"} MEM_USAGE=${MEM_USAGE:-"N/A"} DISK_USAGE=${DISK_USAGE:-"N/A"} # 写入CSV(含特殊字符的字段用双引号包裹) echo "\"$VM_NAME\",\"$ZONE\",\"$CPU_USAGE\",\"$MEM_USAGE\",\"$DISK_USAGE\"" >> vm_metrics.csv done < <(gcloud compute instances list --project="$PROJECT_ID" --format="value(name, zone)")
内容的提问来源于stack exchange,提问作者Algamma
相关产品推荐
相关产品推荐

