Monitorización de microservizos Flask con Prometheus

Un par de liñas de código e a túa aplicación xera métricas, ¡guau!

Para comprender como funciona Prometheus_matraz_exportador un exemplo mínimo é suficiente:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

@app.route('/')
def main():
    return 'OK'

Iso é todo o que necesitas para comezar! Engadindo unha importación e unha liña para a inicialización PrometheusMetrics, obterás métricas duración da solicitude и contadores de solicitudes, que se mostra no punto final /métricas a aplicación Flask coa que está rexistrado, así como todas as métricas predeterminadas que obtén da base Biblioteca cliente Prometheus.

podes atopar exemplo doado de usar no repositorio de GitHub que executa a instancia Prometeu и grafana xunto cunha aplicación de demostración para xerar métricas que terán un aspecto así:

Monitorización de microservizos Flask con Prometheus

Tamén atoparás unha lista de indicadores en README exemplos que aparecen no panel, xunto coas consultas de Prometheus que enchen os paneis.

axuste

Hai moitas opcións de configuración na biblioteca, mira README proxecto exemplos deles cunha breve explicación.

A configuración básica móstrase arriba. Só ten que crear unha instancia PrometheusMetrics, chamémoslle métricas, e utilízao para definir as métricas adicionais que quere recoller decorando as funcións:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Os contadores contan as chamadas e outros recollen métricas en función da duración desas chamadas. Podes definir etiquetas para cada un destes, utilizando potencialmente as propiedades de solicitude ou resposta. Por exemplo:

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

No exemplo anterior, premendo no punto final /collection/10002/item/76 fará que o contador aumente, por exemplo cnt_collection{colección = "10002", estado = "200"}, ademais de obter as métricas predeterminadas (para cada punto final neste exemplo) da biblioteca predeterminada:

  • flask_http_request_duration_seconds — Duración da solicitude HTTP en segundos para todas as solicitudes de Flask por método, camiño e estado

  • flask_http_request_total — Número total de solicitudes HTTP por métodos e estados

Hai opcións para omitir o seguimento de puntos finais específicos, rexistrar métricas predeterminadas adicionais ou omitir as indicadas anteriormente ou aplicar a mesma métrica personalizada a varios puntos finais. Comprobar README proxecto para ver o que hai dispoñible.

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}
    )
)

A biblioteca ten extensións convenientes para bibliotecas de multiprocesamento populares como uWSGI e Gunicorn. Tamén podes atopar pequenos exemplos de casos de uso específicos, incluído o multiprocesamento.

Colección de métricas

Como se mencionou anteriormente, a biblioteca ofrece un punto final por defecto /métricas nunha aplicación Flask, que pode servir de destino para Construtor de Prometeo.

No exemplo do panel anterior, podes orientar o teu Prometheus a unha aplicación Flask con configuración predeterminada con esta configuración:

scrape_configs:
  - job_name: 'example'

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

Vexa o exemplo completo en Repositorios GitHub. Isto supón que Prometheus pode atopar as instancias da aplicación Flask http://app:5000/metrics, onde o nome de dominio da aplicación podería resolverse en varios enderezos IP, por exemplo cando se executa Kubernetes ou Enxame Docker.

Se non che convén expoñer o punto final de métricas deste xeito, quizais porque non queres permitir o acceso externo a el, podes desactivalo facilmente pasando camiño=Ningún ao crear unha 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)

Entón podes usar start_http_server(porto)para abrir este punto final nun porto HTTP diferente, 5099 no exemplo anterior. Alternativamente, se está satisfeito con que o punto final estea na mesma aplicación Flask, pero cómpre cambiar a súa ruta de /métricas, pode pasar outro URI como parámetro de ruta ou usar rexistro_punto final(..)para instalalo máis tarde.

referencias

Se decides probalo, non dubides en abrir un problema en GitHub ou deixar os teus comentarios, comentarios e suxestións.

Grazas!

Fonte: www.habr.com

Engadir un comentario