Todos os produtos
Search
Central de documentação

Managed Service for Prometheus:Configure a descoberta de serviço com um ServiceMonitor

Última atualização: Sep 08, 2026

O Managed Service for Prometheus oferece suporte à descoberta de serviço por meio do CRD ServiceMonitor. Um ServiceMonitor define o escopo de namespace para a descoberta de pods e seleciona os Services alvo usando matchLabel. Este tutorial usa uma aplicação Spring Boot como exemplo.

Demonstração

Baixe o projeto de demonstração para obter um exemplo completo de descoberta de serviço baseada em ServiceMonitor.

Etapa 1: Adicionar dependências

  1. Crie uma aplicação Maven e adicione as seguintes dependências ao arquivo 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. Adicione a seguinte configuração ao arquivo src/resources/applications.properties do projeto.

    management.endpoints.web.exposure.include=prometheus
  3. Inicie o projeto e acesse http://{host}:{port}/actuator/prometheus no navegador.

    Os dados de monitoramento da JVM são exibidos. Veja abaixo um exemplo de saída no formato de exposição do 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

Etapa 2: Implantar um cluster Kubernetes

  1. Crie uma imagem e envie-a para um repositório de imagens. Para mais informações, consulte Connect to a source code platform.

  2. Crie um deployment usando a seguinte configuração YAML.

    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. Crie um Service usando a seguinte configuração YAML.

    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

Etapa 3: Criar um ServiceMonitor

  1. Salve o arquivo YAML no computador e execute kubectl apply -f {path/to/the/YAML/file} para aplicá-lo.

Exemplo de YAML do ServiceMonitor:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: micrometer-demo
  namespace: default
spec:
  endpoints:
    - interval: 15s
      path: /actuator/prometheus
      port: metrics    # Note: Configure the port name, not the port number.
  namespaceSelector:
    any: true
  selector:
    matchLabels:
      micrometer-prometheus-discovery: 'true'

Descrição dos campos YAML:

  • Os campos name e namespace em metadata identificam o ServiceMonitor.

  • O campo endpoints em spec define os alvos de coleta. Cada endpoint no array endpoints (que aceita múltiplas entradas) contém os seguintes campos:

    • interval: Intervalo de coleta para este endpoint. Exemplo: 15s.

    • path: Caminho de coleta das métricas. Exemplo: /actuator/prometheus.

    • port: Nome da porta do Service. Deve corresponder ao name definido no Service da Etapa 2. Exemplo: metrics.

      Importante

      Configure o nome da porta, não o número da porta.

  • O campo namespaceSelector em spec define o escopo da descoberta de Services. O namespaceSelector aceita dois campos mutuamente exclusivos:

    • any: Defina como true para monitorar todos os Services correspondentes em todos os namespaces.

    • matchNames: Restringe o monitoramento a namespaces específicos. Por exemplo, para monitorar apenas os namespaces default e arms-prom, configure matchNames da seguinte forma:

      namespaceSelector:
        matchNames:
        - default
        - arms-prom
  • O campo selector em spec filtra Services por rótulo.

    Como o Service de exemplo tem o rótulo micrometer-prometheus-discovery: 'true', configure o selector conforme abaixo:

    selector:
      matchLabels:
        micrometer-prometheus-discovery: 'true'

Para ativar a autenticação básica, use o seguinte YAML:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: cloud-open-api-monitor     #  Set a unique name for the ServiceMonitor.
  namespace: default   #  Set the namespace where the ServiceMonitor resides.
spec:
  endpoints:
  - interval: 30s
    # Specify the interval at which Prometheus scrapes the current endpoint.
    port: tcp-8080
    # Enter the path exposed in the Prometheus exporter code.
    path: /api/actuator/prometheus
    basicAuth:
      password:
        name: basic-auth
        key: <password>
      username:
        name: basic-auth
        key: <userName>
    scheme: http
  namespaceSelector:
    any: true
  selector:
    matchLabels:
      # Match Services with the following label.
      edas.oam.acname: cloud-open-api

Se você não tiver permissões para autenticação básica, crie um ClusterRole com as permissões necessárias e vincule-o à ServiceAccount arms-prom-operator no namespace arms-prom usando um ClusterRoleBinding.

  • Arquivo YAML do 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"]  # Adjust as needed.
      - apiGroups: ["monitoring.coreos.com"]  # Adjust the apiGroups as needed.
        resources: ["*"]
        verbs: ["get", "list", "watch", "create", "update", "delete"]  # Adjust as needed.
    
  • Arquivo YAML do ClusterRoleBinding

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: prometheus-agent-binding
    subjects:
      - kind: ServiceAccount
        name: arms-prom-operator  # Service account name
        namespace: arms-prom      # The namespace where the service account resides.
    roleRef:
      kind: ClusterRole
      name: prometheus-agent-role  # The name of the ClusterRole defined above.
      apiGroup: rbac.authorization.k8s.io
    

Etapa 4: Verificar o ServiceMonitor

Verifique se o Prometheus descobriu o service:

  1. Faça login no Managed Service for Prometheus console. No painel de navegação à esquerda, clique em Integration Management.

  2. Na aba Integrated Environments, clique no nome do ambiente de contêiner desejado na lista Container Service.

  3. Clique na aba Self-Monitoring.

    Na aba Targets, verifique se existe um alvo chamado {namespace}/{serviceMonitorName}/x.

    A página exibe o grupo de alvos default/micrometer-demo/0 (3/3 up), indicando que o Prometheus identificou corretamente o ServiceMonitor. Todos os alvos mostram o estado verde UP, confirmando que a configuração é válida.

  4. Expanda a linha do alvo {namespace}/{serviceMonitorName}/x e clique no link do endpoint.

    Verifique se as métricas são exibidas corretamente. A página mostra métricas de runtime da JVM e do Tomcat no formato de exposição do Prometheus, confirmando que o ServiceMonitor está configurado adequadamente.

    # 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