Ngawasi Flask Microservices karo Prometheus

Saperangan baris kode lan aplikasi sampeyan ngasilake metrik, wow!

Kanggo ngerti cara kerjane prometheus_labu_exporter conto minimal cukup:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Iku kabeh sing perlu kanggo miwiti! Kanthi nambahake impor lan baris kanggo initialization PrometheusMetrics, sampeyan bakal entuk metrik durasi request ΠΈ njaluk counters, ditampilake ing titik pungkasan /metrik aplikasi Flask sing didaftarake, uga kabeh metrik standar sing sampeyan entuk saka pangkalan Pustaka klien Prometheus.

sampeyan bisa nemokake gampang kanggo nggunakake conto ing repositori GitHub sing mbukak conto Prometheus ΠΈ Grafana bebarengan karo aplikasi demo kanggo ngasilake metrik sing bakal katon kaya iki:

Ngawasi Flask Microservices karo Prometheus

Sampeyan uga bakal nemokake dhaptar indikator ing README conto sing katon ing dashboard, bebarengan karo pitakonan Prometheus sing populate dashboard.

imbuhan

Ana akeh opsi konfigurasi ing perpustakaan, dipikir ing README conto proyek mau karo panjelasan singkat.

Konfigurasi dhasar ditampilake ing ndhuwur. Mung nggawe conto PrometheusMetrics, ayo diarani metrik, banjur gunakake kanggo nemtokake metrik tambahan sing pengin diklumpukake kanthi dekorasi fungsi:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Counter ngitung telpon, lan liya-liyane ngumpulake metrik adhedhasar durasi telpon kasebut. Sampeyan bisa nemtokake label kanggo saben kasebut, kanthi potensial nggunakake properti panyuwunan utawa respon. Tuladhane:

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

Ing conto ing ndhuwur, ngeklik titik pungkasan /koleksi/10002/item/76 bakal nimbulakΓ© counter kanggo nambah, contone, cnt_collection{collection = "10002", status = "200"}, plus sampeyan bakal entuk metrik standar (kanggo saben titik pungkasan ing conto iki) saka perpustakaan standar:

  • flask_http_request_duration_seconds - Durasi panyuwunan HTTP ing sawetara detik kanggo kabeh panjalukan Flask kanthi cara, path lan status

  • flask_http_request_total - Jumlah panjalukan HTTP miturut cara lan status

Ana pilihan kanggo nglewati nelusuri titik pungkasan tartamtu, mlebu metrik standar tambahan utawa ngliwati sing kasebut ing ndhuwur, utawa ngetrapake metrik khusus sing padha menyang sawetara titik pungkasan. Deloken README proyek kanggo ndeleng apa sing kasedhiya.

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

Pustaka kasebut nduweni ekstensi sing trep kanggo perpustakaan multiprocessing populer kayata uWSGI lan Gunicorn. Sampeyan uga bisa nemokake conto cilik saka kasus panggunaan sing diangkah, kalebu multiprocessing.

Koleksi metrik

Kaya kasebut ing ndhuwur, perpustakaan nyedhiyakake titik pungkasan kanthi standar /metrik ing aplikasi Flask, sing bisa dadi target kanggo Prometheus mbangun.

Ing conto dashboard ing ndhuwur, sampeyan bisa target Prometheus menyang aplikasi Flask kanthi setelan gawan karo konfigurasi iki:

scrape_configs:
  - job_name: 'example'

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

Deleng conto lengkap ing Repositori GitHub. Iki nganggep yen Prometheus bisa nemokake conto aplikasi Flask sampeyan http://app:5000/metrics, ing ngendi jeneng domain aplikasi duweni potensi bisa ngatasi sawetara alamat IP, contone nalika mbukak Kubernetes utawa Grombolan Docker.

Yen mbabarake titik akhir metrik kanthi cara iki ora cocog karo sampeyan, mbok menawa amarga sampeyan ora pengin ngidini akses eksternal menyang, sampeyan bisa kanthi gampang mateni kanthi ngliwati path = Ora ana nalika nggawe conto 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)

Banjur sampeyan bisa nggunakake start_http_server(port)kanggo mbukak endpoint iki ing port HTTP sing beda, 5099 ing conto ing ndhuwur. Utawa, yen sampeyan seneng karo titik pungkasan ing aplikasi Flask sing padha, nanging sampeyan kudu ngganti path saka /metrik, sampeyan bisa ngliwati URI liyane minangka parameter path, utawa nggunakake register_endpoint(..)kanggo nginstal mengko.

referensi

Yen sampeyan mutusake kanggo nyoba, aja ragu-ragu mbukak masalah ing GitHub utawa tinggalake komentar, saran, lan saran!

Matur suwun!

Source: www.habr.com

Add a comment