wu-sheng closed pull request #829:  [Agent] Support hystrix plugin
URL: https://github.com/apache/incubator-skywalking/pull/829
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/ServerTypeDefine.java
 
b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/ServerTypeDefine.java
index 71e2ae346..61a91fb66 100644
--- 
a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/ServerTypeDefine.java
+++ 
b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/register/ServerTypeDefine.java
@@ -32,7 +32,7 @@
     private ServerType[] serverTypes;
 
     private ServerTypeDefine() {
-        this.serverTypes = new ServerType[29];
+        this.serverTypes = new ServerType[30];
         this.serverTypeNames = new String[11];
         addServerType(new ServerType(ComponentsDefine.TOMCAT.getId(), 
Const.NONE, Const.EMPTY_STRING));
         addServerType(new ServerType(ComponentsDefine.HTTPCLIENT.getId(), 
Const.NONE, Const.EMPTY_STRING));
@@ -62,6 +62,7 @@ private ServerTypeDefine() {
         addServerType(new 
ServerType(ComponentsDefine.HTTP_ASYNC_CLIENT.getId(), Const.NONE, 
Const.EMPTY_STRING));
         addServerType(new ServerType(ComponentsDefine.KAFKA.getId(), 10, 
ComponentsDefine.KAFKA.getName()));
         addServerType(new ServerType(ComponentsDefine.SERVICECOMB.getId(), 
Const.NONE, ComponentsDefine.SERVICECOMB.getName()));
+        addServerType(new ServerType(ComponentsDefine.HYSTRIX.getId(), 
Const.NONE, ComponentsDefine.HYSTRIX.getName()));
     }
 
     public static ServerTypeDefine getInstance() {
diff --git 
a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
 
b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
index fa6e9c24e..40bc356f3 100644
--- 
a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
+++ 
b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
@@ -82,6 +82,8 @@
   
     public static final OfficialComponent SERVICECOMB = new 
OfficialComponent(28, "ServiceComb");
 
+    public static final OfficialComponent HYSTRIX =  new OfficialComponent(29, 
"Hystrix");
+
     private static ComponentsDefine INSTANCE = new ComponentsDefine();
 
     private String[] components;
@@ -91,7 +93,7 @@ public static ComponentsDefine getInstance() {
     }
 
     public ComponentsDefine() {
-        components = new String[29];
+        components = new String[30];
         addComponent(TOMCAT);
         addComponent(HTTPCLIENT);
         addComponent(DUBBO);
@@ -120,6 +122,7 @@ public ComponentsDefine() {
         addComponent(HTTP_ASYNC_CLIENT);
         addComponent(KAFKA);
         addComponent(SERVICECOMB);
+        addComponent(HYSTRIX);
     }
 
     private void addComponent(OfficialComponent component) {
diff --git a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml
new file mode 100644
index 000000000..bc7b8bedd
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <parent>
+        <artifactId>apm-sdk-plugin</artifactId>
+        <groupId>org.apache.skywalking</groupId>
+        <version>5.0.0-alpha-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>apm-hystrix-1.x-plugin</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>com.netflix.hystrix</groupId>
+            <artifactId>hystrix-core</artifactId>
+            <version>1.4.0</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/EnhanceRequireObjectCache.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/EnhanceRequireObjectCache.java
new file mode 100644
index 000000000..2be967ede
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/EnhanceRequireObjectCache.java
@@ -0,0 +1,48 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1;
+
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+
+/**
+ * {@link EnhanceRequireObjectCache} record the prefix operation name of span 
and {@link ContextSnapshot} object for
+ * tracing.
+ *
+ * @author zhang xin
+ */
+public class EnhanceRequireObjectCache {
+    private final String operationNamePrefix;
+    private ContextSnapshot contextSnapshot;
+
+    public EnhanceRequireObjectCache(String prefix) {
+        operationNamePrefix = prefix;
+    }
+
+    public String getOperationNamePrefix() {
+        return operationNamePrefix;
+    }
+
+    public ContextSnapshot getContextSnapshot() {
+        return contextSnapshot;
+    }
+
+    public void setContextSnapshot(ContextSnapshot contextSnapshot) {
+        this.contextSnapshot = contextSnapshot;
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandConstructorInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandConstructorInterceptor.java
new file mode 100644
index 000000000..e6f8aeb31
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandConstructorInterceptor.java
@@ -0,0 +1,60 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1;
+
+import com.netflix.hystrix.HystrixCollapser;
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixObservableCollapser;
+import com.netflix.hystrix.HystrixObservableCommand;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor;
+
+/**
+ * {@link HystrixCommandConstructorInterceptor} get <code>CommandKey</code> or 
<code>CollapserKey</code> as the
+ * operation name prefix of span when the constructor that the class hierarchy 
<code>com.netflix.hystrix.HystrixCommand</code>
+ * invoked.
+ *
+ * @author zhang xin
+ */
+public class HystrixCommandConstructorInterceptor implements 
InstanceConstructorInterceptor {
+
+    public static final String OPERATION_NAME_PREFIX = "Hystrix/";
+
+    @Override
+    public void onConstruct(EnhancedInstance objInst, Object[] allArguments) {
+        String commandIdentify = "";
+
+        if (HystrixCommand.class.isAssignableFrom(objInst.getClass())) {
+            HystrixCommand hystrixCommand = (HystrixCommand)objInst;
+            commandIdentify = hystrixCommand.getCommandKey().name();
+        } else if 
(HystrixCollapser.class.isAssignableFrom(objInst.getClass())) {
+            HystrixCollapser hystrixCollapser = (HystrixCollapser)objInst;
+            commandIdentify = hystrixCollapser.getCollapserKey().name();
+        } else if 
(HystrixObservableCollapser.class.isAssignableFrom(objInst.getClass())) {
+            HystrixObservableCollapser hystrixObservableCollapser = 
(HystrixObservableCollapser)objInst;
+            commandIdentify = 
hystrixObservableCollapser.getCollapserKey().name();
+        } else if 
(HystrixObservableCommand.class.isAssignableFrom(objInst.getClass())) {
+            HystrixObservableCommand hystrixObservableCommand = 
(HystrixObservableCommand)objInst;
+            commandIdentify = hystrixObservableCommand.getCommandKey().name();
+        }
+
+        objInst.setSkyWalkingDynamicField(new 
EnhanceRequireObjectCache(OPERATION_NAME_PREFIX + commandIdentify));
+    }
+
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandGetFallbackInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandGetFallbackInterceptor.java
new file mode 100644
index 000000000..f935c77eb
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandGetFallbackInterceptor.java
@@ -0,0 +1,53 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1;
+
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+
+public class HystrixCommandGetFallbackInterceptor implements 
InstanceMethodsAroundInterceptor {
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] 
allArguments, Class<?>[] argumentsTypes,
+        MethodInterceptResult result) throws Throwable {
+        EnhanceRequireObjectCache enhanceRequireObjectCache = 
(EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField();
+        ContextSnapshot snapshot = 
enhanceRequireObjectCache.getContextSnapshot();
+
+        AbstractSpan activeSpan = 
ContextManager.createLocalSpan(enhanceRequireObjectCache.getOperationNamePrefix()
 + "/Fallback");
+        activeSpan.setComponent(ComponentsDefine.HYSTRIX);
+        ContextManager.continued(snapshot);
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, 
Object[] allArguments, Class<?>[] argumentsTypes,
+        Object ret) throws Throwable {
+        ContextManager.stopSpan();
+        return ret;
+    }
+
+    @Override public void handleMethodException(EnhancedInstance objInst, 
Method method, Object[] allArguments,
+        Class<?>[] argumentsTypes, Throwable t) {
+        ContextManager.activeSpan().errorOccurred().log(t);
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandRunInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandRunInterceptor.java
new file mode 100644
index 000000000..c281f59f9
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixCommandRunInterceptor.java
@@ -0,0 +1,57 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1;
+
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+
+public class HystrixCommandRunInterceptor implements 
InstanceMethodsAroundInterceptor {
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] 
allArguments, Class<?>[] argumentsTypes,
+        MethodInterceptResult result) throws Throwable {
+        // create a local span, and continued, The `execution method` running 
in other thread if the
+        // hystrix strategy is `THREAD`.
+        EnhanceRequireObjectCache enhanceRequireObjectCache = 
(EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField();
+        ContextSnapshot snapshot = 
enhanceRequireObjectCache.getContextSnapshot();
+
+        AbstractSpan activeSpan = 
ContextManager.createLocalSpan(enhanceRequireObjectCache.getOperationNamePrefix()
 + "/Execution");
+        activeSpan.setComponent(ComponentsDefine.HYSTRIX);
+        ContextManager.continued(snapshot);
+        // Because of `fall back` method running in other thread. so we need 
capture concurrent span for tracing.
+        enhanceRequireObjectCache.setContextSnapshot(ContextManager.capture());
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, 
Object[] allArguments, Class<?>[] argumentsTypes,
+        Object ret) throws Throwable {
+        ContextManager.stopSpan();
+        return ret;
+    }
+
+    @Override public void handleMethodException(EnhancedInstance objInst, 
Method method, Object[] allArguments,
+        Class<?>[] argumentsTypes, Throwable t) {
+        ContextManager.activeSpan().errorOccurred().log(t);
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixPluginsInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixPluginsInterceptor.java
new file mode 100644
index 000000000..d29b62fd4
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/HystrixPluginsInterceptor.java
@@ -0,0 +1,50 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1;
+
+import com.netflix.hystrix.strategy.HystrixPlugins;
+import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
+import java.lang.reflect.Method;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+
+/**
+ * {@link HystrixPluginsInterceptor} wrapper the {@link 
HystrixCommandExecutionHook} object by using {@link
+ * SWExecutionHookWrapper} when the {@link 
HystrixPlugins#getCommandExecutionHook()} method invoked.
+ *
+ * @author zhang xin
+ */
+public class HystrixPluginsInterceptor implements 
InstanceMethodsAroundInterceptor {
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] 
allArguments, Class<?>[] argumentsTypes,
+        MethodInterceptResult result) throws Throwable {
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, 
Object[] allArguments, Class<?>[] argumentsTypes,
+        Object ret) throws Throwable {
+        return new SWExecutionHookWrapper((HystrixCommandExecutionHook)ret);
+    }
+
+    @Override public void handleMethodException(EnhancedInstance objInst, 
Method method, Object[] allArguments,
+        Class<?>[] argumentsTypes, Throwable t) {
+
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/SWExecutionHookWrapper.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/SWExecutionHookWrapper.java
new file mode 100644
index 000000000..eedc646cd
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/SWExecutionHookWrapper.java
@@ -0,0 +1,180 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixInvokable;
+import com.netflix.hystrix.exception.HystrixRuntimeException;
+import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+
+/**
+ * {@link SWExecutionHookWrapper} wrapper the HystrixCommandExecutionHook 
object for tracing.
+ *
+ * @author zhang xin
+ */
+public class SWExecutionHookWrapper extends HystrixCommandExecutionHook {
+    private final HystrixCommandExecutionHook actual;
+
+    public SWExecutionHookWrapper(HystrixCommandExecutionHook actual) {
+        this.actual = actual;
+    }
+
+    @Override
+    public <T> void onStart(HystrixInvokable<T> commandInstance) {
+        EnhancedInstance enhancedInstance = (EnhancedInstance)commandInstance;
+        EnhanceRequireObjectCache enhanceRequireObjectCache = 
(EnhanceRequireObjectCache)enhancedInstance.getSkyWalkingDynamicField();
+        enhanceRequireObjectCache.setContextSnapshot(ContextManager.capture());
+        actual.onStart(commandInstance);
+    }
+
+    @Override
+    public <T> void onExecutionStart(HystrixInvokable<T> commandInstance) {
+        actual.onExecutionStart(commandInstance);
+    }
+
+    @Override
+    public <T> Exception onExecutionError(HystrixInvokable<T> commandInstance, 
Exception e) {
+        return actual.onExecutionError(commandInstance, e);
+    }
+
+    @Override
+    public <T> void onExecutionSuccess(HystrixInvokable<T> commandInstance) {
+        actual.onExecutionSuccess(commandInstance);
+    }
+
+    @Override
+    public <T> void onFallbackStart(HystrixInvokable<T> commandInstance) {
+        actual.onFallbackStart(commandInstance);
+    }
+
+    @Override
+    public <T> Exception onFallbackError(HystrixInvokable<T> commandInstance, 
Exception e) {
+        return actual.onFallbackError(commandInstance, e);
+    }
+
+    @Override
+    public <T> void onFallbackSuccess(HystrixInvokable<T> commandInstance) {
+        actual.onFallbackSuccess(commandInstance);
+    }
+
+    @Override public <T> Exception onRunError(HystrixInvokable<T> 
commandInstance, Exception e) {
+        return actual.onRunError(commandInstance, e);
+    }
+
+    @Override public <T> Exception onRunError(HystrixCommand<T> 
commandInstance, Exception e) {
+        return actual.onRunError(commandInstance, e);
+    }
+
+    @Override
+    public <T> Exception onError(HystrixInvokable<T> commandInstance, 
HystrixRuntimeException.FailureType failureType,
+        Exception e) {
+        return actual.onError(commandInstance, failureType, e);
+    }
+
+    @Override public <T> void onSuccess(HystrixInvokable<T> commandInstance) {
+        actual.onSuccess(commandInstance);
+    }
+
+    @Override public <T> T onEmit(HystrixInvokable<T> commandInstance, T 
value) {
+        return actual.onEmit(commandInstance, value);
+    }
+
+    @Override public <T> T onExecutionEmit(HystrixInvokable<T> 
commandInstance, T value) {
+        return actual.onExecutionEmit(commandInstance, value);
+    }
+
+    @Override public <T> T onFallbackEmit(HystrixInvokable<T> commandInstance, 
T value) {
+        return actual.onFallbackEmit(commandInstance, value);
+    }
+
+    @Override public <T> void onCacheHit(HystrixInvokable<T> commandInstance) {
+        actual.onCacheHit(commandInstance);
+    }
+
+    @Override public <T> void onThreadComplete(HystrixInvokable<T> 
commandInstance) {
+        actual.onThreadComplete(commandInstance);
+    }
+
+    @Override public <T> void onThreadStart(HystrixInvokable<T> 
commandInstance) {
+        actual.onThreadStart(commandInstance);
+    }
+
+    @Override
+    public <T> Exception onError(HystrixCommand<T> commandInstance, 
HystrixRuntimeException.FailureType failureType,
+        Exception e) {
+        return actual.onError(commandInstance, failureType, e);
+    }
+
+    @Override public <T> Exception onFallbackError(HystrixCommand<T> 
commandInstance, Exception e) {
+        return actual.onFallbackError(commandInstance, e);
+    }
+
+    @Override public <T> T onComplete(HystrixCommand<T> commandInstance, T 
response) {
+        return actual.onComplete(commandInstance, response);
+    }
+
+    @Override public <T> T onComplete(HystrixInvokable<T> commandInstance, T 
response) {
+        return actual.onComplete(commandInstance, response);
+    }
+
+    @Override public <T> T onFallbackSuccess(HystrixCommand<T> 
commandInstance, T fallbackResponse) {
+        return actual.onFallbackSuccess(commandInstance, fallbackResponse);
+    }
+
+    @Override public <T> T onFallbackSuccess(HystrixInvokable<T> 
commandInstance, T fallbackResponse) {
+        return actual.onFallbackSuccess(commandInstance, fallbackResponse);
+    }
+
+    @Override public <T> T onRunSuccess(HystrixCommand<T> commandInstance, T 
response) {
+        return actual.onRunSuccess(commandInstance, response);
+    }
+
+    @Override public <T> T onRunSuccess(HystrixInvokable<T> commandInstance, T 
response) {
+        return actual.onRunSuccess(commandInstance, response);
+    }
+
+    @Override public <T> void onFallbackStart(HystrixCommand<T> 
commandInstance) {
+        actual.onFallbackStart(commandInstance);
+    }
+
+    @Override public <T> void onRunStart(HystrixCommand<T> commandInstance) {
+        actual.onRunStart(commandInstance);
+    }
+
+    @Override public <T> void onRunStart(HystrixInvokable<T> commandInstance) {
+        actual.onRunStart(commandInstance);
+    }
+
+    @Override public <T> void onStart(HystrixCommand<T> commandInstance) {
+        EnhancedInstance enhancedInstance = (EnhancedInstance)commandInstance;
+        EnhanceRequireObjectCache enhanceRequireObjectCache = 
(EnhanceRequireObjectCache)enhancedInstance.getSkyWalkingDynamicField();
+        enhanceRequireObjectCache.setContextSnapshot(ContextManager.capture());
+        actual.onStart(commandInstance);
+    }
+
+    @Override public <T> void onThreadComplete(HystrixCommand<T> 
commandInstance) {
+        actual.onThreadComplete(commandInstance);
+    }
+
+    @Override public <T> void onThreadStart(HystrixCommand<T> commandInstance) 
{
+        actual.onThreadStart(commandInstance);
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/define/HystrixCommandInstrumentation.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/define/HystrixCommandInstrumentation.java
new file mode 100644
index 000000000..780db9359
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/define/HystrixCommandInstrumentation.java
@@ -0,0 +1,86 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1.define;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.any;
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static 
org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch.byHierarchyMatch;
+
+public class HystrixCommandInstrumentation extends 
ClassInstanceMethodsEnhancePluginDefine {
+
+    public static final String INTERCEPT_CLASS = 
"org.apache.skywalking.apm.plugin.hystrix.v1.HystrixCommandConstructorInterceptor";
+    public static final String ENHANCE_CLASS = 
"com.netflix.hystrix.HystrixCommand";
+
+    @Override protected ConstructorInterceptPoint[] 
getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[] {
+            new ConstructorInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getConstructorMatcher() {
+                    return any();
+                }
+
+                @Override public String getConstructorInterceptor() {
+                    return INTERCEPT_CLASS;
+                }
+            }
+        };
+    }
+
+    @Override protected InstanceMethodsInterceptPoint[] 
getInstanceMethodsInterceptPoints() {
+        return new InstanceMethodsInterceptPoint[] {
+            new InstanceMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named("run");
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return 
"org.apache.skywalking.apm.plugin.hystrix.v1.HystrixCommandRunInterceptor";
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new InstanceMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named("getFallback");
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return 
"org.apache.skywalking.apm.plugin.hystrix.v1.HystrixCommandGetFallbackInterceptor";
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+
+    @Override protected ClassMatch enhanceClass() {
+        return byHierarchyMatch(new String[] {ENHANCE_CLASS});
+    }
+
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/define/HystrixPluginsInstrumentation.java
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/define/HystrixPluginsInstrumentation.java
new file mode 100644
index 000000000..0c59115d4
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/hystrix/v1/define/HystrixPluginsInstrumentation.java
@@ -0,0 +1,65 @@
+/*
+ * 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.skywalking.apm.plugin.hystrix.v1.define;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static 
org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName;
+
+public class HystrixPluginsInstrumentation extends 
ClassInstanceMethodsEnhancePluginDefine {
+
+    public static final String INTERCEPT_CLASS = 
"org.apache.skywalking.apm.plugin.hystrix.v1.HystrixPluginsInterceptor";
+    public static final String ENHANCE_METHOD = "getCommandExecutionHook";
+    public static final String ENHANCE_CLASS = 
"com.netflix.hystrix.strategy.HystrixPlugins";
+
+    @Override
+    protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[0];
+    }
+
+    @Override
+    protected InstanceMethodsInterceptPoint[] 
getInstanceMethodsInterceptPoints() {
+        return new InstanceMethodsInterceptPoint[] {
+            new InstanceMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(ENHANCE_METHOD);
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return INTERCEPT_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+
+    @Override
+    protected ClassMatch enhanceClass() {
+        return byName(ENHANCE_CLASS);
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/resources/skywalking-plugin.def
 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/resources/skywalking-plugin.def
new file mode 100644
index 000000000..0c9c9c94f
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/src/main/resources/skywalking-plugin.def
@@ -0,0 +1,2 @@
+hystrix-1.x=org.apache.skywalking.apm.plugin.hystrix.v1.define.HystrixCommandInstrumentation
+hystrix-1.x=org.apache.skywalking.apm.plugin.hystrix.v1.define.HystrixPluginsInstrumentation
diff --git a/apm-sniffer/apm-sdk-plugin/pom.xml 
b/apm-sniffer/apm-sdk-plugin/pom.xml
index 3218855d9..6a4f1fffe 100644
--- a/apm-sniffer/apm-sdk-plugin/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/pom.xml
@@ -55,6 +55,7 @@
         <module>httpasyncclient-4.x-plugin</module>
         <module>kafka-v1-plugin</module>
         <module>servicecomb-plugin</module>
+        <module>hystrix-1.x-plugin</module>
     </modules>
     <packaging>pom</packaging>
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to