Ngawaskeun Flask Microservices kalawan Prometheus

Sababaraha baris kode sareng aplikasi anjeun ngahasilkeun métrik, wow!

Dina raraga ngartos kumaha prometheus_ jalanlabu_eksportir 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'

Éta sadayana anu anjeun peryogikeun pikeun ngamimitian! Ku nambahkeun hiji impor sarta garis pikeun initialization PrometheusMetrics, anjeun bakal meunang metrics lilana pamundut и pamundut counters, dipintonkeun dina titik tungtung / métrik aplikasi Flask anu didaptarkeun sareng sadaya métrik standar anu anjeun kéngingkeun tina dasarna perpustakaan klien Prometheus.

anjeun tiasa mendakan gampang ngagunakeun conto dina Repository GitHub anu ngajalankeun conto Prometheus и grafana sareng aplikasi demo pikeun ngahasilkeun métrik anu bakal katingali sapertos kieu:

Ngawaskeun Flask Microservices kalawan Prometheus

Anjeun oge bakal manggihan daptar indikator dina README conto nu nembongan dina dasbor, babarengan jeung Prometheus queries nu populate nu dasbor.

carana ngatur

Aya loba pilihan konfigurasi dina perpustakaan, tingali dina README conto proyék di antarana kalayan katerangan ringkes.

Konfigurasi dasar ditémbongkeun di luhur. Ngan nyieun hiji conto PrometheusMetrics, hayu urang sebutkeun metrics, teras dianggo pikeun nangtukeun métrik tambahan anu anjeun hoyong kumpulkeun ku ngahias fungsi:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Counter ngitung telepon, sareng anu sanésna ngumpulkeun métrik dumasar kana durasi telepon éta. Anjeun tiasa nangtukeun labél pikeun tiap ieu, berpotensi ngagunakeun pamundut atawa sipat respon. Salaku conto:

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

Dina conto di luhur, ngaklik titik tungtung / kumpulan / 10002 / barang / 76 bakal ngabalukarkeun counter kana increment, contona cnt_collection{collection = "10002", status = "200"}, ditambah anjeun bakal nampi métrik standar (pikeun unggal titik dina conto ieu) tina perpustakaan standar:

  • flask_http_request_duration_seconds - Durasi pamundut HTTP dina detik pikeun sadaya pamundut Flask ku metode, jalur sareng status

  • flask_http_request_total - Jumlah total pamundut HTTP ku metode sareng status

Aya pilihan pikeun ngalangkungan tracking titik akhir khusus, log métrik standar tambahan atanapi ngalangkungan anu didaptarkeun di luhur, atanapi nerapkeun métrik khusus anu sami ka sababaraha titik tungtung. Parios README proyék pikeun ningali naon anu sayogi.

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

Perpustakaan ngagaduhan ekstensi anu cocog pikeun perpustakaan multiprocessing populér sapertos uWSGI sareng Gunicorn. Anjeun oge bisa manggihan conto leutik kasus pamakéan sasaran, kaasup multiprocessing.

Koléksi métrik

Sakumaha didadarkeun di luhur, perpustakaan nyadiakeun endpoint sacara standar / métrik dina aplikasi Flask, nu bisa ngawula ka salaku udagan pikeun Prometheus pembina.

Dina conto dasbor di luhur, anjeun tiasa nargétkeun Prometheus anjeun kana aplikasi Flask kalayan setélan standar sareng konfigurasi ieu:

scrape_configs:
  - job_name: 'example'

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

Tempo conto lengkep di Repositories GitHub. Ieu nganggap yén Prometheus tiasa mendakan instansi aplikasi Flask anjeun dina http://app:5000/metrics, dimana nami domain aplikasi berpotensi tiasa ngabéréskeun sababaraha alamat IP, contona nalika ngajalankeun Kubernetes atawa Docker ngagimbung.

Upami ngalaan titik tungtung métrik ku cara ieu henteu cocog sareng anjeun, panginten anjeun henteu hoyong ngijinkeun aksés éksternal kana éta, anjeun tiasa nganonaktipkeun sacara gampang ku jalan ngalangkungan jalur = Euweuh nalika nyieun hiji 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)

Teras anjeun tiasa nganggo start_http_server(port)pikeun muka tungtung ieu dina port HTTP béda, 5099 dina conto di luhur. Alternatipna, upami anjeun senang sareng titik tungtung aya dina aplikasi Flask anu sami, tapi anjeun kedah ngarobih jalurna tina / métrik, Anjeun boh bisa lulus URI sejen salaku parameter jalur, atawa pamakéan register_endpoint(..)pikeun masang éta engké.

rujukan

Upami anjeun mutuskeun pikeun nyobian, mangga buka masalah dina GitHub atanapi tinggalkeun koméntar, tanggapan, sareng saran anjeun!

Hatur nuhun!

sumber: www.habr.com

Tambahkeun komentar