Monitoringa kolbas mikropakalpojumi ar Prometheus

Pāris koda rindiņas, un jūsu lietojumprogramma ģenerē metriku, oho!

Lai saprastu, kā darbojas prometejs_kolba_eksportētājam pietiek ar minimālu piemēru:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Tas ir viss, kas jums nepieciešams, lai sāktu! Pievienojot importu un rindiņu inicializācijai PrometheusMetrics, jūs iegūsit metriku pieprasījuma ilgums и pieprasījumu skaitītāji, tiek parādīts beigu punktā /metrics lietojumprogramma Flask, kurā tā ir reģistrēta, kā arī visi noklusējuma rādītāji, ko iegūstat no bāzes Prometheus klientu bibliotēka.

tu vari atrast viegli lietojams piemērs GitHub repozitorijā, kurā darbojas instancē Prometejs и grafana kopā ar demonstrācijas lietojumprogrammu, lai ģenerētu metriku, kas izskatīsies apmēram šādi:

Monitoringa kolbas mikropakalpojumi ar Prometheus

Šeit atradīsit arī rādītāju sarakstu README piemēri, kas tiek rādīti informācijas panelī, kā arī Prometheus vaicājumi, kas aizpilda informācijas paneļus.

koriģēšana

Bibliotēkā ir daudz konfigurācijas iespēju, apskatiet README projektu piemēri ar īsu skaidrojumu.

Pamatkonfigurācija ir parādīta iepriekš. Vienkārši izveidojiet piemēru PrometheusMetrics, sauksim to metrika, un pēc tam izmantojiet to, lai definētu papildu metriku, ko vēlaties apkopot, dekorējot funkcijas:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Skaitītāji uzskaita zvanus, bet citi apkopo metriku, pamatojoties uz šo zvanu ilgumu. Katram no tiem varat definēt etiķetes, iespējams, izmantojot pieprasījuma vai atbildes rekvizītus. Piemēram:

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

Iepriekš minētajā piemērā noklikšķinot uz beigu punkta /collection/10002/item/76 piemēram, skaitītājs palielināsies cnt_collection{collection = "10002", statuss = "200"}, kā arī jūs iegūsit noklusējuma metriku (katram 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

Ir iespējas izlaist noteiktu galapunktu izsekošanu, reģistrēt papildu noklusējuma metriku vai izlaist iepriekš uzskaitītos, vai lietot vienu un to pašu pielāgoto metriku vairākiem galapunktiem. Pārbaudiet README projektu, lai redzē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ēkai ir ērti paplašinājumi populārām daudzapstrādes bibliotēkām, piemēram, uWSGI un Gunicorn. Varat arī atrast nelielus mērķtiecīgu lietošanas gadījumu piemērus, tostarp vairāku apstrādi.

Metrikas kolekcija

Kā minēts iepriekš, bibliotēka pēc noklusējuma nodrošina beigu punktu /metrics lietojumprogrammā Flask, kas var kalpot kā mērķis Prometeja celtnieks.

Iepriekš redzamajā informācijas paneļa piemērā varat atlasīt savu Prometheus lietojumprogrammai Flask 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

Pilnu piemēru skatiet vietnē GitHub krātuves. Tas pieņem, ka Prometheus var atrast jūsu Flask lietojumprogrammas gadījumus http://app:5000/metrics, kur, piemēram, lietojumprogrammas domēna nosaukums var tikt izmantots vairākās IP adresēs, piemēram, iedarbojoties Kubernetes vai Dokera bars.

Ja metrikas beigu punkta atklāšana šādā veidā jums nav piemērota, iespējams, tāpēc, ka nevēlaties atļaut tam ārēju piekļuvi, varat to viegli atspējot, nododot garām ceļš=Nav 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_serveris(ports)lai atvērtu šo galapunktu citā HTTP portā, 5099 iepriekš minētajā piemērā. Alternatīvi, ja esat apmierināts ar to, ka galapunkts atrodas tajā pašā Flask lietojumprogrammā, bet jums ir jāmaina tā ceļš no /metrics, kā ceļa parametru varat nodot citu URI vai izmantot register_endpoint(..)lai to instalētu vēlāk.

atsauces

Ja nolemjat izmēģināt, atveriet problēmu vietnē GitHub vai atstājiet savus komentārus, atsauksmes un ieteikumus!

Paldies!

Avots: www.habr.com

Pievieno komentāru