Managed Service for Prometheus mendukung penemuan layanan melalui Custom Resource Definition (CRD) ServiceMonitor. Anda dapat menggunakan ServiceMonitor untuk menentukan namespace tempat Pod ditemukan dan memilih Services yang akan dipantau dengan matchLabel. Topik ini menjelaskan cara membuat konfigurasi penemuan layanan menggunakan ServiceMonitor untuk aplikasi berbasis framework Spring Boot.
Demo
Unduh proyek demo untuk contoh lengkap pembuatan konfigurasi penemuan layanan menggunakan ServiceMonitor.
Langkah 1: Tambahkan dependensi
Buat aplikasi Maven dan tambahkan dependensi berikut ke file pom.xml.
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>Tambahkan konfigurasi berikut ke file src/resources/application.properties dalam proyek.
management.endpoints.web.exposure.include=prometheusJalankan proyek dan akses
http://{host}:{port}/actuator/prometheusdi browser.Data pemantauan untuk Java Virtual Machine (JVM) yang sesuai akan ditampilkan. Gambar berikut menunjukkan contohnya.

Langkah 2: Terapkan kluster Kubernetes
Bangun citra dan unggah ke repositori image. Untuk informasi selengkapnya, lihat Bind a source code hosting platform.
Buat deployment menggunakan konfigurasi YAML berikut.
apiVersion: apps/v1 kind: Deployment metadata: name: micrometer-prometheus namespace: default labels: app: demo-prometheus spec: replicas: 3 selector: matchLabels: app: demo-prometheus template: metadata: labels: app: demo-prometheus spec: containers: - name: micrometer-prometheus image: manjusakalza/micrometer-prometheus:latest ports: - containerPort: 8080Buat Service menggunakan konfigurasi YAML berikut.
apiVersion: v1 kind: Service metadata: name: prometheus-metrics-demo namespace: default labels: micrometer-prometheus-discovery: 'true' spec: selector: app: demo-prometheus ports: - protocol: TCP port: 8080 targetPort: 8080 name: metrics
Langkah 3: Buat ServiceMonitor
Simpan file YAML ke komputer Anda dan jalankan
kubectl apply -f {path/to/the/YAML/file}untuk menerapkan file tersebut.
Berikut adalah contoh file YAML untuk ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: micrometer-demo
namespace: default
spec:
endpoints:
- interval: 15s
path: /actuator/prometheus
port: metrics # Catatan: Konfigurasikan nama port, bukan nomor port.
namespaceSelector:
any: true
selector:
matchLabels:
micrometer-prometheus-discovery: 'true'Bidang-bidang dalam file YAML ini dijelaskan sebagai berikut:
Bidang
metadatanamedannamespacemenentukan metadata utama untuk ServiceMonitor.Bidang
specendpointsmenentukan titik akhir server tempat Prometheus mengambil metrik.endpointsmerupakan array yang memungkinkan Anda menentukan beberapaendpoints. Setiapendpointberisi tiga bidang berikut:interval: Menentukan interval pengambilan metrik oleh Prometheus dariendpointsaat ini. Satuannya adalah detik. Dalam contoh ini, nilainya diatur menjadi15s.path: Menentukan path pengambilan untuk Prometheus. Dalam contoh ini, nilainya diatur menjadi/actuator/prometheus.port: Nama port layanan tempat metrik dikumpulkan. Atur parameter ini ke nilai parameternameyang ditentukan untuk Service yang Anda buat di Langkah 2. Dalam contoh ini, parameter ini diatur menjadimetrics.PentingKonfigurasikan nama port, bukan nomor port.
Bidang
specnamespaceSelectormenentukan cakupan penemuan Service.namespaceSelectorberisi dua bidang yang saling eksklusif, yaitu:any: Hanya memiliki satu nilai,true. Jika bidang ini diatur ke `true`, sistem akan memantau semua Services yang sesuai dengan kondisi filter selector di semua namespace.matchNames: Array yang menentukannamespacesyang akan dipantau. Misalnya, untuk hanya memantau Services di namespace default dan arms-prom, aturmatchNamessebagai berikut:namespaceSelector: matchNames: - default - arms-prom
Bidang
specselectordigunakan untuk memilih Services.Service yang digunakan dalam contoh ini memiliki label micrometer-prometheus-discovery: 'true'. Oleh karena itu, atur
selectorsebagai berikut:selector: matchLabels: micrometer-prometheus-discovery: 'true'
Untuk menggunakan fitur basic auth, lihat contoh file YAML berikut.
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: cloud-open-api-monitor # Tetapkan nama unik untuk ServiceMonitor.
namespace: default # Tetapkan namespace tempat ServiceMonitor berada.
spec:
endpoints:
- interval: 30s
# Tentukan interval pengambilan metrik oleh Prometheus dari endpoint saat ini.
port: tcp-8080
# Masukkan path yang diekspos dalam kode Prometheus exporter.
path: /api/actuator/prometheus
basicAuth:
password:
name: basic-auth
key: <password>
username:
name: basic-auth
key: <userName>
scheme: http
namespaceSelector:
any: true
selector:
matchLabels:
# Cocokkan Services dengan label berikut.
edas.oam.acname: cloud-open-apiJika Anda tidak memiliki izin yang diperlukan untuk menggunakan fitur basic auth, tambahkan ClusterRole dengan izin yang diperlukan ke kluster. Kemudian, bind ClusterRole tersebut ke ServiceAccount bernama arms-prom-operator di namespace arms-prom menggunakan ClusterRoleBinding. Hal ini memberikan izin yang diperlukan kepada Prometheus Agent.
File YAML ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-agent-role labels: app: prometheus-agent rules: - apiGroups: [""] resources: ["pods", "services", "endpoints", "nodes"] verbs: ["get", "list", "watch"] # Sesuaikan jika diperlukan. - apiGroups: ["monitoring.coreos.com"] # Sesuaikan apiGroups jika diperlukan. resources: ["*"] verbs: ["get", "list", "watch", "create", "update", "delete"] # Sesuaikan jika diperlukan.File YAML ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-agent-binding subjects: - kind: ServiceAccount name: arms-prom-operator # Nama akun layanan namespace: arms-prom # Namespace tempat akun layanan berada. roleRef: kind: ClusterRole name: prometheus-agent-role # Nama ClusterRole yang didefinisikan di atas. apiGroup: rbac.authorization.k8s.io
Langkah 4: Verifikasi ServiceMonitor
Lakukan langkah-langkah berikut untuk memverifikasi bahwa Prometheus berhasil menemukan layanan tersebut.
Masuk ke Konsol Managed Service for Prometheus. Di panel navigasi sebelah kiri, klik Integration Management.
Pada tab Integrated Environments, klik nama lingkungan kontainer target dalam daftar Container Service.
Klik tab Self-Monitoring.
Pada tab Targets, periksa apakah terdapat target bernama {namespace}/{serviceMonitorName}/x.

Klik baris target {namespace}/{serviceMonitorName}/x untuk memperluasnya, lalu klik tautan endpoint.
Verifikasi bahwa metrik ditampilkan dengan benar.
