All Products
Search
Document Center

Application Real-Time Monitoring Service:Buat penemuan layanan dengan ServiceMonitor

Last Updated:Aug 21, 2026

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

  1. 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>
  2. Tambahkan konfigurasi berikut ke file src/resources/applications.properties dalam proyek.

    management.endpoints.web.exposure.include=prometheus
  3. Jalankan proyek dan akses http://{host}:{port}/actuator/prometheus di 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

  1. Buat image dan unggah ke repositori image. Untuk informasi lebih lanjut, lihat Hubungkan ke platform kode sumber.

  2. 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
  3. 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

  1. 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 metadata name dan namespace mengidentifikasi ServiceMonitor.

  • Bidang spec endpoints menentukan target pengambilan (scrape). Setiap endpoint dalam larik endpoints (endpoints mendukung beberapa entri) berisi bidang-bidang berikut:

    • interval: Interval pengambilan untuk endpoint ini. Contoh: 15s.

    • path: Jalur pengambilan metrik. Contoh: /actuator/prometheus.

    • port: Nama port Service (harus sesuai dengan name yang didefinisikan dalam Service Anda dari Langkah 2). Contoh: metrics.

      Penting

      Konfigurasikan nama port, bukan nomor port.

  • Bidang spec namespaceSelector menetapkan cakupan penemuan Service. namespaceSelector mendukung dua bidang yang saling eksklusif:

    • any: Atur ke true untuk memantau semua Service yang sesuai di seluruh namespace.

    • matchNames: Membatasi pemantauan hanya pada namespace tertentu. Misalnya, untuk memantau hanya namespace default dan arms-prom, atur matchNames sebagai berikut:

      namespaceSelector:
        matchNames:
        - default
        - arms-prom
  • Bidang spec selector memfilter Service berdasarkan label.

    Service contoh memiliki label micrometer-prometheus-discovery: 'true', sehingga konfigurasikan selector sebagai 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:

  1. Masuk ke Konsol ARMS. Di panel navigasi kiri, klik Integration Management.

  2. Pada tab Integrated Environments, klik nama lingkungan kontainer target dalam daftar Container Service.

  3. 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.

  4. 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