Monitoreo de microservicios Flask con Prometheus

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 cliente de Prometheus.

Puedes encontrar un ejemplo fácil de usar en el repositorio de GitHub que ejecuta una instancia Prometheus y Grafana junto con una aplicación de demostración para generar métricas que se verán aproximadamente así:

Monitoreo de microservicios Flask con Prometheus

También encontrarás una lista de métricas en README 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 README 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):
    pass

En 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 estado

  • flask_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 README 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 el recolector de Prometheus.

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: 5s

Vea el ejemplo completo en repositorio de GitHub. 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 Kubernetes o Docker Swarm.

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

Si decides probarlo, no dudes en abrir un issue en GitHub o dejar tus comentarios, opiniones y sugerencias.

¡Gracias!

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster