Monitorovanie mikroservisov Flask s pomocou Prometheusu

Pár riadkov kódu a vaša aplikácia generuje metriky, wow!

Aby ste pochopili, ako funguje prometheus_flask_exporter, stačí minimálny prí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šetko, čo potrebujete na začiatok! Pridaním importu a inicializačného riadku PrometheusMetrics, získate metriky trvania požiadaviek a počítadlá požiadaviek, zobrazené na koncovom bode /metrics aplikácie Flask, v ktorej je registrované, ako aj všetky predvolené metriky, ktoré získate z základnej klientskej knižnice Prometheus.

Môžete nájsť jednoduchý príklad v repozitári GitHub, ktorý spúšťa inštanciu Prometheus a Grafana spolu s ukážkovou aplikáciou na generovanie metrik, ktoré budú vyzerať približne takto:

Monitorovanie mikroservisov Flask s pomocou Prometheusu

Nájdete tiež zoznam metrík v README príklade, ktoré sa zobrazujú na paneli, spolu so žiadosťami Prometheus, ktoré vyplňujú panely.

Nastavenie

Knižnica má množstvo konfiguračných možností, pozrite sa na README projekty s ich príkladmi a stručným vysvetlením.

Základná konfigurácia je uvedená hore. Stačí vytvoriť inštanciu PrometheusMetrics, nazvime ju metrics, a potom s ňou definovať ďalšie metriky, ktoré chcete zhromažďovať, označovaním funkcií:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Čítače počítajú volania a ostatné zhromažďujú metriky v závislosti od trvania týchto volaní. Môžete definovať štítky pre každé z nich, potenciálne pomocou vlastností požiadavky alebo odpovede. Naprí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 invokácií na zbierku', 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 uvedenom príklade kliknutie na koncový bod /collection/10002/item/76 spôsobí zvýšenie počítadla, ako napríklad cnt_collection{collection = „10002“, status = „200“}, plus získate predvolené metriky (pre každý koncový bod v tomto príklade) z knižnice predvolene:

  • flask_http_request_duration_seconds — Doba trvania HTTP požiadaviek v sekundách pre všetky požiadavky Flask podľa metódy, cesty a stavu

  • flask_http_request_total — Celkový počet HTTP požiadaviek podľa metód a stavov

Existujú možnosti preskočiť sledovanie určitých koncových bodov, registrovať ďalšie predvolené metriky alebo preskočiť tie, ktoré sú uvedené vyššie, alebo aplikovať rovnakú prispôsobenú metriku na viaceré koncové body. Zoznámte sa s README projektom, aby ste zistili, čo je k dispozícii.

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

@app.route('/')
def main():
    pass  # požiadavky sú sledované predvolene

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # predvolené metriky nie sú zhromaždené

# prispôsobená metrika, ktorá sa aplikovať na viaceré koncové body
common_counter = metrics.counter(
    'by_endpoint_counter', 'Počet požiadaviek podľa koncových bodov',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # sledovaný prispôsobenou a predvoľbou metrikou

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # taktiež sledovaný prispôsobenou a predvoľbou metrikou

# registrovať ďalšie predvolené metriky
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Počet požiadaviek podľa cestných ciest',
        labels={'path': lambda: request.path}
    )
)

Knižnica obsahuje užitočné rozšírenia pre populárne multiprocesorové knižnice, ako sú uWSGI a Gunicorn. Môžete tiež nájsť malé príklady cieľových scenárov použitia, vrátane multiprocesorových.

Zber metrík

Ako bolo spomenuté vyššie, knižnica predvolene poskytuje koncovú bod /metrics v aplikácii Flask, ktorý môže slúžiť ako cieľ pre zberateľa Prometheus.

V uvedenom príklade s panelom nástrojov môžete nasmerovať svoj Prometheus na aplikáciu Flask s predvolenými nastaveniami s takouto konfiguráciou:

scrape_configs:
  - job_name: 'example'

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

Pozrite si úplný príklad v rezpository GitHub. To predpokladá, že Prometheus môže nájsť vaše inštancie aplikácie Flask na http://app:5000/metrics, kde názov domény aplikácie môže potenciálne resolvovať na niekoľko IP adries, napríklad pri prevádzke v Kubernetes alebo Docker Swarm.

Ak vám takéto sprístupnenie koncového bodu metrík nevyhovuje, možno preto, že nechcete umožniť vonkajší prístup, môžete ho jednoducho vypnúť, ak predáte path=None pri vytváraní inštancie 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)

Potom môžete použiť start_http_server(port), aby ste otvorili tento koncový bod na inom HTTP porte, 5099 v uvedenom príklade. Ako alternatívu, ak vám nevadí, že je koncový bod v tej istej aplikácii Flask, ale potrebujete zmeniť jeho cestu od /metrics, môžete buď zadať inú URI ako parameter cesty, alebo použiť register_endpoint(..), aby ste to neskôr nastavili.

Odkazy

Ak sa rozhodnete vyskúšať, neváhajte otvoriť issue na GitHub alebo zanechať svoje komentáre, recenzie a návrhy!

Ďakujeme!

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster