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 .
Możesz znaleźć w repozytorium GitHub, które uruchamia instancję i razem z aplikacją demonstracyjną do generowania metryki, które będą wyglądać mniej więcej tak:

Znajdziesz również listę wskaźników w 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 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):
passW 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 statusuflask_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 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 .
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: 5sZobacz pełny przykład w . 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 lub .
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
— Ten eksporcie flakonów dla Prometheus
— Użycie, przykłady i opcje konfiguracji
— Przykłady konfiguracji monitorowania aplikacji Flask na różne sposoby
— Ten projekt na PyPI
— Oficjalna biblioteka kliencka Prometheus dla Pythona
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
