Monitoring Flask Microservices Prometheus segítségével

Néhány sor kód, és az alkalmazás mérőszámokat generál, wow!

Annak érdekében, hogy megértsük, hogyan működik a prométheuszlombik_exportőrnek elég egy minimális példa:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Ennyi kell az induláshoz! Importálás és inicializálási sor hozzáadásával PrometheusMetrics, akkor mutatókat fog kapni kérés időtartama и kérésszámlálók, megjelenik a végponton /metrics a Flask alkalmazás, amelyhez regisztrálva van, valamint az alapból kapott összes alapértelmezett metrika Prometheus kliens könyvtár.

megtalálhatod könnyen használható példa a példányt futtató GitHub-lerakatban Prométheusz и grafana egy demóalkalmazással együtt olyan mutatók generálására, amelyek így néznek ki:

Monitoring Flask Microservices Prometheus segítségével

Itt találja a mutatók listáját is README az irányítópulton megjelenő példák, valamint az irányítópultokat feltöltő Prometheus-lekérdezések.

beállítás

A könyvtárban sok konfigurációs lehetőség található, nézd meg README projekt példákat rájuk rövid magyarázattal.

Az alapkonfiguráció fent látható. Csak hozzon létre egy példányt PrometheusMetrics, nevezzük mutatók, majd a függvények díszítésével határozza meg azokat a további mutatókat, amelyeket össze szeretne gyűjteni:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

A számlálók számolják a hívásokat, mások pedig a hívások időtartama alapján gyűjtik a mutatókat. Ezek mindegyikéhez meghatározhat címkéket, esetleg kérés vagy válasz tulajdonságok használatával. Például:

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

A fenti példában a végpontra kattintva /collection/10002/item/76 például a számláló növekedését okozza cnt_collection{collection = "10002", status = "200"}, valamint megkapja az alapértelmezett mutatókat (ebben a példában minden végponthoz) az alapértelmezett könyvtárból:

  • flask_http_request_duration_seconds — HTTP-kérés időtartama másodpercben az összes Lombik-kéréshez módszer, útvonal és állapot szerint

  • flask_http_request_total — A HTTP-kérések teljes száma metódusok és állapotok szerint

Lehetőség van bizonyos végpontok nyomon követésének kihagyására, további alapértelmezett metrikák naplózására vagy a fent felsoroltak kihagyására, vagy ugyanazon egyéni metrika több végpontra történő alkalmazására. Nézze meg README projektet, hogy lássa, mi áll rendelkezésre.

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

A könyvtár kényelmes bővítményekkel rendelkezik a népszerű többfeldolgozó könyvtárak, például az uWSGI és a Gunicorn számára. Kis példákat is találhat célzott felhasználási esetekre, beleértve a többfeldolgozást is.

Metrika gyűjtemény

Ahogy fentebb említettük, a könyvtár alapértelmezés szerint végpontot biztosít /metrics Lombik alkalmazásban, amely célpontként szolgálhat Prométheusz építő.

A fenti irányítópult-példában a Prometheus egy Flask alkalmazást célozhat meg alapértelmezett beállításokkal, a következő konfigurációval:

scrape_configs:
  - job_name: 'example'

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

Lásd a teljes példát itt GitHub adattárak. Ez azt feltételezi, hogy a Prometheus megtalálja a Flask alkalmazáspéldányait http://app:5000/metrics, ahol az alkalmazás tartományneve több IP-címre is feloldódhat, például amikor befut Kubernetes vagy Docker Raj.

Ha a metrika végpont ilyen módon való feltárása nem felel meg Önnek, esetleg azért, mert nem akar külső hozzáférést engedélyezni hozzá, egyszerűen letilthatja az átadással path=Nincs példány létrehozásakor 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)

Akkor használhatod start_http_server(port)a végpont megnyitásához egy másik HTTP-porton, 5099 a fenti példában. Alternatív megoldásként, ha elégedett azzal, hogy a végpont ugyanabban a Flask alkalmazásban van, de meg kell változtatnia az elérési utat /metrics, vagy átadhat egy másik URI-t elérési út paraméterként, vagy használhatja register_endpoint(..)hogy később telepítse.

referenciák

Ha úgy dönt, hogy kipróbálja, nyugodtan nyisson meg egy problémát a GitHubon, vagy írja meg észrevételeit, visszajelzését és javaslatait!

Köszönöm!

Forrás: will.com

Hozzászólás