You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2022/04/21 11:26:12 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2457] governance circuit breaker support metrics (#2793)

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 787b0f113 [SCB-2457] governance circuit breaker support metrics (#2793)
787b0f113 is described below

commit 787b0f113e70286720ae905bc11e7aa86d6e3e09
Author: liubao68 <bi...@qq.com>
AuthorDate: Thu Apr 21 19:26:06 2022 +0800

    [SCB-2457] governance circuit breaker support metrics (#2793)
---
 dependencies/default/pom.xml                       |  20 +--
 governance/pom.xml                                 |   8 ++
 .../governance/GovernanceConfiguration.java        | 152 +++++++++++++++++++++
 .../servicecomb/governance/MatchersManager.java    |   7 -
 .../handler/AbstractGovernanceHandler.java         |  14 +-
 .../governance/handler/BulkheadHandler.java        |   4 -
 .../governance/handler/CircuitBreakerHandler.java  |  18 ++-
 .../handler/InstanceIsolationHandler.java          |  35 ++++-
 .../governance/handler/RateLimitingHandler.java    |   4 -
 .../governance/handler/RetryHandler.java           |   4 -
 .../governance/marker/RequestProcessor.java        |   4 -
 .../marker/operator/CompareOperator.java           |   4 -
 .../marker/operator/ContainsOperator.java          |   3 -
 .../governance/marker/operator/ExactOperator.java  |   2 -
 .../governance/marker/operator/PrefixOperator.java |   2 -
 .../governance/marker/operator/SuffixOperator.java |   2 -
 .../governance/properties/BulkheadProperties.java  |   2 -
 .../properties/CircuitBreakerProperties.java       |   2 -
 .../properties/InstanceIsolationProperties.java    |   2 -
 .../governance/properties/MatchProperties.java     |   2 -
 .../governance/properties/RateLimitProperties.java |   2 -
 .../governance/properties/RetryProperties.java     |   2 -
 .../governance/service/MatchersServiceImpl.java    |   4 -
 .../servicecomb/governance/FlowControlTest.java    |   3 +-
 .../governance/GovernancePropertiesTest.java       |   3 +-
 .../governance/InstanceIsolationTest.java          |  47 ++++++-
 ...kRetryExtension.java => MockConfiguration.java} |  33 +++--
 .../governance/MockInvocationContext.java          |   3 -
 .../governance/MockMicroserviceMeta.java           |   3 -
 .../servicecomb/governance/MockRetryExtension.java |   2 -
 .../servicecomb/governance/OperatorTest.java       |   6 +-
 .../src/test/resources/META-INF/spring/bean.xml    |   3 +-
 .../metrics/prometheus/PrometheusPublisher.java    |   4 +-
 33 files changed, 289 insertions(+), 117 deletions(-)

diff --git a/dependencies/default/pom.xml b/dependencies/default/pom.xml
index 9002fbd8e..1e3e51620 100644
--- a/dependencies/default/pom.xml
+++ b/dependencies/default/pom.xml
@@ -83,7 +83,8 @@
     <netty.version>4.1.72.Final</netty.version>
     <okhttp3.version>3.14.2</okhttp3.version>
     <powermock.version>1.6.2</powermock.version>
-    <prometheus.version>0.6.0</prometheus.version>
+    <micrometer.version>1.8.5</micrometer.version>
+    <prometheus.version>0.12.0</prometheus.version>
     <protobuf.version>3.7.1</protobuf.version>
     <protostuff.version>1.5.9</protostuff.version>
     <protostuff-parser.version>2.2.25</protostuff-parser.version>
@@ -446,19 +447,18 @@
       </dependency>
 
       <dependency>
-        <groupId>io.prometheus</groupId>
-        <artifactId>simpleclient</artifactId>
-        <version>${prometheus.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>io.prometheus</groupId>
-        <artifactId>simpleclient_httpserver</artifactId>
-        <version>${prometheus.version}</version>
+        <groupId>io.micrometer</groupId>
+        <artifactId>micrometer-bom</artifactId>
+        <version>${micrometer.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>io.prometheus</groupId>
-        <artifactId>simpleclient_common</artifactId>
+        <artifactId>simpleclient_bom</artifactId>
         <version>${prometheus.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
       </dependency>
 
       <dependency>
diff --git a/governance/pom.xml b/governance/pom.xml
index c65107357..38e997adb 100644
--- a/governance/pom.xml
+++ b/governance/pom.xml
@@ -34,6 +34,14 @@
       <groupId>io.github.resilience4j</groupId>
       <artifactId>resilience4j-all</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.github.resilience4j</groupId>
+      <artifactId>resilience4j-micrometer</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.micrometer</groupId>
+      <artifactId>micrometer-registry-prometheus</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java b/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java
new file mode 100644
index 000000000..63b74ddd7
--- /dev/null
+++ b/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java
@@ -0,0 +1,152 @@
+/*
+ * 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.servicecomb.governance;
+
+import java.util.Map;
+
+import org.apache.servicecomb.governance.handler.BulkheadHandler;
+import org.apache.servicecomb.governance.handler.CircuitBreakerHandler;
+import org.apache.servicecomb.governance.handler.InstanceIsolationHandler;
+import org.apache.servicecomb.governance.handler.RateLimitingHandler;
+import org.apache.servicecomb.governance.handler.RetryHandler;
+import org.apache.servicecomb.governance.handler.ext.RetryExtension;
+import org.apache.servicecomb.governance.marker.RequestProcessor;
+import org.apache.servicecomb.governance.marker.operator.CompareOperator;
+import org.apache.servicecomb.governance.marker.operator.ContainsOperator;
+import org.apache.servicecomb.governance.marker.operator.ExactOperator;
+import org.apache.servicecomb.governance.marker.operator.MatchOperator;
+import org.apache.servicecomb.governance.marker.operator.PrefixOperator;
+import org.apache.servicecomb.governance.marker.operator.SuffixOperator;
+import org.apache.servicecomb.governance.properties.BulkheadProperties;
+import org.apache.servicecomb.governance.properties.CircuitBreakerProperties;
+import org.apache.servicecomb.governance.properties.InstanceIsolationProperties;
+import org.apache.servicecomb.governance.properties.MatchProperties;
+import org.apache.servicecomb.governance.properties.RateLimitProperties;
+import org.apache.servicecomb.governance.properties.RetryProperties;
+import org.apache.servicecomb.governance.service.MatchersService;
+import org.apache.servicecomb.governance.service.MatchersServiceImpl;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import io.micrometer.core.instrument.MeterRegistry;
+
+@Configuration
+public class GovernanceConfiguration {
+  // properties configuration
+  @Bean
+  public BulkheadProperties bulkheadProperties() {
+    return new BulkheadProperties();
+  }
+
+  @Bean
+  public CircuitBreakerProperties circuitBreakerProperties() {
+    return new CircuitBreakerProperties();
+  }
+
+  @Bean
+  public InstanceIsolationProperties instanceIsolationProperties() {
+    return new InstanceIsolationProperties();
+  }
+
+  @Bean
+  public MatchProperties matchProperties() {
+    return new MatchProperties();
+  }
+
+  @Bean
+  public RateLimitProperties rateLimitProperties() {
+    return new RateLimitProperties();
+  }
+
+  @Bean
+  public RetryProperties retryProperties() {
+    return new RetryProperties();
+  }
+
+  // handlers configuration
+  @Bean
+  public BulkheadHandler bulkheadHandler(BulkheadProperties bulkheadProperties) {
+    return new BulkheadHandler(bulkheadProperties);
+  }
+
+  @Bean
+  public CircuitBreakerHandler circuitBreakerHandler(CircuitBreakerProperties circuitBreakerProperties,
+      ObjectProvider<MeterRegistry> meterRegistry) {
+    return new CircuitBreakerHandler(circuitBreakerProperties, meterRegistry);
+  }
+
+  @Bean
+  public InstanceIsolationHandler instanceIsolationHandler(InstanceIsolationProperties instanceIsolationProperties,
+      ObjectProvider<MeterRegistry> meterRegistry) {
+    return new InstanceIsolationHandler(instanceIsolationProperties, meterRegistry);
+  }
+
+  @Bean
+  public RateLimitingHandler rateLimitingHandler(RateLimitProperties rateLimitProperties) {
+    return new RateLimitingHandler(rateLimitProperties);
+  }
+
+  @Bean
+  public RetryHandler retryHandler(RetryProperties retryProperties, RetryExtension retryExtension) {
+    return new RetryHandler(retryProperties, retryExtension);
+  }
+
+  // request processor
+  @Bean
+  public RequestProcessor requestProcessor(Map<String, MatchOperator> operatorMap) {
+    return new RequestProcessor(operatorMap);
+  }
+
+  // matchers
+  @Bean
+  public MatchersService matchersService(RequestProcessor requestProcessor, MatchProperties matchProperties) {
+    return new MatchersServiceImpl(requestProcessor, matchProperties);
+  }
+
+  @Bean
+  public MatchersManager matchersManager(MatchersService matchersService, InvocationContext invocationContext) {
+    return new MatchersManager(matchersService, invocationContext);
+  }
+
+  // operators
+  @Bean
+  public CompareOperator compareOperator() {
+    return new CompareOperator();
+  }
+
+  @Bean
+  public ContainsOperator containsOperator() {
+    return new ContainsOperator();
+  }
+
+  @Bean
+  public ExactOperator exactOperator() {
+    return new ExactOperator();
+  }
+
+  @Bean
+  public PrefixOperator prefixOperator() {
+    return new PrefixOperator();
+  }
+
+  @Bean
+  public SuffixOperator suffixOperator() {
+    return new SuffixOperator();
+  }
+}
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java b/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
index 1580af39d..1bb9a346e 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
@@ -22,24 +22,17 @@ import java.util.Map.Entry;
 import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.policy.AbstractPolicy;
 import org.apache.servicecomb.governance.service.MatchersService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
 public class MatchersManager {
   private MatchersService matchersService;
 
   private InvocationContext invocationContext;
 
-  @Autowired
   public MatchersManager(MatchersService matchersService, InvocationContext invocationContext) {
     this.matchersService = matchersService;
     this.invocationContext = invocationContext;
   }
 
-  public MatchersManager() {
-  }
-
   public <T extends AbstractPolicy> T match(GovernanceRequest request, Map<String, T> policies) {
     Map<String, Boolean> calculatedMatches = invocationContext.getCalculatedMatches();
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/AbstractGovernanceHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/AbstractGovernanceHandler.java
index 20aca3d12..e7bd3426b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/AbstractGovernanceHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/AbstractGovernanceHandler.java
@@ -30,7 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import com.google.common.eventbus.Subscribe;
 
 public abstract class AbstractGovernanceHandler<PROCESSOR, POLICY extends AbstractPolicy> {
-  private final Map<String, PROCESSOR> map = new ConcurrentHashMap<>();
+  protected final Map<String, PROCESSOR> processors = new ConcurrentHashMap<>();
 
   private final Object lock = new Object();
 
@@ -52,13 +52,13 @@ public abstract class AbstractGovernanceHandler<PROCESSOR, POLICY extends Abstra
     }
 
     String key = createKey(governanceRequest, policy);
-    PROCESSOR processor = map.get(key);
+    PROCESSOR processor = processors.get(key);
     if (processor == null) {
       synchronized (lock) {
-        processor = map.get(key);
+        processor = processors.get(key);
         if (processor == null) {
           processor = createProcessor(governanceRequest, policy);
-          map.put(key, processor);
+          processors.put(key, processor);
         }
       }
     }
@@ -71,8 +71,12 @@ public abstract class AbstractGovernanceHandler<PROCESSOR, POLICY extends Abstra
 
   abstract protected PROCESSOR createProcessor(GovernanceRequest governanceRequest, POLICY policy);
 
+  protected void onConfigurationChanged(String key) {
+    processors.remove(key);
+  }
+
   @Subscribe
   public void onDynamicConfigurationListener(GovernanceConfigurationChangedEvent event) {
-    event.getChangedConfigurations().forEach(v -> map.remove(v));
+    event.getChangedConfigurations().forEach(v -> onConfigurationChanged(v));
   }
 }
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
index e32c0d998..fea76a617 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
@@ -24,20 +24,16 @@ import org.apache.servicecomb.governance.policy.BulkheadPolicy;
 import org.apache.servicecomb.governance.properties.BulkheadProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
 import io.github.resilience4j.bulkhead.Bulkhead;
 import io.github.resilience4j.bulkhead.BulkheadConfig;
 import io.github.resilience4j.bulkhead.BulkheadRegistry;
 
-@Component
 public class BulkheadHandler extends AbstractGovernanceHandler<Bulkhead, BulkheadPolicy> {
   private static final Logger LOGGER = LoggerFactory.getLogger(BulkheadHandler.class);
 
   private final BulkheadProperties bulkheadProperties;
 
-  @Autowired
   public BulkheadHandler(BulkheadProperties bulkheadProperties) {
     this.bulkheadProperties = bulkheadProperties;
   }
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 e7193bc0a..b1bed54ae 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
@@ -23,22 +23,25 @@ import org.apache.servicecomb.governance.policy.CircuitBreakerPolicy;
 import org.apache.servicecomb.governance.properties.CircuitBreakerProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
+import org.springframework.beans.factory.ObjectProvider;
 
 import io.github.resilience4j.circuitbreaker.CircuitBreaker;
 import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
 import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
+import io.github.resilience4j.micrometer.tagged.TaggedCircuitBreakerMetrics;
+import io.micrometer.core.instrument.MeterRegistry;
 
-@Component
 public class CircuitBreakerHandler extends AbstractGovernanceHandler<CircuitBreaker, CircuitBreakerPolicy> {
   private static final Logger LOGGER = LoggerFactory.getLogger(CircuitBreakerHandler.class);
 
   private final CircuitBreakerProperties circuitBreakerProperties;
 
-  @Autowired
-  public CircuitBreakerHandler(CircuitBreakerProperties circuitBreakerProperties) {
+  private final MeterRegistry meterRegistry;
+
+  public CircuitBreakerHandler(CircuitBreakerProperties circuitBreakerProperties,
+      ObjectProvider<MeterRegistry> meterRegistry) {
     this.circuitBreakerProperties = circuitBreakerProperties;
+    this.meterRegistry = meterRegistry.getIfAvailable();
   }
 
   @Override
@@ -70,6 +73,11 @@ public class CircuitBreakerHandler extends AbstractGovernanceHandler<CircuitBrea
         .slidingWindowSize(Integer.valueOf(policy.getSlidingWindowSize()))
         .build();
     CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
+    if (meterRegistry != null) {
+      TaggedCircuitBreakerMetrics
+          .ofCircuitBreakerRegistry(circuitBreakerRegistry)
+          .bindTo(meterRegistry);
+    }
     return circuitBreakerRegistry.circuitBreaker(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 1299e6efe..c79887038 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
@@ -25,14 +25,14 @@ import org.apache.servicecomb.governance.policy.CircuitBreakerPolicy;
 import org.apache.servicecomb.governance.properties.InstanceIsolationProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
+import org.springframework.beans.factory.ObjectProvider;
 
 import io.github.resilience4j.circuitbreaker.CircuitBreaker;
 import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
 import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
+import io.github.resilience4j.micrometer.tagged.TaggedCircuitBreakerMetrics;
+import io.micrometer.core.instrument.MeterRegistry;
 
-@Component
 public class InstanceIsolationHandler extends AbstractGovernanceHandler<CircuitBreaker, CircuitBreakerPolicy> {
   private static final Logger LOGGER = LoggerFactory.getLogger(CircuitBreakerHandler.class);
 
@@ -40,14 +40,30 @@ public class InstanceIsolationHandler extends AbstractGovernanceHandler<CircuitB
 
   private final InstanceIsolationProperties instanceIsolationProperties;
 
-  @Autowired
-  public InstanceIsolationHandler(InstanceIsolationProperties instanceIsolationProperties) {
+  private final MeterRegistry meterRegistry;
+
+  public InstanceIsolationHandler(InstanceIsolationProperties instanceIsolationProperties,
+      ObjectProvider<MeterRegistry> meterRegistry) {
     this.instanceIsolationProperties = instanceIsolationProperties;
+    this.meterRegistry = meterRegistry.getIfAvailable();
   }
 
   @Override
   protected String createKey(GovernanceRequest governanceRequest, CircuitBreakerPolicy policy) {
-    return InstanceIsolationProperties.MATCH_INSTANCE_ISOLATION_KEY + "." + governanceRequest.getInstanceId();
+    return InstanceIsolationProperties.MATCH_INSTANCE_ISOLATION_KEY
+        + "." + governanceRequest.getServiceId()
+        + "." + governanceRequest.getInstanceId();
+  }
+
+  @Override
+  protected void onConfigurationChanged(String key) {
+    if (key.startsWith(InstanceIsolationProperties.MATCH_INSTANCE_ISOLATION_KEY)) {
+      for (String processorKey : processors.keySet()) {
+        if (processorKey.startsWith(key)) {
+          processors.remove(processorKey);
+        }
+      }
+    }
   }
 
   @Override
@@ -82,9 +98,14 @@ public class InstanceIsolationHandler extends AbstractGovernanceHandler<CircuitB
         .permittedNumberOfCallsInHalfOpenState(policy.getPermittedNumberOfCallsInHalfOpenState())
         .minimumNumberOfCalls(policy.getMinimumNumberOfCalls())
         .slidingWindowType(policy.getSlidingWindowTypeEnum())
-        .slidingWindowSize(Integer.valueOf(policy.getSlidingWindowSize()))
+        .slidingWindowSize(Integer.parseInt(policy.getSlidingWindowSize()))
         .build();
     CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
+    if (meterRegistry != null) {
+      TaggedCircuitBreakerMetrics
+          .ofCircuitBreakerRegistry(circuitBreakerRegistry)
+          .bindTo(meterRegistry);
+    }
     return circuitBreakerRegistry.circuitBreaker(governanceRequest.getInstanceId(), circuitBreakerConfig);
   }
 }
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
index 72a76b8cf..aa3ee9f2b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
@@ -23,20 +23,16 @@ import org.apache.servicecomb.governance.policy.RateLimitingPolicy;
 import org.apache.servicecomb.governance.properties.RateLimitProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
 import io.github.resilience4j.ratelimiter.RateLimiter;
 import io.github.resilience4j.ratelimiter.RateLimiterConfig;
 import io.github.resilience4j.ratelimiter.RateLimiterRegistry;
 
-@Component
 public class RateLimitingHandler extends AbstractGovernanceHandler<RateLimiter, RateLimitingPolicy> {
   private static final Logger LOGGER = LoggerFactory.getLogger(RateLimitingHandler.class);
 
   private final RateLimitProperties rateLimitProperties;
 
-  @Autowired
   public RateLimitingHandler(RateLimitProperties rateLimitProperties) {
     this.rateLimitProperties = rateLimitProperties;
   }
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
index ba8092584..42898c58b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
@@ -25,15 +25,12 @@ import org.apache.servicecomb.governance.properties.RetryProperties;
 import org.apache.servicecomb.governance.utils.GovernanceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
 import io.github.resilience4j.core.IntervalFunction;
 import io.github.resilience4j.retry.Retry;
 import io.github.resilience4j.retry.RetryConfig;
 import io.github.resilience4j.retry.RetryRegistry;
 
-@Component
 public class RetryHandler extends AbstractGovernanceHandler<Retry, RetryPolicy> {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(RetryHandler.class);
@@ -42,7 +39,6 @@ public class RetryHandler extends AbstractGovernanceHandler<Retry, RetryPolicy>
 
   private final RetryExtension retryExtension;
 
-  @Autowired
   public RetryHandler(RetryProperties retryProperties, RetryExtension retryExtension) {
     this.retryProperties = retryProperties;
     this.retryExtension = retryExtension;
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
index ad899fa8a..95f26b89a 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
@@ -23,10 +23,7 @@ import org.apache.servicecomb.governance.marker.operator.MatchOperator;
 import org.apache.servicecomb.governance.marker.operator.RawOperator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
 public class RequestProcessor {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(RequestProcessor.class);
@@ -35,7 +32,6 @@ public class RequestProcessor {
 
   private final Map<String, MatchOperator> operatorMap;
 
-  @Autowired
   public RequestProcessor(Map<String, MatchOperator> operatorMap) {
     this.operatorMap = operatorMap;
   }
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/CompareOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/CompareOperator.java
index 7e44f1089..ff491ecef 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/CompareOperator.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/CompareOperator.java
@@ -19,12 +19,8 @@ package org.apache.servicecomb.governance.marker.operator;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.springframework.stereotype.Component;
-
 import org.apache.servicecomb.governance.exception.IllegalArgsOperatorException;
 
-
-@Component
 public class CompareOperator implements MatchOperator {
 
   private final Set<Character> charSet = new HashSet<>();
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ContainsOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ContainsOperator.java
index 8e8327069..a5bb935f9 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ContainsOperator.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ContainsOperator.java
@@ -16,9 +16,6 @@
  */
 package org.apache.servicecomb.governance.marker.operator;
 
-import org.springframework.stereotype.Component;
-
-@Component
 public class ContainsOperator implements MatchOperator {
 
   @Override
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java
index 0a614279e..139d2f8cd 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java
@@ -17,9 +17,7 @@
 package org.apache.servicecomb.governance.marker.operator;
 
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Component;
 
-@Component
 public class ExactOperator implements MatchOperator {
 
   @Override
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java
index 5fbf61107..e211d0d60 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java
@@ -18,9 +18,7 @@
 package org.apache.servicecomb.governance.marker.operator;
 
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Component;
 
-@Component
 public class PrefixOperator implements MatchOperator {
   @Override
   public boolean match(String requestValue, String patternValue) {
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java
index 3e4a2241c..712b00b6b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java
@@ -18,9 +18,7 @@
 package org.apache.servicecomb.governance.marker.operator;
 
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Component;
 
-@Component
 public class SuffixOperator implements MatchOperator {
   @Override
   public boolean match(String requestValue, String patternValue) {
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/properties/BulkheadProperties.java b/governance/src/main/java/org/apache/servicecomb/governance/properties/BulkheadProperties.java
index 2e340b786..28daf0018 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/properties/BulkheadProperties.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/properties/BulkheadProperties.java
@@ -18,9 +18,7 @@
 package org.apache.servicecomb.governance.properties;
 
 import org.apache.servicecomb.governance.policy.BulkheadPolicy;
-import org.springframework.stereotype.Component;
 
-@Component
 public class BulkheadProperties extends PolicyProperties<BulkheadPolicy> {
   public static final String MATCH_BULKHEAD__KEY = "servicecomb.bulkhead";
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/properties/CircuitBreakerProperties.java b/governance/src/main/java/org/apache/servicecomb/governance/properties/CircuitBreakerProperties.java
index 578d34604..9b04fd0a9 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/properties/CircuitBreakerProperties.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/properties/CircuitBreakerProperties.java
@@ -17,9 +17,7 @@
 package org.apache.servicecomb.governance.properties;
 
 import org.apache.servicecomb.governance.policy.CircuitBreakerPolicy;
-import org.springframework.stereotype.Component;
 
-@Component
 public class CircuitBreakerProperties extends PolicyProperties<CircuitBreakerPolicy> {
   public static final String MATCH_CIRCUITBREAKER_KEY = "servicecomb.circuitBreaker";
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/properties/InstanceIsolationProperties.java b/governance/src/main/java/org/apache/servicecomb/governance/properties/InstanceIsolationProperties.java
index 2d9c478ab..0f773ed7b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/properties/InstanceIsolationProperties.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/properties/InstanceIsolationProperties.java
@@ -18,9 +18,7 @@
 package org.apache.servicecomb.governance.properties;
 
 import org.apache.servicecomb.governance.policy.CircuitBreakerPolicy;
-import org.springframework.stereotype.Component;
 
-@Component
 public class InstanceIsolationProperties extends PolicyProperties<CircuitBreakerPolicy> {
   public static final String MATCH_INSTANCE_ISOLATION_KEY = "servicecomb.instanceIsolation";
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java b/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
index 3188f90df..ca551e9c7 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
@@ -17,9 +17,7 @@
 package org.apache.servicecomb.governance.properties;
 
 import org.apache.servicecomb.governance.marker.TrafficMarker;
-import org.springframework.stereotype.Component;
 
-@Component
 public class MatchProperties extends GovernanceProperties<TrafficMarker> {
   public static final String MATCH_POLICY_KEY = "servicecomb.matchGroup";
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/properties/RateLimitProperties.java b/governance/src/main/java/org/apache/servicecomb/governance/properties/RateLimitProperties.java
index 472901cf8..7aa5daef8 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/properties/RateLimitProperties.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/properties/RateLimitProperties.java
@@ -18,9 +18,7 @@ package org.apache.servicecomb.governance.properties;
 
 
 import org.apache.servicecomb.governance.policy.RateLimitingPolicy;
-import org.springframework.stereotype.Component;
 
-@Component
 public class RateLimitProperties extends PolicyProperties<RateLimitingPolicy> {
   public static final String MATCH_RATE_LIMIT_KEY = "servicecomb.rateLimiting";
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/properties/RetryProperties.java b/governance/src/main/java/org/apache/servicecomb/governance/properties/RetryProperties.java
index 483ea5297..b19d44653 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/properties/RetryProperties.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/properties/RetryProperties.java
@@ -17,9 +17,7 @@
 package org.apache.servicecomb.governance.properties;
 
 import org.apache.servicecomb.governance.policy.RetryPolicy;
-import org.springframework.stereotype.Component;
 
-@Component
 public class RetryProperties extends PolicyProperties<RetryPolicy> {
   public static final String MATCH_RETRY_KEY = "servicecomb.retry";
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java b/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
index f17b938d9..b4d09af24 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
@@ -23,16 +23,12 @@ import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.marker.RequestProcessor;
 import org.apache.servicecomb.governance.marker.TrafficMarker;
 import org.apache.servicecomb.governance.properties.MatchProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
 public class MatchersServiceImpl implements MatchersService {
   private final RequestProcessor requestProcessor;
 
   private final MatchProperties matchProperties;
 
-  @Autowired
   public MatchersServiceImpl(RequestProcessor requestProcessor, MatchProperties matchProperties) {
     this.requestProcessor = requestProcessor;
     this.matchProperties = matchProperties;
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java b/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
index 304758512..3a6288f58 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
@@ -27,7 +27,6 @@ import org.apache.servicecomb.governance.properties.RateLimitProperties;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ContextConfiguration;
 
@@ -37,7 +36,7 @@ import io.github.resilience4j.ratelimiter.RateLimiter;
 import io.github.resilience4j.ratelimiter.RequestNotPermitted;
 
 @SpringBootTest
-@ContextConfiguration(locations = "classpath:META-INF/spring/*.xml", initializers = ConfigDataApplicationContextInitializer.class)
+@ContextConfiguration(classes = {GovernanceConfiguration.class, MockConfiguration.class})
 public class FlowControlTest {
   private RateLimitingHandler rateLimitingHandler;
 
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java b/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
index 93394b3ed..6f6bbc05d 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
@@ -45,7 +45,6 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.core.env.ConfigurableEnvironment;
 import org.springframework.core.env.EnumerablePropertySource;
@@ -53,7 +52,7 @@ import org.springframework.core.env.Environment;
 import org.springframework.test.context.ContextConfiguration;
 
 @SpringBootTest
-@ContextConfiguration(locations = "classpath:META-INF/spring/*.xml", initializers = ConfigDataApplicationContextInitializer.class)
+@ContextConfiguration(classes = {GovernanceConfiguration.class, MockConfiguration.class})
 public class GovernancePropertiesTest {
   private List<GovernanceProperties<? extends AbstractPolicy>> propertiesList;
 
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 ecb6709ab..fa242196e 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/InstanceIsolationTest.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/InstanceIsolationTest.java
@@ -24,25 +24,27 @@ import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ContextConfiguration;
 
 import io.github.resilience4j.circuitbreaker.CircuitBreaker;
 import io.github.resilience4j.decorators.Decorators;
 import io.github.resilience4j.decorators.Decorators.DecorateCheckedSupplier;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.prometheus.PrometheusMeterRegistry;
 
 @SpringBootTest
-@ContextConfiguration(locations = "classpath:META-INF/spring/*.xml", initializers = ConfigDataApplicationContextInitializer.class)
+@ContextConfiguration(classes = {GovernanceConfiguration.class, MockConfiguration.class})
 public class InstanceIsolationTest {
   private InstanceIsolationHandler instanceIsolationHandler;
 
+  private MeterRegistry meterRegistry;
+
   @Autowired
-  public void setInstanceIsolationHandler(InstanceIsolationHandler instanceIsolationHandler) {
+  public void setInstanceIsolationHandler(InstanceIsolationHandler instanceIsolationHandler,
+      MeterRegistry meterRegistry) {
     this.instanceIsolationHandler = instanceIsolationHandler;
-  }
-
-  public InstanceIsolationTest() {
+    this.meterRegistry = meterRegistry;
   }
 
   @Test
@@ -71,6 +73,11 @@ public class InstanceIsolationTest {
 
     // isolation from error
     Assertions.assertEquals("test", ds.get());
+    Assertions.assertThrows(RuntimeException.class, () -> ds.get());
+
+    Assertions.assertThrows(RuntimeException.class, () -> ds.get());
+    Assertions.assertThrows(RuntimeException.class, () -> ds.get());
+
     Assertions.assertThrows(RuntimeException.class, () -> ds.get());
     Assertions.assertThrows(RuntimeException.class, () -> ds.get());
     Assertions.assertThrows(RuntimeException.class, () -> ds.get());
@@ -88,6 +95,8 @@ public class InstanceIsolationTest {
     Assertions.assertEquals("test", ds2.get());
     Assertions.assertEquals("test", ds2.get());
 
+    assertMetricsNotFinish();
+
     // recover from isolation
     Thread.sleep(1000);
 
@@ -95,5 +104,31 @@ public class InstanceIsolationTest {
     Assertions.assertEquals("test", ds.get());
     Assertions.assertEquals("test", ds2.get());
     Assertions.assertEquals("test", ds2.get());
+
+    assertMetricsFinish();
+  }
+
+  private void assertMetricsNotFinish() {
+    String result = ((PrometheusMeterRegistry) meterRegistry).scrape();
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_state{name=\"instance01\",state=\"open\",} 1.0"));
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_state{name=\"instance02\",state=\"closed\",} 1.0"));
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance01\",} 1.0"));
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance02\",} 4.0"));
+  }
+
+  private void assertMetricsFinish() {
+    String result = ((PrometheusMeterRegistry) meterRegistry).scrape();
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_state{name=\"instance01\",state=\"closed\",} 1.0"));
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_state{name=\"instance02\",state=\"closed\",} 1.0"));
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance01\",} 3.0"));
+    Assertions.assertTrue(result.contains(
+        "resilience4j_circuitbreaker_calls_seconds_count{kind=\"successful\",name=\"instance02\",} 6.0"));
   }
 }
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java b/governance/src/test/java/org/apache/servicecomb/governance/MockConfiguration.java
similarity index 54%
copy from governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java
copy to governance/src/test/java/org/apache/servicecomb/governance/MockConfiguration.java
index 1ca9b4dae..20c5605e5 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/MockConfiguration.java
@@ -17,20 +17,31 @@
 
 package org.apache.servicecomb.governance;
 
-import java.util.List;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
-import org.apache.servicecomb.governance.handler.ext.RetryExtension;
-import org.springframework.stereotype.Component;
+import io.micrometer.prometheus.PrometheusConfig;
+import io.micrometer.prometheus.PrometheusMeterRegistry;
 
-@Component
-public class MockRetryExtension implements RetryExtension {
-  @Override
-  public boolean isRetry(List<String> statusList, Object result) {
-    return false;
+@Configuration
+public class MockConfiguration {
+  @Bean
+  public MockInvocationContext mockInvocationContext() {
+    return new MockInvocationContext();
   }
 
-  @Override
-  public boolean isRetry(Throwable e) {
-    return false;
+  @Bean
+  public MockMicroserviceMeta mockMicroserviceMeta() {
+    return new MockMicroserviceMeta();
+  }
+
+  @Bean
+  public MockRetryExtension mockRetryExtension() {
+    return new MockRetryExtension();
+  }
+
+  @Bean
+  public PrometheusMeterRegistry meterRegistry() {
+    return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
   }
 }
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/MockInvocationContext.java b/governance/src/test/java/org/apache/servicecomb/governance/MockInvocationContext.java
index c9ae43922..7c3e92705 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/MockInvocationContext.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/MockInvocationContext.java
@@ -21,9 +21,6 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.springframework.stereotype.Component;
-
-@Component
 public class MockInvocationContext implements InvocationContext {
   private final ThreadLocal<Map<String, Boolean>> context = new ThreadLocal<>();
 
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java b/governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java
index 552c5209d..ca68e2b3a 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java
@@ -17,9 +17,6 @@
 
 package org.apache.servicecomb.governance;
 
-import org.springframework.stereotype.Component;
-
-@Component
 public class MockMicroserviceMeta implements MicroserviceMeta {
   @Override
   public String getName() {
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java b/governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java
index 1ca9b4dae..d451f6e25 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/MockRetryExtension.java
@@ -20,9 +20,7 @@ package org.apache.servicecomb.governance;
 import java.util.List;
 
 import org.apache.servicecomb.governance.handler.ext.RetryExtension;
-import org.springframework.stereotype.Component;
 
-@Component
 public class MockRetryExtension implements RetryExtension {
   @Override
   public boolean isRetry(List<String> statusList, Object result) {
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java b/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java
index c984c06ec..82af09083 100644
--- a/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java
+++ b/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java
@@ -30,12 +30,11 @@ import org.apache.servicecomb.governance.policy.RetryPolicy;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ContextConfiguration;
 
 @SpringBootTest
-@ContextConfiguration(locations = "classpath:META-INF/spring/*.xml", initializers = ConfigDataApplicationContextInitializer.class)
+@ContextConfiguration(classes = {GovernanceConfiguration.class, MockConfiguration.class})
 public class OperatorTest {
   private RequestProcessor requestProcessor;
 
@@ -44,9 +43,6 @@ public class OperatorTest {
     this.requestProcessor = requestProcessor;
   }
 
-  public OperatorTest() {
-  }
-
   @Test
   public void test_unknown_operator() {
     GovernanceRequest request = new GovernanceRequest();
diff --git a/governance/src/test/resources/META-INF/spring/bean.xml b/governance/src/test/resources/META-INF/spring/bean.xml
index 69f523757..f93824417 100644
--- a/governance/src/test/resources/META-INF/spring/bean.xml
+++ b/governance/src/test/resources/META-INF/spring/bean.xml
@@ -18,10 +18,9 @@
 
 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:cse="http://www.huawei.com/schema/paas/cse/rpc"
   xsi:schemaLocation="
 		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
-  <context:component-scan base-package="org.apache.servicecomb.router,org.apache.servicecomb.governance"/>
+  <context:component-scan base-package="org.apache.servicecomb.router"/>
 </beans>
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
index 18dd87a90..877d77882 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
@@ -94,7 +94,7 @@ public class PrometheusPublisher extends Collector implements Collector.Describa
       }
     }
 
-    familySamples.add(new MetricFamilySamples("ServiceComb_Metrics", Type.UNTYPED, "ServiceComb Metrics", samples));
+    familySamples.add(new MetricFamilySamples("ServiceComb_Metrics", Type.UNKNOWN, "ServiceComb Metrics", samples));
 
     return familySamples;
   }
@@ -126,7 +126,7 @@ public class PrometheusPublisher extends Collector implements Collector.Describa
       return;
     }
 
-    httpServer.stop();
+    httpServer.close();
     httpServer = null;
     LOGGER.info("Prometheus httpServer stopped.");
   }