Monitoring Flask Microservices με Prometheus

Μερικές γραμμές κώδικα και η εφαρμογή σας δημιουργεί μετρήσεις, ουάου!

Για να καταλάβουμε πώς λειτουργεί ο prometheus_φλάσκα_εξαγωγέα αρκεί ένα ελάχιστο παράδειγμα:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Αυτό είναι το μόνο που χρειάζεστε για να ξεκινήσετε! Προσθέτοντας μια εισαγωγή και μια γραμμή για προετοιμασία PrometheusMetrics, θα λάβετε μετρήσεις διάρκεια αιτήματος и μετρητές αιτημάτων, εμφανίζεται στο τελικό σημείο /μετρικές την εφαρμογή Flask με την οποία είναι καταχωρημένη, καθώς και όλες τις προεπιλεγμένες μετρήσεις που λαμβάνετε από τη βάση Βιβλιοθήκη πελατών Prometheus.

μπορείς να βρεις εύκολο στη χρήση παράδειγμα στο αποθετήριο GitHub που εκτελεί την παρουσία Προμηθέας и Γκράφανα μαζί με μια εφαρμογή επίδειξης για τη δημιουργία μετρήσεων που θα μοιάζουν κάπως έτσι:

Monitoring Flask Microservices με Prometheus

Θα βρείτε επίσης μια λίστα δεικτών στο README παραδείγματα που εμφανίζονται στον πίνακα εργαλείων, μαζί με ερωτήματα Prometheus που συμπληρώνουν τους πίνακες εργαλείων.

προσαρμογή

Υπάρχουν πολλές επιλογές διαμόρφωσης στη βιβλιοθήκη, κοιτάξτε README Προβάλετε παραδείγματα αυτών με μια σύντομη εξήγηση.

Η βασική διαμόρφωση φαίνεται παραπάνω. Απλώς δημιουργήστε ένα παράδειγμα PrometheusMetrics, ας το πούμε μετρήσειςκαι, στη συνέχεια, χρησιμοποιήστε το για να ορίσετε τις πρόσθετες μετρήσεις που θέλετε να συλλέξετε διακοσμώντας τις συναρτήσεις:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Οι μετρητές μετρούν τις κλήσεις και άλλοι συλλέγουν μετρήσεις με βάση τη διάρκεια αυτών των κλήσεων. Μπορείτε να ορίσετε ετικέτες για καθένα από αυτά, χρησιμοποιώντας ενδεχομένως ιδιότητες αιτήματος ή απόκρισης. Για παράδειγμα:

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

Στο παραπάνω παράδειγμα, κάνοντας κλικ στο τελικό σημείο /collection/10002/item/76 θα προκαλέσει την αύξηση του μετρητή, για παράδειγμα cnt_collection{collection = "10002", status = "200"}, συν ότι θα λάβετε τις προεπιλεγμένες μετρήσεις (για κάθε τελικό σημείο σε αυτό το παράδειγμα) από την προεπιλεγμένη βιβλιοθήκη:

  • flask_http_request_duration_seconds — Διάρκεια αιτήματος HTTP σε δευτερόλεπτα για όλα τα αιτήματα Flask κατά μέθοδο, διαδρομή και κατάσταση

  • flask_http_request_total — Συνολικός αριθμός αιτημάτων HTTP κατά μεθόδους και καταστάσεις

Υπάρχουν επιλογές για παράλειψη παρακολούθησης συγκεκριμένων σημείων, καταγραφή πρόσθετων προεπιλεγμένων μετρήσεων ή παράλειψη αυτών που αναφέρονται παραπάνω ή εφαρμογή της ίδιας προσαρμοσμένης μέτρησης σε πολλά τελικά σημεία. Ολοκλήρωση αγοράς README έργο για να δείτε τι είναι διαθέσιμο.

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

Η βιβλιοθήκη έχει βολικές επεκτάσεις για δημοφιλείς βιβλιοθήκες πολλαπλής επεξεργασίας όπως το uWSGI και το Gunicorn. Μπορείτε επίσης να βρείτε μικρά παραδείγματα περιπτώσεων στοχευμένης χρήσης, συμπεριλαμβανομένης της πολυεπεξεργασίας.

Συλλογή μετρήσεων

Όπως αναφέρθηκε παραπάνω, η βιβλιοθήκη παρέχει ένα τελικό σημείο από προεπιλογή /μετρικές σε μια εφαρμογή Flask, η οποία μπορεί να χρησιμεύσει ως στόχος για Προμηθέας οικοδόμος.

Στο παραπάνω παράδειγμα του πίνακα εργαλείων, θα μπορούσατε να στοχεύσετε τον Prometheus σας σε μια εφαρμογή Flask με προεπιλεγμένες ρυθμίσεις με αυτήν τη διαμόρφωση:

scrape_configs:
  - job_name: 'example'

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

Δείτε το πλήρες παράδειγμα στο Αποθετήρια GitHub. Αυτό προϋποθέτει ότι ο Prometheus μπορεί να βρει τα στιγμιότυπα της εφαρμογής σας στο Flask http://app:5000/metrics, όπου το όνομα τομέα της εφαρμογής θα μπορούσε ενδεχομένως να επιλυθεί σε πολλές διευθύνσεις IP, για παράδειγμα κατά την εκτέλεση Kubernetes ή Σμήνος Docker.

Εάν η έκθεση του τελικού σημείου μετρήσεων με αυτόν τον τρόπο δεν σας ταιριάζει, ίσως επειδή δεν θέλετε να επιτρέψετε εξωτερική πρόσβαση σε αυτό, μπορείτε εύκολα να το απενεργοποιήσετε περνώντας μονοπάτι=Καμία κατά τη δημιουργία ενός στιγμιότυπου 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)

Στη συνέχεια, μπορείτε να χρησιμοποιήσετε start_http_server(port)για να ανοίξετε αυτό το τελικό σημείο σε διαφορετική θύρα HTTP, 5099 στο παραπάνω παράδειγμα. Εναλλακτικά, εάν είστε ευχαριστημένοι με το τελικό σημείο που βρίσκεται στην ίδια εφαρμογή Flask, αλλά πρέπει να αλλάξετε τη διαδρομή του από /μετρικές, μπορείτε είτε να μεταβιβάσετε ένα άλλο URI ως παράμετρο διαδρομής είτε να το χρησιμοποιήσετε register_endpoint(..)για να το εγκαταστήσετε αργότερα.

παραπομπές

Εάν αποφασίσετε να το δοκιμάσετε, μη διστάσετε να ανοίξετε ένα θέμα στο GitHub ή αφήστε τα σχόλια, τα σχόλια και τις προτάσεις σας!

Σας ευχαριστούμε!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο