Prometheus UI中Service Monitor显示undefined,无法采集K8s中Spring Boot指标
解决Prometheus采集K8s Spring Boot服务显示"undefined"的问题
核心问题定位
你的配置存在两个关键问题:
- Service缺少匹配标签:ServiceMonitor的
spec.selector要求匹配带有app: java-server和release: prometheus标签的Service,但你的java-server-ip-service没有release: prometheus标签,导致ServiceMonitor无法关联到该Service,进而Prometheus无法识别目标名称,显示为"undefined"。 - 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.
相关产品推荐
相关产品推荐

