暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Springboot监控系统Actuator+Prometheus+Grafana

AweSomeBaZinGa 2019-08-08
1558

整体框架图

一、Actuator

Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。

Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。

二、Micrometer

从Spring Boot 2.0开始,Actuator将底层改为Micrometer,提供了更强、更灵活的监控能力。

Micrometer是一个监控门面,可以类比成监控界的 Slf4j
,主要用来以极低极低的消耗来给Java程序提供对指标的监控。Micrometer支持接入多种数据库,监控系统主要使用的是prometheus。

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

三、Prometheus

Prometheus 是一套开源的系统监控报警框架。内置一个时序数据库。

  • 强大的多维度数据模型:

  1. 时间序列数据通过 metric 名和键值对来区分。

  2. 所有的 metrics 都可以设置任意的多维标签。

  3. 数据模型更随意,不需要刻意设置为以点分隔的字符串。

  4. 可以对数据模型进行聚合,切割和切片操作。

  5. 支持双精度浮点类型,标签可以设为全 unicode。

  • 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。

  • 易于管理:Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。

  • 高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。

  • 使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。

  • 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。

  • 可以通过服务发现或者静态配置去获取监控的 targets。

  • 有多种可视化图形界面。

  • 易于伸缩。

  • Prometheus 生态圈中包含了多个组件,其中许多组件是可选的:

    • Prometheus Server: 用于收集和存储时间序列数据。

    • Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。

    • Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。

    • Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。

    • Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。

    • 一些其他的工具。

    从上图可以看出,Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。

    其大概的工作流程是:

    1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。

    2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。

    3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。

    4. 在图形界面中,可视化采集数据。

    四、Grafana

    Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

    1、展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;

    2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;

    3、通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;

    4、混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;

    5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;

    6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

    五、实现

    1、引入依赖
    <!-- actuator support -->
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- prometheus support -->
    <dependency>
     <groupId>io.micrometer</groupId>
     <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
    复制
    #暴露出shutdown之外所有的端点 /appContext/actuator/prometheus为prometheus的
    management.endpoints.web.exposure.exclude = shutdown
    management.endpoints.web.exposure.include = *
    management.endpoints.web.cors.allowed-origins = *
    management.endpoints.web.cors.allowed-methods = *
    management.endpoints.jmx.exposure.exclude = shutdown
    management.endpoints.jmx.exposure.include = *
    management.endpoint.health.show-details = always
    复制
    #为指标设置一个名为application=originservice的Tag,Tag是Prometheus提供的一种能力,从而实现更加灵活的筛选。
    management.metrics.tags.application = originservice
    复制
    scrape_configs:
    # 任意写,建议英文,不要包含特殊字符
    - job_name: 'spring'
     # 多久采集一次数据
    scrape_interval: 15s
     # 采集时的超时时间
    scrape_timeout: 10s
     # 采集的路径
    metrics_path: '/actuator/prometheus'
     # 采集服务的地址,设置成上面Spring Boot应用所在服务器的具体地址。
    static_configs:
    - targets: ['30.1.229.89:8080']
    复制

    更多配置项详见 Prometheus Configuration官方文档

    3、对接Prometheus(开源的监控 + 时序数据库 + 报警软件)
    2.2私有配置
    2.1公共配置
    2、配置

    这里,我们为应用引入了 micrometer-registry-prometheus
    ,事实上,你想对接上文列表中的哪款监控系统,就写什么。例如想对接 Influx
    ,则需添加依赖 micrometer-registry-influx

    4、Grafana可视化

    启动Grafana,初始密码admin/admin

    4.1自定义步骤

    Add Data Source—>Create Dashboard—>Add Query—>Add Title—>Add Panel

    4.2Dashboard市场

    [地址]    https://grafana.com/grafana/dashboards 



    5、spring security保护端点

    Spring Security致力于为Java应用提供认证和授权管理。它是一个强大的,高度自定义的认证和访问控制框架。

    5.1引入依赖
    <!-- security support -->
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    复制

    #配置文件

    spring.security.user.name = actuator

    spring.security.user.password = actuator
    spring.security.user.roles = ACTUATOR_ADMIN
    复制

    配置类

    package com.sccba;

    //import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
    //import org.springframework.boot.actuate.context.ShutdownEndpoint;
    //import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

    /**
    * @Author zhangwy
    * @Description:security配置类
    * @Date: 2019-07-09
    */
    @EnableWebSecurity
    @Configuration
    public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
        /*
           This spring security configuration does the following
           1. Restrict access to the Shutdown endpoint to the ACTUATOR_ADMIN role.
           2. Allow access to all other actuator endpoints.
           3. Allow access to static resources.
           4. Allow access to the home page (/).
           5. All other requests need to be authenticated.
           5. Enable http basic authentication to make the configuration complete.
              You are free to use any other form of authentication.
        */

       @Override
    protected void configure(HttpSecurity http) throws Exception {
       //根据需要对部分请求执行校验
    // http.authorizeRequests()
    // .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class)).hasRole("ACTUATOR_ADMIN")
    // .requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll()
    // .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
    // .antMatchers("/").permitAll().antMatchers("/**").authenticated().and().httpBasic();

    //   http.formLogin()                               // 定义当需要用户登录时候,转到的登录页面。
    //       .loginPage("/login")                       // 设置登录页面
    //       .loginProcessingUrl("/user/login")         // 自定义的登录接口
    //       .defaultSuccessUrl("/home").permitAll()     // 登录成功之后,默认跳转的页面
    //       .and().authorizeRequests()                 // 定义哪些URL需要被保护、哪些不需要被保护
    //       .antMatchers("/", "/index","/user/login").permitAll()     // 设置所有人都可以访问登录页面
    //       .anyRequest().authenticated()               // 任何请求,登录后可以访问
    //       .and().csrf().disable();                   // 关闭csrf防护
       
       // 默认对所有的请求通过,实际根据需要完成对资源的权限控制
    http.csrf().disable().authorizeRequests().antMatchers("/**").permitAll();
    }
    }
    复制

    5.3关闭默认的校验

    @EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})

    5.3关闭默认的校验
    5.2配置


    文章转载自AweSomeBaZinGa,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论