Monitoramento de microsserviços Flask com Prometheus

Algumas linhas de código e seu aplicativo gera métricas, uau!

Para entender como o prometheus_ funciona,flask_um 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'

Isto é tudo que você precisa para começar! Adicionando a importação e a linha para inicializar PrometheusMetrics, você obterá métricas da duração das requisições e contadores de requisições, exibidas no endpoint /metrics do aplicativo Flask em que foi registrado, e também todas as métricas padrão que você recebe da biblioteca cliente Prometheus.

Você pode encontrar um exemplo fácil de usar no repositório GitHub, que executa uma instância Prometheus e Grafana junto com um aplicativo de demonstração para gerar métricas que ficarão mais ou menos assim:

Monitoramento de microsserviços Flask com Prometheus

Você também encontrará uma lista de métricas em README o exemplo, que são exibidas no painel de controle, juntamente com as consultas Prometheus que preenchem os painéis.

Configuração

A biblioteca possui várias opções de configuração, dê uma olhada na README documentação do projeto para exemplos com uma breve explicação.

A configuração básica é mostrada no início. Basta criar uma instância PrometheusMetrics, vamos chamá-la de metrics, e então use-a para definir métricas adicionais que você deseja coletar, decorando funções:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Os contadores contam as invocações, enquanto os demais coletam métricas com base na duração dessas invocações. Você pode definir rótulos para cada um deles, potencialmente usando propriedades da requisição ou da resposta. Por exemplo:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# agrupar por endpoint ao invés de caminho
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Número de invocações por coleção', 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 acima, fazer uma chamada no endpoint /collection/10002/item/76 resultará no incremento do contador, por exemplo cnt_collection{collection = "10002", status = "200"}, além de receber as métricas padrão (para cada endpoint neste exemplo) da biblioteca padrão:

  • flask_http_request_duration_seconds — Duração da requisição HTTP em segundos para todas as requisições Flask por método, caminho e status

  • flask_http_request_total — Total de requisições HTTP por métodos e status

Há opções para ignorar o rastreamento de determinados endpoints, registrar métricas adicionais por padrão ou ignorar aquelas mencionadas acima, ou aplicar a mesma métrica personalizada a vários endpoints. Consulte README o projeto para saber o que está disponível.

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

@app.route('\\/')
def main():
    pass  # solicitações rastreadas por padrão

@app.route('\\/skip')
@metrics.do_not_track()
def skip():
    pass  # métricas padrão não são coletadas

# métrica personalizada a ser aplicada em múltiplos endpoints
common_counter = metrics.counter(
    'by_endpoint_counter', 'Contagem de solicitações por endpoints',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('\\/common\\/one')
@common_counter
def endpoint_one():
    pass  # rastreado pela métrica personalizada e pela métrica padrão

@app.route('\\/common\\/two')
@common_counter
def endpoint_two():
    pass  # também rastreado pela métrica personalizada e pela métrica padrão

# registrar métricas adicionais padrão
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Contagem de solicitações por caminhos de solicitação',
        labels={'path': lambda: request.path}
    )
)

A biblioteca possui convenientes extensões para populares bibliotecas multiprocessadas, como uWSGI e Gunicorn. Você também pode encontrar pequenos exemplos de casos de uso direcionados, incluindo multiprocessamento.

Coleta de métricas

Como mencionado acima, a biblioteca por padrão fornece um endpoint /metrics no aplicativo Flask, que pode servir como alvo para o coletor Prometheus.

No exemplo acima com o painel, você pode direcionar seu Prometheus para o aplicativo Flask com configurações padrão usando a seguinte configuração:

scrape_configs:
  - job_name: 'example'

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

Veja o exemplo completo em repositório GitHub. Isso presume que o Prometheus pode encontrar suas instâncias do aplicativo Flask em http://app:5000/metrics, onde o nome de domínio do aplicativo pode potencialmente ser resolvido em vários endereços IP, por exemplo, ao operar em Kubernetes ou Mas isso significa que você pode usar o mesmo arquivo docker-compose no.

Se essa exposição do endpoint de métricas não for adequada para você, talvez porque você não queira permitir o acesso externo a ele, você pode facilmente desativá-lo, passando path=None ao criar a instância 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ão você pode usar start_http_server(port), para abrir esse endpoint em outra porta HTTP, 5099 no exemplo acima. Como alternativa, se você estiver confortável com o fato de que o endpoint está no mesmo aplicativo Flask, mas precisa alterar seu caminho de /metrics, você pode ou passar outro URI como parâmetro de caminho, ou usar register_endpoint(..), para definir isso mais tarde.

Links

Se você decidir experimentar, sinta-se à vontade para abrir uma issue no GitHub ou deixar seus comentários, feedbacks e sugestões!

Obrigado!

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster