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 .
Você pode encontrar no repositório GitHub, que executa uma instância e junto com um aplicativo de demonstração para gerar métricas que ficarão mais ou menos assim:

Você também encontrará uma lista de métricas em 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 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):
passNo 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 statusflask_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 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 .
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: 5sVeja o exemplo completo em . 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 ou .
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
— Este exportador é para o Prometheus
— Uso, exemplos e parâmetros de configuração
— Exemplos de configuração do monitoramento de aplicações Flask de várias maneiras
— Este projeto está no PyPI
— A biblioteca cliente oficial do Prometheus para Python
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
