Memantau Layanan Mikro Flask dengan Prometheus

Beberapa baris kode dan aplikasi Anda menghasilkan metrik, wow!

Untuk memahami cara kerja prometheus_labu_eksportir contoh minimal sudah cukup:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Hanya itu yang Anda perlukan untuk memulai! Dengan menambahkan impor dan baris untuk inisialisasi Metrik Prometheus, Anda akan mendapatkan metrik durasi permintaan ΠΈ penghitung permintaan, ditampilkan di titik akhir /metrik aplikasi Flask yang didaftarkannya, serta semua metrik default yang Anda dapatkan dari basis Perpustakaan klien Prometheus.

kamu dapat menemukan contoh yang mudah digunakan di repositori GitHub yang menjalankan instance tersebut Prometheus ΠΈ grafana bersama dengan aplikasi demo untuk menghasilkan metrik yang akan terlihat seperti ini:

Memantau Layanan Mikro Flask dengan Prometheus

Anda juga akan menemukan daftar indikator di README contoh yang muncul di dasbor, bersama dengan kueri Prometheus yang mengisi dasbor.

pengaturan

Ada banyak opsi konfigurasi di perpustakaan, lihat README contoh proyek mereka dengan penjelasan singkat.

Konfigurasi dasar ditunjukkan di atas. Buat saja sebuah instance Metrik Prometheus, sebut saja metrik, lalu gunakan untuk menentukan metrik tambahan yang ingin Anda kumpulkan dengan mendekorasi fungsi:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Penghitung menghitung panggilan, dan lainnya mengumpulkan metrik berdasarkan durasi panggilan tersebut. Anda dapat menentukan label untuk masing-masing label tersebut, kemungkinan menggunakan properti permintaan atau respons. Misalnya:

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, klik pada titik akhir /koleksi/10002/barang/76 akan menyebabkan penghitung bertambah, misalnya cnt_collection{koleksi = "10002", status = "200"}, ditambah lagi Anda akan mendapatkan metrik default (untuk setiap titik akhir dalam contoh ini) dari pustaka default:

  • flask_http_request_duration_seconds β€” Durasi permintaan HTTP dalam hitungan detik untuk semua permintaan Flask berdasarkan metode, jalur, dan status

  • flask_http_request_total β€” Jumlah total permintaan HTTP berdasarkan metode dan status

Terdapat opsi untuk melewati pelacakan titik akhir tertentu, mencatat metrik default tambahan atau melewati metrik yang tercantum di atas, atau menerapkan metrik khusus yang sama ke beberapa titik akhir. Periksa README proyek 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 memiliki ekstensi yang nyaman untuk perpustakaan multiprosesor populer seperti uWSGI dan Gunicorn. Anda juga dapat menemukan contoh kecil kasus penggunaan yang ditargetkan, termasuk multiprosesor.

Pengumpulan metrik

Seperti disebutkan di atas, perpustakaan menyediakan titik akhir secara default /metrik dalam aplikasi Flask, yang dapat dijadikan sebagai target Pembangun Prometheus.

Pada contoh dashboard di atas, Anda dapat menargetkan Prometheus Anda ke aplikasi Flask dengan pengaturan default dengan konfigurasi ini:

scrape_configs:
  - job_name: 'example'

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

Lihat contoh selengkapnya di Repositori GitHub. Ini mengasumsikan bahwa Prometheus dapat menemukan instance aplikasi Flask Anda http://app:5000/metrics, di mana nama domain aplikasi berpotensi dapat ditetapkan ke beberapa alamat IP, misalnya saat dijalankan Kubernetes ΠΈΠ»ΠΈ Kawanan Docker.

Jika mengekspos titik akhir metrik dengan cara ini tidak cocok untuk Anda, mungkin karena Anda tidak ingin mengizinkan akses eksternal ke sana, Anda dapat dengan mudah menonaktifkannya dengan meneruskan jalur=Tidak ada saat membuat sebuah instance Metrik Prometheus.

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 dapat menggunakan start_http_server(pelabuhan)untuk membuka titik akhir ini pada port HTTP yang berbeda, 5099 dalam contoh di atas. Alternatifnya, jika Anda puas dengan titik akhir yang ada di aplikasi Flask yang sama, namun Anda perlu mengubah jalurnya /metrik, Anda dapat meneruskan URI lain sebagai parameter jalur, atau menggunakan register_titik akhir(..)untuk menginstalnya nanti.

referensi

Jika Anda memutuskan untuk mencobanya, silakan buka terbitan di GitHub atau tinggalkan komentar, masukan, dan saran Anda!

Terima kasih!

Sumber: www.habr.com

Tambah komentar