Monitorando microsserviços Flask com Prometheus

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

Para entender como funciona o prometheus_frasco_exportador, basta um exemplo mínimo:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Isso é tudo que você precisa para começar! Adicionando uma importação e uma linha para inicialização Métricas do Prometheus, você obterá métricas duração da solicitação и solicitar contadores, exibido no ponto final /Métricas o aplicativo Flask com o qual ele está registrado, bem como todas as métricas padrão que você obtém da base Biblioteca cliente Prometheus.

você pode encontrar exemplo fácil de usar no repositório GitHub que executa a instância Prometeu и grafana junto com um aplicativo de demonstração para gerar métricas parecidas com estas:

Monitorando microsserviços Flask com Prometheus

Você também encontrará uma lista de indicadores em README exemplos que aparecem no painel, juntamente com consultas do Prometheus que preenchem os painéis.

Fixação

Existem muitas opções de configuração na biblioteca, veja README exemplos de projetos deles com uma breve explicação.

A configuração básica é mostrada acima. Basta criar uma instância Métricas do Prometheus, vamos chamá-lo métricae use-o para definir as métricas adicionais que você deseja coletar decorando as funções:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Os contadores contam as chamadas e outros coletam métricas com base na duração dessas chamadas. Você pode definir rótulos para cada um deles, potencialmente usando propriedades de solicitação 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 acima, clicando no endpoint /coleção/10002/item/76 fará com que o contador aumente, por exemplo cnt_collection{coleção = "10002", status = "200"}, além de obter as métricas padrão (para cada endpoint neste exemplo) da biblioteca padrão:

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

  • flask_http_request_total — Número total de solicitações HTTP por métodos e status

Existem opções para ignorar o rastreamento de endpoints específicos, registrar métricas padrão adicionais ou ignorar as listadas acima, ou aplicar a mesma métrica personalizada a vários endpoints. Confira README projeto para ver o que está disponível.

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 possui extensões convenientes para bibliotecas de multiprocessamento populares, como uWSGI e Gunicorn. Você também pode encontrar pequenos exemplos de casos de uso direcionados, incluindo multiprocessamento.

Coleta de métricas

Conforme mencionado acima, a biblioteca fornece um endpoint por padrão /Métricas em uma aplicação Flask, que pode servir como alvo para Construtor Prometeu.

No exemplo do painel acima, você poderia direcionar seu Prometheus para um aplicativo Flask com configurações padrão com esta configuração:

scrape_configs:
  - job_name: 'example'

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

Veja exemplo completo em Repositórios GitHub. Isso pressupõe que o Prometheus pode encontrar as instâncias do seu aplicativo Flask em http://app:5000/metrics, onde o nome de domínio do aplicativo poderia potencialmente ser resolvido para vários endereços IP, por exemplo, ao executar em Kubernetes ou Docker swarm.

Se expor o endpoint de métricas dessa forma não for adequado para você, talvez porque você não queira permitir acesso externo a ele, você pode desativá-lo facilmente passando caminho=Nenhum ao criar uma instância Métricas do Prometheus.

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(porta)para abrir este endpoint em uma porta HTTP diferente, 5099 no exemplo acima. Alternativamente, se você estiver satisfeito com o endpoint estar no mesmo aplicativo Flask, mas precisar alterar seu caminho de /Métricas, você pode passar outro URI como parâmetro de caminho ou usar ponto final_de_registro(..)para instalá-lo mais tarde.

referências

Se você decidir tentar, fique à vontade para abrir um problema no GitHub ou deixar seus comentários, feedback e sugestões!

Obrigado!

Fonte: habr.com

Adicionar um comentário