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

zhangliang 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 1e690ee  Agent metrics spi (#8521)
1e690ee is described below

commit 1e690eef2a7f82ebe5111a9477cf51d82babb25c
Author: xiaoyu <[email protected]>
AuthorDate: Mon Dec 7 19:41:16 2020 +0800

    Agent metrics spi (#8521)
    
    * Add agent metrics spi
    
    * refactor name
    
    * fix checkstyle
    
    * spi refactor
    
    * refactor code
---
 .../agent/bootstrap/ShardingSphereAgent.java       | 14 +++----
 .../agent/core/ShardingSphereTransformer.java      | 18 ++++-----
 ...AgentPathLocator.java => AgentPathBuilder.java} | 16 ++++++--
 .../agent/core/config/AgentConfiguration.java      |  2 +
 .../core/config/AgentConfigurationLoader.java      |  4 +-
 .../AgentServiceProviderNotFoundException.java}    | 29 +++++---------
 .../{PluginLoader.java => AgentPluginLoader.java}  | 16 ++++----
 .../core/{utils => spi}/AgentServiceLoader.java    |  7 ++--
 .../agent/core/spi/AgentTypedSPI.java}             | 14 +++----
 .../agent/core/spi/AgentTypedSPIRegistry.java      | 46 ++++++++++++++++++++++
 .../shardingsphere-agent-plugins/pom.xml           |  6 +++
 .../agent/metrics/api/MetricsProvider.java         | 10 +++--
 .../agent/metrics/api/MetricsRegisterFactory.java  |  4 +-
 .../api/prometheus/PrometheusMetricsRegister.java  | 15 ++++++-
 .../PrometheusMetricsRegisterFactory.java          |  5 +++
 .../agent/plugin/trace/SamplePluginDefinition.java |  5 +--
 16 files changed, 140 insertions(+), 71 deletions(-)

diff --git 
a/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
 
b/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
index 90bfbc8..767cb0d 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-bootstrap/src/main/java/org/apache/shardingsphere/agent/bootstrap/ShardingSphereAgent.java
@@ -26,7 +26,7 @@ import org.apache.shardingsphere.agent.core.LoggingListener;
 import org.apache.shardingsphere.agent.core.ShardingSphereTransformer;
 import org.apache.shardingsphere.agent.core.config.AgentConfiguration;
 import org.apache.shardingsphere.agent.core.config.AgentConfigurationLoader;
-import org.apache.shardingsphere.agent.core.plugin.PluginLoader;
+import org.apache.shardingsphere.agent.core.plugin.AgentPluginLoader;
 import org.apache.shardingsphere.agent.core.utils.SingletonHolder;
 
 import java.io.IOException;
@@ -53,14 +53,14 @@ public class ShardingSphereAgent {
             .ignore(ElementMatchers.isSynthetic())
             
.or(ElementMatchers.nameStartsWith("org.apache.shardingsphere.agent."))
             
.or(ElementMatchers.not(ElementMatchers.nameStartsWith("org.apache.shardingsphere.")));
-        PluginLoader pluginLoader = PluginLoader.getInstance();
-        pluginLoader.initialAllServices();
-        builder.type(pluginLoader.typeMatcher())
-               .transform(new ShardingSphereTransformer(pluginLoader))
+        AgentPluginLoader agentPluginLoader = AgentPluginLoader.getInstance();
+        agentPluginLoader.initialAllServices();
+        builder.type(agentPluginLoader.typeMatcher())
+               .transform(new ShardingSphereTransformer(agentPluginLoader))
                .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
                .with(new LoggingListener())
                .installOn(instrumentation);
-        pluginLoader.startAllServices();
-        Runtime.getRuntime().addShutdownHook(new 
Thread(pluginLoader::shutdownAllServices));
+        agentPluginLoader.startAllServices();
+        Runtime.getRuntime().addShutdownHook(new 
Thread(agentPluginLoader::shutdownAllServices));
     }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
index 622a24c..890a32d 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereTransformer.java
@@ -28,7 +28,7 @@ import net.bytebuddy.implementation.SuperMethodCall;
 import net.bytebuddy.jar.asm.Opcodes;
 import net.bytebuddy.utility.JavaModule;
 import org.apache.shardingsphere.agent.core.plugin.PluginAdviceDefinition;
-import org.apache.shardingsphere.agent.core.plugin.PluginLoader;
+import org.apache.shardingsphere.agent.core.plugin.AgentPluginLoader;
 import 
org.apache.shardingsphere.agent.core.plugin.advice.ConstructorMethodInterceptor;
 import 
