用量统计
能查到哪些维度、时间口径怎么算、数据保留多久,以及怎么自己导出留档。
用量数据决定你能不能发现异常消耗。这一篇说清楚每个接口给什么、时间边界在哪、数据能留多久。
汇总
GET
/api/v1/proxy/usage/summary给出的是账户级的全局视图:
- 当前流量池余额和累计购买量
- 本月和上月的计费字节
curl 'https://api.example.com/api/v1/proxy/usage/summary' \
-H 'Authorization: Bearer at_YOUR_ACCESS_TOKEN'
这是监控脚本最该轮询的接口——余额低于阈值就告警。
逐日统计
GET
/api/v1/proxy/usage/daily范围 1–90 天。
curl 'https://api.example.com/api/v1/proxy/usage/daily?days=30' \
-H 'Authorization: Bearer at_YOUR_ACCESS_TOKEN'
用量曲线
GET
/api/v1/proxy/usage/series可查的时间粒度:
| 粒度 | 范围 |
|---|---|
| 小时 | 今日 24 个小时 |
| 日 | 最近 7 天 / 30 天(按北京自然日) |
还支持按目标域名筛选,这在定位"是哪个站把流量吃掉了"时很有用。
访问过的域名
GET
/api/v1/proxy/usage/domains返回最近访问过的域名,最多 500 个。
curl 'https://api.example.com/api/v1/proxy/usage/domains' \
-H 'Authorization: Bearer at_YOUR_ACCESS_TOKEN'
数据保留
| 数据 | 保留时长 |
|---|---|
| 日汇总 | 长期 |
| 小时级明细 | 60 天 |
| 域名小时级明细 | 60 天 |
客户接口的维度限制
::note{title="没有"按子账号查询"参数"} 接口目前提供的是用户级汇总,没有"指定任意子账号 ID 查询"的参数。
按子账号分开看用量,当前要靠控制台的展示,或者在业务侧自己按子账号记账。 ::
这一点在做团队分账时要提前考虑。可行的替代做法:
一个子账号对应一个业务单元,然后用 remark 字段标记归属,在业务侧自己统计。见 代理子账号。
统计口径
原始流量 = 上传 + 下载的双向 payload 字节。
计费流量 = 原始流量 × 产品倍率,累计后向下取整。
两个数在倍率为 1:1 时相同。完整口径(什么算、什么不算)见 流量计费口径。
自己导出留档
import csv
import json
from datetime import date, timedelta
def export_daily_usage(client, days: int = 90, path: str = "usage.csv") -> None:
"""导出逐日用量。
小时级明细只保留 60 天,日汇总是长期的,
但仍建议定期导出——接口一次最多给 90 天。
"""
payload = client.get("/api/v1/proxy/usage/daily", days=days)
with open(path, "w", newline="", encoding="utf-8") as handle:
writer = csv.DictWriter(
handle,
fieldnames=["date", "uploadBytes", "downloadBytes", "bytesBilled"],
)
writer.writeheader()
writer.writerows(payload["items"])
def export_hourly_snapshot(client, path: str = "hourly.jsonl") -> None:
"""导出小时级明细。这类数据 60 天后消失,需要定期跑。"""
payload = client.get("/api/v1/proxy/usage/series", granularity="hour")
with open(path, "a", encoding="utf-8") as handle:
for point in payload["items"]:
handle.write(json.dumps(point, ensure_ascii=False) + "\n")
def export_domains(client, path: str = "domains.csv") -> None:
"""域名明细最多 500 个,且是"最近访问"的滚动窗口。"""
payload = client.get("/api/v1/proxy/usage/domains")
with open(path, "w", newline="", encoding="utf-8") as handle:
writer = csv.DictWriter(handle, fieldnames=["domain", "bytesBilled"])
writer.writeheader()
writer.writerows(payload["items"])
交易记录
流量购买、充值、退款走的是交易接口,跟用量统计是两条线:
GET
/api/v1/transactionsGET
/api/v1/transactions/metricsmetrics 给的是充值 / 消费 / 退款的指标汇总。
钱包余额和最近账本:
GET
/api/v1/wallet一个日常巡检脚本
def daily_check(client, *, warn_gb: float = 20.0, spike_ratio: float = 2.0) -> None:
"""每天跑一次:余额告警 + 消耗突增检测。"""
summary = client.get("/api/v1/proxy/usage/summary")
remaining_gb = summary["trafficRemainBytes"] / 1024 ** 3
if remaining_gb < warn_gb:
alert(f"流量余额 {remaining_gb:.1f} GB,低于 {warn_gb} GB")
daily = client.get("/api/v1/proxy/usage/daily", days=8)["items"]
if len(daily) < 8:
return
# 拿最近一天和前七天均值比,突增说明有异常任务
recent = daily[-1]["bytesBilled"]
baseline = sum(item["bytesBilled"] for item in daily[-8:-1]) / 7
if baseline > 0 and recent > baseline * spike_ratio:
domains = client.get("/api/v1/proxy/usage/domains")["items"][:5]
top = ", ".join(f"{d['domain']}" for d in domains)
alert(
f"用量突增:{recent / 1024 ** 3:.1f} GB vs 均值 "
f"{baseline / 1024 ** 3:.1f} GB。消耗最高的域名:{top}"
)
平台侧的预警
平台自带的流量余量预警每天最多发一次(低于阈值期间,按北京自然日),支持 Email / Webhook / Bark / Telegram 四种渠道。
配置方式和能力边界见 通知与 Webhook。如果需要更及时或更多维度的告警,自己轮询是当前唯一的办法。