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í:
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:
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.