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

如何使用OpenTelemetry上报一次性解析执行时间指标?

解决一次性上报请求ID关联的解析时间指标问题

核心问题原因

Prometheus是拉取式监控系统,默认会周期性采集所有存在的指标时间序列。你用的几种指标类型(UpAndDownCounter/Histogram/Gauge)如果不主动清理,对应的request_id标签实例会一直存在,导致每次采集都上报相同值,最终在图表上呈现为水平线。

可行解决方案:用Gauge+主动清理标签实例

要实现单个请求ID对应单个数据点,关键是在指标被Prometheus采集到后,主动移除该请求ID对应的指标实例。

1. 初始化Gauge指标

import time
import threading
from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.exporter.prometheus import PrometheusMetricReader

# 初始化指标提供者与导出器
metrics.set_meter_provider(MeterProvider(metric_readers=[PrometheusMetricReader()]))
meter = metrics.get_meter("parser_service")

# 创建带request_id标签的Gauge
parse_duration_gauge = meter.create_gauge(
    name="parse_function_duration_seconds",
    description="单次请求的解析函数执行耗时",
    unit="s",
)

2. 上报并清理指标

在解析函数执行完成后设置指标值,然后延迟一段时间(确保Prometheus完成至少一次采集)清理该请求ID的标签实例:

def process_parse_request(request_id, raw_data):
    start = time.time()
    # 执行你的解析逻辑
    # ...
    duration = time.time() - start

    # 上报当前请求的解析耗时
    parse_duration_gauge.set(duration, {"request_id": request_id})

    # 延迟清理:比Prometheus采集间隔(默认15s)短一点,确保被采集一次
    def cleanup_metric():
        parse_duration_gauge.remove({"request_id": request_id})
    
    threading.Timer(10.0, cleanup_metric).start()

3. Grafana图表配置

在Grafana中使用last_over_time函数获取每个request_id的唯一有效数据点:

last_over_time(parse_function_duration_seconds[1m])

然后配置柱状图:

  • X轴选择request_id标签
  • Y轴使用指标值即可

备选方案:用日志替代指标(高基数场景)

如果你的请求ID基数极大(比如每秒上千个新ID),用指标会导致Prometheus内存占用过高,此时更适合将解析耗时+request_id作为日志上报,用Loki存储,再在Grafana中基于日志生成柱状图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:43:34