自定义Ignite 控制台输出信息
以下是增强版的指标输出,可以显示更多有用的 Ignite 集群和节点信息,并优化了输出格式:
static {
try {
System.setProperty("enableMetricsLog", "true");
// 1. 加载XML配置
IgniteConfiguration igniteCfg = Ignition.loadSpringBean(CLIENT_CONFIG_PATH, "ignite.cfg");
igniteCfg.setMetricsLogFrequency(0);
// 2. 启动节点(先不配置缓存)
ignite = Ignition.start(igniteCfg);
// 3. 动态创建缓存配置(确保集群感知)
CacheConfiguration<String, JSONObject> cacheCfg = new CacheConfiguration<>();
cacheCfg.setName(CACHE_NAME)
.setAtomicityMode(CacheAtomicityMode.ATOMIC)
.setBackups(1)
.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); // 确保写同步
// 4. 获取或创建缓存(这会确保配置传播到整个集群)
IgniteCache<String, JSONObject> cache = ignite.getOrCreateCache(cacheCfg);
// 5. 显式等待缓存完全初始化(可选)
ignite.cluster().state().active(true); // 确保集群激活
cache.query(new SqlFieldsQuery("SELECT 1")).getAll(); // 测试查询确保缓存就绪
initialized = true;
startMetricsLogger();
} catch (Exception e) {
throw new IllegalStateException("Ignite初始化失败", e);
}
}
private static void printEnhancedMetrics() {
ClusterMetrics metrics = ignite.cluster().localNode().metrics();
ClusterNode localNode = ignite.cluster().localNode();
// 基础信息
String basicInfo = String.format(
"[%s] Ignite 节点状态 [ID: %s]%n" +
"├─ 集群状态: %s%n" +
"├─ 节点总数: %d (客户端: %d)%n" +
"├─ 拓扑版本: %d%n",
DateTimeUtils.getCurrentTimeSSS(),
localNode.id().toString().substring(0, 8) + "...",
ignite.cluster().state(),
ignite.cluster().nodes().size(),
ignite.cluster().forClients().nodes().size(),
ignite.cluster().topologyVersion()
);
// CPU和内存
String cpuMemInfo = String.format(
"├─ CPU 使用率: %.1f%% (平均: %.1f%%)%n" +
"├─ 堆内存: %s / %s MB (%.1f%%)%n" +
"├─ 非堆内存: %s MB%n" +
"├─ 总内存: %s / %s MB%n",
metrics.getCurrentCpuLoad() * 100,
metrics.getAverageCpuLoad() * 100,
formatMB(metrics.getHeapMemoryUsed()),
formatMB(metrics.getHeapMemoryMaximum()),
(double)metrics.getHeapMemoryUsed() / metrics.getHeapMemoryMaximum() * 100,
formatMB(metrics.getNonHeapMemoryUsed()),
formatMB(metrics.getTotalMemoryUsed()),
formatMB(metrics.getTotalMemoryMaximum())
);
// 线程和缓存
String threadCacheInfo = String.format(
"├─ 线程数: %d (峰值: %d)%n" +
"├─ 公网线程池: %d/%d (队列: %d)%n" +
"├─ 系统线程池: %d/%d (队列: %d)%n" +
"├─ 缓存数量: %d%n",
metrics.getCurrentThreadCount(),
metrics.getPeakThreadCount(),
metrics.getCurrentPublicThreadPoolSize(),
metrics.getPublicThreadPoolSize(),
metrics.getPublicThreadPoolQueueSize(