Memantau Perkhidmatan Mikro Flask dengan Prometheus

Beberapa baris kod dan aplikasi anda menjana metrik, wow!

Untuk memahami cara prometheus_ berfungsikelalang_pengeksport contoh minimum sudah cukup:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Itu sahaja yang anda perlukan untuk bermula! Dengan menambah import dan baris untuk permulaan PrometheusMetrics, anda akan mendapat metrik tempoh permintaan ΠΈ kaunter permintaan, dipaparkan pada titik akhir /metrik aplikasi Flask yang didaftarkan dengannya, serta semua metrik lalai yang anda perolehi daripada pangkalan Perpustakaan pelanggan Prometheus.

awak boleh cari contoh yang mudah digunakan dalam repositori GitHub yang menjalankan instance Prometheus ΠΈ grafana bersama-sama dengan aplikasi demo untuk menjana metrik yang akan kelihatan seperti ini:

Memantau Perkhidmatan Mikro Flask dengan Prometheus

Anda juga akan menemui senarai penunjuk dalam README contoh yang muncul dalam papan pemuka, bersama-sama dengan pertanyaan Prometheus yang mengisi papan pemuka.

pelarasan

Terdapat banyak pilihan konfigurasi dalam perpustakaan, lihat README contoh projek mereka dengan penerangan ringkas.

Konfigurasi asas ditunjukkan di atas. Buat contoh sahaja PrometheusMetrics, mari kita panggil Metrik, dan kemudian gunakannya untuk menentukan metrik tambahan yang anda ingin kumpulkan dengan menghiasi fungsi:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Kaunter mengira panggilan dan yang lain mengumpul metrik berdasarkan tempoh panggilan tersebut. Anda boleh menentukan label untuk setiap satu daripada ini, yang berpotensi menggunakan sifat permintaan atau tindak balas. Sebagai contoh:

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

Dalam contoh di atas, mengklik pada titik akhir /collection/10002/item/76 akan menyebabkan kaunter meningkat, contohnya cnt_collection{collection = "10002", status = "200"}, serta anda akan mendapat metrik lalai (untuk setiap titik akhir dalam contoh ini) daripada pustaka lalai:

  • flask_http_request_duration_seconds β€” Tempoh permintaan HTTP dalam beberapa saat untuk semua permintaan Flask mengikut kaedah, laluan dan status

  • flask_http_request_total β€” Jumlah bilangan permintaan HTTP mengikut kaedah dan status

Terdapat pilihan untuk melangkau penjejakan titik akhir tertentu, log metrik lalai tambahan atau melangkau yang disenaraikan di atas atau menggunakan metrik tersuai yang sama pada berbilang titik akhir. Semak keluar README projek untuk melihat apa yang tersedia.

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 ini mempunyai sambungan yang mudah untuk perpustakaan berbilang pemprosesan yang popular seperti uWSGI dan Gunicorn. Anda juga boleh menemui contoh kecil kes penggunaan yang disasarkan, termasuk berbilang pemprosesan.

Pengumpulan metrik

Seperti yang dinyatakan di atas, perpustakaan menyediakan titik akhir secara lalai /metrik dalam aplikasi Flask, yang boleh berfungsi sebagai sasaran untuk Pembina Prometheus.

Dalam contoh papan pemuka di atas, anda boleh menyasarkan aplikasi Prometheus anda ke Flask dengan tetapan lalai dengan konfigurasi ini:

scrape_configs:
  - job_name: 'example'

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

Lihat contoh penuh di Repositori GitHub. Ini mengandaikan bahawa Prometheus boleh mencari contoh aplikasi Flask anda pada http://app:5000/metrics, di mana nama domain aplikasi berpotensi boleh diselesaikan kepada berbilang alamat IP, contohnya apabila dijalankan Kubernetes atau Kumpulan Docker.

Jika mendedahkan titik akhir metrik dengan cara ini tidak sesuai dengan anda, mungkin kerana anda tidak mahu membenarkan akses luaran kepadanya, anda boleh melumpuhkannya dengan mudah dengan meneruskan laluan=Tiada semasa membuat contoh 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)

Kemudian anda boleh menggunakan start_http_server(port)untuk membuka titik akhir ini pada port HTTP yang berbeza, 5099 dalam contoh di atas. Sebagai alternatif, jika anda berpuas hati dengan titik akhir berada dalam aplikasi Flask yang sama, tetapi anda perlu menukar laluannya daripada /metrik, anda boleh sama ada lulus URI lain sebagai parameter laluan, atau gunakan register_endpoint(..)untuk memasangnya kemudian.

rujukan

Jika anda memutuskan untuk mencubanya, jangan ragu untuk membuka isu di GitHub atau tinggalkan ulasan, maklum balas dan cadangan anda!

Thank you!

Sumber: www.habr.com

Tambah komen