Memantau Microservices dengan Prometheus dan Grafana
June 8, 2023
Pemantauan berkelanjutan sangat penting untuk membuat sistem microservice menjadi tangguh. Tanpa pemantauan yang tepat, microservices dapat dengan cepat menjadi kewalahan, yang mengakibatkan kesalahan dan penurunan performa.
Melalui pemantauan berkelanjutan, pengembang dapat mendeteksi masalah pada layanan mereka segera setelah muncul dan mengambil tindakan untuk mencegah kerusakan yang signifikan. Ini juga memberikan wawasan tentang bagaimana layanan Anda berkinerja, memungkinkan Anda membuat keputusan yang lebih baik.
Artikel ini akan memperkenalkan cara Anda dapat menyiapkan pemantauan pada aplikasi microservice Anda menggunakan dua alat populer di bidang ini, Prometheus, dan Grafana.
Kode sumber dan file Docker Compose untuk tutorial ini tersedia di pottekkat/monitoring-101.
Dasar-dasar Prometheus
Prometheus adalah alat pemantauan dan peringatan sumber terbuka. Alat ini "menarik" metrik (pengukuran) dari microservices dengan mengirimkan permintaan HTTP dan menyimpan hasilnya dalam basis data time-series.
Anda dapat menginstrumentasi layanan Anda dengan menggunakan client libraries yang disediakan oleh Prometheus. Ini akan memungkinkan Anda untuk membuat dan mengumpulkan metrik kustom dari layanan Anda.
Prometheus juga memiliki exporters yang memungkinkan Anda menarik metrik yang tidak dalam format Prometheus. Sebuah exporter bertindak sebagai perantara dan mengubah data yang diekspor ke format yang dapat dibaca oleh Prometheus.

Prometheus menyediakan bahasa kueri yang kuat, PromQL, untuk bekerja dengan data yang dikumpulkan ini. Anda dapat menggunakan PromQL untuk membuat kueri kompleks guna memfilter, mengagregasi, dan mengubah data ke format yang diinginkan.
Selain menarik metrik, Prometheus juga dapat memicu peringatan ketika ambang batas yang ditetapkan dilanggar. Mekanisme peringatan ini sangat dapat dikonfigurasi dan dapat mengirim notifikasi ke tempat seperti Slack atau email.
Prometheus memiliki antarmuka pengguna grafis (GUI) yang memungkinkan Anda memvisualisasikan metrik yang dikumpulkan dengan mudah. Ini juga terintegrasi dengan alat visualisasi lanjutan lainnya seperti Grafana.

Jenis Metrik
Prometheus menawarkan empat jenis metrik inti:
- Counter: mewakili penghitung tunggal yang meningkat secara monoton. Nilainya dapat meningkat atau direset ke nol saat restart. Anda dapat menggunakannya untuk mewakili metrik seperti jumlah permintaan yang dilayani.
- Gauge: mewakili nilai numerik yang dapat naik atau turun. Anda dapat menggunakannya untuk mewakili nilai seperti penggunaan memori atau jumlah permintaan per detik.
- Histogram: mengambil sampel data ke dalam bucket yang dapat dikonfigurasi. Gunakan ini untuk mewakili nilai seperti durasi permintaan atau ukuran respons.
- Summary: mirip dengan histogram, ini juga menghitung nilai yang dapat dikonfigurasi selama jendela waktu geser.
Anda dapat mempelajari lebih lanjut tentang jenis metrik ini dan cara menggunakannya dari dokumentasi resmi.
Aplikasi Contoh
Aplikasi contoh kami akan terdiri dari gateway API, aplikasi Go, dan aplikasi Python.

Aplikasi ini akan mengembalikan, "Halo <nama>!" dalam bahasa yang Anda pilih dengan <nama> yang Anda berikan. Apache APISIX akan menjadi gateway API yang mengarahkan lalu lintas ke layanan Anda.
Diagram di bawah ini menunjukkan cara kerja sistem.