org.apache.shardingsphere.agent.core.plugin.advice.MethodAroundInterceptor;
 import 
org.apache.shardingsphere.agent.core.plugin.advice.StaticMethodAroundInterceptor;
@@ -45,22 +45,22 @@ import java.util.Map;
 @Slf4j
 public class ShardingSphereTransformer implements AgentBuilder.Transformer {
     
-    private final PluginLoader pluginLoader;
+    private final AgentPluginLoader agentPluginLoader;
     
-    public ShardingSphereTransformer(final PluginLoader pluginLoader) {
-        this.pluginLoader = pluginLoader;
+    public ShardingSphereTransformer(final AgentPluginLoader 
agentPluginLoader) {
+        this.agentPluginLoader = agentPluginLoader;
     }
     
     @Override
     public DynamicType.Builder<?> transform(final DynamicType.Builder<?> 
builder, final TypeDescription typeDescription, final ClassLoader classLoader, 
final JavaModule module) {
-        if (pluginLoader.containsType(typeDescription)) {
+        if (agentPluginLoader.containsType(typeDescription)) {
             DynamicType.Builder<?> newBuilder = 
builder.defineField("_SSExtraData_", Map.class, Opcodes.ACC_PRIVATE | 
Opcodes.ACC_VOLATILE)
                     .implement(TargetObject.class)
                     .intercept(FieldAccessor.ofField("_SSExtraData_"));
-            final PluginAdviceDefinition define = 
pluginLoader.loadPluginAdviceDefine(typeDescription);
+            final PluginAdviceDefinition define = 
agentPluginLoader.loadPluginAdviceDefine(typeDescription);
             for (ConstructorPoint point : define.getConstructorPoints()) {
                 try {
-                    final ConstructorMethodInterceptor interceptor = new 
ConstructorMethodInterceptor(pluginLoader.getOrCreateInstance(point.getAdvice()));
+                    final ConstructorMethodInterceptor interceptor = new 
ConstructorMethodInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
                     newBuilder = 
newBuilder.constructor(point.getConstructorMatcher())
                             
.intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration().to(interceptor)));
                     // CHECKSTYLE:OFF
@@ -71,7 +71,7 @@ public class ShardingSphereTransformer implements 
AgentBuilder.Transformer {
             }
             for (ClassStaticMethodPoint point : 
define.getClassStaticMethodPoints()) {
                 try {
-                    final StaticMethodAroundInterceptor interceptor = new 
StaticMethodAroundInterceptor(pluginLoader.getOrCreateInstance(point.getAdvice()));
+                    final StaticMethodAroundInterceptor interceptor = new 
StaticMethodAroundInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
                     newBuilder = 
newBuilder.method(point.getMethodsMatcher()).intercept(MethodDelegation.withDefaultConfiguration().to(interceptor));
                     // CHECKSTYLE:OFF
                 } catch (Exception e) {
@@ -81,7 +81,7 @@ public class ShardingSphereTransformer implements 
AgentBuilder.Transformer {
             }
             for (InstanceMethodPoint point : define.getInstanceMethodPoints()) 
{
                 try {
-                    final MethodAroundInterceptor interceptor = new 
MethodAroundInterceptor(pluginLoader.getOrCreateInstance(point.getAdvice()));
+                    final MethodAroundInterceptor interceptor = new 
MethodAroundInterceptor(agentPluginLoader.getOrCreateInstance(point.getAdvice()));
                     newBuilder = 
newBuilder.method(point.getMethodMatcher()).intercept(MethodDelegation.withDefaultConfiguration().to(interceptor));
                     // CHECKSTYLE:OFF
                 } catch (Exception e) {
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/common/AgentPathLocator.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/common/AgentPathBuilder.java
similarity index 87%
rename from 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/common/AgentPathLocator.java
rename to 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/common/AgentPathBuilder.java
index 081d2e9..ea337d2 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/common/AgentPathLocator.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/common/AgentPathBuilder.java
@@ -30,17 +30,21 @@ import 
org.apache.shardingsphere.agent.core.exception.ShardingSphereAgentExcepti
  * Agent path locator.
  */
 @Slf4j
-public final class AgentPathLocator {
+public final class AgentPathBuilder {
     
     @Getter
     private static File agentPath;
     
+    @Getter
+    private static File pluginPath;
+    
     static {
-        agentPath = locatorPath();
+        agentPath = buildAgentPath();
+        pluginPath = buildAgentPluginPath();
     }
     
-    private static File locatorPath() {
-        String classResourcePath = 
AgentPathLocator.class.getName().replaceAll("\\.", "/") + ".class";
+    private static File buildAgentPath() {
+        String classResourcePath = 
AgentPathBuilder.class.getName().replaceAll("\\.", "/") + ".class";
         URL resource = 
ClassLoader.getSystemClassLoader().getResource(classResourcePath);
         if (resource != null) {
             String url = resource.toString();
@@ -72,4 +76,8 @@ public final class AgentPathLocator {
             return null;
         }
     }
+    
+    private static File buildAgentPluginPath() {
+        return new File(agentPath.getPath() + "/plugins");
+    }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
index 8b5091a..fcd8184 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
@@ -36,6 +36,8 @@ public class AgentConfiguration {
     @Data
     public static class MetricsConfiguration {
         
+        private String type = "prometheus";
+        
         private String host;
         
         private int port = 9090;
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfigurationLoader.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfigurationLoader.java
index 94c9c7f..03f6366 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfigurationLoader.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfigurationLoader.java
@@ -22,7 +22,7 @@ import java.io.File;
 import java.io.IOException;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.agent.core.common.AgentPathLocator;
+import org.apache.shardingsphere.agent.core.common.AgentPathBuilder;
 import org.apache.shardingsphere.agent.core.yaml.YamlEngine;
 
 /**
@@ -43,7 +43,7 @@ public final class AgentConfigurationLoader {
      */
     public static AgentConfiguration load() throws IOException {
         String specifiedConfigPath = System.getProperty(SPECIFIED_CONFIG_PATH);
-        File configFile = null == specifiedConfigPath ? new 
File(AgentPathLocator.getAgentPath(), DEFAULT_CONFIG_PATH) : new 
File(specifiedConfigPath);
+        File configFile = null == specifiedConfigPath ? new 
File(AgentPathBuilder.getAgentPath(), DEFAULT_CONFIG_PATH) : new 
File(specifiedConfigPath);
         return loadAgentConfiguration(configFile);
     }
     
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/exception/AgentServiceProviderNotFoundException.java
similarity index 56%
copy from 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
copy to 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/exception/AgentServiceProviderNotFoundException.java
index 8b5091a..08dd483 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/config/AgentConfiguration.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/exception/AgentServiceProviderNotFoundException.java
@@ -15,31 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.config;
-
-import lombok.Data;
-
-import java.util.List;
+package org.apache.shardingsphere.agent.core.exception;
 
 /**
- * Agent configuration.
+ * Agent service provider not found exception.
  */
-@Data
-public class AgentConfiguration {
+public final class AgentServiceProviderNotFoundException extends 
RuntimeException {
     
-    private String applicationName;
+    private static final long serialVersionUID = -3730257541332863235L;
     
-    private MetricsConfiguration metrics;
-    
-    private List<String> activatedPlugins;
+    public AgentServiceProviderNotFoundException(final Class<?> clazz) {
+        super(String.format("No implementation class load from SPI `%s`.", 
clazz.getName()));
+    }
     
-    @Data
-    public static class MetricsConfiguration {
-        
-        private String host;
-        
-        private int port = 9090;
-        
-        private boolean jvmInformationCollectorEnabled;
+    public AgentServiceProviderNotFoundException(final Class<?> clazz, final 
String type) {
+        super(String.format("No implementation class load from SPI `%s` with 
type `%s`.", clazz.getName(), type));
     }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLoader.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
similarity index 94%
rename from 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLoader.java
rename to 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
index 1088c30..eeb35e5 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginLoader.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/AgentPluginLoader.java
@@ -29,7 +29,7 @@ import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.matcher.ElementMatcher;
 import net.bytebuddy.matcher.ElementMatchers;
 
-import org.apache.shardingsphere.agent.core.common.AgentPathLocator;
+import org.apache.shardingsphere.agent.core.common.AgentPathBuilder;
 import org.apache.shardingsphere.agent.core.config.AgentConfiguration;
 import org.apache.shardingsphere.agent.core.utils.SingletonHolder;
 
@@ -48,12 +48,12 @@ import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
 
 /**
- * Plugins loader.
+ * Agent plugin loader.
  */
 @Slf4j
-public final class PluginLoader extends ClassLoader implements Closeable {
+public final class AgentPluginLoader extends ClassLoader implements Closeable {
     
-    private static final PluginLoader INSTANCE = new PluginLoader();
+    private static final AgentPluginLoader INSTANCE = new AgentPluginLoader();
     
     private final ConcurrentHashMap<String, Object> objectPool = new 
ConcurrentHashMap<>();
     
@@ -65,7 +65,7 @@ public final class PluginLoader extends ClassLoader 
implements Closeable {
     
     private Map<String, PluginAdviceDefinition> pluginDefineMap;
     
-    private PluginLoader() {
+    private AgentPluginLoader() {
         try {
             pluginDefineMap = loadAllPlugins();
         } catch (IOException ioe) {
@@ -102,16 +102,16 @@ public final class PluginLoader extends ClassLoader 
implements Closeable {
     }
     
     /**
-     * To get plugin loader instance.
+     * To get agent plugin loader instance.
      *
      * @return plugin loader
      */
-    public static PluginLoader getInstance() {
+    public static AgentPluginLoader getInstance() {
         return INSTANCE;
     }
     
     private Map<String, PluginAdviceDefinition> loadAllPlugins() throws 
IOException {
-        File[] jarFiles = AgentPathLocator.getAgentPath().listFiles(file -> 
file.getName().endsWith(".jar"));
+        File[] jarFiles = AgentPathBuilder.getPluginPath().listFiles(file -> 
file.getName().endsWith(".jar"));
         ImmutableMap.Builder<String, PluginAdviceDefinition> pluginDefineMap = 
ImmutableMap.builder();
         if (jarFiles == null) {
             return pluginDefineMap.build();
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/utils/AgentServiceLoader.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
similarity index 93%
rename from 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/utils/AgentServiceLoader.java
rename to 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
index c6fdd2d..0b45846 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/utils/AgentServiceLoader.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentServiceLoader.java
@@ -15,12 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.utils;
+package org.apache.shardingsphere.agent.core.spi;
 
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -68,8 +67,8 @@ public final class AgentServiceLoader<T> {
      *
      * @return service instances
      */
-    public Optional<T> newServiceInstances() {
-        return serviceMap.get(service).stream().findFirst();
+    public Collection<T> newServiceInstances() {
+        return serviceMap.get(service);
     }
     
     private void register(final Class<T> service) {
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentTypedSPI.java
similarity index 77%
copy from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
copy to 
shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentTypedSPI.java
index f15f799..49e69ec 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentTypedSPI.java
@@ -15,17 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.metrics.api;
+package org.apache.shardingsphere.agent.core.spi;
 
 /**
- * Metrics register factory.
+ * Agent typed SPI.
  */
-public interface MetricsRegisterFactory {
+public interface AgentTypedSPI {
     
     /**
-     * New instance metrics register.
-     *
-     * @return the metrics register
+     * Get type.
+     * 
+     * @return type
      */
-    MetricsRegister newInstance();
+    String getType();
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentTypedSPIRegistry.java
 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentTypedSPIRegistry.java
new file mode 100644
index 0000000..60d2d52
--- /dev/null
+++ 
b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/spi/AgentTypedSPIRegistry.java
@@ -0,0 +1,46 @@
+/*
+ * 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.core.spi;
+
+import java.util.Optional;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.agent.core.exception.AgentServiceProviderNotFoundException;
+
+/**
+ *  Agent typed SPI registry.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class AgentTypedSPIRegistry {
+    
+    /**
+     * Get registered service.
+     * 
+     * @param typedSPIClass typed SPI class
+     * @param type type
+     * @param <T> type
+     * @return registered service
+     */
+    public static <T extends AgentTypedSPI> T getRegisteredService(final 
Class<T> typedSPIClass, final String type) {
+        Optional<T> serviceInstance = 
AgentServiceLoader.getServiceLoader(typedSPIClass).newServiceInstances().stream().filter(each
 -> each.getType().equalsIgnoreCase(type)).findFirst();
+        if (serviceInstance.isPresent()) {
+            return serviceInstance.get();
+        }
+        throw new AgentServiceProviderNotFoundException(typedSPIClass, type);
+    }
+}
diff --git a/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml 
b/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml
index 77a769a..ae62913 100644
--- a/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml
+++ b/shardingsphere-agent/shardingsphere-agent-plugins/pom.xml
@@ -72,6 +72,12 @@
                                     
<exclude>org.apache.commons:logging:*</exclude>
                                 </excludes>
                             </artifactSet>
+                            <relocations>
+                                <relocation>
+                                    <pattern>net.bytebuddy</pattern>
+                                    
<shadedPattern>${shade.package}.net.bytebuddy</shadedPattern>
+                                </relocation>
+                            </relocations>
                         </configuration>
                     </execution>
                 </executions>
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsProvider.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsProvider.java
index 3132fa1..aeab546 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsProvider.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsProvider.java
@@ -17,11 +17,12 @@
 
 package org.apache.shardingsphere.agent.metrics.api;
 
-import org.apache.shardingsphere.agent.core.utils.AgentServiceLoader;
-import 
org.apache.shardingsphere.agent.metrics.api.prometheus.PrometheusMetricsRegisterFactory;
+import org.apache.shardingsphere.agent.core.config.AgentConfiguration;
+import org.apache.shardingsphere.agent.core.spi.AgentTypedSPIRegistry;
+import org.apache.shardingsphere.agent.core.utils.SingletonHolder;
 
 /**
- * The enum Metrics provider.
+ * The enum metrics provider.
  */
 public enum MetricsProvider {
     
@@ -33,7 +34,8 @@ public enum MetricsProvider {
     private static MetricsRegisterFactory metricRegisterFactory;
     
     static {
-        metricRegisterFactory = 
AgentServiceLoader.getServiceLoader(MetricsRegisterFactory.class).newServiceInstances().orElse(new
 PrometheusMetricsRegisterFactory());
+        AgentConfiguration.MetricsConfiguration metricsConfiguration = 
SingletonHolder.INSTANCE.get(AgentConfiguration.class).getMetrics();
+        metricRegisterFactory = 
AgentTypedSPIRegistry.getRegisteredService(MetricsRegisterFactory.class, 
metricsConfiguration.getType());
     }
     
     /**
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
index f15f799..07aa45b 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/MetricsRegisterFactory.java
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.agent.metrics.api;
 
+import org.apache.shardingsphere.agent.core.spi.AgentTypedSPI;
+
 /**
  * Metrics register factory.
  */
-public interface MetricsRegisterFactory {
+public interface MetricsRegisterFactory extends AgentTypedSPI {
     
     /**
      * New instance metrics register.
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegister.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegister.java
index e03209f..223ce2a 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegister.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegister.java
@@ -46,9 +46,12 @@ public final class PrometheusMetricsRegister implements 
MetricsRegister {
     
     private final AgentConfiguration.MetricsConfiguration metricsConfiguration 
= SingletonHolder.INSTANCE.get(AgentConfiguration.class).getMetrics();
     
+    private HTTPServer httpServer;
+    
     private PrometheusMetricsRegister() {
         registerJvm();
         startServer();
+        registerClose();
     }
     
     /**
@@ -153,7 +156,7 @@ public final class PrometheusMetricsRegister implements 
MetricsRegister {
             inetSocketAddress = new InetSocketAddress(host, port);
         }
         try {
-            new HTTPServer(inetSocketAddress, 
CollectorRegistry.defaultRegistry, true);
+            httpServer = new HTTPServer(inetSocketAddress, 
CollectorRegistry.defaultRegistry, true);
             log.info(String.format("you start prometheus metrics http server 
host is: %s , port is: %s", inetSocketAddress.getPort(), 
inetSocketAddress.getPort()));
         } catch (IOException e) {
             log.error("you start prometheus metrics http server is error", e);
@@ -168,8 +171,16 @@ public final class PrometheusMetricsRegister implements 
MetricsRegister {
         }
     }
     
-    private static class PrometheusMetricsRegisterHolder {
+    private void registerClose() {
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            if (null != httpServer) {
+                httpServer.stop();
+            }
+        }));
+    }
     
+    private static class PrometheusMetricsRegisterHolder {
+        
         private static final PrometheusMetricsRegister INSTANCE = new 
PrometheusMetricsRegister();
     }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegisterFactory.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegisterFactory.java
index 5ce8db4..a3145c8 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegisterFactory.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-metrics/shardingsphere-agent-metrics-api/src/main/java/org/apache/shardingsphere/agent/metrics/api/prometheus/PrometheusMetricsRegisterFactory.java
@@ -29,4 +29,9 @@ public final class PrometheusMetricsRegisterFactory 
implements MetricsRegisterFa
     public MetricsRegister newInstance() {
         return PrometheusMetricsRegister.getInstance();
     }
+    
+    @Override
+    public String getType() {
+        return "prometheus";
+    }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
index 0695381..6166284 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracers/shardingsphere-agent-tracer-sample/src/main/java/org/apache/shardingsphere/agent/plugin/trace/SamplePluginDefinition.java
@@ -27,15 +27,14 @@ import 
org.apache.shardingsphere.agent.core.plugin.PluginDefinition;
 public class SamplePluginDefinition extends PluginDefinition {
 
     public SamplePluginDefinition() {
-        super("");
+        super("sample");
     }
 
     @Override
     protected void define() {
-        
intercept("org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask")
+        intercept("org.Test")
                 .aroundInstanceMethod(ElementMatchers.named("run"))
                 
.implement("org.apache.shardingsphere.agent.plugin.trace.SampleAdvice")
                 .build();
-        registerService(SampleTracer.class);
     }
 }

Reply via email to