Monitoring Flask Microservices s Prometheus

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

Aby ste pochopili, ako funguje prometheus_flask_exportérovi 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, aby ste mohli začať! Pridaním importu a riadku na inicializáciu PrometheusMetrics, získate metriky trvanie žiadosti и počítadlá žiadostí, zobrazený v koncovom bode /metrics aplikáciu Flask, v ktorej je zaregistrovaný, ako aj všetky predvolené metriky, ktoré získate zo základne Klientska knižnica Prometheus.

môžeš nájsť ľahko použiteľný príklad v úložisku GitHub, v ktorom je spustená inštancia Prometheus и grafana spolu s ukážkovou aplikáciou na generovanie metrík, ktoré budú vyzerať asi takto:

Monitoring Flask Microservices s Prometheus

Nájdete tu aj zoznam indikátorov README príklady, ktoré sa zobrazujú na dashboarde, spolu s dopytmi Prometheus, ktoré vypĺňajú dashboardy.

nastavenie

V knižnici je veľa možností konfigurácie, pozrite sa README ich projektové príklady so stručným vysvetlením.

Základná konfigurácia je zobrazená vyššie. Stačí vytvoriť inštanciu PrometheusMetrics, nazvime to metrikya potom ho použite na definovanie ďalších metrík, ktoré chcete zhromažďovať, zdobením funkcií:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Počítadlá počítajú hovory a iné zhromažďujú metriky na základe trvania týchto hovorov. Pre každý z nich môžete definovať označenia, prípadne 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', '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

Vo vyššie uvedenom príklade kliknutie na koncový bod /kolekcia/10002/položka/76 spôsobí napríklad zvýšenie počítadla cnt_collection{collection = "10002", status = "200"}a navyše získate predvolené metriky (pre každý koncový bod v tomto príklade) z predvolenej knižnice:

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

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

Existujú možnosti, ako preskočiť sledovanie konkrétnych koncových bodov, zaznamenať ďalšie predvolené metriky alebo preskočiť tie, ktoré sú uvedené vyššie, alebo použiť rovnakú vlastnú metriku na viacero koncových bodov. Odhlásiť sa README projektu, aby ste videli, čo je k dispozícii.

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}
    )
)

Knižnica má pohodlné rozšírenia pre populárne multiprocessingové knižnice, ako sú uWSGI a Gunicorn. Môžete tiež nájsť malé príklady prípadov cieleného použitia vrátane multiprocessingu.

Zbierka metrík

Ako je uvedené vyššie, knižnica štandardne poskytuje koncový bod /metrics v aplikácii Flask, ktorá môže slúžiť ako cieľ pre Staviteľ Prometheus.

Vo vyššie uvedenom príklade ovládacieho panela môžete svoj Prometheus zacieliť na aplikáciu Flask s predvolenými nastaveniami s touto konfiguráciou:

scrape_configs:
  - job_name: 'example'

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

Pozrite si celý príklad na úložiská GitHub. To predpokladá, že Prometheus môže nájsť vaše inštancie aplikácie Flask na http://app:5000/metrics, kde by sa názov domény aplikácie mohol potenciálne rozložiť na viacero IP adries, napríklad pri spustení Kubernetes alebo Dockerov roj.

Ak vám vystavenie koncového bodu metrík týmto spôsobom nevyhovuje, možno preto, že k nemu nechcete povoliť externý prístup, môžete ho jednoducho zakázať prechodom cesta=Žiadna 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ť štart_http_server(port)otvoriť tento koncový bod na inom HTTP porte, 5099 vo vyššie uvedenom príklade. Prípadne, ak ste spokojní s tým, že koncový bod je v rovnakej aplikácii Flask, ale musíte zmeniť jeho cestu /metrics, môžete buď odovzdať iný URI ako parameter cesty, alebo použiť register_endpoint(..)na inštaláciu neskôr.

referencie

Ak sa to rozhodnete vyskúšať, pokojne otvorte problém na GitHub alebo zanechajte svoje komentáre, spätnú väzbu a návrhy!

Ďakujeme!

Zdroj: hab.com

Pridať komentár