- Pengguna mengirimkan permintaan GET ke APISIX, titik masuk untuk aplikasi.
- APISIX meneruskan permintaan ke layanan Go.
- Layanan Go mengirimkan permintaan GET ke layanan Python untuk mendapatkan "Halo" dalam bahasa yang ditentukan.
- Layanan Python merespons dengan terjemahan "Halo" yang diperlukan.
- Layanan Go membuat respons yang diperlukan dengan menggunakan nama yang diberikan dalam kueri dan mengirimkannya ke APISIX.
- APISIX meneruskan respons kembali ke pengguna.
Mengonfigurasi Prometheus untuk Mengumpulkan Metrik
Kami akan menginstrumentasi dan mengekspor metrik dari semua layanan dalam aplikasi kami dan mengumpulkannya di Prometheus. Kami akan mulai dengan gateway API kami, Apache APISIX.
Mengekspor Metrik dari APISIX
Apache APISIX adalah gateway API sumber terbuka yang berbasis cloud-native.
Anda tidak perlu mengetahui tentang APISIX untuk mengikuti tutorial ini, dan Anda dapat menggunakan file Docker Compose yang disediakan untuk menyiapkan semuanya. Untuk mempelajari lebih lanjut tentang APISIX, kunjungi api7.ai/apisix.
APISIX menawarkan Plugin prometheus yang dengan mudah mengekspor metrik dalam format Prometheus. Anda dapat mengonfigurasi Plugin ini di file konfigurasi APISIX Anda:
apisix: enable_admin: false # menjalankan APISIX dalam mode standalone config_center: yaml # menggunakan file YAML untuk konfigurasi alih-alih menyimpannya di etcd plugin_attr: prometheus: export_uri: /prometheus/metrics # mengaktifkan Plugin prometheus dan mengekspor metrik ke URI ini enable_export_server: false # mengekspor metrik di port data-plane default
Sekarang kita dapat mengaktifkan Plugin di setiap Route dengan menjadikannya Global rule:
routes: # mengarahkan permintaan ke /hello/* ke go-app - uri: /hello/* upstream: type: roundrobin nodes: "go-app:8080": 1 plugins: # menghapus prefiks "/hello" sebelum meneruskan permintaan ke go-app proxy-rewrite: regex_uri: - "/hello/(.*)" - "/$1" # mengekspor metrik Prometheus ke URI yang ditentukan - uri: /prometheus/metrics plugins: public-api: # mengaktifkan Plugin Prometheus secara global di semua Route global_rules: - id: 1 plugins: prometheus: prefer_name: true #END
Ini akan mengekspor metrik ke endpoint /prometheus/metrics di Apache APISIX.
Anda dapat mempelajari lebih lanjut tentang metrik yang tersedia dari dokumentasi.
Menginstrumentasi dan Mengekspor Metrik dari Layanan Go
Prometheus memiliki client library Go resmi untuk menginstrumentasi aplikasi Go.
Secara default, Prometheus akan mengekspos metrik Go default. Anda juga dapat membuat metrik khusus aplikasi Anda sendiri.
Dalam layanan kami, kami akan mengekspos metrik default dan membuat metrik counter kami sendiri untuk melacak jumlah permintaan:
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "os" // Paket Prometheus "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) // Response menyimpan Pesan yang diperoleh dari python-app type Response struct { Message string `json:"message"` } // bahasa dan nama default var ( lang = "en" name = "John" ) // membuat metrik counter Prometheus kustom baru var pingCounter = promauto.NewCounter( prometheus.CounterOpts{ Name: "go_app_request_count", Help: "Jumlah permintaan yang ditangani oleh go-app", }, ) // HelloHandler menangani permintaan ke go-app func HelloHandler(w http.ResponseWriter, r *http.Request) { lang = r.URL.String() name = r.URL.Query()["name"][0] fmt.Println("Permintaan untuk", lang, "dengan nama", name) pingCounter.Inc() pUrl := os.Getenv("PYTHON_APP_URL") if len(pUrl) == 0 { pUrl = "localhost" } // memanggil python-app untuk mendapatkan terjemahan resp, err := http.Get("http://" + pUrl + ":8000" + lang) if err != nil { log.Fatalln(err) } body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalln(err) } resp.Body.Close() var m Response json.Unmarshal(body, &m) // mengirim kembali respons dengan "Halo nama!" dalam bahasa yang ditentukan fmt.Fprintf(w, "%s %s!", m.Message, name) } func main() { // mengekspos metrik Prometheus http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/", HelloHandler) http.ListenAndServe(":8080", nil) }
Ini akan mengekspos metrik ke endpoint /metrics. Anda dapat mempelajari lebih lanjut tentang client library Go dari repositori GitHub.
Menginstrumentasi dan Mengekspor Metrik dari Layanan Python
Prometheus juga memiliki client library Python resmi. Ada juga library pihak ketiga yang disesuaikan untuk kasus penggunaan tertentu.
Layanan kami menggunakan FastAPI, dan kami akan menggunakan library prometheus_fastapi_instrumentator untuk menginstrumentasinya:
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from prometheus_fastapi_instrumentator import Instrumentator app = FastAPI() hello = {"en": "Hello", "fr": "Bonjour", "es": "Hola", "ml": "ഹലോ"} # mengekspos metrik Python default ke endpoint /metrics Instrumentator().instrument(app).expose(app) @app.get("/{lang}") async def get_hello(lang): return {"message": hello[lang]}
Anda dapat mempelajari lebih lanjut tentang membuat metrik kustom dari dokumentasi.
Mengonfigurasi Prometheus
Sekarang kita dapat mengumpulkan metrik ini di Prometheus.
Anda dapat mengonfigurasi Prometheus untuk mengumpulkan metrik dari setiap layanan. Secara default, Prometheus memeriksa metrik di path /metrics:
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "go-app" static_configs: - targets: ["go-app:8080"] - job_name: "python-app" static_configs: - targets: ["python-app:8000"] - job_name: "apisix" static_configs: - targets: ["apisix:9080"] metrics_path: "/prometheus/metrics"
Itu saja! Sekarang, jika Anda membuka dashboard Prometheus (default di port 9090) dan klik "Status" dari navbar dan "Targets," Anda akan dapat melihat status metrik yang diambil dari layanan Anda.

