This is an automated email from the ASF dual-hosted git repository.

jianglongtao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 705ba96a2d5 Optimize driver agent to support multiple data sources 
(#32612)
705ba96a2d5 is described below

commit 705ba96a2d58095013d9ef90cf0981ea771d2b9d
Author: jiangML <[email protected]>
AuthorDate: Thu Aug 22 11:55:22 2024 +0800

    Optimize driver agent to support multiple data sources (#32612)
    
    * Improve agent for driver
    
    * Fix test error
    
    * Rename ShardingSphereDataSourceHolder to 
ShardingSphereDataSourceContextHolder
    
    * Update java doc
    
    * Fix test error
---
 .../agent/plugin/core/context/PluginContext.java   | 13 ++----
 .../context/ShardingSphereDataSourceContext.java   | 34 +++++++++++++++
 ... => ShardingSphereDataSourceContextHolder.java} | 34 +++++++--------
 .../jdbc/ShardingSphereDataSourceAdvice.java       | 13 +++---
 .../impl/jdbc/JDBCMetaDataInfoExporter.java        | 24 ++++------
 .../core/exporter/impl/jdbc/JDBCStateExporter.java | 22 ++++------
 .../jdbc/ShardingSphereDataSourceAdviceTest.java   | 38 ++++++++++------
 .../impl/jdbc/JDBCMetaDataInfoExporterTest.java    | 51 ++++++++++++++--------
 .../exporter/impl/jdbc/JDBCStateExporterTest.java  | 46 +++++++++++++++----
 9 files changed, 172 insertions(+), 103 deletions(-)

diff --git 
a/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/PluginContext.java
 
b/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/PluginContext.java
index 52cf4d12bcb..c72a419351f 100644
--- 
a/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/PluginContext.java
+++ 
b/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/PluginContext.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.agent.plugin.core.context;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-import org.apache.shardingsphere.agent.plugin.core.holder.ContextManagerHolder;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -61,17 +61,12 @@ public final class PluginContext {
         return null == contextManager || 
contextManager.getMetaDataContexts().getMetaData().getProps().<Boolean>getValue(ConfigurationPropertyKey.AGENT_PLUGINS_ENABLED);
     }
     
-    /**
-     * Get context manager.
-     *
-     * @return context manager
-     */
-    public Optional<ContextManager> getContextManager() {
+    private Optional<ContextManager> getContextManager() {
         if (isEnhancedForProxy) {
             return 
Optional.ofNullable(ProxyContext.getInstance().getContextManager());
         }
-        return ContextManagerHolder.getDatabaseContextManager().isEmpty()
+        return 
ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().isEmpty()
                 ? Optional.empty()
-                : 
Optional.of(ContextManagerHolder.getDatabaseContextManager().values().iterator().next());
+                : 
Optional.of(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().values().iterator().next().getContextManager());
     }
 }
diff --git 
a/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/ShardingSphereDataSourceContext.java
 
b/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/ShardingSphereDataSourceContext.java
new file mode 100644
index 00000000000..833032980d8
--- /dev/null
+++ 
b/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/context/ShardingSphereDataSourceContext.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.core.context;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+
+/**
+ * ShardingSphere data source context.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class ShardingSphereDataSourceContext {
+    
+    private final String databaseName;
+    
+    private final ContextManager contextManager;
+}
diff --git 
a/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/holder/ContextManagerHolder.java
 
b/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/holder/ShardingSphereDataSourceContextHolder.java
similarity index 53%
rename from 
agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/holder/ContextManagerHolder.java
rename to 
agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/holder/ShardingSphereDataSourceContextHolder.java
index 48da2b43004..0516f0df780 100644
--- 
a/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/holder/ContextManagerHolder.java
+++ 
b/agent/plugins/core/src/main/java/org/apache/shardingsphere/agent/plugin/core/holder/ShardingSphereDataSourceContextHolder.java
@@ -19,44 +19,44 @@ package org.apache.shardingsphere.agent.plugin.core.holder;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.mode.manager.ContextManager;
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Context manager holder.
+ * ShardingSphere data source context holder.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ContextManagerHolder {
+public final class ShardingSphereDataSourceContextHolder {
     
-    private static final Map<String, ContextManager> 
DATABASE_CONTEXT_MANAGER_CACHE = new ConcurrentHashMap<>();
+    private static final Map<String, ShardingSphereDataSourceContext> 
DATA_SOURCE_CONTEXTS = new ConcurrentHashMap<>();
     
     /**
-     * put.
+     * Put.
      *
-     * @param database database
-     * @param contextManager context manager
+     * @param instanceId instance Id
+     * @param dataSourceContext sharding sphere data source context
      */
-    public static void put(final String database, final ContextManager 
contextManager) {
-        DATABASE_CONTEXT_MANAGER_CACHE.put(database, contextManager);
+    public static void put(final String instanceId, final 
ShardingSphereDataSourceContext dataSourceContext) {
+        DATA_SOURCE_CONTEXTS.put(instanceId, dataSourceContext);
     }
     
     /**
-     * remove.
+     * Remove.
      *
-     * @param database database
+     * @param instanceId instance id
      */
-    public static void remove(final String database) {
-        DATABASE_CONTEXT_MANAGER_CACHE.remove(database);
+    public static void remove(final String instanceId) {
+        DATA_SOURCE_CONTEXTS.remove(instanceId);
     }
     
     /**
-     * Get database context manager.
+     * Get sharding sphere data source contexts.
      *
-     * @return database context manager
+     * @return sharding sphere data source contexts
      */
-    public static Map<String, ContextManager> getDatabaseContextManager() {
-        return DATABASE_CONTEXT_MANAGER_CACHE;
+    public static Map<String, ShardingSphereDataSourceContext> 
getShardingSphereDataSourceContexts() {
+        return DATA_SOURCE_CONTEXTS;
     }
 }
diff --git 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdvice.java
 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdvice.java
index 04bda4dcf28..63e8376d485 100644
--- 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdvice.java
+++ 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdvice.java
@@ -20,7 +20,8 @@ package 
org.apache.shardingsphere.agent.plugin.metrics.core.advice.jdbc;
 import org.apache.shardingsphere.agent.api.advice.TargetAdviceMethod;
 import org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
 import 
org.apache.shardingsphere.agent.plugin.core.advice.AbstractInstanceMethodAdvice;
-import org.apache.shardingsphere.agent.plugin.core.holder.ContextManagerHolder;
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import org.apache.shardingsphere.agent.plugin.core.util.AgentReflectionUtils;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 
@@ -32,18 +33,16 @@ public final class ShardingSphereDataSourceAdvice extends 
AbstractInstanceMethod
     @Override
     public void beforeMethod(final TargetAdviceObject target, final 
TargetAdviceMethod method, final Object[] args, final String pluginType) {
         if ("close".equals(method.getName())) {
-            ContextManagerHolder.remove(getDatabaseName(target));
+            ContextManager contextManager = 
AgentReflectionUtils.getFieldValue(target, "contextManager");
+            
ShardingSphereDataSourceContextHolder.remove(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId());
         }
     }
     
     @Override
     public void afterMethod(final TargetAdviceObject target, final 
TargetAdviceMethod method, final Object[] args, final Object result, final 
String pluginType) {
         if ("createContextManager".equals(method.getName())) {
-            ContextManagerHolder.put(getDatabaseName(target), (ContextManager) 
result);
+            ShardingSphereDataSourceContextHolder.put(((ContextManager) 
result).getComputeNodeInstanceContext().getInstance().getMetaData().getId(),
+                    new 
ShardingSphereDataSourceContext(AgentReflectionUtils.getFieldValue(target, 
"databaseName"), (ContextManager) result));
         }
     }
-    
-    private String getDatabaseName(final TargetAdviceObject target) {
-        return AgentReflectionUtils.getFieldValue(target, "databaseName");
-    }
 }
diff --git 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporter.java
 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporter.java
index fe30e08745e..40fb92306f7 100644
--- 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporter.java
+++ 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporter.java
@@ -17,17 +17,15 @@
 
 package org.apache.shardingsphere.agent.plugin.metrics.core.exporter.impl.jdbc;
 
-import org.apache.shardingsphere.agent.plugin.core.holder.ContextManagerHolder;
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.MetricsCollectorRegistry;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.type.GaugeMetricFamilyMetricsCollector;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricCollectorType;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricConfiguration;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.exporter.MetricsExporter;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.mode.manager.ContextManager;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Map.Entry;
 import java.util.Optional;
 
@@ -36,24 +34,18 @@ import java.util.Optional;
  */
 public final class JDBCMetaDataInfoExporter implements MetricsExporter {
     
-    private final MetricConfiguration config = new 
MetricConfiguration("jdbc_meta_data_info",
-            MetricCollectorType.GAUGE_METRIC_FAMILY, "Meta data information of 
ShardingSphere-JDBC",
-            Arrays.asList("database", "type"), Collections.emptyMap());
+    private final MetricConfiguration config = new 
MetricConfiguration("jdbc_meta_data_info", 
MetricCollectorType.GAUGE_METRIC_FAMILY,
+            "Meta data information of ShardingSphere-JDBC",
+            Arrays.asList("driver_instance", "database", "type"));
     
     @Override
     public Optional<GaugeMetricFamilyMetricsCollector> export(final String 
pluginType) {
         GaugeMetricFamilyMetricsCollector result = 
MetricsCollectorRegistry.get(config, pluginType);
         result.cleanMetrics();
-        for (Entry<String, ContextManager> entry : 
ContextManagerHolder.getDatabaseContextManager().entrySet()) {
-            addMetric(result, entry.getKey(), entry.getValue());
+        for (Entry<String, ShardingSphereDataSourceContext> entry : 
ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().entrySet())
 {
+            
Optional.ofNullable(entry.getValue().getContextManager().getDatabase(entry.getValue().getDatabaseName()))
+                    .ifPresent(optional -> 
result.addMetric(Arrays.asList(entry.getKey(), optional.getName(), 
"storage_unit_count"), 
optional.getResourceMetaData().getStorageUnits().size()));
         }
         return Optional.of(result);
     }
-    
-    private void addMetric(final GaugeMetricFamilyMetricsCollector collector, 
final String database, final ContextManager contextManager) {
-        ShardingSphereDatabase shardingSphereDatabase = 
contextManager.getDatabase(database);
-        if (null != shardingSphereDatabase) {
-            collector.addMetric(Arrays.asList(database, "storage_unit_count"), 
shardingSphereDatabase.getResourceMetaData().getStorageUnits().size());
-        }
-    }
 }
diff --git 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporter.java
 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporter.java
index 452c7c92af7..ee9a7b39935 100644
--- 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporter.java
+++ 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporter.java
@@ -17,16 +17,15 @@
 
 package org.apache.shardingsphere.agent.plugin.metrics.core.exporter.impl.jdbc;
 
-import org.apache.shardingsphere.agent.plugin.core.holder.ContextManagerHolder;
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.MetricsCollectorRegistry;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.type.GaugeMetricFamilyMetricsCollector;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricCollectorType;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricConfiguration;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.exporter.MetricsExporter;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.mode.manager.ContextManager;
 
-import java.util.Collections;
+import java.util.Arrays;
 import java.util.Map.Entry;
 import java.util.Optional;
 
@@ -36,22 +35,17 @@ import java.util.Optional;
 public final class JDBCStateExporter implements MetricsExporter {
     
     private final MetricConfiguration config = new 
MetricConfiguration("jdbc_state", MetricCollectorType.GAUGE_METRIC_FAMILY,
-            "State of ShardingSphere-JDBC. 0 is OK; 1 is CIRCUIT BREAK", 
Collections.singletonList("database"));
+            "State of ShardingSphere-JDBC. 0 is OK; 1 is CIRCUIT BREAK", 
Arrays.asList("driver_instance", "database"));
     
     @Override
     public Optional<GaugeMetricFamilyMetricsCollector> export(final String 
pluginType) {
         GaugeMetricFamilyMetricsCollector result = 
MetricsCollectorRegistry.get(config, pluginType);
         result.cleanMetrics();
-        for (Entry<String, ContextManager> entry : 
ContextManagerHolder.getDatabaseContextManager().entrySet()) {
-            addMetric(result, entry.getKey(), entry.getValue());
+        for (Entry<String, ShardingSphereDataSourceContext> entry : 
ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().entrySet())
 {
+            
Optional.ofNullable(entry.getValue().getContextManager().getDatabase(entry.getValue().getDatabaseName()))
+                    .ifPresent(optional -> 
result.addMetric(Arrays.asList(entry.getKey(), optional.getName()),
+                            
entry.getValue().getContextManager().getComputeNodeInstanceContext().getInstance().getState().getCurrentState().ordinal()));
         }
         return Optional.of(result);
     }
-    
-    private void addMetric(final GaugeMetricFamilyMetricsCollector collector, 
final String database, final ContextManager contextManager) {
-        ShardingSphereDatabase shardingSphereDatabase = 
contextManager.getDatabase(database);
-        if (null != shardingSphereDatabase) {
-            collector.addMetric(Collections.singletonList(database), 
contextManager.getComputeNodeInstanceContext().getInstance().getState().getCurrentState().ordinal());
-        }
-    }
 }
diff --git 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdviceTest.java
 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdviceTest.java
index e2cba8879d2..fd48e7097db 100644
--- 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdviceTest.java
+++ 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/jdbc/ShardingSphereDataSourceAdviceTest.java
@@ -18,17 +18,19 @@
 package org.apache.shardingsphere.agent.plugin.metrics.core.advice.jdbc;
 
 import org.apache.shardingsphere.agent.api.advice.TargetAdviceMethod;
-import org.apache.shardingsphere.agent.plugin.core.holder.ContextManagerHolder;
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import org.apache.shardingsphere.agent.plugin.core.util.AgentReflectionUtils;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.fixture.TargetAdviceObjectFixture;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import java.util.UUID;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -43,35 +45,43 @@ class ShardingSphereDataSourceAdviceTest {
     
     private final String databaseName = "sharding_db";
     
-    @BeforeEach
-    void setup() {
-        when(AgentReflectionUtils.getFieldValue(fixture, 
"databaseName")).thenReturn(databaseName);
-    }
+    private final String instanceId = UUID.randomUUID().toString();
     
     @AfterEach
     void clean() {
-        ContextManagerHolder.getDatabaseContextManager().clear();
+        
ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().clear();
     }
     
     @Test
     void assertBeforeMethod() {
-        ContextManagerHolder.put(databaseName, mock(ContextManager.class, 
RETURNS_DEEP_STUBS));
-        assertThat(ContextManagerHolder.getDatabaseContextManager().size(), 
is(1));
+        ContextManager contextManager = mockContextManager();
+        when(AgentReflectionUtils.getFieldValue(fixture, 
"contextManager")).thenReturn(contextManager);
+        ShardingSphereDataSourceContextHolder.put(instanceId, new 
ShardingSphereDataSourceContext(databaseName, mock(ContextManager.class, 
RETURNS_DEEP_STUBS)));
+        
assertThat(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().size(),
 is(1));
         TargetAdviceMethod method = mock(TargetAdviceMethod.class);
         when(method.getName()).thenReturn("close");
         ShardingSphereDataSourceAdvice advice = new 
ShardingSphereDataSourceAdvice();
         advice.beforeMethod(fixture, method, new Object[]{}, "FIXTURE");
-        assertThat(ContextManagerHolder.getDatabaseContextManager().size(), 
is(0));
+        
assertThat(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().size(),
 is(0));
     }
     
     @Test
     void assertAfterMethod() {
-        assertThat(ContextManagerHolder.getDatabaseContextManager().size(), 
is(0));
+        
assertThat(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().size(),
 is(0));
+        when(AgentReflectionUtils.getFieldValue(fixture, 
"databaseName")).thenReturn(databaseName);
         TargetAdviceMethod method = mock(TargetAdviceMethod.class);
         when(method.getName()).thenReturn("createContextManager");
         ShardingSphereDataSourceAdvice advice = new 
ShardingSphereDataSourceAdvice();
-        advice.afterMethod(fixture, method, new Object[]{}, 
mock(ContextManager.class, RETURNS_DEEP_STUBS), "FIXTURE");
-        assertThat(ContextManagerHolder.getDatabaseContextManager().size(), 
is(1));
-        
assertThat(ContextManagerHolder.getDatabaseContextManager().keySet().iterator().next(),
 is(databaseName));
+        ContextManager contextManager = mockContextManager();
+        advice.afterMethod(fixture, method, new Object[]{}, contextManager, 
"FIXTURE");
+        
assertThat(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().size(),
 is(1));
+        
assertThat(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().keySet().iterator().next(),
 is(instanceId));
+        
assertThat(ShardingSphereDataSourceContextHolder.getShardingSphereDataSourceContexts().get(instanceId).getDatabaseName(),
 is(databaseName));
+    }
+    
+    private ContextManager mockContextManager() {
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        
when(result.getComputeNodeInstanceContext().getInstance().getMetaData().getId()).thenReturn(instanceId);
+        return result;
     }
 }
diff --git 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporterTest.java
 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporterTest.java
index c954d12db8c..96d6ca5eb5d 100644
--- 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporterTest.java
+++ 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCMetaDataInfoExporterTest.java
@@ -17,24 +17,26 @@
 
 package org.apache.shardingsphere.agent.plugin.metrics.core.exporter.impl.jdbc;
 
-import org.apache.shardingsphere.agent.plugin.core.holder.ContextManagerHolder;
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.MetricsCollectorRegistry;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.type.GaugeMetricFamilyMetricsCollector;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricCollectorType;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricConfiguration;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.fixture.collector.MetricsCollectorFixture;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Optional;
+import java.util.UUID;
 
-import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -43,30 +45,43 @@ import static org.mockito.Mockito.when;
 
 class JDBCMetaDataInfoExporterTest {
     
+    private String instanceId;
+    
+    private String databaseName;
+    
+    @BeforeEach
+    void setUp() {
+        instanceId = UUID.randomUUID().toString();
+        databaseName = "sharding_db";
+        ContextManager contextManager = mockContextManager(instanceId, 
databaseName);
+        ShardingSphereDataSourceContextHolder.put(instanceId, new 
ShardingSphereDataSourceContext(databaseName, contextManager));
+    }
+    
+    private ContextManager mockContextManager(final String instanceId, final 
String databaseName) {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        when(database.getName()).thenReturn(databaseName);
+        
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
 mock(StorageUnit.class)));
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        when(result.getDatabase(databaseName)).thenReturn(database);
+        
when(result.getComputeNodeInstanceContext().getInstance().getMetaData().getId()).thenReturn(instanceId);
+        return result;
+    }
+    
     @AfterEach
-    void reset() {
+    void clean() {
         MetricConfiguration config = new 
MetricConfiguration("jdbc_meta_data_info",
                 MetricCollectorType.GAUGE_METRIC_FAMILY, "Meta data 
information of ShardingSphere-JDBC",
-                Arrays.asList("database", "type"), Collections.emptyMap());
+                Arrays.asList("driver_instance", "database", "type"), 
Collections.emptyMap());
         ((MetricsCollectorFixture) MetricsCollectorRegistry.get(config, 
"FIXTURE")).reset();
-        ContextManagerHolder.remove("sharding_db");
+        ShardingSphereDataSourceContextHolder.remove(instanceId);
     }
     
     @Test
     void assertExport() {
-        ContextManagerHolder.put("sharding_db", 
mockContextManager("sharding_db"));
         Optional<GaugeMetricFamilyMetricsCollector> collector = new 
JDBCMetaDataInfoExporter().export("FIXTURE");
         assertTrue(collector.isPresent());
-        assertThat(collector.get().toString(), is("sharding_db=1, 
storage_unit_count=1"));
-    }
-    
-    private ContextManager mockContextManager(final String databaseName) {
-        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
-        
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
 mock(StorageUnit.class)));
-        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        when(result.getDatabase(databaseName)).thenReturn(database);
-        return result;
+        assertThat(collector.get().toString(), containsString(instanceId));
+        assertThat(collector.get().toString(), containsString(databaseName));
+        assertThat(collector.get().toString(), 
containsString("storage_unit_count"));
     }
 }
diff --git 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporterTest.java
 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporterTest.java
index bbbb49a99b2..c6fbee96225 100644
--- 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporterTest.java
+++ 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/jdbc/JDBCStateExporterTest.java
@@ -17,36 +17,66 @@
 
 package org.apache.shardingsphere.agent.plugin.metrics.core.exporter.impl.jdbc;
 
+import 
org.apache.shardingsphere.agent.plugin.core.context.ShardingSphereDataSourceContext;
+import 
org.apache.shardingsphere.agent.plugin.core.holder.ShardingSphereDataSourceContextHolder;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.MetricsCollectorRegistry;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.type.GaugeMetricFamilyMetricsCollector;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricCollectorType;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricConfiguration;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.fixture.collector.MetricsCollectorFixture;
-import org.apache.shardingsphere.driver.ShardingSphereDriver;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.state.instance.InstanceState;
+import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import java.sql.DriverManager;
-import java.sql.SQLException;
 import java.util.Optional;
+import java.util.UUID;
 
-import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class JDBCStateExporterTest {
     
+    private String instanceId;
+    
+    private String databaseName;
+    
+    @BeforeEach
+    void setUp() {
+        instanceId = UUID.randomUUID().toString();
+        databaseName = "sharding_db";
+        ContextManager contextManager = mockContextManager(instanceId, 
databaseName);
+        ShardingSphereDataSourceContextHolder.put(instanceId, new 
ShardingSphereDataSourceContext(databaseName, contextManager));
+    }
+    
+    private ContextManager mockContextManager(final String instanceId, final 
String databaseName) {
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        when(database.getName()).thenReturn(databaseName);
+        when(result.getDatabase(databaseName)).thenReturn(database);
+        
when(result.getComputeNodeInstanceContext().getInstance().getMetaData().getId()).thenReturn(instanceId);
+        
when(result.getComputeNodeInstanceContext().getInstance().getState().getCurrentState().ordinal()).thenReturn(InstanceState.OK.ordinal());
+        return result;
+    }
+    
     @AfterEach
-    void reset() {
+    void clean() {
         MetricConfiguration config = new MetricConfiguration("jdbc_state", 
MetricCollectorType.GAUGE_METRIC_FAMILY, "State of ShardingSphere-JDBC. 0 is 
OK; 1 is CIRCUIT BREAK");
         ((MetricsCollectorFixture) MetricsCollectorRegistry.get(config, 
"FIXTURE")).reset();
+        ShardingSphereDataSourceContextHolder.remove(instanceId);
     }
     
     @Test
-    void assertExport() throws SQLException {
-        DriverManager.registerDriver(new ShardingSphereDriver());
+    void assertExport() {
         Optional<GaugeMetricFamilyMetricsCollector> collector = new 
JDBCStateExporter().export("FIXTURE");
         assertTrue(collector.isPresent());
-        assertThat(collector.get().toString(), is("0"));
+        assertThat(collector.get().toString(), containsString(instanceId));
+        assertThat(collector.get().toString(), containsString(databaseName));
     }
 }

Reply via email to