Monitoringo kolbos mikroservisai su Prometheus

Pora kodo eilučių ir jūsų programa sugeneruos metriką, oho!

Norėdami suprasti, kaip veikia prometėjas_kolba_eksportuotojui pakanka minimalaus pavyzdžio:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Tai viskas, ko jums reikia norint pradėti! Pridedant importą ir inicijavimo eilutę PrometheusMetrics, gausite metrikas prašymo trukmė и užklausų skaitikliai, rodomas galutiniame taške /metrikai programa „Flask“, kurioje ji yra užregistruota, taip pat visos numatytosios metrikos, kurias gaunate iš bazės Prometheus kliento biblioteka.

tu gali rasti paprastas naudojimo pavyzdys „GitHub“ saugykloje, kurioje vykdomas egzempliorius Prometėjas и grafana kartu su demonstracine programa, skirta sukurti metriką, kuri atrodys maždaug taip:

Monitoringo kolbos mikroservisai su Prometheus

Taip pat rasite rodiklių sąrašą SKAITYK MANE pavyzdžiai, rodomi prietaisų skydelyje, kartu su Prometheus užklausomis, kurios užpildo prietaisų skydelius.

reguliavimas

Bibliotekoje yra daug konfigūravimo parinkčių, pažiūrėkite SKAITYK MANE jų projektų pavyzdžiai su trumpu paaiškinimu.

Pagrindinė konfigūracija parodyta aukščiau. Tiesiog sukurkite pavyzdį PrometheusMetrics, pavadinkim metrikos, tada naudokite jį norėdami apibrėžti papildomą metriką, kurią norite rinkti, dekoruodami funkcijas:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Skaitikliai skaičiuoja skambučius, o kiti renka metrikas pagal tų skambučių trukmę. Galite apibrėžti etiketes kiekvienam iš jų, galbūt naudodami užklausos arba atsakymo ypatybes. Pavyzdžiui:

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

Aukščiau pateiktame pavyzdyje spustelėjus galinį tašką /collection/10002/item/76 Pavyzdžiui, skaitiklis padidės cnt_collection{collection = "10002", būsena = "200"}, be to, iš numatytosios bibliotekos gausite numatytąją metriką (kiekvienam galutiniam taškui šiame pavyzdyje):

  • flask_http_request_duration_seconds — HTTP užklausos trukmė sekundėmis visoms „Flask“ užklausoms pagal metodą, kelią ir būseną

  • flask_http_request_total — Bendras HTTP užklausų skaičius pagal metodus ir būsenas

Yra parinkčių praleisti konkrečių galinių taškų stebėjimą, registruoti papildomą numatytąją metriką arba praleisti aukščiau išvardytas, arba taikyti tą pačią tinkintą metriką keliems galiniams taškams. Patikrinkite SKAITYK MANE projektą, kad pamatytumėte, kas yra.

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

Bibliotekoje yra patogių plėtinių populiarioms daugiafunkcinėms bibliotekoms, tokioms kaip uWSGI ir Gunicorn. Taip pat galite rasti nedidelių tikslinių naudojimo atvejų pavyzdžių, įskaitant kelių apdorojimą.

Metrikos rinkinys

Kaip minėta pirmiau, bibliotekoje pagal numatytuosius nustatymus pateikiamas galutinis taškas /metrikai kolbos programoje, kuri gali būti naudojama kaip taikinys Prometėjo statybininkas.

Aukščiau pateiktame prietaisų skydelio pavyzdyje galite nukreipti savo „Prometheus“ į „Flask“ programą su numatytaisiais nustatymais, naudodami šią konfigūraciją:

scrape_configs:
  - job_name: 'example'

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

Visą pavyzdį žr „GitHub“ saugyklos. Daroma prielaida, kad „Prometheus“ gali rasti jūsų „Flask“ programos egzempliorius http://app:5000/metrics, kur programos domeno pavadinimas gali būti sudarytas iš kelių IP adresų, pavyzdžiui, įjungus Kubernetes arba Dockerio spiečius.

Jei metrikos galinio taško atskleidimas tokiu būdu jums netinka, galbūt todėl, kad nenorite leisti išorinės prieigos prie jo, galite lengvai jį išjungti perduodant path=Nėra kurdami egzempliorių 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)

Tada galite naudoti start_http_server(prievadas)norėdami atidaryti šį galinį tašką kitame HTTP prievade, 5099 aukščiau pateiktame pavyzdyje. Arba, jei esate patenkintas tuo, kad galutinis taškas yra toje pačioje „Flask“ programoje, bet jums reikia pakeisti jo kelią iš /metrikai, galite perduoti kitą URI kaip kelio parametrą arba naudoti registro_galinis taškas(..)norėdami jį įdiegti vėliau.

Nuorodos

Jei nuspręsite pabandyti, nedvejodami atidarykite problemą „GitHub“ arba palikite savo komentarus, atsiliepimus ir pasiūlymus!

Dėkojame!

Šaltinis: www.habr.com