




















做法不复杂:像盯延迟一样盯成本。把 cost-per-request 拉出来,设基线,设告警,让它也能触发值班。
成本的数据原料其实都有:请求数有、执行时长有、内存配置有、出口字节有。大多数团队缺的不是数据,是把这些数据拼起来持续计算、然后接入告警管道的习惯。
原文给了一条 Prometheus 告警规则,就是最直接的做法:
- alert: CostPerRequestAnomaly expr: | ( increase(cloud_spend_dollars_total{service="payment-processor"}[30m]) / increase(http_requests_total{service="payment-processor"}[30m]) ) > 0.02 for: 15m labels: severity: warning annotations: summary: "Payment processor cost/request exceeding $0.02 threshold" runbook: "https://wiki.internal/runbooks/cost-anomaly"
这条规则的意思是:过去 30 分钟内,支付服务的每请求成本超过 $0.02 并且持续 15 分钟,就触发告警。实际落地需要处理几个边界:请求量降到零时分母为零怎么办、固定成本(跟请求量无关的部分)怎么单独核算、每个服务的阈值需要各自调。原则没有问题。
国内平台可以用阿里云的 cloud-exporter 把费用数据接入 Prometheus,或者直接用费用中心 API 拉数据写入自建监控。
在接好完整的 Prometheus 流水线之前,最基本的计算逻辑用一段 Shell 就能说明白:
bashset -euo pipefail cat > /tmp/cost_data.csv <<'CSVEOF' timestamp,requests,cost 08:00,1000,12.50 08:05,1100,13.00 08:10,1050,12.80 08:15,1200,13.50 08:20,1150,13.20 08:25,1000,12.50 08:30,1300,35.00 08:35,1250,33.00 08:40,1350,36.50 08:45,1400,38.00 08:50,1200,32.00 08:55,1100,30.00 CSVEOF BASELINE=0.012 THRESHOLD=$(awk "BEGIN {print $BASELINE * 2}") echo "=== cost-per-request 监控演示 ===" echo "基线: \$${BASELINE}/request,告警阈值: \$${THRESHOLD}/request(基线 × 2)" echo "" tail -n +2 /tmp/cost_data.csv | while IFS=, read -r ts req cost; do cpr=$(awk "BEGIN {printf \"%.4f\", $cost / $req}") if awk -v cpr="$cpr" -v thresh="$THRESHOLD" 'BEGIN {exit !(cpr > thresh)}'; then printf " %s req=%s cost=\$%-6s cpr=\$%s ← 超过阈值!\n" "$ts" "$req" "$cost" "$cpr" else printf " %s req=%s cost=\$%-6s cpr=\$%s\n" "$ts" "$req" "$cost" "$cpr" fi done echo "" echo "08:30 开始 cpr 翻倍。排查方向:" echo " 1. 新部署是否引入了 N+1 查询" echo " 2. 索引被误删导致全表扫描" echo " 3. Serverless 函数是否有 retry storm" echo " 4. 是否有人在跨 region 拉数据"
=== cost-per-request 监控演示 === 基线: $0.012/request,告警阈值: $0.024/request(基线 × 2) 08:00 req=1000 cost=$12.50 cpr=$0.0125 08:05 req=1100 cost=$13.00 cpr=$0.0118 08:10 req=1050 cost=$12.80 cpr=$0.0122 08:15 req=1200 cost=$13.50 cpr=$0.0112 08:20 req=1150 cost=$13.20 cpr=$0.0115 08:25 req=1000 cost=$12.50 cpr=$0.0125 08:30 req=1300 cost=$35.00 cpr=$0.0269 ← 超过阈值! 08:35 req=1250 cost=$33.00 cpr=$0.0264 ← 超过阈值! 08:40 req=1350 cost=$36.50 cpr=$0.0270 ← 超过阈值! 08:45 req=1400 cost=$38.00 cpr=$0.0271 ← 超过阈值! 08:50 req=1200 cost=$32.00 cpr=$0.0267 ← 超过阈值! 08:55 req=1100 cost=$30.00 cpr=$0.0273 ← 超过阈值! 08:30 开始 cpr 翻倍。排查方向: 1. 新部署是否引入了 N+1 查询 2. 索引被误删导致全表扫描 3. Serverless 函数是否有 retry storm 4. 是否有人在跨 region 拉数据
实际使用时,把模拟数据换成云厂商账单 API 的返回值,加到 cron 里每 5 分钟跑一次。成本异常就能在第一个 30 分钟窗口内收到告警,不用等到月底对账。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。