Bare linjer med kode, og applikasjonen din genererer metrikker, wow!
For å forstå hvordan prometheus_ fungerer,flask_,er det nok med et minimumseksempel:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'Dette er alt som trengs for å komme i gang! Ved å legge til import og en linje for initialisering av PrometheusMetrics, vil du få metrikker for forespørselers varighet, og forespørselsteller,, som vises på endepunktet /metrics til Flask-applikasjonen hvor det er registrert, samt alle standardmetrikker du får fra den grunnleggende .
Du kan finne i GitHub-repositoriet som kjører en instans og sammen med et demonstrasjonsprogram for å generere metrikker som vil se omtrent slik ut:

Du vil også finne en liste over indikatorene i eksemplet, som vises på kontrollpanelet, sammen med Prometheus-forespørslene som fyller panelene.
Konfigurasjon
Biblioteket har mange konfigurasjonsalternativer, ta en kikk i prosjektet deres eksempler med en kort forklaring.
Grunnkonfigurasjonen er vist over. Bare opprett en instans, PrometheusMetricsla oss kalle den metrics,og deretter bruk den til å definere ytterligere metrikker du ønsker å samle inn, ved å dekorere funksjoner:
@metrics.counter(..)@metrics.gauge(..)@metrics.summary(..)@metrics.histogram(..)
Tellere teller forekomster, mens de andre samler inn metrikker avhengig av varigheten av disse forekomstene. Du kan definere etiketter for hver av dem, potensielt ved å bruke egenskaper fra forespørselen eller svaret. For eksempel:
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', 'Antall invokasjoner per samling', labels={
'collection': lambda: request.view_args['collection_id'],
'status': lambda resp: resp.status_code
})
def get_item_from_collection(collection_id, item_id):
passI eksemplet over vil trykk på endepunktet /collection/10002/item/76 øke telleren, for eksempel cnt_collection{collection = "10002", status = "200"}, pluss du vil få standardmetrikker (for hver endepunkt i dette eksemplet) fra standardbiblioteket:
flask_http_request_duration_seconds — Varighet av HTTP-forespørselen i sekunder for alle Flask-forespørsel etter metode, sti og status.flask_http_request_total — Det totale antallet HTTP-forespørsel etter metoder og statuser.— Det totale antallet HTTP-forespørsel etter metoder og statuser.— Totalt antall HTTP-forespørsel etter metoder og statuser.
Det finnes alternativer for å utelate sporing av bestemte endepunkter, registrere ekstra standardmetrikker eller utelate de som er nevnt ovenfor, eller bruke samme tilpassede metrikk på flere endepunkter. Se på prosjektet for å se hva som er tilgjengelig.
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route(' / ')
def main():
pass # forespørslene spores som standard
@app.route(' /skip ')
@metrics.do_not_track()
def skip():
pass # standardmetrikker samles ikke inn
# tilpasset metrikk som skal brukes på flere endepunkter
common_counter = metrics.counter(
'by_endpoint_counter', 'Antall forespørsel etter endepunkter',
labels={'endpoint': lambda: request.endpoint}
)
@app.route(' /common/one ')
@common_counter
def endpoint_one():
pass # spores av de tilpassede og standardmetrikene
@app.route(' /common/two ')
@common_counter
def endpoint_two():
pass # spores også av de tilpassede og standardmetrikene
# registrere flere standardmetrikker
metrics.register_default(
metrics.counter(
'by_path_counter', 'Antall forespørsel etter forespørselstier',
labels={'path': lambda: request.path}
)
)Biblioteket har praktiske utvidelser for populære flerprosesseringsbiblioteker som uWSGI og Gunicorn. Du kan også finne små eksempler på målrettede bruksområder, inkludert flerprosessering.
Innsamling av metrikker
Som nevnt ovenfor, gir biblioteket som standard et endepunkt /metrics i Flask-applikasjonen som kan tjene som mål for .
I det ovennevnte dashbordeksemplet kan du rette Prometheus mot Flask-applikasjonen med standardinnstillinger med følgende konfigurasjon:
scrape_configs:
- job_name: 'eksempel'
dns_sd_configs:
- names: ['app']
port: 5000
type: A
refresh_interval: 5sSe det fullstendige eksemplet i . Dette forutsetter at Prometheus kan finne Flask-applikasjonens instanser på http://app:5000/metrics, der applikasjonsdomenenavnet potensielt kan løses til flere IP-adresser, for eksempel når man opererer i eller .
Hvis en slik utsettelse av metriske endepunkter ikke passer for deg, muligens fordi du ikke ønsker å tillate ekstern tilgang til den, kan du enkelt deaktivere den ved å sende path=None ved opprettelse av instansen 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)Deretter kan du bruke start_http_server(port), for å åpne dette endepunktet på en annen HTTP-port, 5099 i det ovennevnte eksempelet. Alternativt, hvis du er ok med at endepunktet ligger i samme Flask-applikasjon, men trenger å endre stien fra /metrics, du kan enten overføre en annen URI som baneparameter, eller bruke register_endpoint(..), for å sette dette senere.
Lenker
— Denne flasken eksportøren for Prometheus
— Bruk, eksempler og konfigurasjonsparametere
— Eksempler på å sette opp overvåking av Flask-applikasjoner på ulike måter
— Dette prosjektet på PyPI
— Den offisielle klientbiblioteket for Prometheus for Python
Hvis du bestemmer deg for å prøve, ikke nøl med å åpne en issue på GitHub eller gi oss tilbakemeldinger og forslag!
Takk!
Kilde: habr.com
