Überwachung von Flask-Mikrodiensten mit Prometheus

Ein paar Zeilen Code und Ihre Anwendung generiert Metriken. Wow!

Um zu verstehen, wie prometheus_ funktioniert,flask_reicht ein einfaches Beispiel:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Das ist alles, was Sie für den Einstieg benötigen! Fügen Sie den Import und die Initialisierungszeile hinzu PrometheusMetrics, und Sie erhalten Metriken zur Dauer der Anfragen und Anfrageschalter, die am Endpunkt angezeigt werden /metrics der Flask-Anwendung, in der es registriert ist, sowie alle Standardmetriken, die Sie aus der Basis- Prometheus-Client-Bibliothek erhalten.

Sie können ein einfach zu benutzendes Beispiel im GitHub-Repository finden, das eine Instanz startet Prometheus und Grafana neben einer Demoanwendung zur Generierung von Metriken, die ungefähr so aussehen werden:

Überwachung von Flask-Mikrodiensten mit Prometheus

Sie finden auch eine Liste von Metriken in README dem Beispiel, die im Dashboard angezeigt werden, zusammen mit Prometheus-Abfragen, die die Panels füllen.

Konfiguration

Die Bibliothek bietet viele Konfigurationsoptionen, schauen Sie sich die README Projekte deren Beispiele mit einer kurzen Erklärung an.

Die Basiskonfiguration ist oben dargestellt. Erstellen Sie einfach eine Instanz. PrometheusMetrics, nennen wir sie metrics, und nutzen Sie sie dann, um zusätzliche Metriken zu definieren, die Sie sammeln möchten, indem Sie die Funktionen dekorieren:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Zähler zählen die Aufrufe, während die anderen Metriken je nach Dauer dieser Aufrufe sammeln. Sie können Labels für jedes definieren, wobei Sie potenziell Eigenschaften der Anfrage oder der Antwort verwenden. Zum Beispiel:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# Gruppieren nach Endpunkt statt nach Pfad
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Anzahl der Aufrufe pro Sammlung', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

Im obigen Beispiel wird das Klicken auf den Endpunkt /collection/10002/item/76 zugleich den Zähler erhöhen, zum Beispiel cnt_collection{collection = "10002", status = "200"}, zudem erhalten Sie Standardmetriken (für jeden Endpunkt in diesem Beispiel) aus der Standardbibliothek:

  • flask_http_request_duration_seconds — HTTP-Anforderungsdauer in Sekunden für alle Flask-Anfragen, unterteilt nach Methode, Pfad und Status.

  • flask_http_request_total — Gesamtzahl der HTTP-Anfragen nach Methoden und Status

Es gibt Optionen, um das Tracking bestimmter Endpunkte zu überspringen, zusätzliche Standardmetriken zu registrieren oder die oben genannten zu überspringen, oder dieselbe anpassbare Metrik auf mehrere Endpunkte anzuwenden. Informieren Sie sich über README das Projekt, um zu sehen, was verfügbar ist.

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

@app.route('/')
def main():
    pass  # Anfragen werden standardmäßig verfolgt

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # Standardmetriken werden nicht erfasst

# benutzerdefinierte Metrik, die auf mehrere Endpunkte angewendet wird
common_counter = metrics.counter(
    'by_endpoint_counter', 'Anzahl der Anfragen nach Endpunkten',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # verfolgt durch die benutzerdefinierten und die Standardmetriken

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # auch verfolgt durch die benutzerdefinierten und die Standardmetriken

# zusätzliche Standardmetriken registrieren
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Anzahl der Anfragen nach Anforderungswegen',
        labels={'path': lambda: request.path}
    )
)

Die Bibliothek bietet nützliche Erweiterungen für beliebte Multiprozessor-Bibliotheken wie uWSGI und Gunicorn. Sie finden auch kleine Beispiele für Anwendungsfälle, einschließlich Multiprozessor-fähiger Optionen.

Metriksammlung

Wie bereits erwähnt, bietet die Standardbibliothek einen Endpunkt /metrics in der Flask-Anwendung, der als Ziel für den Prometheus-Scraper dienen kann..

In dem obigen Beispiel mit dem Dashboard können Sie Ihren Prometheus auf die Flask-Anwendung mit den Standardkonfigurationen mit folgender Konfiguration ausrichten:

scrape_configs:
  - job_name: 'example'

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

Siehe vollständiges Beispiel in hinzugefügt wird. Anweisungen, wie Sie das tun können, finden Sie im. Dies geht davon aus, dass Prometheus Ihre Instanzen der Flask-Anwendung finden kann unter http://app:5000/metrics, wo der Domainname der Anwendung möglicherweise auf mehrere IP-Adressen aufgelöst werden kann, beispielsweise wenn Sie in Kubernetes oder Docker Swarm.

Wenn Ihnen eine solche Offenlegung des Metrik-Endpunkts nicht zusagt, möglicherweise weil Sie externen Zugriff darauf nicht zulassen möchten, können Sie sie einfach deaktivieren, indem Sie path=None beim Erstellen einer Instanz übergeben: 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)

Dann können Sie start_http_server(port), um diesen Endpunkt auf einem anderen HTTP-Port zu öffnen. 5099 im obigen Beispiel. Als Alternative, wenn es für Sie in Ordnung ist, dass der Endpunkt sich in derselben Flask-Anwendung befindet, aber Sie den Pfad ändern müssen von /metrics, können Sie entweder einen anderen URI als Pfadparameter übergeben oder register_endpoint(..), um dies später festzulegen.

Links

Wenn Sie es ausprobieren möchten, zögern Sie nicht, ein Issue auf GitHub zu eröffnen oder Ihre Kommentare, Feedback und Vorschläge zu hinterlassen!

Danke!

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster