Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。
Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。
Endpoints
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.properties
management.endpoints.web.exposure.include=*
management.endpoint.integrationgraph.enabled=true // 需要单独开启
env
GET localhost:8080/actuator/env
health
GET localhost:8080/actuator/health
RedisHealthIndicator (redis 组件)
public class RedisHealthIndicator extends AbstractHealthIndicator {
static final String VERSION = "version";
static final String REDIS_VERSION = "redis_version";
private final RedisConnectionFactory redisConnectionFactory;
public RedisHealthIndicator(RedisConnectionFactory connectionFactory) {
super("Redis health check failed");
Assert.notNull(connectionFactory, "ConnectionFactory must not be null");
this.redisConnectionFactory = connectionFactory;
}
protected void doHealthCheck(Builder builder) throws Exception {
RedisConnection connection = RedisConnectionUtils.getConnection(this.redisConnectionFactory);
try {
if (connection instanceof RedisClusterConnection) {
ClusterInfo clusterInfo = ((RedisClusterConnection)connection).clusterGetClusterInfo();
builder.up().withDetail("cluster_size", clusterInfo.getClusterSize()).withDetail("slots_up", clusterInfo.getSlotsOk()).withDetail("slots_fail", clusterInfo.getSlotsFail());
} else {
Properties info = connection.info();
builder.up().withDetail("version", info.getProperty("redis_version"));
}
} finally {
RedisConnectionUtils.releaseConnection(connection, this.redisConnectionFactory);
}
}
}
自定义health 组件
实现AbstractHealthIndicator 接口可以自定义健康检查类
shutdown
POST localhost:8080/actuator/shutdown
loggers
GET localhost:8080/actuator/loggers/root // 查看root目录下的日志级别
POST localhost:8080/actuator/loggers/root // 修改root目录下的日志级别
{"configuredLevel":"DEBUG"}
Info
GET localhost:8080/actuator/info
Metrics(监控)
localhost:8080/actuator/metrics // 返回所有监视的名称,比如jvm.gc.max.data.size
localhost:8080/actuator/metrics/jvm.gc.max.data.size
监控内容包含:
JVM(垃圾收集器、内存、堆)
系统(运行时间、平均负载、处理器的信息)
线程池信息
Tomcat会话信息
……
Actuator两种形态的监控
HTTP
JMX(Java Management Extensions)
application.properties
management.endpoints.jmx.exposure.include=*
#是否展示spring jmx信息
spring.jmx.enabled=true
cmd - jconsole
自定义JMX
定义接口,后缀 MBean
public interface SystemInfoMBean {
int getCpuCore();
long getTotalMemory();
void shutdown();
}
实现类,命名保持一致
public class SystemInfo implements SystemInfoMBean{
@Override
public int getCpuCore() {
return Runtime.getRuntime().availableProcessors();
}
@Override
public long getTotalMemory() {
return Runtime.getRuntime().totalMemory();
}
@Override
public void shutdown() {
System.exit(0);
}
}
发布一(main 方法发布)
public class JMXMain {
public static void main(String[] args) throws Exception {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); // 创建MBeanServer
ObjectName objectName = new ObjectName("com.example.actuator.jmx:type=SystemInfo");// 新建MBean, 在MBeanServer里标识注册的MBean
SystemInfo systemInfo = new SystemInfo();// 创建MBean:SystemInfo
mBeanServer.registerMBean(systemInfo,objectName);// 在MBeanServer里注册MBean, 标识为ObjectName(com.tenpay.jmx:type=Echo)
// mBeanServer.invoke(objectName, "print", new Object[] { "haitao.tu"}, new String[] {"java.lang.String"});// 在MBeanServer里调用已注册的EchoMBean的print方法
System.in.read();
}
}
发布二(注册类,参考 SpringApplicationAdminMXBeanRegistrar.class)
@Component
public class GpApplicationMXBeanRegistrar implements ApplicationContextAware,
EnvironmentAware, InitializingBean, DisposableBean {
private ConfigurableApplicationContext applicationContext;
private Environment environment = new StandardEnvironment();
private final ObjectName objectName=new ObjectName("com.example.actuator.jmx:type=SystemInfo");
public GpApplicationMXBeanRegistrar() throws MalformedObjectNameException {
}
/* 销毁 */
@Override
public void destroy() throws Exception {
ManagementFactory.getPlatformMBeanServer()
.unregisterMBean(this.objectName);
}
/* 注册 */
@Override
public void afterPropertiesSet() throws Exception {
ManagementFactory.getPlatformMBeanServer()
.registerMBean(new SystemInfo(), this.objectName);
}
/* 获取上下文 */
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=(ConfigurableApplicationContext)applicationContext;
}
@Override
public void setEnvironment(Environment environment) {
this.environment=environment;
}
}
可视化系统(prometheus 集成 grafana)
替代jconsole的监控系统:
数据采集
时序数据库(time-series) 存储 metrics
可视化