Monitorowanie mikrousług Flask za pomocą Prometheusa

Kilka linii kodu i aplikacja generuje metryki, wow!

Aby zrozumieć, jak działa prometeusz_kolba_eksporterowi wystarczy minimalny przykład:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

To wszystko, czego potrzebujesz, aby zacząć! Dodając import i linię do inicjalizacji Prometeusz Metryka, otrzymasz metryki czas trwania żądania и liczniki żądań, wyświetlany w punkcie końcowym /metryka aplikacja Flask, w której jest zarejestrowana, a także wszystkie domyślne metryki, które otrzymujesz z bazy Biblioteka klienta Prometheus.

możesz znaleźć łatwy w użyciu przykład w repozytorium GitHub, w którym działa instancja Prometheus и grafana wraz z aplikacją demonstracyjną do generowania metryk, które będą wyglądać mniej więcej tak:

Monitorowanie mikrousług Flask za pomocą Prometheusa

Listę wskaźników znajdziesz także w README przykłady wyświetlane na pulpicie nawigacyjnym wraz z zapytaniami Prometheus wypełniającymi pulpity nawigacyjne.

regulacja

W bibliotece dostępnych jest wiele opcji konfiguracji, spójrz README przykłady projektów z krótkim objaśnieniem.

Podstawowa konfiguracja jest pokazana powyżej. Po prostu utwórz instancję Prometeusz Metryka, nazwijmy to metryka, a następnie użyj go do zdefiniowania dodatkowych metryk, które chcesz zebrać, dekorując funkcje:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Liczniki zliczają połączenia, a inne zbierają dane na podstawie czasu trwania tych połączeń. Dla każdego z nich można zdefiniować etykiety, potencjalnie wykorzystują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__)

# 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

W powyższym przykładzie kliknięcie punktu końcowego /kolekcja/10002/item/76 spowoduje na przykład zwiększenie licznika cnt_collection{kolekcja = "10002", status = "200"}, a dodatkowo otrzymasz domyślne metryki (dla każdego punktu końcowego 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

Istnieją opcje pominięcia śledzenia określonych punktów końcowych, rejestrowania dodatkowych wskaźników domyślnych lub pominięcia tych wymienionych powyżej, a także zastosowania tych samych niestandardowych danych do wielu punktów końcowych. Wymeldować się README projektu, aby zobaczyć, co jest dostępne.

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

Biblioteka posiada wygodne rozszerzenia dla popularnych bibliotek wieloprocesorowych, takich jak uWSGI i Gunicorn. Można również znaleźć małe przykłady ukierunkowanych przypadków użycia, w tym przetwarzania wieloprocesowego.

Zbiór metryk

Jak wspomniano powyżej, biblioteka domyślnie udostępnia punkt końcowy /metryka w aplikacji Flask, która może służyć jako cel Konstruktor Prometeusza.

W powyższym przykładzie pulpitu nawigacyjnego możesz skierować Prometheusa na aplikację Flask z ustawieniami domyślnymi w tej konfiguracji:

scrape_configs:
  - job_name: 'example'

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

Zobacz pełny przykład na Repozytoria GitHuba. Zakłada się, że Prometheus może znaleźć instancje aplikacji Flask http://app:5000/metrics, gdzie nazwa domeny aplikacji może potencjalnie zostać przetłumaczona na wiele adresów IP, na przykład podczas uruchamiania Kubernetes lub Rój dokerów.

Jeśli ujawnienie punktu końcowego metryk w ten sposób Ci nie odpowiada, być może dlatego, że nie chcesz zezwalać na dostęp do niego z zewnątrz, możesz łatwo go wyłączyć, przekazując ścieżka=Brak podczas tworzenia instancji Prometeusz Metryka.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)

...

metrics.start_http_server(5099)

Wtedy 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 jesteś zadowolony z punktu końcowego znajdującego się w tej samej aplikacji Flask, ale musisz zmienić jego ścieżkę z /metryka, możesz przekazać inny identyfikator URI jako parametr ścieżki lub użyć rejestr_punkt końcowy(..)aby zainstalować go później.

referencje

Jeśli zdecydujesz się spróbować, możesz otworzyć problem w GitHub lub zostawić swoje komentarze, opinie i sugestie!

Dziękuję!

Źródło: www.habr.com

Dodaj komentarz