[SCB-2588]circuit breaker provider a name to distinguish metrics (#3102)

diff --git a/governance/pom.xml b/governance/pom.xml
index 90f7eef..60eb64d 100644
--- a/governance/pom.xml
+++ b/governance/pom.xml
@@ -31,6 +31,10 @@
 
   <dependencies>
     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-common</artifactId>
+    </dependency>
+    <dependency>
       <groupId>io.github.resilience4j</groupId>
       <artifactId>resilience4j-all</artifactId>
     </dependency>
@@ -40,7 +44,7 @@
     </dependency>
     <dependency>
       <groupId>io.micrometer</groupId>
-      <artifactId>micrometer-registry-prometheus</artifactId>
+      <artifactId>micrometer-core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.aspectj</groupId>
@@ -86,8 +90,9 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>foundation-common</artifactId>
+      <groupId>io.micrometer</groupId>
+      <artifactId>micrometer-registry-prometheus</artifactId>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 </project>
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
index 5048618..65f2711 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
@@ -78,6 +78,7 @@
           .ofCircuitBreakerRegistry(circuitBreakerRegistry)
           .bindTo(meterRegistry);
     }
-    return circuitBreakerRegistry.circuitBreaker(policy.getName(), circuitBreakerConfig);
+    return circuitBreakerRegistry.circuitBreaker(
+        CircuitBreakerProperties.MATCH_CIRCUITBREAKER_KEY + "." + policy.getName(), circuitBreakerConfig);
   }
 }
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
index 8ab3333..ade1987 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
@@ -106,6 +106,8 @@
           .ofCircuitBreakerRegistry(circuitBreakerRegistry)
           .bindTo(meterRegistry);
     }
-    return circuitBreakerRegistry.circuitBreaker(governanceRequest.getInstanceId(), circuitBreakerConfig);
+    return circuitBreakerRegistry.circuitBreaker(InstanceIsolationProperties.MATCH_INSTANCE_ISOLATION_KEY
+        + "." + governanceRequest.getServiceName()
+        + "." + governanceRequest.getInstanceId(), circuitBreakerConfig);
   }
 }
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/InstanceIsolationTest.java b/governance/src/test/java/org/apache/servicecomb/governance/InstanceIsolationTest.java
index 86b19bf..a97c3c6 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/InstanceIsolationTest.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/InstanceIsolationTest.java
@@ -111,24 +111,24 @@
   private void assertMetricsNotFinish() {
     String result = ((PrometheusMeterRegistry) meterRegistry).scrape();
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_state{name=\"instance01\",state=\"open\",} 1.0"));
+        "resilience4j_circuitbreaker_state{name=\"servicecomb.instanceIsolation.service01.instance01\",state=\"open\",} 1.0"));
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_state{name=\"instance02\",state=\"closed\",} 1.0"));
+        "resilience4j_circuitbreaker_state{name=\"servicecomb.instanceIsolation.service01.instance02\",state=\"closed\",} 1.0"));
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance01\",} 1.0"));
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"servicecomb.instanceIsolation.service01.instance01\",} 1.0"));
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance02\",} 4.0"));
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"servicecomb.instanceIsolation.service01.instance02\",} 4.0"));
   }
 
   private void assertMetricsFinish() {
     String result = ((PrometheusMeterRegistry) meterRegistry).scrape();
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_state{name=\"instance01\",state=\"closed\",} 1.0"));
+        "resilience4j_circuitbreaker_state{name=\"servicecomb.instanceIsolation.service01.instance01\",state=\"closed\",} 1.0"));
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_state{name=\"instance02\",state=\"closed\",} 1.0"));
+        "resilience4j_circuitbreaker_state{name=\"servicecomb.instanceIsolation.service01.instance02\",state=\"closed\",} 1.0"));
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance01\",} 3.0"));
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"servicecomb.instanceIsolation.service01.instance01\",} 3.0"));
     Assertions.assertTrue(result.contains(
-        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance02\",} 6.0"));
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"servicecomb.instanceIsolation.service01.instance02\",} 6.0"));
   }
 }
diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DataFactory.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DataFactory.java
index 67f94c2..12ba905 100644
--- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DataFactory.java
+++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DataFactory.java
@@ -26,7 +26,7 @@
 import javax.inject.Inject;
 
 import org.apache.servicecomb.huaweicloud.dashboard.monitor.data.MonitorConstant;
