上一篇文章中了解了Spring Boot提供的监控接口,例如:/health、/info等等,实际上除了以前提到的信息,还有其余信息业须要监控:当前处于活跃状态的会话数量、当前应用的并发数、延迟以及其余度量信息。此次咱们了解如何利用Spring-boot-admin对应用信息进行可视化,如何添加度量信息。html
spring-boot-admin的Github地址在:https://github.com/codecentric/spring-boot-admin,它在Spring Boot Actuator的基础上提供简洁的可视化WEB UI。java
<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>
@SpringBootApplication @EnableAdminServer public class SpringBootAdminWebApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminWebApplication.class, args); } }
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
启动应用程序,在后台给定以下提示:git
在浏览器中访问上图中提示的地址,能够看到下图的信息github
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; } }
@Bean public PublicMetrics dbCountMetrics(Collection<CrudRepository> repositories) { return new DbCountMetrics(repositories); }
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>1.3.2</version> </dependency>
spring.application.name=@project.description@ server.port=8080 spring.boot.admin.url=http://localhost:8090
点击右侧的“Details”,能够看到该应用的详细信息web
Spring Boot Admin就是将Spring Boot Actuator中提供的endpoint信息可视化表示,在BookPub应用(被监控)的这一端,只须要进行一点配置便可。spring
若是但愿经过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提供的度量工具功能强大且具有良好的扩展性,除了咱们配置的DbCountMetrics,还监控BookPub应用的其余信息,例如内存消耗、线程数量、系统时间以及http会话数量。浏览器
gague和counter度量经过GagueService和CountService实例提供,这些实例能够导入到任何Spring管理的对象中,用于度量应用信息。例如,咱们能够统计某个方法的调用次数,若是要统计全部RESTful接口的调用次数,则能够经过AOP实现,在调用指定的接口以前,首先调用counterService.increment("objectName.methodName.invoked");,某个方法被调用以后,则对它的统计值+1。具体的实验步骤以下:服务器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
@Aspect @Component public class ServiceMonitor { @Autowired private CounterService counterService; @Before("execution(* com.test.bookpub.controller.*.*(..))") public void countServiceInvoke(JoinPoint joinPoint) { counterService.increment(joinPoint.getSignature() + ""); } }
spring.aop.auto=true
http://localhost:8080/books/9876-5432-1111
,而后再去Spring Boot Admin后台查看对应信息,发现该方法的调用次数已经被统计好了若是但愿统计每一个接口的调用时长,则须要借助GagueService来实现,一样使用AOP实现,则须要环绕通知:在接口调用以前,利用long start = System.currentTimeMillis();,在接口调用以后,计算耗费的时间,单位是ms,而后使用gugeService.submit(latency)更新该接口的调用延时。
@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); }
而后在Spring Boot Admin后台能够看到对应接口的调用延迟
这两个service能够应付大多数应用需求,若是须要监控其余的度量信息,则能够定制咱们本身的Metrics,例如在以前的例子中咱们要统计四个数据库接口的调用状态,则咱们定义了DbCountMetrics,该类实现了PublishMetrics,在这个类中咱们统计每一个数据库接口的记录数量。
PublishMetrics这个接口只有一个方法:Collection<Metric<?>> metrics();,在该方法中定义具体的监控信息;该接口的实现类须要在配置文件中经过@Bean注解,让Spring Boot在启动过程当中初始化,并自动注册到MetricsEndpoint处理器中,这样每次有访问/metrics的请求到来时,就会执行对应的metrics方法。