Monitoring Flask Microservices ndi Prometheus

Mizere ingapo yamakhodi ndipo pulogalamu yanu imapanga ma metric, wow!

Kuti mumvetsetse momwe prometheus_ imagwirira ntchitobotolo_Exporter chitsanzo chochepa ndi chokwanira:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Ndizo zonse zomwe mukufunikira kuti muyambe! Powonjezera zolowetsa ndi mzere woyambira Zithunzi za PrometheusMetrics, mupeza ma metric nthawi yopempha ΠΈ pempha zowerengera, zowonetsedwa kumapeto /metrics pulogalamu ya Flask yomwe idalembetsedwa nayo, komanso ma metric onse omwe mumapeza kuchokera m'munsi Prometheus kasitomala library.

mutha kupeza yosavuta kugwiritsa ntchito chitsanzo m'malo a GitHub omwe amayendetsa chitsanzocho Prometheus ΠΈ grafana pamodzi ndi pulogalamu ya demo kuti mupange ma metric omwe aziwoneka motere:

Monitoring Flask Microservices ndi Prometheus

Mudzapezanso mndandanda wa zizindikiro mu YERENGANI zitsanzo zomwe zimawoneka mu dashboard, pamodzi ndi mafunso a Prometheus omwe amadzaza ma dashboards.

kusintha

Pali njira zambiri zosinthira mu library, yang'anani YERENGANI zitsanzo za polojekiti ndi kufotokozera mwachidule.

Kusintha kofunikira kukuwonetsedwa pamwambapa. Ingopangani chitsanzo Zithunzi za PrometheusMetrics, tiyeni titchule maselo, ndiyeno mugwiritseni ntchito kutanthauzira ma metric owonjezera omwe mukufuna kusonkhanitsa pokongoletsa magwiridwe antchito:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Ma Counter amawerengera mafoni, ndipo ena amatolera ma metric kutengera nthawi yakuyimbirako. Mutha kutanthauzira zilembo pa chilichonse mwa izi, pogwiritsa ntchito zopempha kapena mayankho. Mwachitsanzo:

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

Mu chitsanzo pamwamba, kuwonekera pa mapeto /collection/10002/item/76 zipangitsa kuti kauntala ichuluke, mwachitsanzo cnt_collection{collection = "10002", status = "200"}, kuphatikizanso mupeza zoyezetsa zokhazikika (pamapeto aliwonse pachitsanzo ichi) kuchokera mulaibulale yokhazikika:

  • flask_http_request_duration_seconds - Kutalika kwa pempho la HTTP mumasekondi pazofunsira zonse za Flask ndi njira, njira ndi mawonekedwe

  • flask_http_request_total - Chiwerengero chonse cha zopempha za HTTP ndi njira ndi ma status

Pali zosankha zomwe mungalumphe kutsatira mathero enaake, kulemba ma metric owonjezera osakhazikika kapena kudumpha zomwe zandandalikidwa pamwambapa, kapena kugwiritsa ntchito metric yofananira kumalo angapo. Onani YERENGANI polojekiti kuti muwone zomwe zilipo.

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

Laibulaleyi ili ndi zowonjezera zowonjezera zama library ambiri otchuka monga uWSGI ndi Gunicorn. Mutha kupezanso zitsanzo zing'onozing'ono zamilandu yogwiritsiridwa ntchito, kuphatikiza ma multiprocessing.

Kutolera ma metrics

Monga tafotokozera pamwambapa, laibulale imapereka mapeto mwachisawawa /metrics mu pulogalamu ya Flask, yomwe ingakhale ngati chandamale cha Wopanga Prometheus.

Muchitsanzo cha dashboard pamwambapa, mutha kulunjika Prometheus ku pulogalamu ya Flask yokhala ndi zosintha zosasinthika ndi kasinthidwe uku:

scrape_configs:
  - job_name: 'example'

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

Onani chitsanzo chonse pa Zosungirako za GitHub. Izi zikuganiza kuti Prometheus atha kupeza mawonekedwe a Flask yanu http://app:5000/metrics, pomwe dzina lachidziwitso la pulogalamu limatha kukhazikika pama adilesi angapo a IP, mwachitsanzo mukamalowa Kubernetes kapena Gulu la Docker.

Ngati kuwulula ma metrics endpoint motere sikukugwirizana ndi inu, mwina chifukwa simukufuna kulola mwayi wakunja, mutha kuyimitsa mosavuta podutsa. njira=Palibe popanga chitsanzo Zithunzi za 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)

Ndiye mungagwiritse ntchito kuyamba_http_seva(doko)kuti mutsegule mapeto awa pa doko lina la HTTP, 5099 mu chitsanzo pamwambapa. Kapenanso, ngati muli okondwa kuti mapeto ali mu Flask yomweyi, koma muyenera kusintha njira yake /metrics, mutha kudutsa URI ina ngati njira yolowera, kapena kugwiritsa ntchito register_endpoint(..)kukhazikitsa pambuyo pake.

powatsimikizira

Ngati mwaganiza zoyesa, omasuka kutsegula nkhani pa GitHub kapena kusiya ndemanga zanu, malingaliro anu, ndi malingaliro!

Бпасибо!

Source: www.habr.com

Kuwonjezera ndemanga