通过API获取CPU使用率失败及计算偏差问题求助
问题分析与解决方案
核心问题
当前脚本错误使用单个时间点的累计CPU时间计算使用率,而DigitalOcean提供的CPU指标是系统启动以来的累计jiffies值,正确计算需基于时间区间内的数值差值。
修正步骤
1. 提取时间区间内的数值差值
修改jq命令,分别提取每个CPU模式在起始、结束时间点的数值,计算差值后汇总:
# 调用API获取监控数据 response=$(curl -s -X GET -H 'Content-Type: application/json' -H 'Authorization: Bearer token' "$api_endpoint") # 计算总CPU时间的区间差值 total_diff=$(echo "$response" | jq -r '[.data.result[] | (.values[1][1] | tonumber) - (.values[0][1] | tonumber)] | add') # 计算空闲CPU时间的区间差值 idle_diff=$(echo "$response" | jq -r '[.data.result[] | select(.metric.mode == "idle") | (.values[1][1] | tonumber) - (.values[0][1] | tonumber)] | add')
2. 正确计算CPU使用率
用差值计算使用率,同时修复浮点运算的语法错误(全程用bc处理浮点计算):
# 计算已使用CPU时间的差值 used_diff=$(echo "scale=4; $total_diff - $idle_diff" | bc) # 避免除以0,计算最终使用率 if (( $(echo "$total_diff > 0" | bc -l) )); then cpu_usage=$(echo "scale=2; ($used_diff / $total_diff) * 100" | bc) printf 'CPU Usage: %s%%\n' "$cpu_usage" else echo "No valid CPU metrics data for the interval" fi
3. 完整修正后的脚本
#!/bin/bash set -euo pipefail HOST_ID="390488586" TOKEN="your_token_here" INTERVAL=120 # 时间区间长度,单位秒 end_time=$(date +%s) start_time=$((end_time - INTERVAL)) api_endpoint="https://api.digitalocean.com/v2/monitoring/metrics/droplet/cpu?host_id=$HOST_ID&start=$start_time&end=$end_time" response=$(curl -s -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" "$api_endpoint") # 计算总差值和空闲差值 total_diff=$(echo "$response" | jq -r '[.data.result[] | (.values[1][1]|tonumber) - (.values[0][1]|tonumber)] | add') idle_diff=$(echo "$response" | jq -r '[.data.result[] | select(.metric.mode=="idle") | (.values[1][1]|tonumber) - (.values[0][1]|tonumber)] | add') # 计算使用率 if (( $(echo "$total_diff > 0" | bc -l) )); then used_diff=$(echo "scale=4; $total_diff - $idle_diff" | bc) cpu_usage=$(echo "scale=2; ($used_diff / $total_diff) * 100" | bc) printf "CPU Usage: %s%%\n" "$cpu_usage" else echo "No valid CPU metrics data for the interval" fi
验证说明
基于你提供的API返回数据计算:
- 空闲时间差值:
353512.14 - 353393.29 = 118.85 - 总CPU时间差值:
120.02 - 最终使用率:
(120.02 - 118.85)/120.02 *100 ≈ 0.97%,符合实际低于1%的情况
内容的提问来源于stack exchange,提问作者serverstackqns
相关产品推荐
相关产品推荐