Mengkueri dan Memvisualisasikan Metrik di Prometheus
Sekarang, Anda dapat menggunakan dashboard Prometheus untuk menjalankan kueri dan ekspresi kompleks.

Anda dapat mempelajari lebih lanjut tentang mengkueri Prometheus di dokumentasi resmi.
Menggunakan Grafana untuk Mengkueri Prometheus
Grafana adalah platform visualisasi data sumber terbuka yang bekerja dengan Prometheus untuk menyediakan alat yang komprehensif untuk mengumpulkan, mengkueri, dan memvisualisasikan metrik.
Prometheus bagus dalam mengumpulkan metrik dan mengkueri tetapi kurang dalam menyediakan alat untuk membuat visualisasi yang bermakna. Grafana mengatasi keterbatasan ini dengan mengubah metrik yang dikumpulkan menjadi visualisasi.
Grafana juga kompatibel dengan banyak sumber data lain selain Prometheus.
Setelah Anda menerapkan Grafana, Anda dapat membuka antarmuka web (default di port 3000).
Pertama, Anda harus menambahkan Prometheus sebagai sumber data. Untuk melakukan ini, buka /datasources atau "Configuration" dan "Data sources." Klik "Add data source" dan pilih Prometheus. Tentukan di mana Prometheus diterapkan, simpan dan uji koneksi.

Menggunakan Dashboard Grafana yang Sudah Dibuat
Grafana menyediakan repositori dashboard publik yang berisi dashboard Grafana yang sudah dibuat. Anda dapat menggunakannya di instance Grafana Anda untuk dengan cepat memvisualisasikan metrik yang relevan.
Kami akan menggunakan dashboard Go Processes yang akan memproses dan memvisualisasikan status proses yang dipublikasikan oleh client library Go Prometheus.
Untuk mengimpor template ini, pertama-tama salin ID-nya (6671) dari repositori dashboard. Di antarmuka Grafana Anda, buka "Dashboards" dan pilih "Import." Tempel ID yang Anda salin dan klik "Load."

Anda juga dapat menjelajahi dashboard yang sudah dibuat lainnya atau membuat dashboard Anda sendiri. Lihat dokumentasi untuk mempelajari lebih lanjut tentang ini.
Apa Selanjutnya?
Itu saja untuk tutorial ini!
Artikel ini hanya pengenalan tentang cara Anda dapat menyiapkan pemantauan pada layanan Anda, dan saya mendorong Anda untuk mempelajari lebih lanjut tentang Prometheus dan Grafana dari sumber daya yang disebutkan di bawah ini:
Kode lengkap dan file Docker Compose untuk tutorial ini tersedia di pottekkat/monitoring-101.