Monitoring mikroslužeb Flask pomocí Prometheus

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í klientské knihovny Prometheus.

Můžete najít snadno použitelný příklad v repozitáři GitHub, který spouští instanci Prometheus a Grafana společně s demonstrační aplikací pro generování metrik, které budou vypadat přibližně takto:

Monitoring mikroslužeb Flask pomocí Prometheus

Najdete také seznam metrik v README 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 README 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):
    pass

V 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 stavu

  • flask_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 README 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 shromažďovač Prometheus..

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: 5s

Podívejte se na celý příklad v repozitory GitHub.. 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 Kubernetes nebo Docker Swarm.

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

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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster