Pagsubaybay sa Flask Microservices gamit ang Prometheus

Ang ilang linya ng code at ang iyong application ay bumubuo ng mga sukatan, wow!

Upang maunawaan kung paano gumagana ang prometheus_prasko_exporter isang kaunting halimbawa ay sapat na:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Iyon lang ang kailangan mo para makapagsimula! Sa pamamagitan ng pagdaragdag ng pag-import at isang linya para sa pagsisimula PrometheusMetrics, makakakuha ka ng mga sukatan tagal ng kahilingan ΠΈ mga counter ng kahilingan, ipinapakita sa endpoint /metrics ang Flask application kung saan ito nakarehistro, pati na rin ang lahat ng default na sukatan na nakukuha mo mula sa base Prometheus client library.

mahahanap mo madaling gamitin na halimbawa sa GitHub repository na nagpapatakbo ng instance Promiteyus ΠΈ grafana kasama ng isang demo application upang makabuo ng mga sukatan na magiging ganito ang hitsura:

Pagsubaybay sa Flask Microservices gamit ang Prometheus

Makakakita ka rin ng listahan ng mga indicator sa README mga halimbawang lumalabas sa dashboard, kasama ng mga query sa Prometheus na pumupuno sa mga dashboard.

pag-aayos

Mayroong maraming mga pagpipilian sa pagsasaayos sa library, tingnan mo README mga halimbawa ng proyekto ng mga ito na may maikling paliwanag.

Ang pangunahing pagsasaayos ay ipinapakita sa itaas. Gumawa lang ng isang instance PrometheusMetrics, tawagan natin ito sukatan, at pagkatapos ay gamitin ito upang tukuyin ang mga karagdagang sukatan na gusto mong kolektahin sa pamamagitan ng dekorasyon sa mga function:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Nagbibilang ng mga tawag ang mga counter, at nangongolekta ang iba ng mga sukatan batay sa tagal ng mga tawag na iyon. Maaari mong tukuyin ang mga label para sa bawat isa sa mga ito, na posibleng gumamit ng mga katangian ng kahilingan o pagtugon. Halimbawa:

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

Sa halimbawa sa itaas, ang pag-click sa endpoint /collection/10002/item/76 ay magiging sanhi ng pagtaas ng counter, halimbawa cnt_collection{collection = "10002", status = "200"}, at makukuha mo ang mga default na sukatan (para sa bawat endpoint sa halimbawang ito) mula sa default na library:

  • flask_http_request_duration_seconds β€” Tagal ng kahilingan ng HTTP sa mga segundo para sa lahat ng kahilingan sa Flask ayon sa pamamaraan, landas at katayuan

  • flask_http_request_total β€” Kabuuang bilang ng mga kahilingan sa HTTP ayon sa mga pamamaraan at katayuan

May mga opsyon para laktawan ang pagsubaybay sa mga partikular na endpoint, mag-log ng mga karagdagang default na sukatan o laktawan ang mga nakalista sa itaas, o ilapat ang parehong custom na sukatan sa maraming endpoint. Tignan mo README proyekto upang makita kung ano ang magagamit.

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

Ang library ay may mga maginhawang extension para sa mga sikat na multiprocessing na aklatan tulad ng uWSGI at Gunicorn. Makakahanap ka rin ng maliliit na halimbawa ng naka-target na mga kaso ng paggamit, kabilang ang multiprocessing.

Koleksyon ng mga sukatan

Tulad ng nabanggit sa itaas, ang library ay nagbibigay ng isang endpoint bilang default /metrics sa isang Flask application, na maaaring magsilbing target para sa Tagabuo ng Prometheus.

Sa halimbawa ng dashboard sa itaas, maaari mong i-target ang iyong Prometheus sa isang Flask application na may mga default na setting na may ganitong configuration:

scrape_configs:
  - job_name: 'example'

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

Tingnan ang buong halimbawa sa Mga repositoryo ng GitHub. Ipinapalagay nito na makikita ng Prometheus ang iyong mga instance ng Flask application sa http://app:5000/metrics, kung saan ang pangalan ng domain ng application ay maaaring potensyal na malutas sa maraming mga IP address, halimbawa kapag tumatakbo sa Kubernetes o Docker kuyog.

Kung hindi nababagay sa iyo ang paglalantad sa endpoint ng sukatan sa ganitong paraan, marahil dahil ayaw mong payagan ang external na access dito, madali mo itong madi-disable sa pamamagitan ng pagpasa landas=Wala kapag gumagawa ng isang instance 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)

Pagkatapos ay maaari mong gamitin start_http_server(port)upang buksan ang endpoint na ito sa ibang HTTP port, 5099 sa halimbawa sa itaas. Bilang kahalili, kung masaya ka sa endpoint na nasa parehong Flask application, ngunit kailangan mong baguhin ang landas nito mula sa /metrics, maaari mong ipasa ang isa pang URI bilang parameter ng path, o gamitin register_endpoint(..)upang i-install ito sa ibang pagkakataon.

sanggunian

Kung magpasya kang subukan ito, huwag mag-atubiling magbukas ng isyu sa GitHub o mag-iwan ng iyong mga komento, feedback, at mungkahi!

Salamat sa iyo!

Pinagmulan: www.habr.com

Magdagdag ng komento