Monitorado de Flask-Mikroservoj kun Prometheus

Paro da linioj de kodo kaj via aplikaĵo generas metrikojn, uu!

Por kompreni kiel prometheus_ funkciasflasko_eksportisto sufiĉas minimuma ekzemplo:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Jen ĉio, kion vi bezonas por komenci! Aldonante importon kaj linion por inicialigo PrometheusMetrics, vi ricevos metrikojn peto daŭro и petoj nombriloj, montrata ĉe la finpunkto /metriko la Flask-aplikaĵo kun kiu ĝi estas registrita, kaj ankaŭ ĉiujn defaŭltajn metrikojn, kiujn vi ricevas de la bazo Prometheus-klienta biblioteko.

vi povas trovi facile uzebla ekzemplo en la GitHub-deponejo, kiu kuras la petskribon Prometeo и grafana kune kun demo-aplikaĵo por generi metrikojn, kiuj aspektos kiel ĉi tio:

Monitorado de Flask-Mikroservoj kun Prometheus

Vi ankaŭ trovos liston de indikiloj en Legu ekzemploj kiuj aperas en la instrumentpanelo, kune kun Prometheus-demandoj kiuj popolas la instrumentpanelojn.

alĝustigo

Estas multaj agordaj opcioj en la biblioteko, rigardu Legu projekti ekzemplojn de ili kun mallonga klarigo.

La baza agordo estas montrita supre. Nur kreu ekzemplon PrometheusMetrics, ni nomu ĝin metrikoj, kaj poste uzu ĝin por difini la kromajn metrikojn, kiujn vi volas kolekti ornamante la funkciojn:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Nombriloj nombras vokojn, kaj aliaj kolektas metrikojn bazitajn sur la daŭro de tiuj vokoj. Vi povas difini etikedojn por ĉiu el ĉi tiuj, eble uzante petajn aŭ respondajn trajtojn. Ekzemple:

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

En la supra ekzemplo, alklakante la finpunkton /kolekto/10002/item/76 igos la nombrilon pligrandigi, ekzemple cnt_kolekto{kolekto = "10002", statuso = "200"}, krome vi ricevos la defaŭltajn metrikojn (por ĉiu finpunkto en ĉi tiu ekzemplo) de la defaŭlta biblioteko:

  • flask_http_request_duration_seconds — Daŭro de HTTP-peto en sekundoj por ĉiuj Flask-petoj laŭ metodo, vojo kaj stato

  • flask_http_request_total — Tuta nombro da HTTP-petoj laŭ metodoj kaj statusoj

Estas ebloj por preterlasi spuradon de specifaj finpunktoj, registri kromajn defaŭltajn metrikojn aŭ preterlasi tiujn listigitajn supre, aŭ apliki la saman kutiman metrikon al pluraj finpunktoj. Kontrolu Legu projekto por vidi kio disponeblas.

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 biblioteko havas oportunajn etendaĵojn por popularaj plurprocesaj bibliotekoj kiel ekzemple uWSGI kaj Gunicorn. Vi ankaŭ povas trovi malgrandajn ekzemplojn de celitaj uzkazoj, inkluzive de multprocesado.

Kolekto de metrikoj

Kiel menciite supre, la biblioteko disponigas finpunkton defaŭlte /metriko en Flask-aplikaĵo, kiu povas servi kiel celo por Prometeo konstruisto.

En la supra ekzemplo de panelo, vi povus celi vian Prometheus al aplikaĵo Flask kun defaŭltaj agordoj kun ĉi tiu agordo:

scrape_configs:
  - job_name: 'example'

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

Vidu plenan ekzemplon ĉe GitHub-deponejoj. Ĉi tio supozas, ke Prometheus povas trovi viajn petskribojn pri Flask-aplikaĵo http://app:5000/metrics, kie la aplikaĵa domajna nomo povus eble solvi al multoblaj IP-adresoj, ekzemple dum kurado KubernetojDocker Svarmo.

Se elmontri la metrikan finpunkton tiel ne konvenas al vi, eble ĉar vi ne volas permesi eksteran aliron al ĝi, vi povas facile malŝalti ĝin preterpasante vojo=Neniu dum kreado de kazo 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)

Tiam vi povas uzi start_http_servilo (haveno)malfermi ĉi tiun finpunkton sur malsama HTTP-haveno, 5099 en la supra ekzemplo. Alternative, se vi estas feliĉa kun la finpunkto en la sama Flask-apliko, sed vi devas ŝanĝi ĝian vojon de /metriko, vi povas aŭ pasi alian URI kiel la padparametron, aŭ uzi registri_finpunkto(..)instali ĝin poste.

referencoj

Se vi decidas provi ĝin, bonvolu malfermi aferon en GitHub aŭ lasi viajn komentojn, komentojn kaj sugestojn!

Dankon!

fonto: www.habr.com

Aldoni komenton