健康监控模块 (Health Monitor Module)
健康监控模块 (Health Monitor Module)
概述
健康监控模块提供了应用程序运行时健康状态的监控功能,包括系统资源使用情况、JVM性能指标、垃圾回收统计等信息的收集和记录。该模块基于Vert.x和Keel框架构建,支持两种监控模式:问题记录模式和指标记录模式。
核心组件
1. HealthMonitor (抽象基类)
HealthMonitor<X>
是健康监控的抽象基类,继承自 KeelVerticleImpl
。
关键特性
- 泛型设计: 支持不同类型的数据记录格式
- 周期性监控: 默认60秒间隔进行系统监控
- 可扩展: 通过抽象方法支持自定义监控项和处理逻辑
核心方法
protected abstract void prepare(); // 初始化准备工作
protected abstract void moreMonitorItems(@Nonnull final X draft); // 添加自定义监控项
protected abstract X createDraft(); // 创建数据草稿对象
protected abstract void handleRecord(@Nonnull MonitorSnapshot monitorSnapshot, @Nonnull X moreDraft); // 处理监控记录
protected long interval(); // 监控间隔(默认60秒)
2. HealthMonitorWithIssueRecorder (问题记录实现)
基于问题日志的健康监控实现,当系统指标超过阈值时记录警告或错误日志。
核心特性
- 数据格式: 使用
JsonObject
存储监控数据 - 阈值监控:
- CPU使用率 ≥ 50% 或堆内存使用率 ≥ 50% → WARNING级别
- CPU使用率 ≥ 75% 或堆内存使用率 ≥ 75% 或发生Major GC → ERROR级别
- 监控内容:
- 应用存活时间 (survived)
- GC统计信息 (gc)
- CPU时间统计 (cpu_time)
- JVM内存统计 (jvm_memory_stat)
告警策略
// WARNING 级别触发条件
CPU使用率 >= 50% || 堆内存使用率 >= 50%
// ERROR 级别触发条件
CPU使用率 >= 75% || 堆内存使用率 >= 75% || Major GC次数 > 0
3. HealthMonitorWithMetricRecorder (指标记录实现)
基于指标数据的健康监控实现,定期收集和记录系统性能指标。
核心特性
- 数据格式: 使用
List<HealthMonitorMetricRecord>
存储指标数据 - 高频监控: 默认10秒间隔进行指标收集
- 丰富指标: 收集10种不同类型的系统和JVM指标
收集的指标类型
- 存活时间 (
survived
): 应用运行时长(毫秒) - 硬件内存使用率 (
hardware_memory_usage
): 物理内存使用百分比 - JVM内存使用率 (
jvm_memory_usage
): 堆内存使用百分比 - JVM堆内存使用量 (
jvm_heap_memory_used_bytes
): 堆内存使用字节数 - JVM非堆内存使用量 (
jvm_non_heap_memory_used_bytes
): 非堆内存使用字节数 - CPU使用率 (
cpu_usage
): CPU使用百分比 - Major GC次数 (
major_gc_count
): Major垃圾回收次数 - Major GC时间 (
major_gc_time
): Major垃圾回收耗时 - Minor GC次数 (
minor_gc_count
): Minor垃圾回收次数 - Minor GC时间 (
minor_gc_time
): Minor垃圾回收耗时
4. HealthMonitorMixin (混入接口)
提供便捷的健康监控集成接口,实现了CommonUnit接口。
主要功能
// 构建默认的健康监控器(问题记录模式)
HealthMonitor<?> buildHealthMonitor()
// 加载并部署健康监控器
Future<String> loadHealthMonitor()
部署配置
- 线程模型: WORKER线程模型
- 默认实现: 使用HealthMonitorWithIssueRecorder
数据模型
HealthMonitorIssueRecord
问题记录数据模型,扩展了 KeelIssueRecord
。
public static final String TopicHealthMonitor = "HealthMonitor";
public static final String AttributeSnapshot = "snapshot";
// 记录监控快照数据
HealthMonitorIssueRecord snapshot(@Nonnull JsonObject snapshot)
HealthMonitorMetricRecord
指标记录数据模型,扩展了 KeelMetricRecord
。
提供静态工厂方法创建各种类型的指标记录:
HealthMonitorMetricRecord.asSurvived(long value)
HealthMonitorMetricRecord.asCpuUsage(double value)
HealthMonitorMetricRecord.asJvmMemoryUsage(double value)
// ... 等等
使用方式
1. 基本集成 (推荐)
实现 HealthMonitorMixin
接口:
public class MyApplication implements HealthMonitorMixin {
public void start() {
// 加载健康监控
loadHealthMonitor()
.onSuccess(deploymentId -> {
logger.info("健康监控启动成功: " + deploymentId);
})
.onFailure(error -> {
logger.error("健康监控启动失败", error);
});
}
}
2. 自定义监控实现
继承 HealthMonitor
实现自定义监控逻辑:
public class CustomHealthMonitor extends HealthMonitor<CustomData> {
@Override
protected void prepare() {
// 初始化自定义组件
}
@Override
protected CustomData createDraft() {
return new CustomData();
}
@Override
protected void moreMonitorItems(@Nonnull CustomData draft) {
// 添加自定义监控项
draft.setCustomMetric(getCustomMetricValue());
}
@Override
protected void handleRecord(@Nonnull MonitorSnapshot snapshot, @Nonnull CustomData data) {
// 处理监控数据
}
@Override
protected long interval() {
return 30_000L; // 自定义监控间隔30秒
}
}
3. 指标监控模式
使用指标记录器进行详细的性能监控:
KeelMetricRecorder metricRecorder = // 初始化指标记录器
HealthMonitor<List<HealthMonitorMetricRecord>> monitor =
new HealthMonitorWithMetricRecorder(metricRecorder);
// 部署监控器
monitor.deployMe(new DeploymentOptions().setThreadingModel(ThreadingModel.WORKER));
架构设计
设计模式
- 模板方法模式:
HealthMonitor
抽象类定义监控流程框架 - 策略模式: 不同的监控实现(
WithIssueRecorder
vsWithMetricRecorder
) - 混入模式:
HealthMonitorMixin
提供便捷集成 - 工厂模式: 静态工厂方法创建各种指标记录
扩展点
- 自定义监控项: 通过
moreMonitorItems()
添加业务特定监控 - 自定义处理逻辑: 通过
handleRecord()
实现特定的数据处理 - 自定义监控间隔: 通过
interval()
调整监控频率 - 自定义数据格式: 通过泛型
<X>
支持不同的数据结构
注意事项
- 性能影响: 健康监控会占用一定的系统资源,建议根据实际需求调整监控间隔
- 存储考虑: 指标记录模式会产生大量数据,需要考虑存储和清理策略
- 线程模型: 默认使用WORKER线程模型,避免阻塞主EventLoop
- 告警阈值: 问题记录模式的阈值可能需要根据具体应用场景调整
- 依赖关系: 模块依赖Keel框架的运行时监控和日志记录功能
版本历史
- 1.0.0: 初始版本
- 1.4.0: 重构为抽象类,提供两种实现方式
- 1.4.2: 添加可配置的监控间隔