小飞知识库 | YeLu🤠MiLu🤪 小飞知识库 | YeLu🤠MiLu🤪
  • 函数式编程
  • Spring
  • SpringMVC
  • SpringBoot
  • SpringCloud
  • Mybatis
  • JVM
  • JUC并发编程
  • 设计模式
  • 单元测试
  • Redis
  • RabbitMQ
  • mysql
  • oracle
  • linux
  • nginx
  • docker
  • elasticSearch
  • windows
  • 虚拟机
  • 监控系统
  • https
  • 内网穿透
  • 前端文章

    • JavaScript
  • 页面

    • HTML
    • CSS
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 版本管理

    • Git笔记
  • 项目构建

    • maven
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • JAR包相关
  • 关于
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YeLu

爱技术的YeLu🤠
  • 函数式编程
  • Spring
  • SpringMVC
  • SpringBoot
  • SpringCloud
  • Mybatis
  • JVM
  • JUC并发编程
  • 设计模式
  • 单元测试
  • Redis
  • RabbitMQ
  • mysql
  • oracle
  • linux
  • nginx
  • docker
  • elasticSearch
  • windows
  • 虚拟机
  • 监控系统
  • https
  • 内网穿透
  • 前端文章

    • JavaScript
  • 页面

    • HTML
    • CSS
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 版本管理

    • Git笔记
  • 项目构建

    • maven
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • JAR包相关
  • 关于
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • linux笔记

  • nginx笔记

  • docker笔记

  • windows笔记

  • ElasticSearch

  • 虚拟机

  • 监控系统

    • prometheus

      • Docker安装prometheus
      • Prometheus采集Springboot应用
        • 导包
        • 编写配置文件
        • 配置监控的应用名称
        • Actuator 配置用户认证
          • 导包
          • 注入加解密Bean
          • 编写Filter校验用户认证
          • 注入Filter
          • 配置prometheus
    • grafana

  • 运维
  • 监控系统
  • prometheus
YeLu🤠
2025-02-20
目录

Prometheus采集Springboot应用

# 导包

        <!-- springboot 监控系统 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 将数据格式转换成prometheus要求 -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <scope>runtime</scope>
        </dependency>
1
2
3
4
5
6
7
8
9
10
11

# 编写配置文件

####################### springboot 应用监控配置 #######################
# Actuator 监控端点配置项
management:
  endpoints:
    web:
      base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
      exposure:
        include: '*' # 需要开放的端点。默认值只打开 health, info 两个端点,通过设置 * ,可以开放所有端点
      # 因为 Actuator 的端点默认没有用户认证,这个地方是我自己扩展的认证方式,需要在 prometheus prometheus.yml scrape_configs 配置中配置 basic_auth
      basic-auth: # 接口权限认证用户配置
        username: 'admin'  # 用户名
        password: '$2a$10$D0ySOfXfNmSuXMlqjnjzXOAiexvhex9a2iPOwn9m7Xx3qSwsuevKK'  # 密文密码
  endpoint:
    prometheus:
      enabled: true
    health:
      show-details: always
  metrics:
    export:
      prometheus:
        enabled: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

basic-auth 说明:自定义的Actuator用户认证,详情看下面的Actuator 配置用户认证讲解

# 配置监控的应用名称

可以在启动类添加如下代码

    @Bean
    MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
        return registry -> registry.config().commonTags("application", applicationName);
    }
1
2
3
4

# Actuator 配置用户认证

# 导包

      <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
        </dependency>
1
2
3
4

# 注入加解密Bean

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

	@Bean
    public PasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
1
2
3
4
5
6
7

使用 BCrypt 生成加密密码,可以通过以下代码实现:

public static void main(String[] args) {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String rawPassword = "curry@xu";  // 明文密码
        String encodedPassword = encoder.encode(rawPassword);
        System.out.println("Encoded Password: " + encodedPassword);
    }
1
2
3
4
5
6

# 编写Filter校验用户认证

@Slf4j
@Component
public class ApiMetricsAuthFilter implements Filter {

    @Resource(name = "bCryptPasswordEncoder")
    private PasswordEncoder bCryptPasswordEncoder;

    @Value("${management.endpoints.web.basic-auth.username}")
    private String userName;

    @Value("${management.endpoints.web.basic-auth.password}")
    private String encodedPassword;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = ServletUtils.getRequest();
        // 获取 Authorization 请求头
        assert request != null;
        String authHeader = request.getHeader("Authorization");
        if (ValidateUtil.isEmpty(authHeader) || !authHeader.startsWith("Basic ")) {
            throw new Exception("对不起,您没有访问该资源的权限! ");
        }
        // 解码 Base64 编码的用户名和密码
        String base64Credentials = authHeader.substring(6);
        String credentials = new String(Base64.getDecoder().decode(base64Credentials), StandardCharsets.UTF_8);
        final String[] values = credentials.split(":", 2);
        String username = values[0];
        String rawPassword = values[1];
        if (!Objects.equals(username, userName)) {
            throw new Exception("对不起,您没有访问该资源的权限! ");
        }
        if (!bCryptPasswordEncoder.matches(rawPassword, encodedPassword)) {
            throw new Exception("对不起,您没有访问该资源的权限! ");
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 注入Filter

    @Bean
    public ApiMetricsAuthFilter apiMetricsAuthFilter() {
        return new ApiMetricsAuthFilter();
    }

    @Bean
    public FilterRegistrationBean<ApiMetricsAuthFilter> apiMetricsAuthFilters() {
        FilterRegistrationBean<ApiMetricsAuthFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(apiMetricsAuthFilter());
        // 配置过滤规则 只拦截 actuator 的接口
        filterRegistrationBean.addUrlPatterns("/actuator/*");
        // 设置过滤器名称
        filterRegistrationBean.setName("apiMetricsAuthFilter");
        // 执行次序
        filterRegistrationBean.setOrder(2);
        return filterRegistrationBean;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 配置prometheus

修改 prometheus.yml 如下:

### 下面进行 SpringBoot 应用配置
  - job_name: "applicationName"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ["ip:port"]
    basic_auth:
      username: 'admin'  # 用户名
      password: 'curry@xu'  # 明文密码
1
2
3
4
5
6
7
8
9
10
11
12

关系如下

最近更新: 2025/07/30, 15:37:56
Docker安装prometheus
Docker安装grafana

← Docker安装prometheus Docker安装grafana→

最近更新
01
服务端配置
07-30
02
frp 安装
07-30
03
Docker安装grafana
02-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | YeLu🤠MiLu🤪 | MIT License 蜀ICP备2024116879号 | 川公网安备51012202001998号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
欢迎你,我的朋友
看板娘