ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Spring Boot 应用对接 Prometheus 监控指南

Spring Boot 应用对接 Prometheus 监控指南

Spring Boot 应用对接 Prometheus 监控指南

本文档介绍如何将 Spring Boot 应用接入 Prometheus 监控体系,分无认证Basic Auth 认证两种情况说明。


一、技术栈

组件用途
Micrometer指标采集门面
Spring Boot Actuator暴露监控端点
Prometheus指标采集 + 时序数据库
Grafana指标可视化

二、通用步骤(两种场景都需要)

2.1 引入依赖

<!-- Spring Boot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Prometheus Registry --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency>

2.2 配置 application.yml

server:port:8086# 业务端口spring:application:name:janus-service1management:server:port:18086# 管理端口,与应用端口隔离endpoints:web:exposure:include:health,info,prometheus# 暴露 Prometheus 端点endpoint:prometheus:enabled:true# 启用 Prometheus 端点metrics:tags:application:${spring.application.name}# 给指标打标签,便于区分

2.3 K8s Deployment 配置

apiVersion:apps/v1kind:Deploymentmetadata:name:janus-service1namespace:gateway-defaultspec:template:metadata:annotations:# ============================================================# 场景一:无认证(直接抓取)# ============================================================prometheus.io/scrape:"true"prometheus.io/kind:"janus-service1"prometheus.io/port:"18086"prometheus.io/path:"/actuator/prometheus"# ============================================================# 场景二:Basic Auth 认证(额外添加)# ============================================================# prometheus.io/auth: "basic" # ← 有认证时取消注释spec:containers:-name:janus-service1image:your-registry/janus-service1:latestports:-name:httpcontainerPort:8086protocol:TCP-name:managementcontainerPort:18086# 管理端口protocol:TCP

三、场景一:无认证(内网/测试环境)

3.1 场景说明

  • Prometheus 直接抓取/actuator/prometheus端点
  • 无需用户名密码验证
  • 适用于内网环境或测试环境

3.2 配置清单

配置项说明
prometheus.io/scrape"true"允许 Prometheus 抓取
prometheus.io/port"18086"抓取端口
prometheus.io/path"/actuator/prometheus"抓取路径
prometheus.io/auth不配置无需认证

3.3 验证命令

# 1. Pod 内验证curlhttp://localhost:18086/actuator/prometheus|head-10# 2. 集群内验证curlhttp://<pod-ip>:18086/actuator/prometheus|head-10# 3. 查看 Prometheus Targetshttp://<prometheus-host>:9090/targets# 预期: State = UP ✅

四、场景二:Basic Auth 认证(生产环境)

4.1 场景说明

  • Prometheus 抓取时需要携带 Basic Auth 凭证
  • 应用需要验证请求中的用户名密码
  • 适用于生产环境,安全性更高

4.2 新增依赖

<!-- 仅场景二需要 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

4.3 配置 application.yml

spring:security:user:# ⚠️ 必须与 Prometheus 配置中的 basic_auth 一致name:usernamepassword:axxxxxxxxxxxxxxxxxxxxxxxmanagement:# ... 与场景一相同,保持不变

4.4 配置 Security(只保护 /actuator 路径)

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.annotation.Order;importorg.springframework.security.config.Customizer;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.EnableWebSecurity;importorg.springframework.security.web.SecurityFilterChain;@Configuration@EnableWebSecuritypublicclassManagementSecurityConfig{/** * 只保护 /actuator/** 路径,使用 Basic Auth */@Bean@Order(1)publicSecurityFilterChainmanagementSecurityFilterChain(HttpSecurityhttp)throwsException{http.securityMatcher("/actuator/**").authorizeHttpRequests(auth->auth.anyRequest().authenticated()).httpBasic(Customizer.withDefaults()).csrf(csrf->csrf.disable());returnhttp.build();}/** * 其他所有请求放行(不影响业务接口) */@Bean@Order(2)publicSecurityFilterChaindefaultSecurityFilterChain(HttpSecurityhttp)throwsException{http.authorizeHttpRequests(auth->auth.anyRequest().permitAll()).csrf(csrf->csrf.disable());returnhttp.build();}}

4.5 K8s 注解(添加 auth 标记)

annotations:prometheus.io/scrape:"true"prometheus.io/kind:"janus-service1"prometheus.io/port:"18086"prometheus.io/path:"/actuator/prometheus"prometheus.io/auth:"basic"# ← 告诉 Prometheus 需要认证

4.6 Prometheus 配置(运维侧)

scrape_configs:-job_name:'janus-service1'kubernetes_sd_configs:-role:podrelabel_configs:# 只抓取 scrape=true 的 Pod-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_scrape]action:keepregex:true# 只抓取 auth=basic 的 Pod-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_auth]action:keepregex:basic# 使用自定义路径-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_path]action:replacetarget_label:__metrics_path__# 使用自定义端口-source_labels:[__address__,__meta_kubernetes_pod_annotation_prometheus_io_port]action:replaceregex:([^:]+)(?::\d+)?;(\d+)replacement:$1:$2target_label:__address__# Basic Auth 认证配置basic_auth:username:usernamepassword:a48xxxxxxxxxxxxxxxxxxxxxxxxxx391
返回列表