Vöktun Flask Microservices með Prometheus

Nokkrar línur af kóða og forritið þitt býr til mælikvarða, vá!

Til að skilja hvernig prometheus_ virkarflaska_útflytjandi lágmarksdæmi er nóg:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Það er allt sem þú þarft til að byrja! Með því að bæta við innflutningi og línu fyrir frumstillingu PrometheusMetrics, þú munt fá mælikvarða biðtímalengd и beiðni teljara, sem birtist á endapunkti /mælingar Flask forritið sem það er skráð hjá, auk allra sjálfgefna mælikvarða sem þú færð frá grunninum Prometheus viðskiptavinabókasafn.

þú getur fundið auðvelt í notkun dæmi í GitHub geymslunni sem keyrir tilvikið Prometheus и grafana ásamt kynningarforriti til að búa til mælikvarða sem munu líta eitthvað svona út:

Vöktun Flask Microservices með Prometheus

Þú finnur einnig lista yfir vísbendingar í README dæmi sem birtast á mælaborðinu ásamt Prometheus fyrirspurnum sem fylla mælaborðin.

aðlögun

Það eru margir stillingarvalkostir á bókasafninu, sjáðu README verkefnisdæmi um þau með stuttri skýringu.

Grunnstillingin er sýnd hér að ofan. Búðu bara til dæmi PrometheusMetrics, við skulum kalla það tölfræði, og notaðu það síðan til að skilgreina viðbótarmælingar sem þú vilt safna með því að skreyta aðgerðirnar:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Teljarar telja símtöl og aðrir safna mælingum út frá lengd þessara símtala. Þú getur skilgreint merki fyrir hvert þessara, hugsanlega með því að nota beiðni- eða svareiginleika. Til dæmis:

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

Í dæminu hér að ofan, smelltu á endapunktinn /safn/10002/liður/76 mun valda því að teljarinn hækki, til dæmis cnt_collection{safn = "10002", status = "200"}, auk þess sem þú munt fá sjálfgefna mæligildi (fyrir hvern endapunkt í þessu dæmi) frá sjálfgefna bókasafninu:

  • flask_http_request_duration_seconds — Lengd HTTP beiðni í sekúndum fyrir allar flöskubeiðnir eftir aðferð, slóð og stöðu

  • flask_http_request_total — Heildarfjöldi HTTP beiðna eftir aðferðum og stöðu

Það eru valkostir til að sleppa því að rekja tiltekna endapunkta, skrá viðbótar sjálfgefna mælikvarða eða sleppa þeim sem taldar eru upp hér að ofan, eða nota sömu sérsniðna mælikvarða á marga endapunkta. Athuga README verkefni til að sjá hvað er í boði.

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

Bókasafnið hefur þægilegar viðbætur fyrir vinsæl fjölvinnslusöfn eins og uWSGI og Gunicorn. Þú getur líka fundið lítil dæmi um markviss notkunartilvik, þar á meðal fjölvinnslu.

Safn mæligilda

Eins og getið er hér að ofan veitir bókasafnið endapunkt sjálfgefið /mælingar í Flask forriti, sem getur þjónað sem skotmark fyrir Prometheus smiður.

Í mælaborðsdæminu hér að ofan gætirðu miðað Prometheus þinn á Flask forrit með sjálfgefnum stillingum með þessari uppsetningu:

scrape_configs:
  - job_name: 'example'

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

Sjá fullt dæmi á GitHub geymslur. Þetta gerir ráð fyrir að Prometheus geti fundið Flask forritið þitt á http://app:5000/metrics, þar sem lén forritsins gæti hugsanlega leyst upp í margar IP tölur, til dæmis þegar það er keyrt inn Kubernetes eða Docker Sveimur.

Ef það hentar þér ekki að afhjúpa mæliendapunktinn á þennan hátt, kannski vegna þess að þú vilt ekki leyfa utanaðkomandi aðgang að honum, geturðu auðveldlega slökkt á honum með því að fara framhjá slóð = Engin þegar tilvik er búið til 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)

Þá geturðu notað start_http_þjónn(gátt)til að opna þennan endapunkt á annarri HTTP tengi, 5099 í dæminu hér að ofan. Að öðrum kosti, ef þú ert ánægður með að endapunkturinn sé í sama Flask forritinu, en þú þarft að breyta slóð hans frá /mælingar, þú getur annað hvort sent aðra vefslóð sem slóðarbreytu, eða notað skrá_endapunkt(..)til að setja það upp síðar.

tilvísanir

Ef þú ákveður að prófa, ekki hika við að opna mál á GitHub eða skilja eftir athugasemdir þínar, athugasemdir og tillögur!

Þakka þér!

Heimild: www.habr.com

Bæta við athugasemd