This is an automated email from the ASF dual-hosted git repository. tanxinyu pushed a commit to branch fix_threadpool_metric_npe_cp in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit e551be5774acaef39643c1ceaa3f7476478e23cd Author: OneSizeFitQuorum <[email protected]> AuthorDate: Thu Dec 12 20:13:13 2024 +0800 fix Signed-off-by: OneSizeFitQuorum <[email protected]> --- .../commons/concurrent/ThreadPoolMetrics.java | 139 ++++++++++++--------- 1 file changed, 77 insertions(+), 62 deletions(-) diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java index 05b6c63b0a5..a05742e38d3 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/concurrent/ThreadPoolMetrics.java @@ -48,87 +48,102 @@ public class ThreadPoolMetrics implements IMetricSet { notRegisteredPoolMap.put(name, pool); } else { registeredPoolMap.put(name, pool); - metricService.createAutoGauge( - SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(), - MetricLevel.IMPORTANT, - registeredPoolMap, - map -> registeredPoolMap.get(name).getActiveCount(), - SystemTag.POOL_NAME.toString(), - name); - metricService.createAutoGauge( - SystemMetric.THREAD_POOL_CORE_SIZE.toString(), - MetricLevel.IMPORTANT, - registeredPoolMap, - map -> registeredPoolMap.get(name).getCorePoolSize(), - SystemTag.POOL_NAME.toString(), - name); - metricService.createAutoGauge( - SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(), - MetricLevel.IMPORTANT, - registeredPoolMap, - map -> registeredPoolMap.get(name).getQueueLength(), - SystemTag.POOL_NAME.toString(), - name); - metricService.createAutoGauge( - SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(), - MetricLevel.IMPORTANT, - registeredPoolMap, - map -> registeredPoolMap.get(name).getCompletedTaskCount(), - SystemTag.POOL_NAME.toString(), - name); - metricService.createAutoGauge( - SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(), - MetricLevel.IMPORTANT, - registeredPoolMap, - map -> registeredPoolMap.get(name).getLargestPoolSize(), - SystemTag.POOL_NAME.toString(), - name); + registerThreadPoolMetrics(name); } } + private void registerThreadPoolMetrics(String name) { + metricService.createAutoGauge( + SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(), + MetricLevel.IMPORTANT, + registeredPoolMap, + map -> registeredPoolMap.get(name).getActiveCount(), + SystemTag.POOL_NAME.toString(), + name); + metricService.createAutoGauge( + SystemMetric.THREAD_POOL_CORE_SIZE.toString(), + MetricLevel.IMPORTANT, + registeredPoolMap, + map -> registeredPoolMap.get(name).getCorePoolSize(), + SystemTag.POOL_NAME.toString(), + name); + metricService.createAutoGauge( + SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(), + MetricLevel.IMPORTANT, + registeredPoolMap, + map -> registeredPoolMap.get(name).getQueueLength(), + SystemTag.POOL_NAME.toString(), + name); + metricService.createAutoGauge( + SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(), + MetricLevel.IMPORTANT, + registeredPoolMap, + map -> registeredPoolMap.get(name).getCompletedTaskCount(), + SystemTag.POOL_NAME.toString(), + name); + metricService.createAutoGauge( + SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(), + MetricLevel.IMPORTANT, + registeredPoolMap, + map -> registeredPoolMap.get(name).getLargestPoolSize(), + SystemTag.POOL_NAME.toString(), + name); + } + public synchronized void unRegisterThreadPool(String name) { if (metricService == null) { notRegisteredPoolMap.remove(name); } else { registeredPoolMap.remove(name); - metricService.remove( - MetricType.GAUGE, - SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(), - SystemTag.POOL_NAME.toString(), - name); - metricService.remove( - MetricType.GAUGE, - SystemMetric.THREAD_POOL_CORE_SIZE.toString(), - SystemTag.POOL_NAME.toString(), - name); - metricService.remove( - MetricType.GAUGE, - SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(), - SystemTag.POOL_NAME.toString(), - name); - metricService.remove( - MetricType.GAUGE, - SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(), - SystemTag.POOL_NAME.toString(), - name); - metricService.remove( - MetricType.GAUGE, - SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(), - SystemTag.POOL_NAME.toString(), - name); + unRegisterThreadPoolMetrics(name); } } + private void unRegisterThreadPoolMetrics(String name) { + metricService.remove( + MetricType.GAUGE, + SystemMetric.THREAD_POOL_ACTIVE_THREAD_COUNT.toString(), + SystemTag.POOL_NAME.toString(), + name); + metricService.remove( + MetricType.GAUGE, + SystemMetric.THREAD_POOL_CORE_SIZE.toString(), + SystemTag.POOL_NAME.toString(), + name); + metricService.remove( + MetricType.GAUGE, + SystemMetric.THREAD_POOL_WAITING_TASK_COUNT.toString(), + SystemTag.POOL_NAME.toString(), + name); + metricService.remove( + MetricType.GAUGE, + SystemMetric.THREAD_POOL_DONE_TASK_COUNT.toString(), + SystemTag.POOL_NAME.toString(), + name); + metricService.remove( + MetricType.GAUGE, + SystemMetric.THREAD_POOL_LARGEST_POOL_SIZE.toString(), + SystemTag.POOL_NAME.toString(), + name); + } + @Override public synchronized void bindTo(AbstractMetricService metricService) { this.metricService = metricService; - notRegisteredPoolMap.forEach((name, pool) -> registerThreadPool(pool, name)); + for (Map.Entry<String, IThreadPoolMBean> entry : notRegisteredPoolMap.entrySet()) { + registerThreadPoolMetrics(entry.getKey()); + } + registeredPoolMap.putAll(notRegisteredPoolMap); notRegisteredPoolMap.clear(); } @Override public synchronized void unbindFrom(AbstractMetricService metricService) { - registeredPoolMap.forEach((name, pool) -> unRegisterThreadPool(name)); + for (Map.Entry<String, IThreadPoolMBean> entry : registeredPoolMap.entrySet()) { + unRegisterThreadPoolMetrics(entry.getKey()); + } + registeredPoolMap.clear(); + notRegisteredPoolMap.clear(); } private static class ThreadPoolMetricsHolder {
