spring-boot-admin的Github地址在:https://github.com/codecentric/spring-boot-admin,它在Spring Boot Actuator的基础上提供简洁的可视化WEB UI。
<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
spring-boot-admin应用启动日志
spring-boot-admin应用
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);
}
新添加的DbCountMetrics
<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
监控BookPub应用
BookPub应用的详细信息
Spring Boot Admin就是将Spring Boot Actuator中提供的endpoint信息可视化表示,在BookPub应用(被监控)的这一端,只需要进行一点配置即可。
如果希望通过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度量通过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() + "");
}
}
如果希望统计每个接口的调用时长,则需要借助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);
}
统计接口的调用延时
这两个service可以应付大多数应用需求,如果需要监控其他的度量信息,则可以定制我们自己的Metrics,例如在之前的例子中我们要统计四个数据库接口的调用状态,则我们定义了DbCountMetrics,该类实现了PublishMetrics,在这个类中我们统计每个数据库接口的记录数量。
PublishMetrics这个接口只有一个方法:Collection<Metric<?>> metrics();,在该方法中定义具体的监控信息;该接口的实现类需要在配置文件中通过@Bean注解,让Spring Boot在启动过程中初始化,并自动注册到MetricsEndpoint处理器中,这样每次有访问*/metrics*的请求到来时,就会执行对应的metrics方法。
一、生产环境日志输出的状况
1、生产环境日志输出的困惑
A.设置日志输出级别为info;
(1)优点:可以详细的打印日志,有利于排错;
(2)缺点:日志消耗系统的性能较大;只能针对整个系统整体设置日志输出较多,定位具体类或方法日志效率较低;
B.设置日志输出级别为error;
(1)优点:日志消耗系统性能较小;
(2)缺点:当遇到bug时,无法追踪到详细信息难以定位问题;
2、解决办法:
A.比较被动的妥协解决方案:项目发布时设置日志输出级别为error,当线上遇到问题时,再重启项目修改日志的输出级别为info;
(1)优点:无需改造现有项目,无需增加监控系统管理日志级别;
(2)缺点:每次都需要重启项目,项目多不利于统一管理;
B.动态配置日志级别:通过Spring Boot Admin的日志级别管理来动态调整日志级别;
(1)优点:动态更新日志级别,细粒度控制(项目,包,类)日志级别,便于快速定位问题;
(2)缺点:需要对现有系统进行改造,增加Spring Boot Admin监控系统;
二、效果展示
1、查看项目启动时日志级别
2、访问系统接口,查看日志
3、在Admin管理控制台修改类 com.zhanghan.zhboot.controller.CheckMobileController 的日志级别为Info
4、再次访问接口,查看日志(很显然,已经将修改为info)