-import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDaraProvider;
+import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataProvider;
 import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataPublisher;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,7 +41,7 @@
   private boolean hasStart = false;
 
   @Inject
-  private List<MonitorDaraProvider> dataProviders;
+  private List<MonitorDataProvider> dataProviders;
 
   @Inject
   private MonitorDataPublisher publisher;
@@ -54,7 +54,7 @@
     executorService = Executors.newScheduledThreadPool(CORE_SIZE, threadFactory);
   }
 
-  public void setMonitorDataProviders(List<MonitorDaraProvider> dataProviders) {
+  public void setMonitorDataProviders(List<MonitorDataProvider> dataProviders) {
     this.dataProviders = dataProviders;
   }
 
@@ -68,7 +68,7 @@
 
       StringBuilder sb = new StringBuilder();
       sb.append("Monitor data sender started. Configured data providers is {");
-      for (MonitorDaraProvider provider : dataProviders) {
+      for (MonitorDataProvider provider : dataProviders) {
         sb.append(provider.getClass().getName());
         sb.append(",");
       }
@@ -87,7 +87,7 @@
   }
 
   void sendData() {
-    for (MonitorDaraProvider provider : this.dataProviders) {
+    for (MonitorDataProvider provider : this.dataProviders) {
       if (provider.enabled()) {
         this.publisher.publish(provider);
       }
diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java
index 70b6e44..de350f7 100644
--- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java
+++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java
@@ -42,7 +42,7 @@
 import org.apache.servicecomb.http.client.common.HttpTransport;
 import org.apache.servicecomb.http.client.common.HttpTransportFactory;
 import org.apache.servicecomb.huaweicloud.dashboard.monitor.data.MonitorConstant;
-import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDaraProvider;
+import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataProvider;
 import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataPublisher;
 
 public class DefaultMonitorDataPublisher implements MonitorDataPublisher {
@@ -118,7 +118,7 @@
   }
 
   @Override
-  public void publish(MonitorDaraProvider provider) {
+  public void publish(MonitorDataProvider provider) {
     dashboardClient.sendData(provider.getURL(), provider.getData());
   }
 }
diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/HealthMonitorDataProvider.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/HealthMonitorDataProvider.java
index 7f0c9dd..1a00cc5 100644
--- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/HealthMonitorDataProvider.java
+++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/HealthMonitorDataProvider.java
@@ -23,7 +23,7 @@
 
 import org.apache.servicecomb.dashboard.client.model.InterfaceInfo;
 import org.apache.servicecomb.dashboard.client.model.MonitorData;
-import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDaraProvider;
+import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataProvider;
 
 import com.netflix.config.DynamicPropertyFactory;
 import com.netflix.hystrix.HystrixCircuitBreaker;
@@ -34,7 +34,7 @@
  * This provider depends on bizkeeper. Because Bizkeeper depends on Hystrix
  * and it is not in maintainence, will keep it here for compatible reason.
  */
-public class HealthMonitorDataProvider implements MonitorDaraProvider {
+public class HealthMonitorDataProvider implements MonitorDataProvider {
   @Override
   public boolean enabled() {
     return DynamicPropertyFactory.getInstance()
diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
index 6c0b4c7..ea8f2de 100644
--- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
+++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
@@ -24,7 +24,7 @@
 import org.apache.servicecomb.dashboard.client.model.MonitorData;
 import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.metrics.PolledEvent;
-import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDaraProvider;
+import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataProvider;
 import org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
 import org.apache.servicecomb.metrics.core.publish.PublishModelFactory;
 import org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel;
@@ -40,7 +40,7 @@
 /**
  * Monitor data based on metrics-core module.
  */
-public class MetricsMonitorDataProvider implements MonitorDaraProvider {
+public class MetricsMonitorDataProvider implements MonitorDataProvider {
 
   public static final String CODE_SUCCESS = "2[0-9]{2}";
 
diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDaraProvider.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataProvider.java
similarity index 98%
rename from huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDaraProvider.java
rename to huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataProvider.java
index bfe2155..ced4598 100644
--- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDaraProvider.java
+++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataProvider.java
@@ -33,7 +33,7 @@
 import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 
-public interface MonitorDaraProvider {
+public interface MonitorDataProvider {
   boolean enabled();
 
   default String getURL() {
diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataPublisher.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataPublisher.java
index a5b1012..7876c2e 100644
--- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataPublisher.java
+++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/model/MonitorDataPublisher.java
@@ -18,7 +18,7 @@
 package org.apache.servicecomb.huaweicloud.dashboard.monitor.model;
 
 public interface MonitorDataPublisher {
-  void publish(MonitorDaraProvider provider);
+  void publish(MonitorDataProvider provider);
 
   default void init() {
 
diff --git a/huawei-cloud/dashboard/src/test/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDaraProviderTest.java b/huawei-cloud/dashboard/src/test/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProviderTest.java
similarity index 96%
rename from huawei-cloud/dashboard/src/test/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDaraProviderTest.java
rename to huawei-cloud/dashboard/src/test/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProviderTest.java
index c3a1a55..c5411fe 100644
--- a/huawei-cloud/dashboard/src/test/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDaraProviderTest.java
+++ b/huawei-cloud/dashboard/src/test/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProviderTest.java
@@ -19,7 +19,7 @@
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-public class MetricsMonitorDaraProviderTest {
+public class MetricsMonitorDataProviderTest {
   @Test
   public void testCodeMatch() {
     Assertions.assertTrue("200".matches(MetricsMonitorDataProvider.CODE_SUCCESS));
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
index 64a191b..ef37c4f 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
@@ -17,8 +17,6 @@
 package org.apache.servicecomb.metrics.core.publish;
 
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.RunnableScheduledFuture;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadPoolExecutor;
 
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
@@ -28,9 +26,7 @@
 import org.junit.jupiter.api.Assertions;
 import org.junit.runners.MethodSorters;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.common.collect.Lists;
-import com.google.common.eventbus.EventBus;
 import com.netflix.spectator.api.DefaultRegistry;
 import com.netflix.spectator.api.ManualClock;
 import com.netflix.spectator.api.Registry;
@@ -38,24 +34,18 @@
 import com.netflix.spectator.api.patterns.ThreadPoolMonitor;
 
 import mockit.Expectations;
-import mockit.Mock;
-import mockit.MockUp;
+import mockit.Injectable;
 import mockit.Mocked;
 
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 public class TestThreadPoolPublishModelFactory {
-  protected EventBus eventBus = new EventBus();
-
   protected Registry registry = new DefaultRegistry(new ManualClock());
 
   @Mocked
-  ThreadPoolExecutor threadPoolExecutor;
-
-  @Mocked
   BlockingQueue<Runnable> queue;
 
   @Test
-  public void createDefaultPublishModel() throws JsonProcessingException {
+  public void createDefaultPublishModel(@Injectable ThreadPoolExecutor threadPoolExecutor) throws Exception {
     new Expectations() {
       {
         threadPoolExecutor.getQueue();
@@ -64,25 +54,15 @@
         result = 10d;
       }
     };
-    new MockUp<ScheduledThreadPoolExecutor>() {
-      @Mock
-      void delayedExecute(RunnableScheduledFuture<?> task) {
 
-      }
-    };
-    try {
-      ThreadPoolMonitor.attach(registry, threadPoolExecutor, "test");
+    ThreadPoolMonitor.attach(registry, threadPoolExecutor, "test");
 
-      PolledMeter.update(registry);
-      PublishModelFactory factory = new PublishModelFactory(Lists.newArrayList(registry.iterator()));
-      DefaultPublishModel model = factory.createDefaultPublishModel();
+    PolledMeter.update(registry);
+    PublishModelFactory factory = new PublishModelFactory(Lists.newArrayList(registry.iterator()));
+    DefaultPublishModel model = factory.createDefaultPublishModel();
 
-      Assertions.assertEquals(
-          "{\"test\":{\"avgTaskCount\":0.0,\"avgCompletedTaskCount\":0.0,\"currentThreadsBusy\":0,\"maxThreads\":0,\"poolSize\":0,\"corePoolSize\":0,\"queueSize\":10,\"rejected\":\"NaN\"}}",
-          JsonUtils.writeValueAsString(model.getThreadPools()));
-    } catch (Throwable e) {
-      e.printStackTrace();
-      Assertions.fail("unexpected error happen. " + e.getMessage());
-    }
+    Assertions.assertEquals(
+        "{\"test\":{\"avgTaskCount\":0.0,\"avgCompletedTaskCount\":0.0,\"currentThreadsBusy\":0,\"maxThreads\":0,\"poolSize\":0,\"corePoolSize\":0,\"queueSize\":10,\"rejected\":\"NaN\"}}",
+        JsonUtils.writeValueAsString(model.getThreadPools()));
   }
 }