【问题标题】:How to collect prometheus metrics from multiple python-flask sub-process?如何从多个 python-flask 子进程中收集 prometheus 指标?
【发布时间】:2021-10-14 17:23:45
【问题描述】:

我有 main() 函数,它产生两个独立的子进程。这两个子流程共享指标。如何共享两个流程的指标并保持更新? 在这里,是我的sn-p以供更多理解。

from multiprocessing import Process
import prometheus_client as prom
from prometheus_client import Counter

# Metrics
c1 = prom.gauge('Counter1', 'Number of Request')
c2 = prom.gauge('Gauge1', 'Processing time in Seconds')

def process_abc():
  while True:
    #Some operations
    c1.set(some_value)
    c2.set(some_value)
    time.sleep(10)

def process_xyz():
   while True:
     #Some operations
     c1.set(some_value)
     c2.set(some_value)
     time.sleep(10)

def main():
  prom.start_http_server(8080)

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

if __name__ == "__main__":
  main()

我能够在端点看到指标名称,但计数始终为零意味着它从未被子流程更新。

【问题讨论】:

    标签: python python-3.x prometheus metrics multiple-processes


    【解决方案1】:

    prometheus_clientdocumentation 解决了这种情况:

    Prometheus 客户端库采用线程模型,其中指标在工作人员之间共享。对于 Python 等语言来说,这并不适用,因为在这些语言中,通常使用进程而不是线程来处理大型工作负载。

    我不会在这里复制解释(针对 gunicorn)用例,但基本上,您需要:

    • 定义一个环境变量和目录使用:因为你自己使用Process,你可以在代码中设置它
    os.environ["PROMETHEUS_MULTIPROC_DIR"] = "/path/to/writeable/tmp/"
    
    • 每个进程都必须有自己的收集器,启动时注册,退出时取消注册:
    from prometheus_client import multiprocess
    
    def called_from_process():
        registry = CollectorRegistry()
        multiprocess.MultiProcessCollector(CollectorRegistry())
    
    def process_exit(process):
        if process.pid is not None:
            multiprocess.mark_process_dead(process.pid)
    
    p = Process(target=f)
    # f calls called_from_process
    p.start()
    p.join()
    process_exit(process)
    

    请参阅有关如何处理仪表和任何其他怪癖的完整文档。

    我希望PROMETHEUS_MULTIPROC_DIR应该在您的应用程序启动时被清理,以处理应用程序先前运行无法这样做的奇怪情况。

    【讨论】:

    • 快速问题:如果我们为每个进程有两个单独的注册表。这些流程将如何更新相同的指标? @迈克尔
    • 很抱歉,但它仍然无法正常工作。它无法从子流程更新指标。
    • 如果您有更新相同指标的进程,则它不会是计数器或同化累积指标的 pb。对于仪表,您可以使用multiprocess_mode 参数来调整其处理方式。
    • 对我来说,最后我使用了threads,并传递了创建的指标对象,并在需要和更新时获取它。
    猜你喜欢
    • 2020-10-31
    • 2019-05-12
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多