Untuk memonitor aplikasi menggunakan Prometheus, Anda dapat menambahkan instrumen untuk mengekspos data aplikasi dan menggunakan klien Prometheus untuk melihat data yang dikumpulkan. Topik ini menjelaskan cara menggunakan klien Prometheus untuk memonitor aplikasi dengan kluster Container Service for Kubernetes (ACK) dan Container Registry.
Prasyarat
Managed Service for Prometheus harus diaktifkan untuk kluster ACK. Untuk informasi lebih lanjut, lihat Aktifkan Managed Service for Prometheus.
Sebuah repositori gambar harus dibuat di Container Registry. Untuk informasi lebih lanjut, lihat Langkah 2: Buat repositori gambar.
Langkah 1: Instrumen aplikasi
Klien Prometheus mendukung sebagian besar bahasa pemrograman. Untuk informasi lebih lanjut, lihat PERPUSTAKAAN KLIEN. Contoh berikut menunjukkan cara menginstrumen aplikasi Go untuk mengekspos data pemantauan:
package main
import (
"flag"
"fmt"
"log"
"math"
"math/rand"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
addr = flag.String("listen-address", ":8080", "Alamat untuk mendengarkan permintaan HTTP.")
uniformDomain = flag.Float64("uniform.domain", 0.0002, "Domain untuk distribusi seragam.")
normDomain = flag.Float64("normal.domain", 0.0002, "Domain untuk distribusi normal.")
normMean = flag.Float64("normal.mean", 0.00001, "Rata-rata untuk distribusi normal.")
oscillationPeriod = flag.Duration("oscillation-period", 10*time.Minute, "Durasi periode osilasi laju.")
)
var (
// Buat ringkasan untuk melacak latensi RPC fiktif antarlayanan untuk tiga layanan berbeda dengan distribusi latensi yang berbeda.
// Layanan ini dibedakan melalui label "service".
rpcDurations = prometheus.NewSummaryVec(
prometheus.SummaryOpts{
Name: "rpc_durations_seconds",
Help: "Distribusi latensi RPC.",
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
},
[]string{"service"},
)
// Sama seperti di atas, tetapi sekarang sebagai histogram, dan hanya untuk distribusi normal.
// Bucket ditargetkan ke parameter distribusi normal, dengan 20 bucket berpusat pada mean, masing-masing setengah-sigma lebar.
rpcDurationsHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "rpc_durations_histogram_seconds",
Help: "Distribusi latensi RPC.",
Buckets: prometheus.LinearBuckets(*normMean-5**normDomain, .5**normDomain, 20),
})
)
func init() {
// Daftarkan ringkasan dan histogram dengan registri default Prometheus.
prometheus.MustRegister(rpcDurations)
prometheus.MustRegister(rpcDurationsHistogram)
// Tambahkan informasi build modul Go.
prometheus.MustRegister(prometheus.NewBuildInfoCollector())
}
func main() {
flag.Parse()
start := time.Now()
oscillationFactor := func() float64 {
return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(*oscillationPeriod)))
}
// Secara berkala rekam beberapa latensi sampel untuk ketiga layanan.
go func() {
for {
v := rand.Float64() * *uniformDomain
rpcDurations.WithLabelValues("uniform").Observe(v)
time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond)
}
}()
go func() {
for {
v := (rand.NormFloat64() * *normDomain) + *normMean
rpcDurations.WithLabelValues("normal").Observe(v)
// Demonstrasi dukungan exemplar dengan ID dummy. Ini
// akan menjadi sesuatu seperti ID jejak dalam aplikasi nyata. Perhatikan asersi tipe yang diperlukan. Kami
// sudah tahu bahwa rpcDurationsHistogram mengimplementasikan
// antarmuka ExemplarObserver dan dengan demikian tidak perlu
// memeriksa hasil dari asersi tipe.
rpcDurationsHistogram.(prometheus.ExemplarObserver).ObserveWithExemplar(
v, prometheus.Labels{"dummyID": fmt.Sprint(rand.Intn(100000))},
)
time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond)
}
}()
go func() {
for {
v := rand.ExpFloat64() / 1e6
rpcDurations.WithLabelValues("exponential").Observe(v)
time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond)
}
}()
// Paparkan metrik yang terdaftar melalui HTTP.
http.Handle("/metrics", promhttp.HandlerFor(
prometheus.DefaultGatherer,
promhttp.HandlerOpts{
// Pilih OpenMetrics untuk mendukung exemplar.
EnableOpenMetrics: true,
},
))
log.Fatal(http.ListenAndServe(*addr, nil))
}Berikut adalah penjelasan parameter:
Anda harus mendaftarkan metrik prometheus.MustRegister sebelum mendaftarkan metrik rpc_durations_seconds. Dalam contoh ini, metrik rpc_durations_seconds bertipe prometheus.NewSummaryVec. Untuk informasi lebih lanjut tentang tipe lainnya, lihat Prometheus.
rpcDurations adalah instance singleton global. Metode rpcDurations.WithLabelValues("uniform").Observe(v) dipanggil untuk memperbarui data pemantauan.
Untuk informasi lebih lanjut tentang template kode, lihat prometheus / client_golang.
Langkah 2: Kemas aplikasi ke dalam gambar kontainer dan unggah gambar ke repositori
Kemas aplikasi yang telah diinstrumen ke dalam gambar kontainer dan unggah gambar tersebut ke repositori di Container Registry.
Jalankan perintah berikut untuk membuat gambar:
docker build -t <Nama gambar Docker sementara lokal>:<Tag gambar Docker sementara lokal> . --no-cacheContoh:
docker build -t prometheus-demo:v1 . --no-cacheJalankan perintah berikut untuk memberi tag pada gambar:
sudo docker tag <Nama gambar Docker sementara lokal>:<Tag gambar Docker sementara lokal> <Nama domain registry>/<Namespace>/<Nama gambar>:<Tag gambar>Contoh:
sudo docker tag prometheus-demo:v1 registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1Jalankan perintah berikut untuk mendorong gambar ke repositori:
sudo docker push <Nama domain registry>/<Namespace>/<Nama gambar>:<Tag gambar>Contoh:
sudo docker push registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1Lihat gambar di konsol Container Registry.
Masuk ke konsol Container Registry.
Di bilah navigasi atas, pilih wilayah.
Di panel navigasi sisi kiri, klik Instances.
Di halaman Instances, klik instance Personal Edition yang ingin Anda kelola.
Di panel navigasi sisi kiri halaman manajemen instance Personal Edition, pilih .
Di halaman Repositories, temukan repositori yang ingin Anda kelola dan klik Manage di kolom Actions.
Di panel navigasi sisi kiri, klik Tags.
Anda dapat menemukan gambar yang diunggah di halaman Tags.
Langkah 3: Terapkan aplikasi ke kluster ACK
Masuk ke konsol ACK. Di panel navigasi sisi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel sisi kiri, pilih .
Buat pods.
Di halaman Pods, klik Create from YAML.
Di halaman Create, masukkan kode berikut di editor kode Template dan klik Create:
apiVersion: apps/v1 # untuk versi sebelum 1.8.0 gunakan apps/v1beta1 kind: Deployment metadata: name: demo-app labels: app: demo-app spec: replicas: 2 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: demo-app image: <Nama domain repositori>/<Namespace>/<Nama gambar>:<Tag gambar> command: - /random ports: - containerPort: 8080Contoh:
apiVersion: apps/v1 # untuk versi sebelum 1.8.0 gunakan apps/v1beta1 kind: Deployment metadata: name: demo-app labels: app: demo-app spec: replicas: 2 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: demo-app image: registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1 command: - /random ports: - containerPort: 8080
Di halaman Pods, Anda dapat menemukan pods yang Anda buat.
Buat sebuah Service.
Di panel navigasi sisi kiri halaman detail, pilih .
Di halaman Services, klik Create from YAML.
Di halaman Create, salin kode berikut ke editor kode Template dan klik Create:
apiVersion: v1 kind: Service metadata: labels: app: demo-app name: demo-app namespace: default spec: ports: - name: http-metrics port: 8080 protocol: TCP targetPort: 8080 selector: app: demo-app type: ClusterIP
Di halaman Services, Anda dapat menemukan Service yang Anda buat.
Langkah 4: Konfigurasi penemuan layanan
Konfigurasikan penemuan layanan di Managed Service for Prometheus untuk menangkap data dari aplikasi Go. Contoh berikut menunjukkan cara mengonfigurasi penemuan layanan di konsol Application Real-Time Monitoring Service (ARMS):
Masuk ke Konsol ARMS.
Di bilah navigasi atas, pilih wilayah tempat kluster diterapkan.
Di panel navigasi sisi kiri, klik Integration Management. Di tab Integrated Environments, klik lingkungan yang memiliki nama sama dengan kluster.
Di halaman Container Service, klik tab Metric Scraping. Di panel navigasi sisi kiri, klik Service Monitor.
Di daftar Service Monitor, klik Create. Di panel Add ServiceMonitor Configuration, salin blok kode berikut ke editor kode dan klik Create.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: app: demo-app name: demo-app namespace: default annotations: arms.prometheus.io/discovery: 'true' spec: endpoints: - interval: 30s port: http-metrics jobLabel: app namespaceSelector: matchNames: - default selector: matchLabels: app: demo-appDi tab ServiceMonitor, Anda dapat menemukan ServiceMonitor yang Anda konfigurasi.
Langkah 5: Periksa apakah klien Prometheus dapat memonitor aplikasi berdasarkan metrik
Masuk ke Konsol ARMS.
Di bilah navigasi atas, pilih wilayah tempat kluster diterapkan.
Di panel navigasi sisi kiri, pilih Metrics Center > Metric Overview. Di kotak pencarian, masukkan rpc_durations_seconds dari metrik yang didaftarkan di Langkah 1: Instrumen aplikasi dan klik ikon
.Jika metrik rpc_durations_seconds dikembalikan, itu menunjukkan bahwa klien Prometheus dapat memonitor aplikasi berdasarkan metrik.