You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Prometheus准确统计指定时间范围的Otel计数器指标?

解决方案与建议

一、Prometheus 准确统计总 ingestion 数的查询方式

针对每个runId对应独立计数器实例、任务结束后指标消失的场景,要统计指定时间范围的总记录数,核心是聚合每个runId对应的计数器增量总和。

推荐两种高效的PromQL查询方式:

  1. 直接使用increase函数获取全局增量并聚合
sum by (accountId, jobId) (
  increase(your_ingestion_counter[指定统计时间范围])
)
  • 说明:increase会自动处理计数器逻辑(你的场景中每个runId对应实例不会重置,但该函数依然适用),直接计算每个计数器在目标时间段的总增长量,再按业务标签求和即可得到准确总数。
  1. 结合rate与sum_over_time做细粒度聚合
sum by (accountId, jobId) (
  sum_over_time(
    rate(your_ingestion_counter[1m])[指定统计时间范围:1m]
  )
)
  • 说明:适合需要观察中间粒度数据的场景,通过1分钟粒度的速率计算再累加全时段数据,结果与increase一致。

二、现有脚本的效率优化建议

如果你的脚本是通过遍历小时间窗口累加数据,长期跨月运行会因数据量过大导致效率问题,可通过以下方式优化:

  • 预计算聚合规则:在Prometheus中配置Recording Rules,提前计算每个runId的总增量并存储,后续统计直接聚合预计算指标:
    groups:
    - name: ingestion_billing_rules
      rules:
      - record: ingestion:total_per_run
        expr: increase(your_ingestion_counter[1d])
        labels:
          source: billing
    
  • 缩小查询范围:统计时尽量带上accountId、jobId等过滤标签,减少Prometheus需要处理的时间序列数量。
  • 避免小步长遍历:直接使用全局时间范围的increase或sum_over_time,替代多次小窗口查询累加的逻辑,降低Prometheus计算压力。

三、工具选型的思考

Prometheus擅长实时监控,但在长期计费统计场景下存在局限性:

  • 大量唯一runId的短生命周期指标会产生海量时间序列,长期存储成本高,大时间范围查询效率下降。
  • Prometheus的设计偏向实时监控,并非为精确的长期计费统计优化。

如果计费是核心需求,建议补充以下方案:

  • 引入分析型时序数据库:将Otel采集的计数器增量直接写入ClickHouse、InfluxDB等,这类数据库在大时间范围聚合查询上效率远高于Prometheus,适合长期存储与计费统计。
  • 任务侧直接上报计费数据:在同步任务结束时,将该runId的总记录数直接写入MySQL、PostgreSQL等业务数据库,从源头保证数据的准确性与可查询性,跳过监控链路的中间环节。
  • Prometheus+下游存储组合:用Prometheus做实时监控,同时通过Remote Write将数据同步到分析型数据库,在下游完成长期统计与计费计算。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:03:20