深色模式
成本看板搭建
成本看板的作用是让工程师在日常工作中就能看到成本,而不是月底才被财务通知。本文用 Prometheus + Grafana 搭一套可运行的成本看板。
适用环境
- Grafana 已部署,Prometheus 为数据源
- 有每日/每小时成本数据(云平台导出 + exporter,或自研采集)
- 有业务量指标(订单数、请求数)用于算单位成本
bash
# 确认数据源连通
curl -s http://localhost:9090/-/healthy
curl -s -u admin:admin http://localhost:3000/api/datasources | jq -r '.[].name'1
2
3
2
3
操作步骤
1. 先把成本数据送进 Prometheus
思路:一个定时任务从账单 API 拉数,写入 Pushgateway 或由 exporter 暴露。
bash
cat > /usr/local/bin/push_cost.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
PUSHGW=${PUSHGW:-http://localhost:9091}
JOB=cost
# amount 单位为元,此处示例为静态值,实际应替换为账单 API 结果
cat <<METRICS | curl -s --data-binary @- "${PUSHGW}/metrics/job/${JOB}"
# TYPE daily_cost_yuan gauge
daily_cost_yuan{service="compute"} 12000.0
daily_cost_yuan{service="storage"} 3400.0
daily_cost_yuan{service="network"} 2100.0
daily_cost_yuan{service="logging"} 1500.0
METRICS
EOF
chmod +x /usr/local/bin/push_cost.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bash
# 每小时推一次
(crontab -l 2>/dev/null; echo "0 * * * * /usr/local/bin/push_cost.sh") | crontab -
/usr/local/bin/push_cost.sh
curl -s http://localhost:9091/metrics | grep daily_cost1
2
3
4
2
3
4
2. 建数据源与目录
bash
curl -s -u admin:admin -X POST http://localhost:3000/api/datasources \
-H 'Content-Type: application/json' \
-d '{"name":"Prometheus","type":"prometheus","url":"http://localhost:9090","access":"proxy","isDefault":true}'1
2
3
2
3
3. 面板一:本月累计总额(Stat)
promql
sum(daily_cost_yuan)1
设置:Unit 选 Currency → ¥,Thresholds 设 70%/90% 两档颜色。
4. 面板二:按服务结构(Pie chart)
promql
sum by (service) (daily_cost_yuan)1
设置:Value options → All values,Unit 设货币,Legend 显示百分比。
5. 面板三:日花费趋势(Time series)
promql
sum by (service) (daily_cost_yuan)1
叠加一条 7 日均值作为基线,便于看异常:
promql
avg_over_time(sum by (service) (daily_cost_yuan)[7d:1h])1
6. 面板四:环比异常检测(Bar gauge)
promql
# 今日 vs 7 日均值的变化率
(sum by (service) (daily_cost_yuan)
/ avg_over_time(sum by (service) (daily_cost_yuan)[7d:1h]) - 1) * 1001
2
3
2
3
设置:Unit 设为 Percent (0-100),Thresholds 设 30 / 50 两档。
7. 面板五:单位成本(最关键)
promql
# 每千次请求成本 = 日成本 / 日请求数 × 1000
sum(daily_cost_yuan{service="compute"})
/ (sum(increase(http_requests_total[1d])) / 1000)1
2
3
2
3
promql
# 每笔订单成本
sum(daily_cost_yuan) / sum(increase(orders_total[1d]))1
2
2
单位成本面板应单独一行展示,并配 7 日移动平均线:
promql
avg_over_time((sum(daily_cost_yuan) / sum(increase(orders_total[1d])))[7d:1h])1
8. 面板六:闲置与未归因金额
promql
# 未归因(无标签)金额
sum(daily_cost_yuan{tag_team=""})1
2
2
promql
# 低利用率资源数量
count(max_over_time(
(1 - sum(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)
/ count(node_cpu_seconds_total{mode="idle"}) by (instance))[7d:5m]) < 0.05)1
2
3
4
2
3
4
9. 导出看板并纳入版本管理
bash
# 导出
curl -s -u admin:admin http://localhost:3000/api/dashboards/uid/cost-overview \
| jq '.dashboard' > finops/grafana-cost-dashboard.json
# 导入到另一环境
curl -s -u admin:admin -X POST http://localhost:3000/api/dashboards/db \
-H 'Content-Type: application/json' \
-d "{\"dashboard\": $(cat finops/grafana-cost-dashboard.json), \"overwrite\": true}"1
2
3
4
5
6
7
2
3
4
5
6
7
10. 看板布局建议
text
第一行(4 个 Stat):本月总额 | 月末预测 | 预算执行率 | 单位成本
第二行(2 个图) :按服务结构(饼图) | 日趋势(时序)
第三行(2 个图) :环比异常(条形) | 单位成本趋势(时序)
第四行(表格) :Top 10 服务花费明细 + 负责人1
2
3
4
2
3
4
验证
bash
# 1) 每个面板都能出数(无 No data)
# 2) 总额与云平台账单一致(误差 < 1%)
# 3) 单位成本面板有 30 天以上趋势
# 4) 阈值颜色在超预算时真的变红
curl -s http://localhost:9090/api/v1/query --data-urlencode 'query=sum(daily_cost_yuan)' | jq '.data.result'1
2
3
4
5
2
3
4
5
常见坑
看板数字与账单对不上
常见原因是时区(UTC vs 本地)、货币单位、以及未包含折扣/税费。看板要注明口径与数据源,并与账单核对一次。
只有总额没有单位成本
总额上涨常常是业务增长导致的,会让团队误判。必须把单位成本作为主指标放在首屏。
成本数据无访问控制
成本数据属于敏感经营信息。Grafana 看板必须配置权限(至少要求登录),不要设置成公开匿名可访问。
数据断点导致趋势图断裂
Pushgateway 脚本失败会让时序出现空洞,increase() 类函数结果失真。要给采集脚本本身加存活告警。