Necesito configurar un punto final /metrics para que Prometheus pueda consumir estadísticas sobre un punto final. ¿Cómo voy a hacer esto?
Tengo esto en mi aplicación Flask:
@app.route('/metrics') def metrics(): def generateMetrics(): metrics = "" ... some string builder logic return metrics response = make_response(generateMetrics(), 200) response.mimetype = "text/plain" return response Es esta la mejor manera? ¿Cuál es la diferencia entre devolver una cadena (solo devolver metrics aquí) y devolver texto sin formato? ¿Por qué necesito el mimetype?
Es esta la mejor manera?
Hay varias formas de configurar el tipo MIME, mejor explicadas y discutidas en esta pregunta de StackOverflow . Su manera funciona bien y hace el trabajo.
¿Cuál es la diferencia entre devolver una cadena y devolver texto sin formato?
Si devuelve una cadena, Flask manejará automáticamente parte de la lógica de respuesta por usted . Esto significa usar algunos valores predeterminados. Si configura dos puntos finales diferentes, verá que la diferencia es que su código devuelve el siguiente encabezado:
Content-Type:"text/plain; charset=utf-8"Mientras que solo devolver una cadena (y el tipo MIME predeterminado) devolvería el siguiente encabezado:
Content-Type:"text/html; charset=utf-8"¿Por qué necesito el mimetype?
Podría decir que técnicamente es más correcto, dado que su respuesta es simplemente texto sin formato y no HTML. Sin embargo, una razón más convincente para necesitarlo sería que un sistema de terceros que está utilizando (Prometheus) depende o se preocupa por los contenidos del encabezado "Tipo de contenido". Si lo hacen, debe configurarlo para que lo acepten.
Código de ejemplo
Para la demostración del encabezado Content-Type, utilicé el siguiente código Python de ejemplo:
from flask import Flask, make_response app = Flask(__name__) def generateMetrics(): return "hello world" @app.route('/metrics') def metrics(): response = make_response(generateMetrics(), 200) response.mimetype = "text/plain" return response @app.route('/metrics2') def metrics2(): return generateMetrics()Luego vi el cuerpo y los encabezados devueltos usando Postman.