Un par de líneas de código y tu aplicación genera métricas, ¡guau!
Para entender cómo funciona prometheus_flask_, solo necesitas un ejemplo mínimo:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'¡Eso es todo lo que necesitas para empezar! Agregando la importación y la línea de inicialización PrometheusMetrics, obtendrás métricas de la duración de las solicitudes y contadores de solicitudes, que se mostrarán en el endpoint /metrics de la aplicación Flask en la que está registrado, así como todas las métricas predeterminadas que obtienes de la biblioteca .
Puedes encontrar en el repositorio de GitHub que ejecuta una instancia y junto con una aplicación de demostración para generar métricas que se verán aproximadamente así:

También encontrarás una lista de métricas en el ejemplo que se muestran en el panel de control, junto con las consultas de Prometheus que llenan los paneles.
Configuración
La biblioteca tiene muchas opciones de configuración, consulta en su proyecto para ejemplos con explicaciones breves.
La configuración básica se muestra arriba. Simplemente crea una instancia PrometheusMetrics, llamémosla metrics, y luego úsala para definir métricas adicionales que deseas recopilar decorando funciones:
@metrics.counter(..)@metrics.gauge(..)@metrics.summary(..)@metrics.histogram(..)
Los contadores cuentan las invocaciones, y los demás recogen métricas dependiendo de la duración de estas invocaciones. Puedes definir etiquetas para cada uno de ellos, potencialmente utilizando propiedades de la solicitud o la respuesta. Por ejemplo:
from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
# agrupar por endpoint en lugar de por ruta
metrics = PrometheusMetrics(app, group_by='endpoint')
@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
'cnt_collection', 'Número de invocaciones por colección', labels={
'collection': lambda: request.view_args['collection_id'],
'status': lambda resp: resp.status_code
})
def get_item_from_collection(collection_id, item_id):
passEn el ejemplo anterior, tocar el endpoint /collection/10002/item/76 incrementará el contador, por ejemplo cnt_collection{collection = «10002», status = «200»}, además de que obtendrás métricas predeterminadas (para cada endpoint en este ejemplo) de la biblioteca por defecto:
flask_http_request_duration_seconds— Duración de las solicitudes HTTP en segundos para todas las solicitudes de Flask por método, ruta y estadoflask_http_request_total— Número total de solicitudes HTTP por métodos y estados
Hay opciones para omitir el seguimiento de ciertos puntos finales, registrar métricas adicionales por defecto o saltar aquellas mencionadas anteriormente, o aplicar la misma métrica personalizada a varios puntos finales. Consulte el proyecto para conocer lo que está disponible.
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route(' / ')
def main():
pass # las solicitudes se rastrean por defecto
@app.route(' / skip')
@metrics.do_not_track()
def skip():
pass # las métricas por defecto no se recopilan
# métrica personalizada que se aplicará a varios puntos finales
common_counter = metrics.counter(
'by_endpoint_counter', 'Conteo de solicitudes por puntos finales',
labels={'endpoint': lambda: request.endpoint}
)
@app.route(' / common / one')
@common_counter
def endpoint_one():
pass # rastreado por métricas personalizadas y por defecto
@app.route(' / common / two')
@common_counter
def endpoint_two():
pass # también rastreado por métricas personalizadas y por defecto
# registrar métricas adicionales por defecto
metrics.register_default(
metrics.counter(
'by_path_counter', 'Conteo de solicitudes por rutas de solicitud',
labels={'path': lambda: request.path}
)
)La biblioteca cuenta con extensiones útiles para bibliotecas multiproceso populares como uWSGI y Gunicorn. También puede encontrar ejemplos pequeños de casos de uso objetivo, incluidos multiproceso.
Recolección de métricas
Como se mencionó anteriormente, la biblioteca por defecto proporciona un punto final /metrics en la aplicación Flask, que puede servir como objetivo para .
En el ejemplo anterior del tablero, puede dirigir su Prometheus a la aplicación Flask con configuraciones por defecto con esta configuración:
scrape_configs:
- job_name: 'example'
dns_sd_configs:
- names: ['app']
port: 5000
type: A
refresh_interval: 5sVea el ejemplo completo en . Esto supone que Prometheus puede encontrar sus instancias de aplicación Flask en http://app:5000/metrics, donde el nombre de dominio de la aplicación puede resolver potencialmente a varias direcciones IP, por ejemplo, al funcionar en o .
Si dicha revelación del punto final de métricas no es adecuada para usted, tal vez porque no desea permitir el acceso externo, puede desactivarlo fácilmente pasando path=None al crear una instancia PrometheusMetrics.
from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)
...
metrics.start_http_server(5099)Luego puede usar start_http_server(port), para abrir este punto final en otro puerto HTTP, 5099 en el ejemplo anterior. Alternativamente, si está de acuerdo en que el punto final esté en la misma aplicación Flask, pero necesita cambiar su ruta de /metrics, puedes pasar otro URI como parámetro de ruta, o usar register_endpoint(..), para configurarlo más tarde.
Enlaces
— Este es un exportador Flask para Prometheus
— Uso, ejemplos y parámetros de configuración
— Ejemplos de configuración de monitoreo de aplicaciones Flask de diferentes maneras
— Este proyecto en PyPI
— La biblioteca cliente oficial de Prometheus para Python
Si decides probarlo, no dudes en abrir un issue en GitHub o dejar tus comentarios, opiniones y sugerencias.
¡Gracias!
Fuente: habr.com
