Überwachung von Flask-Microservices mit Prometheus

Ein paar Zeilen Code und Ihre Anwendung generiert Metriken, wow!

Um zu verstehen, wie Prometheus funktioniert_Flasche_exporter genügt ein Minimalbeispiel:

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 brauchen, um loszulegen! Durch Hinzufügen eines Imports und einer Zeile zur Initialisierung Prometheus-Metriken, erhalten Sie Messwerte Dauer der Anfrage и Anforderungsschalteram Endpunkt angezeigt /Metriken die Flask-App, bei der sie registriert ist, sowie alle Standardmetriken, die Sie von der Basis erhalten Prometheus-Clientbibliothek.

Sie können finden einfach zu verwendendes Beispiel im GitHub-Repository, das die Instanz startet Prometheus и Grafana zusammen mit einer Demoanwendung zum Generieren von Metriken, die etwa so aussehen würde:

Überwachung von Flask-Microservices mit Prometheus

Eine Liste der Indikatoren finden Sie auch in README Beispiele, die im Dashboard angezeigt werden, zusammen mit Prometheus-Abfragen, die die Dashboards füllen.

Einstellung

Die Bibliothek verfügt über viele Konfigurationsmöglichkeiten, schauen Sie sich um README Projizieren Sie ihre Beispiele mit einer kurzen Erklärung.

Die Grundkonfiguration ist oben dargestellt. Einfach instanziieren Prometheus-Metriken, nennen wir es Metriken, und verwenden Sie es dann, um zusätzliche Metriken zu definieren, die Sie durch Dekorationsfunktionen sammeln möchten:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Die Zähler zählen Anrufe und der Rest erfasst Metriken basierend auf der Dauer dieser Anrufe. Sie können für jedes davon Beschriftungen definieren, möglicherweise mithilfe von Anforderungs- oder Antworteigenschaften. Zum Beispiel:

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

Klicken Sie im obigen Beispiel auf den Endpunkt /collection/10002/item/76 führt dazu, dass der Zähler erhöht wird, z.B. cnt_collection{collection = "10002", status = "200"}Außerdem erhalten Sie die Standardmetriken (in diesem Beispiel für jeden Endpunkt) aus der Standardbibliothek:

  • flask_http_request_duration_seconds – Dauer der HTTP-Anfrage in Sekunden für alle Flask-Anfragen nach Methode, Pfad und Status

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

Es gibt Optionen zum Überspringen der Verfolgung bestimmter Endpunkte, zum Registrieren zusätzlicher Standardmetriken oder zum Überspringen der oben genannten oder zum Anwenden derselben benutzerdefinierten Metrik auf mehrere Endpunkte. Kasse README Projekt, um zu sehen, was verfügbar ist.

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

Die Bibliothek verfügt über praktische Erweiterungen für beliebte Multiprozessor-Bibliotheken wie uWSGI und Gunicorn. Dort finden Sie auch kleine Beispiele für Zielanwendungsfälle, einschließlich Multiprozessor-Anwendungsfällen.

Sammlung von Metriken

Wie oben erwähnt, stellt die Standardbibliothek einen Endpunkt bereit /Metriken in einer Flask-Anwendung, die als Ziel dienen kann Assembler Prometheus.

Im obigen Dashboard-Beispiel können Sie Ihr Prometheus auf eine Flask-App mit Standardeinstellungen wie diesen ausrichten:

scrape_configs:
  - job_name: 'example'

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

Das vollständige Beispiel finden Sie unter GitHub-Repositorys. Dies setzt voraus, dass Prometheus Ihre Flask-Anwendungsinstanzen unter finden kann http://app:5000/metrics, wobei der Anwendungsdomänenname möglicherweise in mehrere IP-Adressen aufgelöst werden könnte, beispielsweise beim Ausführen Kubernetes oder Hafenschwarm.

Wenn Ihnen die Offenlegung des Metrik-Endpunkts auf diese Weise nicht zusagt, vielleicht weil Sie keinen externen Zugriff darauf zulassen möchten, können Sie ihn einfach durch Übergeben deaktivieren path=Keine beim Instanziieren Prometheus-Metriken.

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 verwenden start_http_server(port)um diesen Endpunkt auf einem anderen HTTP-Port zu öffnen, 5099 im obigen Beispiel. Alternativ, wenn Sie damit zufrieden sind, dass sich der Endpunkt in derselben Flask-App befindet, aber seinen Pfad ändern müssen /Metriken, können Sie entweder einen anderen URI als Pfadparameter übergeben oder verwenden register_endpoint(..)um es später zu installieren.

Referenzen

Wenn Sie sich entscheiden, es auszuprobieren, können Sie gerne ein Problem auf GitHub eröffnen oder Ihre Kommentare, Rückmeldungen und Vorschläge hinterlassen!

Vielen Dank!

Source: habr.com

Kommentar hinzufügen