自定义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);
    }
}

 

java
 
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(),
        metrics.getCurrentSystemThreadPoolSize(),
        metrics.getSystemThreadPoolSize(),
        metrics.getSystemThreadPoolQueueSize(),
        ignite.cacheNames().size()
    );

    // 网络和存储
    String netStorageInfo = String.format(
        "├─ 发送消息: %d (失败: %d)%n" +
        "├─ 接收消息: %d%n" +
        "├─ 存储空间: %s/%s GB%n" +
        "└─ GC 时间: %d ms%n",
        metrics.getSentMessagesCount(),
        metrics.getSentMessagesFailedCount(),
        metrics.getReceivedMessagesCount(),
        formatGB(metrics.getUsedStorageSpace()),
        formatGB(metrics.getTotalStorageSpace()),
        metrics.getGcCpuLoad() * 100
    );

    System.out.println(basicInfo + cpuMemInfo + threadCacheInfo + netStorageInfo);
}

// 辅助格式化方法
private static String formatMB(long bytes) {
    return String.format("%.1f", bytes / 1024.0 / 1024);
}

private static String formatGB(long bytes) {
    return String.format("%.2f", bytes / 1024.0 / 1024 / 1024);
}

输出示例:

 
[2025-05-01 14:30:45.123] Ignite 节点状态 [ID: c248820d...]
├─ 集群状态: ACTIVE
├─ 节点总数: 3 (客户端: 1)
├─ 拓扑版本: 42
├─ CPU 使用率: 12.5% (平均: 10.2%)
├─ 堆内存: 512.3 / 2048.0 MB (25.0%)
├─ 非堆内存: 256.5 MB
├─ 总内存: 768.8 / 2304.0 MB
├─ 线程数: 45 (峰值: 62)
├─ 公网线程池: 8/16 (队列: 0)
├─ 系统线程池: 4/8 (队列: 2)
├─ 缓存数量: 5
├─ 发送消息: 1245 (失败: 3)
├─ 接收消息: 1280
├─ 存储空间: 12.34/50.00 GB
└─ GC 时间: 15 ms

可选的增强指标:

  1. 缓存特定指标

java
 
ignite.cacheNames().forEach(cacheName -> {
    CacheMetrics cacheMetrics = ignite.cache(cacheName).localMetrics();
    System.out.printf("缓存 [%s] - 大小: %d | 命中率: %.1f%%%n",
        cacheName, 
        cacheMetrics.getSize(),
        cacheMetrics.getCacheHitPercentage());
});
  1. 磁盘使用详情

java
 
if (ignite.cluster().localNode().isDataNode()) {
    DataStorageMetrics dsMetrics = ignite.dataStorageMetrics();
    System.out.printf("数据分区: %d | 页大小: %d KB%n",
        dsMetrics.getTotalAllocatedPages(),
        dsMetrics.getPageSize() / 1024);
}
  1. 网络延迟

java
 
ClusterMetrics metrics = ignite.cluster().localNode().metrics();
System.out.printf("平均网络延迟: %.2f ms%n", 
    metrics.getAverageNetworkLatency());

建议根据实际需求选择显示的指标,避免信息过载。生产环境建议将输出写入日志文件而非控制台。

posted @ 2025-05-01 08:36  锐洋智能  阅读(22)  评论(0)    收藏  举报