You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prometheus UI中Service Monitor显示undefined,无法采集K8s中Spring Boot指标

解决Prometheus采集K8s Spring Boot服务显示"undefined"的问题

核心问题定位

你的配置存在两个关键问题:

  1. Service缺少匹配标签:ServiceMonitor的spec.selector要求匹配带有app: java-server和release: prometheus标签的Service,但你的java-server-ip-service没有release: prometheus标签,导致ServiceMonitor无法关联到该Service,进而Prometheus无法识别目标名称,显示为"undefined"。
  2. ServiceMonitor命名空间配置缺失:虽然当前资源都在default命名空间,但显式指定namespaceSelector可以避免潜在的跨命名空间匹配问题,让配置更严谨。

修复步骤

1. 给Service添加匹配标签

修改你的Service配置,在metadata.labels中加入release: prometheus标签:

apiVersion: v1
kind: Service
metadata:
  name: java-server-ip-service
  labels:
    app: java-server
    release: prometheus # 新增此标签,与ServiceMonitor的selector匹配
spec:
  selector:
    app: java-server
  ports:
  - name: http-traffic
    protocol: TCP
    port: 8080
    targetPort: 8080

2. 调整ServiceMonitor配置

完善ServiceMonitor的命名空间选择和端点配置:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: java-server-prom-monitoring
  labels:
    release: prometheus
  namespace: default
spec:
  namespaceSelector:
    matchNames:
    - default # 显式指定要监控的命名空间
  selector:
    matchLabels:
      app: java-server
      release: prometheus
  endpoints:
    - port: http-traffic
      path: "/actuator/prometheus"
      interval: 30s # 与scrape_configs的采集间隔保持一致

3. 验证Spring Boot应用的Prometheus端点

进入Spring Boot Pod内部,检查/actuator/prometheus端点是否正常返回指标:

kubectl exec -it $(kubectl get pods -l app=java-server -o name) -- curl http://localhost:8080/actuator/prometheus

如果返回404,需要检查Spring Boot的配置:

  • 依赖检查:确保引入了Actuator和Prometheus注册表依赖(以Maven为例):
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
    
  • 配置检查:确保在application.yml中开启了Prometheus端点:
    management:
      endpoints:
        web:
          exposure:
            include: prometheus,health
      metrics:
        tags:
          application: java-server # 可选,给指标添加应用标识标签
    

4. 重新应用配置并验证

# 重新应用修改后的配置
kubectl apply -f your-service-config.yaml
kubectl apply -f your-servicemonitor-config.yaml

# 查看ServiceMonitor状态,确认已匹配到Service
kubectl get servicemonitors monitoring.coreos.com java-server-prom-monitoring -o jsonpath='{.status.observedGeneration}{"\n"}{.status.targets}'

# 查看Prometheus日志,排查是否有采集错误
kubectl logs -n monitoring $(kubectl get pods -n monitoring -l app=prometheus -o name) -f

等待2-3分钟后刷新Prometheus UI,目标列表应该会显示正常的服务名称,且指标采集成功。

额外检查点

  • 确认kube-prometheus-stack的Helm release名称确实是prometheus:执行helm list -n monitoring查看,确保ServiceMonitor的release标签与Helm release名称一致。
  • 检查Prometheus的ServiceMonitorSelector配置:默认情况下,kube-prometheus-stack的Prometheus会选择带有release: <helm-release-name>标签的ServiceMonitor,你的配置符合要求。

内容的提问来源于stack exchange,提问作者J.E.C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:33:15