Monitoring mikroserwisów Flask z użyciem Prometheus

Kilka linijek kodu i twoja aplikacja generuje metryki, wow!

Aby zrozumieć, jak działa prometheus_flask_eksporter wymaga minimalnego przykładu:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

@app.route('')
def main():
    return 'OK'

To wszystko, co potrzebne na początek! Dodając import i linię inicjalizacyjną PrometheusMetrics, otrzymasz metryki czasów trwania żądań i liczniki żądań, wyświetlane na końcowym punkcie /metrics aplikacji Flask, w której jest zarejestrowane, oraz wszystkie metryki domyślne, które otrzymujesz z podstawowej biblioteki klienckiej Prometheus.

Możesz znaleźć prosty w użyciu przykład w repozytorium GitHub, które uruchamia instancję Prometheus i Grafana razem z aplikacją demonstracyjną do generowania metryki, które będą wyglądać mniej więcej tak:

Monitoring mikroserwisów Flask z użyciem Prometheus

Znajdziesz również listę wskaźników w README przykładzie, które są wyświetlane na pulpicie, wraz z zapytaniami Prometheus, które wypełniają panele.

Konfiguracja

W bibliotece jest wiele opcji konfiguracyjnych, sprawdź w README projektach ich przykłady z krótkim wyjaśnieniem.

Podstawowa konfiguracja pokazana jest na górze. Po prostu stwórz instancję PrometheusMetrics, nazwijmy ją metrics, a następnie za jej pomocą określ dodatkowe metryki, które chcesz zbierać, dekorując funkcje:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Liczniki zliczają wywołania, a pozostałe zbierają metryki w zależności od czasu trwania tych wywołań. Możesz określić etykiety dla każdego z nich, potencjalnie używając właściwości żądania lub odpowiedzi. Na przykład:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# grupa według końcowego punktu, a nie ścieżki
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Liczba wywołań na kolekcję', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

W powyższym przykładzie naciśnięcie końcowego punktu /collection/10002/item/76 spowoduje zwiększenie licznika, na przykład cnt_collection{collection = "10002", status = "200"}, a ponadto otrzymasz metryki domyślne (dla każdego końcowego punktu w tym przykładzie) z biblioteki domyślnej:

  • flask_http_request_duration_seconds — Czas trwania żądania HTTP w sekundach dla wszystkich żądań Flask według metody, ścieżki i statusu

  • flask_http_request_total — Całkowita liczba żądań HTTP według metod i statusów

Są opcje, aby pominąć śledzenie określonych punktów końcowych, zarejestrować dodatkowe metryki domyślne lub pominąć te wymienione powyżej, lub zastosować tę samą dostosowaną metrykę do wielu punktów końcowych. Zapoznaj się z README projektem, aby dowiedzieć się, co jest dostępne.

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

@app.route('')
def main():
    pass  # żądania śledzone domyślnie

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # domyślne metryki nie są zbierane

# dostosowana metryka do zastosowania w wielu punktach końcowych
common_counter = metrics.counter(
    'by_endpoint_counter', 'Liczba żądań według punktów końcowych',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # śledzone przez metryki domyślne i dostosowane

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # również śledzone przez metryki domyślne i dostosowane

# rejestracja dodatkowych domyślnych metryk
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Liczba żądań według ścieżek',
        labels={'path': lambda: request.path}
    )
)

Biblioteka zawiera wygodne rozszerzenia dla popularnych bibliotek wieloprocesowych, takich jak uWSGI i Gunicorn. Możesz również znaleźć małe przykłady celowych zastosowań, w tym wieloprocesowych.

Zbieranie metryk

Jak wspomniano powyżej, biblioteka domyślnie udostępnia punkt końcowy /metrics w aplikacji Flask, który może służyć jako cel dla zbieracza Prometheus.

W podanym powyżej przykładzie z panelem kontrolnym możesz skierować swój Prometheus na aplikację Flask z domyślnymi ustawieniami przy takiej konfiguracji:

scrape_configs:
  - job_name: 'example'

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

Zobacz pełny przykład w repozytorium GitHub. To zakłada, że Prometheus może znaleźć Twoje instancje aplikacji Flask na http://app:5000/metrics, gdzie nazwa domeny aplikacji może potencjalnie rozwiązywać się na wiele adresów IP, na przykład podczas działania w Kubernetes lub Czy to oznacza, że można używać tego samego pliku docker-compose w.

Jeśli takie ujawnienie punktu końcowego metryk Ci nie odpowiada, być może dlatego, że nie chcesz pozwolić na dostęp zewnętrzny do niego, możesz łatwo wyłączyć go, przekazując path=None podczas tworzenia instancji 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)

Następnie możesz użyć start_http_server(port), aby otworzyć ten punkt końcowy na innym porcie HTTP, 5099 w powyższym przykładzie. Alternatywnie, jeśli chcesz, aby punkt końcowy znajdował się w tej samej aplikacji Flask, ale musisz zmienić jego ścieżkę na /metrics, możesz przekazać inny URI jako parametr ścieżki lub użyć register_endpoint(..), aby ustawić to później.

Linki

Jeśli zdecydujesz się spróbować, nie wahaj się otworzyć zgłoszenia na GitHubie lub zostawić swoich komentarzy, opinii i sugestii!

Dziękuję!

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster