Flask mikroservisu uzraudzība ar Prometheus

Dažas koda rindas un jūsu lietotne ģenerē metrikas, wow!

Lai saprastu, kā darbojas prometheus_flask_ekspress ieraksta pietiek ar minimālu piemēru:

no flask import Flask
no prometheus_flask_exporter import PrometheusMetrics

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

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

Tas ir viss, kas nepiecieÅ”ams, lai sāktu! Pievienojot importu un inicializācijas rindu PrometheusMetrics, jÅ«s saņemsiet metrikas pieprasÄ«jumu ilguma un pieprasÄ«jumu skaitÄ«tājus, kas tiek parādÄ«ti Flask lietojumprogrammas galapunktā, kurā tas ir reÄ£istrēts, kā arÄ« visas noklusējuma metrikas, kuras jÅ«s saņemat no pamata /metrics Prometheus klienta bibliotēkas JÅ«s varat atrast.

vieglu lietojamu piemēru GitHub krātuvē, kas palaiž instanci kopā ar demonstrācijas lietojumprogrammu metrikas Ä£enerēŔanai, kas izskatÄ«sies aptuveni tā: Prometheus un Grafana JÅ«s arÄ« atradÄ«siet rādÄ«tāju sarakstu

Flask mikroservisu uzraudzība ar Prometheus

piemērā, kas tiek rādīts vadībā, kopā ar Prometheus vaicājumiem, kas aizpilda paneļus. README Bibliotēkā ir daudz konfigurācijas opciju, skatiet

Iestatījumi

projekta piemērus ar Ä«su skaidrojumu. README Pamatkonfigurācija ir parādÄ«ta augÅ”pusē. VienkārÅ”i izveidojiet instanci

, nosauksim to par PrometheusMetricsmetrics , un tad ar tās palīdzību definējiet papildu metrikas, kuras vēlaties vācēt, dekoriējot funkcijas:@metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

  • SkaitÄ«tāji skaita izsaukumus, bet pārējie vāc metrikas atkarÄ«bā no Å”o izsaukumu ilguma. JÅ«s varat definēt atzÄ«mes katram no tiem, potenciāli izmantojot pieprasÄ«juma vai atbildes Ä«paŔības. Piemēram:

no flask import Flask, request no prometheus_flask_exporter import PrometheusMetricsapp = Flask(__name__)# grupēt pēc galapunkta, nevis ceļa metrics = PrometheusMetrics(app, group_by='endpoint')@app.route(' / collection / :collection_id / item / :item_id') @metrics.counter( 'cnt_collection', 'Izsaukumu skaits katrai kolekcijai', etiketēm={ 'collection': lambda: request.view_args['collection_id'], 'status': lambda resp: resp.status_code }) def get_item_from_collection(collection_id, item_id): pass

IepriekÅ” minētajā piemērā nospiežot uz galapunkta

palielinās skaitÄ«tājs, piemēram /collection/10002/item/76 cnt_collection{collection = Ā«10002Ā», status = Ā«200Ā»} , kā arÄ« jÅ«s saņemsiet noklusējuma metrikas (katrai galapunktam Å”ajā piemērā) no noklusējuma bibliotēkas:flask_http_request_duration_seconds

  • — HTTP pieprasÄ«juma ilgums sekundēs visiem Flask pieprasÄ«jumiem pēc metodes, ceļa un statusaĀ flask_http_request_total

  • — Kopējais HTTP pieprasÄ«jumu skaits pēc metodēm un statusiem — Kopējais HTTP pieprasÄ«jumu skaits pēc metodēm un statusiem

Ir iespējas izlaist noteiktu punktu izsekoÅ”anu, reÄ£istrēt papildu noklusējuma metrikas vai izlaist iepriekÅ” minētās, vai piemērot to paÅ”u pielāgoto metriku vairākiem punktiem. IepazÄ«stieties ar README projekta, lai uzzinātu, kas ir pieejams.

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

Bibliotēkā ir ērti paplaÅ”inājumi populārām daudzprocesoru bibliotēkām, piemēram, uWSGI un Gunicorn. JÅ«s arÄ« varat atrast nelielus piemērus mērÄ·a izmantoÅ”anas gadÄ«jumiem, tostarp daudzprocesoriem.

Metriku vākŔana

Kā minēts iepriekÅ”, bibliotēka pēc noklusējuma nodroÅ”ina beigu punktu /metrics Flask lietotnē, kas var kalpot par mērÄ·i Prometheus vācējam.

IepriekÅ” minētajā paneļa piemērā varat norādÄ«t savu Prometheus uz Flask lietotni ar noklusējuma iestatÄ«jumiem ar Ŕādu konfigurāciju:

scrape_configs:
  - job_name: 'example'

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

Skatiet pilnu piemēru GitHub repozitorijā. Tas pieņem, ka Prometheus var atrast jūsu Flask lietotnes instancēm uz http://app:5000/metrics, kur programmas domēna nosaukums var potenciāli atrisināties uz vairākiem IP adresēm, piemēram, darbojoties Kubernetes vai Docker Swarm.

Ja Ŕāda metriku gala punkta atklāŔana jums nepiestāv, iespējams, jo nevēlaties atļaut piekļuvi tam no ārpuses, jÅ«s varat viegli to atslēgt, nododot path=None veidojot instanci 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)

Tad jÅ«s varat izmantot start_http_server(port), lai atvērtu Å”o beigu punktu citā HTTP portā, 5099 iepriekÅ” minētajā piemērā. AlternatÄ«vi, ja jums ir labi, ka beigu punkts atrodas tajā paŔā Flask lietotnē, bet jums jāmaina tā ceļŔ no /metrics, jÅ«s varat vai nu nodot citu URI kā ceļa parametru, vai izmantot register_endpoint(..), lai to izveidotu vēlāk.

Saites

Ja nolemsiet izmēģināt, nevilcinieties atvērt jautājumu GitHub vai atstāt savus komentārus, atsauksmes un ieteikumus!

Paldies!

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster