Managed Service for Prometheus mendukung penemuan layanan melalui CRD ServiceMonitor. ServiceMonitor menentukan cakupan namespace untuk penemuan pod dan memilih layanan target menggunakan matchLabel. Panduan ini menggunakan aplikasi Spring Boot sebagai contoh.
Demo
Unduh proyek demo untuk contoh lengkap penemuan layanan berbasis 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/applications.properties dalam proyek.
management.endpoints.web.exposure.include=prometheus -
Jalankan proyek dan akses
http://{host}:{port}/actuator/prometheusdi browser.Data pemantauan JVM akan ditampilkan. Berikut adalah contoh output dalam format eksposisi Prometheus.
# HELP jvm_threads_daemon_threads The current number of live daemon threads # TYPE jvm_threads_daemon_threads gauge jvm_threads_daemon_threads 23.0 # HELP tomcat_sessions_rejected_sessions_total # TYPE tomcat_sessions_rejected_sessions_total counter tomcat_sessions_rejected_sessions_total 0.0 # HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use # TYPE jvm_memory_committed_bytes gauge jvm_memory_committed_bytes{area="heap",id="PSSurvivorSpace",} 1.31072E7 jvm_memory_committed_bytes{area="heap",id="PSOldGen",} 1.30023424E8 jvm_memory_committed_bytes{area="heap",id="PSEdenSpace",} 1.56762112E8 jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 3.670016E7 jvm_memory_committed_bytes{area="nonheap",id="CodeCache",} 7143424.0 jvm_memory_committed_bytes{area="nonheap",id="CompressedClassSpace",} 5242880.0 # HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine # TYPE jvm_classes_loaded_classes gauge jvm_classes_loaded_classes 6877.0 # HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset # TYPE jvm_threads_peak_threads gauge jvm_threads_peak_threads 28.0 # HELP system_cpu_count The number of processors available to the Java virtual machine # TYPE system_cpu_count gauge system_cpu_count 12.0 # HELP tomcat_sessions_expired_sessions_total # TYPE tomcat_sessions_expired_sessions_total counter tomcat_sessions_expired_sessions_total 0.0 # HELP process_files_max_files The maximum file descriptor count # TYPE process_files_max_files gauge process_files_max_files 10240.0 # HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool # TYPE jvm_buffer_total_capacity_bytes gauge jvm_buffer_total_capacity_bytes{id="direct",} 8192.0 jvm_buffer_total_capacity_bytes{id="mapped",} 0.0 # HELP jvm_threads_states_threads The current number of threads having NEW state # TYPE jvm_threads_states_threads gauge jvm_threads_states_threads{state="runnable",} 9.0 jvm_threads_states_threads{state="blocked",} 0.0 jvm_threads_states_threads{state="waiting",} 12.0 jvm_threads_states_threads{state="timed-waiting",} 6.0 jvm_threads_states_threads{state="new",} 0.0 jvm_threads_states_threads{state="terminated",} 0.0 # HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool # TYPE jvm_buffer_count_buffers gauge jvm_buffer_count_buffers{id="direct",} 1.0 jvm_buffer_count_buffers{id="mapped",} 0.0 # HELP process_files_open_files The open file descriptor count # TYPE process_files_open_files gauge process_files_open_files 93.0 # HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC # TYPE jvm_gc_memory_promoted_bytes_total counter jvm_gc_memory_promoted_bytes_total 5225384.0 # HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management # TYPE jvm_memory_max_bytes gauge jvm_memory_max_bytes{area="heap",id="PSSurvivorSpace",} 1.31072E7 jvm_memory_max_bytes{area="heap",id="PSOldGen",} 2.863661056E9 jvm_memory_max_bytes{area="heap",id="PSEdenSpace",} 1.40509184E9 jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0 jvm_memory_max_bytes{area="nonheap",id="CodeCache",} 2.5165824E8 jvm_memory_max_bytes{area="nonheap",id="CompressedClassSpace",} 1.073741824E9 # HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the (young) heap memory pool after one GC to before the next # TYPE jvm_gc_memory_allocated_bytes_total counter jvm_gc_memory_allocated_bytes_total 1.14749824E8 # HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution # TYPE jvm_classes_unloaded_classes_total counter jvm_classes_unloaded_classes_total 10.0 # HELP tomcat_sessions_created_sessions_total # TYPE tomcat_sessions_created_sessions_total counter
Langkah 2: Terapkan kluster Kubernetes
-
Buat image dan unggah ke repositori image. Untuk informasi lebih lanjut, lihat Hubungkan ke platform kode sumber.
-
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: 8080 -
Buat 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.
Contoh YAML 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'
Deskripsi bidang YAML:
-
Bidang
metadatanamedannamespacemengidentifikasi ServiceMonitor. -
Bidang
specendpointsmenentukan target pengambilan (scrape). Setiapendpointdalam larikendpoints(endpointsmendukung beberapa entri) berisi bidang-bidang berikut:-
interval: Interval pengambilan untukendpointini. Contoh:15s. -
path: Jalur pengambilan metrik. Contoh:/actuator/prometheus. -
port: Nama port Service (harus sesuai dengannameyang didefinisikan dalam Service Anda dari Langkah 2). Contoh:metrics.PentingKonfigurasikan nama port, bukan nomor port.
-
-
Bidang
specnamespaceSelectormenetapkan cakupan penemuan Service.namespaceSelectormendukung dua bidang yang saling eksklusif:-
any: Atur ketrueuntuk memantau semua Service yang sesuai di seluruh namespace. -
matchNames: Membatasi pemantauan hanya padanamespacetertentu. Misalnya, untuk memantau hanya namespace default dan arms-prom, aturmatchNamessebagai berikut:namespaceSelector: matchNames: - default - arms-prom
-
-
Bidang
specselectormemfilter Service berdasarkan label.Service contoh memiliki label micrometer-prometheus-discovery: 'true', sehingga konfigurasikan
selectorsebagai berikut:selector: matchLabels: micrometer-prometheus-discovery: 'true'
Untuk mengaktifkan autentikasi dasar (basic auth), gunakan 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 Prometheus terhadap endpoint saat ini.
port: tcp-8080
# Masukkan jalur yang diekspos dalam kode exporter Prometheus.
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-api
Jika Anda tidak memiliki izin untuk basic auth, buat ClusterRole dengan izin yang diperlukan dan bind ke ServiceAccount arms-prom-operator di namespace arms-prom menggunakan ClusterRoleBinding.
-
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
Verifikasi bahwa Prometheus menemukan layanan Anda:
Masuk ke Konsol ARMS. Di panel navigasi 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.
Laman menampilkan grup target default/micrometer-demo/0 (3/3 up), yang menunjukkan bahwa ServiceMonitor telah berhasil dikenali oleh Prometheus. Semua target menampilkan status UP berwarna hijau, yang mengonfirmasi bahwa konfigurasi valid.
-
Bentangkan baris target {namespace}/{serviceMonitorName}/x dan klik tautan endpoint.
Verifikasi bahwa metrik ditampilkan dengan benar. Laman menampilkan metrik runtime JVM dan Tomcat dalam format eksposisi Prometheus, yang mengonfirmasi bahwa ServiceMonitor dikonfigurasi dengan benar.
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool # TYPE jvm_buffer_total_capacity_bytes gauge jvm_buffer_total_capacity_bytes{id="mapped",} 0.0 jvm_buffer_total_capacity_bytes{id="direct",} 81968.0 # HELP jvm_threads_daemon_threads The current number of live daemon threads # TYPE jvm_threads_daemon_threads gauge jvm_threads_daemon_threads 29.0 # HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use # TYPE jvm_memory_committed_bytes gauge jvm_memory_committed_bytes{area="nonheap",id="miscellaneousnon-heapstorage",} 2.3068672E7 jvm_memory_committed_bytes{area="nonheap",id="classstorage",} 2.8471712E7 jvm_memory_committed_bytes{area="nonheap",id="JITcodecache",} 2.68435456E8 jvm_memory_committed_bytes{area="heap",id="tenured-LOA",} 671744.0 jvm_memory_committed_bytes{area="nonheap",id="JITdatacache",} 2097152.0 jvm_memory_committed_bytes{area="heap",id="nursery-survivor",} 1638400.0 jvm_memory_committed_bytes{area="heap",id="nursery-allocate",} 6881280.0 jvm_memory_committed_bytes{area="heap",id="tenured-SOA",} 1.2763136E7 # HELP process_start_time_seconds Start time of the process since the unix epoch. # TYPE process_start_time_seconds gauge process_start_time_seconds 1.622297808811E9 # HELP tomcat_sessions_expired_sessions_total # TYPE tomcat_sessions_expired_sessions_total counter tomcat_sessions_expired_sessions_total 0.0 # HELP jvm_threads_states_threads The current number of threads having NEW state # TYPE jvm_threads_states_threads gauge jvm_threads_states_threads{state="runnable",} 20.0 jvm_threads_states_threads{state="blocked",} 0.0 jvm_threads_states_threads{state="waiting",} 10.0 jvm_threads_states_threads{state="timed-waiting",} 3.0 jvm_threads_states_threads{state="new",} 0.0 jvm_threads_states_threads{state="terminated",} 0.0 # HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution # TYPE jvm_classes_unloaded_classes_total counter jvm_classes_unloaded_classes_total 0.0 # HELP tomcat_sessions_rejected_sessions_total # TYPE tomcat_sessions_rejected_sessions_total counter tomcat_sessions_rejected_sessions_total 0.0 # HELP tomcat_sessions_created_sessions_total # TYPE tomcat_sessions_created_sessions_total counter tomcat_sessions_created_sessions_total 0.0 # HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads # TYPE jvm_threads_live_threads gauge jvm_threads_live_threads 33.0 # HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management # TYPE jvm_memory_max_bytes gauge