Pár řádků kódu a vaše aplikace generuje metriky, wow!
Abychom pochopili, jak funguje prometheus_flask_exporter, stačí minimální příklad:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('\/')
def main():
return 'OK'To je vše, co potřebujete, abyste začali! Přidáním importu a řádku pro inicializaci PrometheusMetrics, získáte metriky délky požadavků a počítadla požadavků, zobrazené na koncovém bodě /metrics aplikace Flask, ve které je registrováno, stejně jako všechny metriky dle výchozího nastavení, které získáte z základní .
Můžete najít v repozitáři GitHub, který spouští instanci a společně s demonstrační aplikací pro generování metrik, které budou vypadat přibližně takto:

Najdete také seznam metrik v příkladu, které se zobrazují na řídicím panelu spolu s dotazy Prometheus, které vyplňují panely.
Nastavení
Knihovna má mnoho konfiguračních možností, podívejte se na projekt jejich příklady s krátkým vysvětlením.
Základní konfigurace je zobrazena nahoře. Stačí vytvořit instanci PrometheusMetrics, nazvěme ji metrics, a poté s ní definujte další metriky, které chcete sbírat, dekorováním funkcí:
@metrics.counter(..)@metrics.gauge(..)@metrics.summary(..)@metrics.histogram(..)
Počítadla počítají volání, zatímco ostatní sbírají metriky na základě délky těchto volání. Můžete definovat štítky pro každé z nich, potenciálně pomocí vlastností požadavku nebo odpovědi. Například:
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', 'Počet vyvolání na kolekci', labels={
'collection': lambda: request.view_args['collection_id'],
'status': lambda resp: resp.status_code
})
def get_item_from_collection(collection_id, item_id):
passV uvedeném příkladu stisknutí na koncovém bodě /collection/10002/item/76 povede k zvýšení počítadla, například cnt_collection{collection = „10002“, status = „200“}, navíc získáte výchozí metriky (pro každý koncový bod v tomto příkladu) z knihovny podle výchozího nastavení:
flask_http_request_duration_seconds— Doba trvání HTTP požadavku v sekundách pro všechny požadavky Flask podle metody, cesty a stavuflask_http_request_total— Celkový počet HTTP požadavků podle metod a stavů
Existují možnosti, jak vynechat sledování určitých koncových bodů, registrovat další výchozí metriky nebo vynechat ty, které jsou uvedeny výše, nebo aplikovat stejnou přizpůsobenou metriku na několik koncových bodů. Podívejte se na projektu, abyste zjistili, co je k dispozici.
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
pass # požadavky sledovány výchozími prostředky
@app.route('/skip')
@metrics.do_not_track()
def skip():
pass # výchozí metriky nejsou shromažďovány
# přizpůsobená metrika, která se má aplikovat na více koncových bodů
common_counter = metrics.counter(
'by_endpoint_counter', 'Počet požadavků podle koncových bodů',
labels={'endpoint': lambda: request.endpoint}
)
@app.route('/common/one')
@common_counter
def endpoint_one():
pass # sledováno přizpůsobenou a výchozí metrikou
@app.route('/common/two')
@common_counter
def endpoint_two():
pass # také sledováno přizpůsobenou a výchozí metrikou
# registrovat další výchozí metriky
metrics.register_default(
metrics.counter(
'by_path_counter', 'Počet požadavků podle cest požadavků',
labels={'path': lambda: request.path}
)
)Knihovna nabízí praktická rozšíření pro populární víceprocesorové knihovny, jako jsou uWSGI a Gunicorn. Můžete také najít malé příklady cílových použití, včetně vícero procesorů.
Shromažďování metrik
Jak bylo zmíněno výše, knihovna ve výchozím nastavení poskytuje koncovou adresu /metrics v aplikaci Flask, která může sloužit jako cíl pro .
V uvedeném příkladu s dashboardem můžete nasměrovat svůj Prometheus na aplikaci Flask s výchozími nastaveními s touto konfigurací:
scrape_configs:
- job_name: 'example'
dns_sd_configs:
- names: ['app']
port: 5000
type: A
refresh_interval: 5sPodívejte se na celý příklad v . To předpokládá, že Prometheus může najít vaše instance aplikace Flask na http://app:5000/metrics, kde může být název domény aplikace potenciálně rozlišován na několik IP adres, například při provozu v nebo .
Pokud pro vás takové odhalení koncového bodu metrik nevyhovuje, protože si nepřejete povolit externí přístup k němu, můžete ho snadno vypnout předáním path=None při vytváření instance 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)Pak můžete použít start_http_server(port), abyste otevřeli tento koncový bod na jiném HTTP portu, 5099 ve výše uvedeném příkladu. Alternativně, pokud vám vyhovuje, že koncový bod je ve stejné aplikaci Flask, ale potřebujete změnit jeho cestu od /metrics, můžete buď předat jinou URI jako parametr cesty, nebo použít register_endpoint(..), abyste to nastavili později.
Odkazy
— Tento exporter Flasku pro Prometheus
— Použití, příklady a konfigurační parametry
— Příklady nastavení sledování aplikací Flask různými způsoby
— Tento projekt na PyPI
— Oficiální klientská knihovna Prometheus pro Python
Pokud se rozhodnete vyzkoušet, neváhejte otevřít issue na GitHubu nebo zanechat své komentáře, názory a návrhy!
Děkuji!
Zdroj: habr.com
