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
相关产品推荐
相关产品推荐

