Monitoring Flask Microservices s Prometheus

Pár řádků kódu a vaše aplikace vygeneruje metriky, wow!

Abychom pochopili, jak prometheus_ fungujebaňka_exportérovi 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 mohli začít! Přidáním importu a řádku pro inicializaci PrometheusMetrics, získáte metriky trvání požadavku и počítadla požadavků, zobrazený v koncovém bodě /metriky aplikaci Flask, ve které je registrován, a také všechny výchozí metriky, které získáte ze základny Klientská knihovna Prometheus.

můžeš najít snadno použitelný příklad v úložišti GitHub, ve kterém je instance spuštěna Prometheus и grafana spolu s ukázkovou aplikací pro generování metrik, které budou vypadat nějak takto:

Monitoring Flask Microservices s Prometheus

Najdete zde také seznam indikátorů README příklady, které se zobrazují na řídicím panelu, spolu s dotazy Prometheus, které naplňují řídicí panely.

Nastavení

V knihovně je mnoho možností konfigurace, podívejte se README jejich projektové příklady se stručným vysvětlením.

Základní konfigurace je zobrazena výše. Stačí vytvořit instanci PrometheusMetrics, říkejme tomu metrikya poté jej použijte k definování dalších metrik, které chcete shromažďovat, zdobením funkcí:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Počítadla počítají hovory a ostatní shromažďují metriky na základě délky těchto hovorů. Pro každý z nich můžete definovat štítky, případně 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', '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

Ve výše uvedeném příkladu kliknutí na koncový bod /kolekce/10002/položka/76 způsobí například zvýšení počítadla cnt_collection{collection = "10002", status = "200"}a navíc získáte výchozí metriky (pro každý koncový bod v tomto příkladu) z výchozí knihovny:

  • flask_http_request_duration_seconds — Trvání požadavku HTTP v sekundách pro všechny požadavky Flask podle metody, cesty a stavu

  • flask_http_request_total — Celkový počet požadavků HTTP podle metod a stavů

Existují možnosti přeskočit sledování konkrétních koncových bodů, protokolovat další výchozí metriky nebo přeskočit ty, které jsou uvedeny výše, nebo použít stejnou vlastní metriku na více koncových bodů. Překontrolovat README projektu, abyste viděli, co je k dispozici.

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

Knihovna má praktická rozšíření pro oblíbené multiprocessingové knihovny, jako je uWSGI a Gunicorn. Můžete také najít malé příklady případů cíleného použití, včetně multiprocessingu.

Sbírka metrik

Jak bylo uvedeno výše, knihovna standardně poskytuje koncový bod /metriky v aplikaci Flask, která může sloužit jako cíl pro Stavitel Prometheus.

Ve výše uvedeném příkladu řídicího panelu můžete zacílit svůj Prometheus na aplikaci Flask s výchozím nastavením s touto konfigurací:

scrape_configs:
  - job_name: 'example'

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

Viz celý příklad na Úložiště GitHub. To předpokládá, že Prometheus může najít vaše instance aplikace Flask na http://app:5000/metrics, kde by se název domény aplikace mohl potenciálně přeložit na více IP adres, například při spuštění Kubernetes nebo Docker roj.

Pokud vám vystavení koncového bodu metrik tímto způsobem nevyhovuje, možná proto, že k němu nechcete povolit externí přístup, můžete jej snadno deaktivovat předáním cesta=Žádná 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)otevřít tento koncový bod na jiném portu HTTP, 5099 ve výše uvedeném příkladu. Případně, pokud jste spokojeni s tím, že koncový bod je ve stejné aplikaci Flask, ale musíte změnit jeho cestu /metriky, můžete buď předat jiný URI jako parametr cesty, nebo použít register_endpoint(..)nainstalovat později.

reference

Pokud se rozhodnete to zkusit, neváhejte otevřít problém na GitHubu nebo zanechte své komentáře, zpětnou vazbu a návrhy!

Děkujeme!

Zdroj: www.habr.com