я использую Flask + gunicorn. Хочу подключить мониторинг Prometheus.
так как gunicorn использует воркеры
подключаю prometheus в multiprocess mode
примерно так:
from flask import Blueprint, Response
from prometheus_client import multiprocess, CollectorRegistry, generate_latest, CONTENT_TYPE_LATEST
metrics_bp = Blueprint("metrics", __name__)
@metrics_bp.route("/metrics")
def metrics():
registry = CollectorRegistry()
multiprocess.MultiProcessCollector(registry)
data = generate_latest(registry)
return Response(data, mimetype=CONTENT_TYPE_LATEST)
как в документации написано, запускаю так:
CMD rm -rf /tmp/metrics/* && \
mkdir -p /tmp/metrics && \
export PROMETHEUS_MULTIPROC_DIR=/tmp/metrics && \
gunicorn -c app/gunicorn_conf.py app:app
еще в gunicorn_conf.py:
from prometheus_client import multiprocess
def child_exit(server, worker):
multiprocess.mark_process_dead(worker.pid)
Но проблема в том что после вызова /metrics
через некоторое время все падает
получаю:
[9] [CRITICAL] WORKER TIMEOUT (pid:13)
[13] [ERROR] Error handling request (no URI read)