Using Prometheus with Connexion - ValueError: Duplicated timeseries in CollectorRegistry

Using Prometheus with Connexion - ValueError: Duplicated timeseries in CollectorRegistry

我在使用 python3.6/3.7 连接 prometheus 时收到以下错误消息:

ValueError: Duplicated timeseries in CollectorRegistry: {'app_request_processing_seconds_sum', 'app_request_processing_seconds_count', 'app_request_processing_seconds_created', 'app_request_processing_seconds'}

#!/usr/bin/env python3
from gevent import monkey  # noqa

# monkey.patch_all()  # noqa

import json
import os
import connexion
import datetime
import logging

from connexion import NoContent
from prometheus_client import Summary, Counter

logger = logging.getLogger(__name__)

REQUEST_TIME = Summary('app_request_processing_seconds', 'time spent processing')
REQUEST_COUNTER = Counter('app_request_count', 'number of requests')

@REQUEST_TIME.time()
def get_health():
    try:
        'Hello'
    except Exception:
        return connexion.problem(503, "Service Unavailable", "Unhealthy")
    else:
        return "Healthy"


logging.basicConfig(level=logging.INFO)
app = connexion.App(__name__)
app.add_api("swagger.yaml")

if __name__ == "__main__":
    # run our standalone gevent server
    app.run(port=8080, server="gevent")

有一个 swagger.yaml 等同于: https://github.com/hjacobs/connexion-example-redis-kubernetes/blob/master/swagger.yaml

任何帮助都会很棒

作为猜测,您已将文件命名为 app.py。当加载 swagger 时会发生什么,处理被指定为 app.get_health:

paths:
  /health:
    get:
      operationId: app.get_health

然后加载(第二次)app.py 以导入 get_health() 函数。

主文件作为 __main__ 模块加载并因此被第二次加载的原因;有关详细信息,请参阅 this other question。 因此,您最终定义了两次 Prometheus 指标,这对收集器来说并不合适。

最简单的解决方案是重命名您的文件并在另一个名为 app.py.

的文件中实施您的应用程序