Monitoreo de microservicios de 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_matraz_exportador un ejemplo mínimo es suficiente:

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 una importación y una línea para la inicialización PrometheusMétricas, obtendrás métricas duración de la solicitud и contadores de solicitudes, mostrado en el punto final /métrica la aplicación Flask con la que está registrada, así como todas las métricas predeterminadas que obtienes de la base Biblioteca cliente de Prometheus.

puedes encontrar ejemplo fácil de usar en el repositorio de GitHub que ejecuta la instancia Prometeo и Grafana junto con una aplicación de demostración para generar métricas que se verá así:

Monitoreo de microservicios de Flask con Prometheus

También encontrará una lista de indicadores en README ejemplos que aparecen en el panel, junto con consultas de Prometheus que pueblan los paneles.

Ajuste

Hay muchas opciones de configuración en la biblioteca, mira README proyectos de ejemplos de ellos con una breve explicación.

La configuración básica se muestra arriba. Simplemente crea una instancia PrometheusMétricas, llamémoslo métricay luego utilícelo para definir las métricas adicionales que desea recopilar decorando las funciones:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Los contadores cuentan las llamadas y otros recopilan métricas basadas en la duración de esas llamadas. Puede definir etiquetas para cada uno de estos, potencialmente utilizando propiedades de solicitud o respuesta. Por ejemplo:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# group by endpoint rather than path
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Number of invocations per collection', 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, al hacer clic en el punto final /colección/10002/item/76 hará que el contador aumente, por ejemplo cnt_collection{colección = "10002", estado = "200"}, además obtendrá las métricas predeterminadas (para cada punto final en este ejemplo) de la biblioteca predeterminada:

  • flask_http_request_duration_seconds — Duración de la solicitud 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 puntos finales específicos, registrar métricas predeterminadas adicionales u omitir las enumeradas anteriormente, o aplicar la misma métrica personalizada a múltiples puntos finales. Verificar README proyecto para ver qué hay disponible.

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    pass  # requests tracked by default

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # default metrics are not collected

# custom metric to be applied to multiple endpoints
common_counter = metrics.counter(
    'by_endpoint_counter', 'Request count by endpoints',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # tracked by the custom and the default metrics

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # also tracked by the custom and the default metrics

# register additional default metrics
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Request count by request paths',
        labels={'path': lambda: request.path}
    )
)

La biblioteca tiene extensiones convenientes para bibliotecas multiprocesamiento populares como uWSGI y Gunicorn. También puede encontrar pequeños ejemplos de casos de uso específicos, incluido el multiprocesamiento.

Colección de métricas

Como se mencionó anteriormente, la biblioteca proporciona un punto final de forma predeterminada. /métrica en una aplicación Flask, que puede servir como objetivo para constructor de prometeo.

En el ejemplo del panel anterior, puede orientar su Prometheus a una aplicación Flask con la configuración predeterminada con esta configuración:

scrape_configs:
  - job_name: 'example'

    dns_sd_configs:
      - names: ['app']
        port: 5000
        type: A
        refresh_interval: 5s

Ver ejemplo completo en repositorios de GitHub. Esto supone que Prometheus puede encontrar las instancias de su aplicación Flask en http://app:5000/metrics, donde el nombre de dominio de la aplicación podría potencialmente resolverse en múltiples direcciones IP, por ejemplo cuando se ejecuta en Kubernetes o Enjambre Docker.

Si exponer el punto final de métricas de esta manera no le conviene, tal vez porque no desea permitir el acceso externo a él, puede desactivarlo fácilmente pasando ruta=Ninguna al crear una instancia PrometheusMétricas.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)

...

metrics.start_http_server(5099)

Entonces puedes usar start_http_server(puerto)para abrir este punto final en un puerto HTTP diferente, 5099 en el ejemplo anterior. Alternativamente, si está satisfecho con que el punto final esté en la misma aplicación Flask, pero necesita cambiar su ruta de /métrica, puede pasar otro URI como parámetro de ruta o utilizar registrar_punto final(..)para instalarlo más tarde.

referencias

Si decide probarlo, no dude en abrir un problema en GitHub o dejar sus comentarios, opiniones y sugerencias.

Gracias!

Fuente: habr.com

Añadir un comentario