Valvontapullon mikropalvelut Prometheuksen avulla

Pari koodiriviä ja sovelluksesi luo mittareita, vau!

Ymmärtääkseen kuinka prometheus_ toimiipullo_viejälle riittää pieni esimerkki:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Siinä kaikki mitä tarvitset aloittaaksesi! Lisäämällä tuonti ja rivi alustusta varten PrometheusMetrics, saat mittareita pyynnön kesto и pyyntölaskurit, näytetään päätepisteessä /metrics Flask-sovellus, johon se on rekisteröity, sekä kaikki oletusmittarit, jotka saat tukiasemasta Prometheus-asiakaskirjasto.

voit löytää helppokäyttöinen esimerkki esiintymää suorittavassa GitHub-arkistossa Prometheus и grafana sekä esittelysovellus, jolla voidaan luoda mittareita, jotka näyttävät tältä:

Valvontapullon mikropalvelut Prometheuksen avulla

Löydät myös luettelon indikaattoreista LUEMINUT esimerkkejä, jotka näkyvät kojelaudassa, sekä Prometheus-kyselyitä, jotka täyttävät kojelaudat.

säätö

Kirjastossa on monia konfigurointivaihtoehtoja, katso LUEMINUT projektiesimerkkejä niistä lyhyen selityksen kera.

Peruskokoonpano on esitetty yllä. Luo vain esiintymä PrometheusMetrics, kutsutaan sitä mittarit, ja käytä sitä määrittämään lisätiedot, jotka haluat kerätä koristelemalla funktioita:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Laskurit laskevat puhelut, ja muut keräävät mittareita puheluiden keston perusteella. Voit määrittää kullekin näistä tunnisteita käyttämällä mahdollisesti pyyntö- tai vastausominaisuuksia. Esimerkiksi:

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

Yllä olevassa esimerkissä päätepisteen napsauttaminen /collection/10002/item/76 saa esimerkiksi laskurin kasvamaan cnt_collection{collection = "10002", status = "200"}, ja saat oletusarvot (jokaiselle päätepisteelle tässä esimerkissä) oletuskirjastosta:

  • flask_http_request_duration_seconds — HTTP-pyynnön kesto sekunneissa kaikille Flask-pyynnöille menetelmän, polun ja tilan mukaan

  • flask_http_request_total — HTTP-pyyntöjen kokonaismäärä menetelmien ja tilojen mukaan

On olemassa vaihtoehtoja ohittaa tiettyjen päätepisteiden seuranta, kirjata muita oletusmittareita tai ohittaa yllä luetellut tai käyttää samaa mukautettua mittaa useisiin päätepisteisiin. Tarkista LUEMINUT projekti nähdäksesi mitä on saatavilla.

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

Kirjastossa on käteviä laajennuksia suosittuihin moniprosessointikirjastoihin, kuten uWSGI ja Gunicorn. Löydät myös pieniä esimerkkejä kohdistetuista käyttötapauksista, mukaan lukien monikäsittely.

Mittarikokoelma

Kuten edellä mainittiin, kirjasto tarjoaa päätepisteen oletuksena /metrics pullosovelluksessa, joka voi toimia kohteena Prometheuksen rakentaja.

Yllä olevassa kojelautaesimerkissä voit kohdistaa Prometheus-laitteesi Flask-sovellukseen, jossa on oletusasetukset tällä kokoonpanolla:

scrape_configs:
  - job_name: 'example'

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

Katso täydellinen esimerkki osoitteessa GitHub-arkistot. Tämä olettaa, että Prometheus löytää Flask-sovellusesiintymäsi päällä http://app:5000/metrics, jossa sovelluksen verkkotunnuksen nimi voi mahdollisesti muodostua useiksi IP-osoitteiksi esimerkiksi sisäänkäynnin yhteydessä Kubernetes tai Docker-parvi.

Jos mittauspäätepisteen paljastaminen tällä tavalla ei sovi sinulle, ehkä koska et halua sallia ulkoista pääsyä siihen, voit helposti poistaa sen käytöstä ohittamalla path=Ei mitään kun luot ilmentymän 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)

Sitten voit käyttää aloitus_http_palvelin(portti)avataksesi tämän päätepisteen eri HTTP-portissa, 5099 yllä olevassa esimerkissä. Vaihtoehtoisesti, jos olet tyytyväinen siihen, että päätepiste on samassa Flask-sovelluksessa, mutta sinun on muutettava sen polkua /metrics, voit joko välittää toisen URI:n polkuparametriksi tai käyttää register_endpoint(..)asentaaksesi sen myöhemmin.

viittaukset

Jos päätät kokeilla sitä, avaa ongelma GitHubissa tai jätä kommenttisi, palautteesi ja ehdotuksesi!

Kiitos!

Lähde: will.com

Lisää kommentti