This is an automated email from the ASF dual-hosted git repository. tanxinyu pushed a commit to branch fix_threadpool_metric_npe in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 9501c0e3684f9ba4af55a20fb7604f46b120d40f 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..b5b5d5d09b0 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); + registerThreadPoolToMetric(name); } } + private void registerThreadPoolToMetric(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); + unRegisterThreadPoolToMetric(name); } } + private void unRegisterThreadPoolToMetric(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()) { + registerThreadPoolToMetric(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()) { + unRegisterThreadPoolToMetric(entry.getKey()); + } + registeredPoolMap.clear(); + notRegisteredPoolMap.clear(); } private static class ThreadPoolMetricsHolder {
