如何从多个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
相关产品推荐
相关产品推荐

