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

Gunicorn多Worker下OpenTelemetry-Python指标聚合异常求助

问题背景

我是Python新手,使用opentelemetry-python手动采集Flask项目的HTTP指标,通过gunicorn启动2个Worker,指标数据发送至opentelemetry-collector后导出到Prometheus。但发现collector收到来自不同Worker的独立数据,Prometheus拉取时出现时间序列波动、计算错误。具体细节如下:

1. OTLP采集器配置

OTLP采集器接收数据并导出至Prometheus,配置文件collector-config.yaml内容如下:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317

processors:
  memory_limiter:
    check_interval: 5s
    limit_percentage: 85
    spike_limit_percentage: 25

  batch/metrics:
    timeout: 200ms
    send_batch_size: 8192
    send_batch_max_size: 8192
exporters:
  prometheus:
    endpoint: "0.0.0.0:8073"
    resource_to_telemetry_conversion:
      enabled: false

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch/metrics]
      exporters: [prometheus]

2. Flask项目的OTLP SDK配置

SDK代码如下:

class OtlpConfig:
    def __init__(self):

        endpoint = os.getenv(OTLP_EXPORTER_ENDPOINT) or os.getenv(
            OTLP_EXPORTER_ENDPOINT.lower()) or os.getenv(
            OTLP_EXPORTER_ENDPOINT.lower().replace('_', '.')) or "http://127.0.0.1:4317"

        metrics_exporter = OTLPMetricExporterGRPC(endpoint)

        reader = PeriodicExportingMetricReader(exporter=metrics_exporter, export_interval_millis=15,
                                               export_timeout_millis=5)

        meter_provider = MeterProvider(
            metric_readers=[reader]

        )
        metrics.set_meter_provider(meter_provider)
        meter = metrics.get_meter(name="flyme-fcop-python-meter-sdk")
        self.meter = meter

        logging.info("Starting OTLP successfully")

    def get_meter(self):
        return self.meter

启动参数与运行日志

使用gunicorn启动2个Worker的命令:

gunicorn --workers=2 -b 0.0.0.0:8080 main:app 

运行日志:

[2024-03-21 10:15:55 +0000] [1] [INFO] Starting gunicorn 21.2.0
[2024-03-21 10:15:55 +0000] [1] [DEBUG] Arbiter booted
[2024-03-21 10:15:55 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[2024-03-21 10:15:55 +0000] [1] [INFO] Using worker: gthread
[2024-03-21 10:15:55 +0000] [8] [INFO] Booting worker with pid: 8
[2024-03-21 10:15:55 +0000] [9] [INFO] Booting worker with pid: 9

问题现象

我共发起3次请求,其中1次落在PID为8的Worker,2次落在PID为9的Worker,OtlpConfig因2个Worker被初始化两次。opentelemetry-collector收到来自不同Worker的独立数据,导致Prometheus中同一指标数值随拉取次数波动:

第一次拉取结果:

http_server_request_seconds_sum{job="unknown_service",url="/three/app/process"} 0.30804229132064576
http_server_request_seconds_count{job="unknown_service",url="/three/app/process"} 1

第二次拉取结果:

http_server_request_seconds_sum{job="unknown_service",url="/three/app/process"} 0.5080454164143
http_server_request_seconds_count{job="unknown_service",url="/three/app/process"} 2

Prometheus拉取时出现计算错误,时间序列呈现上下波动(异常图与正常图存在明显差异)。现求助以下问题:

  • opentelemetry-collector是否默认按Worker分组接收数据?是否有聚合插件可解决该问题?
  • 若无现成方案,尝试给指标添加Worker ID标签是否可行?但会导致数据上报延迟。
  • 参考Prometheus Python客户端多进程方案及OpenTelemetry官方文档中关于重叠分辨率的内容,是否有成熟解决方案?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:28:20