Flask Microservices-ի մոնիտորինգ Պրոմեթևսի հետ

Կոդերի մի քանի տող և ձեր հավելվածը ստեղծում է չափումներ, վայ:

Որպեսզի հասկանանք, թե ինչպես է աշխատում Պրոմեթևսըտափաշիշ_արտահանողին բավական է մինիմալ օրինակ.

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Դա այն ամենն է, ինչ ձեզ հարկավոր է սկսելու համար: Նախաստորագրման համար ներմուծում և տող ավելացնելով PrometheusMetrics, դուք կստանաք չափումներ հարցման տևողությունը и հարցումների հաշվիչներ, ցուցադրվում է վերջնակետում /մետրիկա Flask հավելվածը, որով գրանցված է, ինչպես նաև բոլոր լռելյայն չափումները, որոնք դուք ստանում եք բազայից Պրոմեթևսի հաճախորդների գրադարան.

դու կարող ես գտնել հեշտ օգտագործման օրինակ GitHub պահոցում, որն աշխատում է օրինակը Պրոմեթեւս и Գրաֆանա Դեմո հավելվածի հետ մեկտեղ՝ չափումներ ստեղծելու համար, որոնք այսպիսի տեսք կունենան.

Flask Microservices-ի մոնիտորինգ Պրոմեթևսի հետ

Դուք նաև կգտնեք ցուցիչների ցանկը առաջնային օրինակներ, որոնք հայտնվում են վահանակում, ինչպես նաև Պրոմեթևսի հարցումները, որոնք լրացնում են վահանակները:

հարմարեցում

Գրադարանում կան բազմաթիվ կազմաձևման տարբերակներ, նայեք առաջնային դրանց նախագծի օրինակները՝ հակիրճ բացատրությամբ:

Հիմնական կոնֆիգուրացիան ներկայացված է վերևում: Պարզապես ստեղծեք օրինակ PrometheusMetrics, կոչենք չափումներ, և այնուհետև օգտագործեք այն՝ սահմանելու լրացուցիչ չափումներ, որոնք ցանկանում եք հավաքել՝ զարդարելով գործառույթները.

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Հաշվիչները հաշվում են զանգերը, իսկ մյուսները հավաքում են չափումներ՝ հիմնված այդ զանգերի տևողության վրա: Դուք կարող եք սահմանել պիտակներ դրանցից յուրաքանչյուրի համար՝ պոտենցիալ օգտագործելով հարցման կամ պատասխանի հատկությունները: Օրինակ:

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

Վերոնշյալ օրինակում սեղմելով վերջնակետին /հավաքածու/10002/հատ/76 կհանգեցնի հաշվիչի ավելացմանը, օրինակ cnt_collection{collection = "10002", կարգավիճակ = "200"}, գումարած, դուք կստանաք կանխադրված չափումներ (այս օրինակի յուրաքանչյուր վերջնակետի համար) լռելյայն գրադարանից.

  • flask_http_request_duration_seconds — HTTP հարցման տևողությունը վայրկյաններով՝ Flask-ի բոլոր հարցումների համար՝ ըստ մեթոդի, ճանապարհի և կարգավիճակի

  • flask_http_request_total — HTTP հարցումների ընդհանուր թիվը՝ ըստ մեթոդների և կարգավիճակների

Կան որոշակի վերջնակետերի հետագծումը բաց թողնելու, լրացուցիչ կանխադրված չափումներ գրանցելու կամ վերը թվարկվածները բաց թողնելու կամ մի քանի վերջնակետերի վրա կիրառելու նույն հարմարեցված չափումները: Ստուգեք առաջնային նախագիծ՝ տեսնելու, թե ինչ կա:

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

Գրադարանը ունի հարմար ընդլայնումներ հանրաճանաչ բազմամշակման գրադարանների համար, ինչպիսիք են uWSGI-ը և Gunicorn-ը: Կարող եք նաև գտնել նպատակային օգտագործման դեպքերի փոքր օրինակներ, ներառյալ բազմամշակումը:

Չափումների հավաքածու

Ինչպես նշվեց վերևում, գրադարանը լռելյայն տրամադրում է վերջնական կետ /մետրիկա Flask հավելվածում, որը կարող է ծառայել որպես թիրախ Պրոմեթևս շինարար.

Վերևի վահանակի օրինակում կարող եք ձեր Prometheus-ը թիրախավորել Flask հավելվածին, որն ունի լռելյայն կարգավորումներ այս կազմաձևով.

scrape_configs:
  - job_name: 'example'

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

Ամբողջական օրինակը տես այստեղ GitHub պահոցներ. Սա ենթադրում է, որ Պրոմեթևսը կարող է գտնել ձեր Flask հավելվածի օրինակները http://app:5000/metrics, որտեղ հավելվածի տիրույթի անունը կարող է փոխակերպվել մի քանի IP հասցեների, օրինակ՝ երբ աշխատում է Կուբերնետես կամ Docker ամբոխ.

Եթե ​​չափումների վերջնակետի այս կերպ բացահայտումը ձեզ չի համապատասխանում, գուցե այն պատճառով, որ դուք չեք ցանկանում թույլ տալ արտաքին մուտք գործել դրան, կարող եք հեշտությամբ անջատել այն՝ անցնելով ճանապարհ=Ոչ օրինակ ստեղծելիս 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)

Ապա դուք կարող եք օգտագործել start_http_server (port)բացելու այս վերջնակետը մեկ այլ HTTP միացքի վրա, 5099 վերը նշված օրինակում. Այլապես, եթե դուք գոհ եք, որ վերջնական կետը նույն Flask հավելվածում է, բայց դուք պետք է փոխեք դրա ուղին /մետրիկա, կարող եք կամ փոխանցել մեկ այլ URI որպես ուղու պարամետր, կամ օգտագործել register_endpoint (..)այն ավելի ուշ տեղադրելու համար:

Սայլակ

Եթե ​​որոշեք փորձել, ազատ զգալ բացեք խնդիր GitHub-ում կամ թողեք ձեր մեկնաբանությունները, կարծիքները և առաջարկները:

Thank you!

Source: www.habr.com

Добавить комментарий