Spring Boot Admin的使用

作者: 程序熊大 | 来源:发表于2015-12-25 17:30 被阅读41889次

上一篇文章中了解了Spring Boot提供的监控接口,例如:/health、/info等等,实际上除了之前提到的信息,还有其他信息业需要监控:当前处于活跃状态的会话数量、当前应用的并发数、延迟以及其他度量信息。这次我们了解如何利用Spring-boot-admin对应用信息进行可视化,如何添加度量信息。

准备

spring-boot-admin的Github地址在:https://github.com/codecentric/spring-boot-admin,它在Spring Boot Actuator的基础上提供简洁的可视化WEB UI。

  1. 首先在start.spring.io中创建简单的admin应用,主要步骤如下:
  • Group: org.sample.admin
  • Artifact: spring-boot-admin-web
  • Name: Spring Boot Admin Web
  • Description: Spring Boot Admin Web Application
  • Package Name: org.sample.admin
  • **Type: ** Maven Project
  • Packaging: Jar
  • Java Version: 1.8
  • Language: Java
  • Spring Boot Version: 1.3.1
  1. Ops组选项中选择Actuator
  2. 选择Generate Project下载应用
  3. 使用IDEA打开工程,在pom.xml文件中添加下列依赖
<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server</artifactId>
   <version>1.3.2</version>
</dependency>
<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server-ui</artifactId>
   <version>1.3.2</version>
</dependency>
  1. SpringBootAdminWebApplication.java文件中添加@EnableAdminServer注解
@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminWebApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminWebApplication.class, args);
    }
}
  1. 在application.properties文件中添加如下配置
server.port = 8090
spring.application.name=Spring Boot Admin Web
spring.boot.admin.url=http://localhost:${server.port}
spring.jackson.serialization.indent_output=true
endpoints.health.sensitive=false
  1. 启动应用程序,在后台给定如下提示:


    spring-boot-admin应用启动日志
  2. 在浏览器中访问上图中提示的地址,可以看到下图的信息


    spring-boot-admin应用

How Do

  1. 启动Admin Web应用后,现在可以添加针对BookPub应用的度量信息了。在文章Spring Boot应用的健康监控中,我们曾定制自己的Health Indicator,用来监控四个数据库接口的健康状态,这次我将利用spring-boot-admin对这些信息进行可视化管理。
  2. 在db-count-starter模块下添加代码,首先在db-count-starter/src/main/java/com/test/bookpubstarter/dbcount目录下添加DbCountMetrics类:
public class DbCountMetrics implements PublicMetrics {
    private Collection<CrudRepository> repositories;
    public DbCountMetrics(Collection<CrudRepository> repositories) {
        this.repositories = repositories;
    }
    @Override
    public Collection<Metric<?>> metrics() {
        List<Metric<?>> metrics = new LinkedList<>();
        for (CrudRepository repository: repositories) {
            String name =
 DbCountRunner.getRepositoryName(repository.getClass());
            String metricName = "counter.datasource." + name;
            metrics.add(new Metric(metricName, repository.count()));
        }
        return metrics;
    }
}
  1. DbCountAutoConfiguration定义对应的Bean,由Spring Boot完成自动注册
@Bean
public PublicMetrics dbCountMetrics(Collection<CrudRepository> repositories) {
    return new DbCountMetrics(repositories);
}
  1. 启动BookPub应用,访问http://localhost:8080/metrics,可以看到DbCountMetrics已经添加到metrics列表中了。
    新添加的DbCountMetrics
  2. 在db-count-starter模块下的pom文件中添加spring-boot-admin-starter-client依赖,
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>1.3.2</version>
</dependency>
  1. 在BookPub应用下的application.properties中配置下列属性值
spring.application.name=@project.description@
server.port=8080
spring.boot.admin.url=http://localhost:8090
  1. 启动BookPub应用,然后在浏览器中访问http://localhost:8090
    监控BookPub应用
  2. 点击右侧的“Details”,可以看到该应用的详细信息


    BookPub应用的详细信息

