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

如何从多个Python Flask子进程中收集Prometheus指标

问题根因

Python multiprocessing 模块创建子进程时采用写时复制机制,每个子进程会独立持有一份指标对象的内存副本。你在主进程启动了Prometheus HTTP服务,该服务只会读取主进程内存中的指标值,子进程对指标的修改仅作用于自身副本,因此主进程侧查询到的数值永远是初始值0。

解决方案:启用Prometheus官方多进程模式

按照以下步骤修改代码即可实现跨进程指标共享:

步骤1:提前配置多进程工作目录

首先在本地创建一个空目录用于存储多进程指标的临时文件,必须在导入prometheus_client之前设置对应的环境变量。

步骤2:修改代码适配多进程模式

修改后的完整代码如下:

import os
import time
from multiprocessing import Process
# 先设置环境变量,再导入prometheus_client
os.environ['PROMETHEUS_MULTIPROC_DIR'] = '/path/to/your/empty/dir' # 替换为你实际的空目录路径

import prometheus_client as prom
from prometheus_client import Gauge, CollectorRegistry, multiprocess, start_http_server

# 定义指标时可指定Gauge的多进程聚合策略
# multiprocess_mode可选值:max(取所有进程最大值)/min(取最小值)/sum(求和)/liveall(返回所有进程值)
c1 = Gauge('Counter1', 'Number of Request', multiprocess_mode='sum')
c2 = Gauge('Gauge1', 'Processing time in Seconds', multiprocess_mode='max')

def process_abc():
  while True:
    some_value = 1 # 替换为实际业务值
    c1.set(some_value)
    c2.set(some_value)
    time.sleep(10)

def process_xyz():
   while True:
     some_value = 2 # 替换为实际业务值
     c1.set(some_value)
     c2.set(some_value)
     time.sleep(10)

def main():
  # 使用多进程收集器注册指标
  registry = CollectorRegistry()
  multiprocess.MultiProcessCollector(registry)
  # 启动HTTP服务时指定注册中心
  start_http_server(8080, registry=registry)

  Process(target=process_abc).start()
  Process(target=process_xyz).start()

if __name__ == "__main__":
  main()

注意事项

  • 每次重启应用前需要清空PROMETHEUS_MULTIPROC_DIR对应的目录,避免残留旧进程的无效指标
  • 你的原始代码中存在笔误:指标类是大写的Gauge,不是小写的gauge
  • Counter类型指标直接调用inc()方法即可,多进程模式下会自动对所有进程的计数做聚合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:24:01