Springboot+actuator+prometheus+Grafana集成

2023/6/3 18:22:32

本文主要是介绍Springboot+actuator+prometheus+Grafana集成,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本次示例以Windows示例

推荐到官网去下载:Windows版的应用程序

下载最新版 prometheus-2.37.8.windows-amd64 压缩包:解压就行

image

下载最新版 grafana-9.5.2 压缩包:解压就行

image

准备一个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>
            <version>1.10.5</version>
        </dependency>


        <!--SpringSecurity 安全访问-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

springSecurity的配置

#springSecurity 配置
spring.security.user.name=root
spring.security.user.password=root
spring.security.user.roles=ADMIN

spring-actuator配置

#增加开启springboot actuator监控的配置
management:
  endpoint:
    shutdown:
      enabled: true # 开启端点
    health:
      show-details: always # 是否展示健康检查详情
  endpoints:
    web:
      exposure:
        include:
          - prometheus
          - health
  metrics:
    tags:
      application: ${spring.application.name}

springSecurity的白名单接口配置-SecurityConfig

package com.gton.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @description:
 * @author: GuoTong
 * @createTime: 2023-06-01 21:44:49
 * @since JDK 1.8 OR 11
 **/

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin().and().authorizeRequests()
                .antMatchers("/actuator/**", "/favicon.ico", "/doc.html").permitAll()
                .antMatchers("/static/**").permitAll()
                .antMatchers("/favicon.ico").permitAll()
                // swagger
                .antMatchers("/swagger**/**").permitAll()
                .antMatchers("/webjars/**").permitAll()
                .antMatchers("/v2/**").permitAll()
                .anyRequest().authenticated().and().csrf().disable();    //关闭csrf保护
    }

    /**
     * Description: 忽略一些借口
     *
     * @author: GuoTong
     * @date: 2023-06-01 21:44:49
     * @return:
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
                .antMatchers(
                        "/doc.html",
                        "/swagger-resources/configuration/ui",
                        "/swagger*",
                        "/swagger**/**",
                        "/webjars/**",
                        "/favicon.ico",
                        "/**/*.css",
                        "/**/*.js",
                        "/**/*.png",
                        "/**/*.gif",
                        "/v2/**",
                        "/**/*.ttf",
                        "/actuator/**"
                );
    }
}

springboot的相关的配置

    @Value("${auth.global.enable:false}")
    private boolean enableGlobalAuth;

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }


    /**
     * Description:  添加全局跨域CORS处理
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置允许跨域的路径
        registry.addMapping("/**")
                //设置允许跨域请求的域名
                .allowedOrigins("http://127.0.0.1:8787")
                // 是否允许证书
                .allowCredentials(true)
                // 设置允许的方法
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                // 设置允许的header属性
                .allowedHeaders("*")
                // 跨域允许时间
                .maxAge(3600);
    }


    /**
     * Description: 静态资源过滤
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //ClassPath:/Static/** 静态资源释放
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        //释放swagger
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        //释放webjars
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    /**
     * 解决springboot升到2.6.x之后,knife4j报错
     *
     * @param webEndpointsSupplier        the web endpoints supplier
     * @param servletEndpointsSupplier    the servlet endpoints supplier
     * @param controllerEndpointsSupplier the controller endpoints supplier
     * @param endpointMediaTypes          the endpoint media types
     * @param corsEndpointProperties      the cors properties
     * @param webEndpointProperties       the web endpoints properties
     * @param environment                 the environment
     * @return the web mvc endpoint handler mapping
     */
    @Bean
    public WebMvcEndpointHandlerMapping webMvcEndpointHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier,
                                                                     ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsEndpointProperties, WebEndpointProperties webEndpointProperties,
                                                                     Environment environment) {
        List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
        Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
        allEndpoints.addAll(webEndpoints);
        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
        String basePath = webEndpointProperties.getBasePath();
        EndpointMapping endpointMapping = new EndpointMapping(basePath);
        boolean shouldRegisterLinksMapping = shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
        return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsEndpointProperties.toCorsConfiguration(), new EndpointLinksResolver(
                allEndpoints, basePath), shouldRegisterLinksMapping, null);
    }

    /**
     * shouldRegisterLinksMapping
     *
     * @param webEndpointProperties
     * @param environment
     * @param basePath
     * @return
     */
    private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
        return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
    }

    /**
     * Description:  过滤器
     *
     * @param registry
     * @author: GuoTong
     * @date: 2023-06-03 12:32:39
     * @return:void
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new MicrometerTPSInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/doc.html")
                .excludePathPatterns("/swagger-resources/**")
                .excludePathPatterns("/webjars/**")
                .excludePathPatterns("/v2/**")
                .excludePathPatterns("/favicon.ico")
                .excludePathPatterns("/sso/**")
                .excludePathPatterns("/swagger-ui.html/**");
    }


    /**
     * Description:  Bean 如下来监控 JVM 性能指标信息:
     * http://localhost:8889/actuator/prometheus 指标地址
     *
     * @param applicationName
     * @author: GuoTong
     * @date: 2023-06-03 12:34:36
     * @return:org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer<io.micrometer.core.instrument.MeterRegistry>
     */
    @Bean
    MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {

        return registry -> registry.config().commonTags("application", applicationName);
    }

启动访问监控

-actuator的看板:http://localhost:port/actuator

image

-prometheus的看板:http://localhost:port/actuator/prometheus

image

配置Prometheus的对于本Springboot微服务站点的监控

image

添加配置 以下内容为SpringBoot应用配置

# Prometheus  启动完成之后 http://localhost:9090/targets
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['127.0.0.1:9090']
  ###以下内容为SpringBoot应用配置
  - job_name: 'BackStageApp'
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['127.0.0.1:8889']
        labels:
          instance: "BackStageApp-prometheus"
          service: "BackStageApp-8889-prometheus"

点击这个执行:prometheus的应用

image

启动成功如下

image

访问prometheus的应用:http://localhost:9090/

image

可以点击链接跳转

image

显示的是:http://sky-20200720fyp:8889/actuator/prometheus
说明Prometheus配置完成

然后启动Grafana

image

启动成功如下:初始化--启动有点久,耐性一点

image

打开Grafana看板:http://localhost:3000/login

首次登录使用 admin:admin 然后可以设置自己的账号密码,也可以跳过Skip

image

第一次进入如下

image

配置Prometheus的数据源

第一步选这个管理配置菜单

image

第二步选这个Datasorce

image

第三步选这个添加新的Datasorce

image

第四步选这个Prometheus数据源

image

第五步配置Prometheus数据源的地址和名称,然后保存

image

image

第六步配置Prometheus的看板

image

导入对应的监控 JVM 的 Dashboard 模板,模板编号为 4701。,点击load

image
image

填写这些必填项;导入自动加载后其他可以不用管,必须选择下面的刚刚配置的prometheus数据源,然后选择import

image

第七步监控JVM

上一步点击然后选择import,会进入这个界面,什么都没有

image

选择自己项目的站点配置的application和instance就行了,刷新左上角的时间

image

很多看板自己研究把

image

创建文件组

image

可以把监控看板移加入分类分组

image



这篇关于Springboot+actuator+prometheus+Grafana集成的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程