分析

Spring Boot Admin就是将Spring Boot Actuator中提供的endpoint信息可视化表示,在BookPub应用(被监控)的这一端,只需要进行一点配置即可。

  • spring-boot-admin-starter-client,作为客户端,用于与Spring Boot Admin Web的服务器沟通;
  • spring.boot.admin.url=http:localhost:8090用于将当前应用注册到Spring Boot Admin。

如果希望通过Web控制系统的日志级别,则需要在应用中添加Jolokia JMX库(org.jolokia:jolokia-core),同时在项目资源目录下添加logback.xml文件,内容如下:

<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <jmxConfigurator/>
</configuration>

然后再次启动BookPub应用,然后在Spring Boot Admin的页面中查看LOGGING,则可以看到如下页面:


通过Spring Boot Admin修改日志级别

Spring Boot提供的度量工具功能强大且具备良好的扩展性,除了我们配置的DbCountMetrics,还监控BookPub应用的其他信息,例如内存消耗、线程数量、系统时间以及http会话数量。

gague和counter的定制

gague和counter度量通过GagueServiceCountService实例提供,这些实例可以导入到任何Spring管理的对象中,用于度量应用信息。例如,我们可以统计某个方法的调用次数,如果要统计所有RESTful接口的调用次数,则可以通过AOP实现,在调用指定的接口之前,首先调用counterService.increment("objectName.methodName.invoked");,某个方法被调用之后,则对它的统计值+1。具体的实验步骤如下:

  1. 在pom文件中添加AOP依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 在BookPub应用中添加Aspect组件,表示在每个Controller的方法调用之前,首先增加调用次数。
@Aspect
@Component
public class ServiceMonitor {
    @Autowired
    private CounterService counterService;
    @Before("execution(* com.test.bookpub.controller.*.*(..))")
    public void countServiceInvoke(JoinPoint joinPoint) {
        counterService.increment(joinPoint.getSignature() + "");
    }
}
  1. 在application.properties中设置打开AOP功能:spring.aop.auto=true
    然后启动BookPub应用,通过浏览器访问http://localhost:8080/books/9876-5432-1111,然后再去Spring Boot Admin后台查看对应信息,发现该方法的调用次数已经被统计好了
    统计接口的调用次数

如果希望统计每个接口的调用时长,则需要借助GagueService来实现,同样使用AOP实现,则需要环绕通知:在接口调用之前,利用long start = System.currentTimeMillis();,在接口调用之后,计算耗费的时间,单位是ms,然后使用gugeService.submit(latency)更新该接口的调用延时。

  1. ServiceMonitor类中添加对应的监控代码
@Autowired
private GaugeService gaugeService;
@Around("execution(* com.test.bookpub.controller.*.*(..))")
public void latencyService(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    pjp.proceed();
    long end = System.currentTimeMillis();
    gaugeService.submit(pjp.getSignature().toString(), end - start);
}
  1. 然后在Spring Boot Admin后台可以看到对应接口的调用延迟


    统计接口的调用延时

这两个service可以应付大多数应用需求,如果需要监控其他的度量信息,则可以定制我们自己的Metrics,例如在之前的例子中我们要统计四个数据库接口的调用状态,则我们定义了DbCountMetrics,该类实现了PublishMetrics,在这个类中我们统计每个数据库接口的记录数量。

PublishMetrics这个接口只有一个方法:Collection<Metric<?>> metrics();,在该方法中定义具体的监控信息;该接口的实现类需要在配置文件中通过@Bean注解,让Spring Boot在启动过程中初始化,并自动注册到MetricsEndpoint处理器中,这样每次有访问/metrics的请求到来时,就会执行对应的metrics方法。

参考资料

  1. Chapter 6. 使用Spring进行面向切面编程(AOP)

相关文章

