Supervisió de microserveis Flask amb Prometheus

Un parell de línies de codi i la vostra aplicació genera mètriques, vaja!

Per entendre com funciona prometheus_matràs_exportador amb un exemple mínim és suficient:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Això és tot el que necessites per començar! Afegint una importació i una línia per a la inicialització PrometheusMetrics, obtindreu mètriques durada de la sol·licitud и comptadors de sol·licituds, que es mostra al punt final /mètriques l'aplicació Flask amb la qual està registrat, així com totes les mètriques predeterminades que obteniu de la base Biblioteca client Prometheus.

pots trobar exemple fàcil d'utilitzar al dipòsit de GitHub que executa la instància Prometeu и Grafana juntament amb una aplicació de demostració per generar mètriques que tindran un aspecte semblant a això:

Supervisió de microserveis Flask amb Prometheus

També trobareu una llista d'indicadors a README exemples que apareixen al tauler, juntament amb les consultes de Prometheus que omplen els taulers.

ajust

Hi ha moltes opcions de configuració a la biblioteca, mireu README Projecte exemples d'ells amb una breu explicació.

La configuració bàsica es mostra a dalt. Només cal crear una instància PrometheusMetrics, diguem-ne mètriques, i després utilitzeu-lo per definir les mètriques addicionals que voleu recollir decorant les funcions:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Els comptadors compten les trucades i altres recullen mètriques en funció de la durada d'aquestes trucades. Podeu definir etiquetes per a cadascun d'ells, potencialment utilitzant propietats de sol·licitud o resposta. Per exemple:

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

A l'exemple anterior, feu clic al punt final /col·lecció/10002/item/76 farà que el comptador augmenti, per exemple cnt_collection{col·lecció = "10002", estat = "200"}, a més, obtindreu les mètriques predeterminades (per a cada punt final d'aquest exemple) de la biblioteca predeterminada:

  • flask_http_request_duration_seconds — Durada de la sol·licitud HTTP en segons per a totes les sol·licituds de Flask per mètode, camí i estat

  • flask_http_request_total — Nombre total de sol·licituds HTTP per mètodes i estats

Hi ha opcions per saltar el seguiment de punts finals específics, registrar mètriques predeterminades addicionals o saltar les enumerades anteriorment, o aplicar la mateixa mètrica personalitzada a diversos punts finals. Fes una ullada README projecte per veure què hi ha disponible.

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

La biblioteca té extensions convenients per a biblioteques de multiprocessament populars com ara uWSGI i Gunicorn. També podeu trobar petits exemples de casos d'ús específics, inclòs el multiprocessament.

Recull de mètriques

Com s'ha esmentat anteriorment, la biblioteca proporciona un punt final per defecte /mètriques en una aplicació Flask, que pot servir com a objectiu per Constructor de Prometeu.

A l'exemple del tauler de control anterior, podeu orientar el vostre Prometheus a una aplicació Flask amb la configuració predeterminada amb aquesta configuració:

scrape_configs:
  - job_name: 'example'

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

Vegeu l'exemple complet a Repositoris GitHub. Això suposa que Prometheus pot trobar les instàncies de l'aplicació Flask http://app:5000/metrics, on el nom de domini de l'aplicació podria resoldre's en diverses adreces IP, per exemple, quan s'executa Kubernetes o docker Swarm.

Si exposar el punt final de mètriques d'aquesta manera no us convé, potser perquè no voleu permetre l'accés extern, podeu desactivar-lo fàcilment passant camí=Cap en crear una instància 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)

Llavors podeu utilitzar start_http_server(port)per obrir aquest punt final en un port HTTP diferent, 5099 en l'exemple anterior. Alternativament, si esteu satisfet amb el punt final a la mateixa aplicació Flask, però heu de canviar-ne el camí de /mètriques, podeu passar un altre URI com a paràmetre de ruta o utilitzar punt_final_registre(..)per instal·lar-lo més tard.

Referències

Si decidiu provar-ho, no dubteu a obrir un problema a GitHub o deixar els vostres comentaris, comentaris i suggeriments!

Gràcies!

Font: www.habr.com

Afegeix comentari