网友评论

  • 20bc4059ba0a:在使用counterService.increment做接口统计的时候,admin ui后台并没有具体的接口信息以及相应的调用次数统计,请问是少了什么配置吗
  • huanfuan:老哥 凌晨5.24还在修改博客,注意身体
  • 20421b207885:请教下,我启动的时候会报这个错Caused by: java.lang.ClassNotFoundException: org.springframework.cloud.netflix.zuul.ZuulConfiguration,是缺少那个包?还是版本不对
  • Me1rfa丶:我在使用SBA时遇到一些问题,请教一下楼主。我在SBA的客户端中(直接采用Eureka的服务发现方式的SBA client)配置文件配置了management.context-path==/admin属性之后,表示所有对外的actuator端点访问前都需要加上/admin,例如health由/health变成/admin/health。在SBA Server端那里我配置spring.boot.admin.discovery.converter.management=/admin这个属性之后可以正常获取到除/health以外的所有端点的数据。比如env,metrics等等。由于无法获取到health端点下的数据,导致服务状态一直是down。目前还没有找到好的解决,请问楼主有没有相关指导。
  • 044239208d65:我想知道,gauge的界面怎么显示出来
  • 2ba7e1d5b5fa:我也碰到了这样的问题, 你猜你使用restController 注解 , 他也肯定使用了aop 去实现, 当自己在rest 层 使用aop 监控之后, 原来的就不能用了,现在还没有解决 1665907807@qq.com
  • 7ac08ae5d1a3:admin server收集性能信息会不会产生应用性能问题?是通过http还是异步方式收集
  • 不想当码农的程序员:Hystrix UI and Turbine UI 这两个, 有文章么? 怎么使用的介绍
    程序熊大: @jamen 👍牛
    不想当码农的程序员:@杜琪 谢谢, 已经弄好了,安装官网,加两个jar ,就好,不复杂。谢谢
    程序熊大:@jamen 我目前没有用过哦,Google下
  • 不想当码农的程序员:写的是不错, 但是因为名称真的操蛋,很乱, 都不知道你的配置是加在 service还是client,
  • GippleLake:写的不错,不过缺少接口安全这块啊
  • KevinWen:好牛逼,一直找又找不到的项目
  • 912b76ed53f2:请教一下:
    希望统计每个接口的调用时长,则需要借助GagueService来实现

    我添加了这段代码之后,访问http://localhost:8080/books之后页面都是空白的,没有内容返回,但是我删了这段代码之后就正常了。
    2ba7e1d5b5fa:我也碰到了这样的问题, 你猜你使用restController 注解 , 他也肯定使用了aop 去实现, 当自己在rest 层 使用aop 监控之后, 原来的就不能用了,现在还没有解决 1665907807@qq.com
  • swanky_yao:他的up 或者 down unknown等状态是根据什么?health都是up的,但是application的状态确实down或者unknown。
  • JingGo:又学习到了:+1:
  • b0542f6c4d28:非常感谢
  • 950598a4663b:如果应用启用了spring security好像有问题 界面老是弹输入密码的框 输入了也有问题
    054c9195dfe2:@Me1rfa丶 可是如果在一般的spring boot工程中引入了spring security,但是又不想马上配置url的过滤的话,怎么关掉弹输入密码的框?
    Me1rfa丶:@花屠 http://codecentric.github.io/spring-boot-admin/1.5.4/#_securing_client_actuator_endpoints 这里有说
    花屠:是啊, 我也遇到这个问题, 请问有办法解决吗?
  • 0261a1823dac:这篇文章写得十分赞
  • 执放:太赞了
  • c059ac2863f2:spring-boot-admin是德国一家叫做codecentric软件公司写的,他们有相当多的超好的spring-boot周边开源项目,可以去他们的github上看下:https://github.com/codecentric
    huanfuan:我也star了 :smile:
    程序熊大:@大宝SOD 谢谢推荐啦,我已经star
  • scrane:实用,点个赞吧!

本文标题:Spring Boot Admin的使用

本文链接:https://www.haomeiwen.com/subject/rqzvhttx.html