From dbee9531f1ed47d824f975744c19c5985044ea5e Mon Sep 17 00:00:00 2001 From: lytscu Date: Sat, 24 Feb 2018 16:16:30 +0800 Subject: [PATCH] Add [Agent] V1 servicecomb plugin --- .../apm-sdk-plugin/servicecomb-plugin/pom.xml | 1 + .../pom.xml | 57 ++++++++ .../ProducerOperationHandlerInterceptor.java | 80 +++++++++++ .../v1/TransportClientHandlerInterceptor.java | 104 ++++++++++++++ ...oducerOperationHandlerInstrumentation.java | 74 ++++++++++ ...TransportClientHandlerInstrumentation.java | 74 ++++++++++ .../src/main/resources/skywalking-plugin.def | 2 + ...oducerOperationHandlerInterceptorTest.java | 133 ++++++++++++++++++ ...TransportClientHandlerInterceptorTest.java | 128 +++++++++++++++++ 9 files changed, 653 insertions(+) create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/ProducerOperationHandlerInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/TransportClientHandlerInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/resources/skywalking-plugin.def create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java create mode 100644 apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml index 1668c7020..ae14a3306 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml @@ -13,6 +13,7 @@ servicecomb-java-chassis-0.x-plugin + servicecomb-java-chassis-1.x-plugin pom diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/pom.xml new file mode 100644 index 000000000..0d3aa169e --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/pom.xml @@ -0,0 +1,57 @@ + + + + servicecomb-plugin + org.apache.skywalking + 5.0.0-alpha + + 4.0.0 + + apm-servicecomb-java-chassis-1.x-plugin + jar + + servicecomb-java-chassis-1.x-plugin + http://maven.apache.org + + + + + org.apache.servicecomb + java-chassis-core + 1.0.0-m1-SNAPSHOT + provided + + + + + apache-servicecomb + + https://repository.apache.org/content/repositories/snapshots/org/apache/servicecomb/java-chassis-core/1.0.0-m1-SNAPSHOT/ + + + true + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + attach-sources + none + + jar + + + + + + + \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptor.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptor.java new file mode 100644 index 000000000..90f437d70 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptor.java @@ -0,0 +1,80 @@ +/* + * 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.servicecomb.v1; + +import java.lang.reflect.Method; +import org.apache.servicecomb.core.Invocation; +import org.apache.skywalking.apm.agent.core.context.CarrierItem; +import org.apache.skywalking.apm.agent.core.context.ContextCarrier; +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; +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; + +/** + * {ProducerOperationHandlerInterceptor} define how to enhance class {@link + * ProducerOperationHandler#handle(org.apache.servicecomb.core.Invocation, org.apache.servicecomb.swagger.invocation.AsyncResponse)}. + * + * @author lytscu + */ +public class ProducerOperationHandlerInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Invocation invocation = (Invocation)allArguments[0]; + ContextCarrier contextCarrier = new ContextCarrier(); + CarrierItem next = contextCarrier.items(); + while (next.hasNext()) { + next = next.next(); + next.setHeadValue(invocation.getContext().get(next.getHeadKey())); + } + String operationName = invocation.getMicroserviceQualifiedName(); + AbstractSpan span = ContextManager.createEntrySpan(operationName, contextCarrier); + String url = invocation.getOperationMeta().getOperationPath(); + Tags.URL.set(span, url); + span.setComponent(ComponentsDefine.SERVICECOMB); + SpanLayer.asRPCFramework(span); + } + + @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + Invocation invocation = (Invocation)allArguments[0]; + AbstractSpan span = ContextManager.activeSpan(); + int statusCode = invocation.getStatus().getStatusCode(); + if (statusCode >= 400) { + span.errorOccurred(); + Tags.STATUS_CODE.set(span, Integer.toString(statusCode)); + } + ContextManager.stopSpan(); + return ret; + } + + @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + AbstractSpan span = ContextManager.activeSpan(); + span.errorOccurred(); + span.log(t); + } + +} diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptor.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptor.java new file mode 100644 index 000000000..6079976c6 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptor.java @@ -0,0 +1,104 @@ +/* + * 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.servicecomb.v1; + +import java.lang.reflect.Method; +import java.net.URI; +import org.apache.servicecomb.core.Invocation; +import org.apache.skywalking.apm.agent.core.context.CarrierItem; +import org.apache.skywalking.apm.agent.core.context.ContextCarrier; +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; +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; + +/** + * {@link TransportClientHandlerInterceptor} define how to enhance class {@link TransportClientHandler#handle(org.apache.servicecomb.core.Invocation, + * org.apache.servicecomb.swagger.invocation.AsyncResponse)}. + * + * @author lytscu + */ +public class TransportClientHandlerInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Invocation invocation = (Invocation)allArguments[0]; + if (!checkRegisterStatus(invocation)) { + return; + } + URI uri = new URI(invocation.getEndpoint().toString()); + String peer = uri.getHost() + ":" + uri.getPort(); + String operationName = invocation.getMicroserviceQualifiedName(); + final ContextCarrier contextCarrier = new ContextCarrier(); + AbstractSpan span = ContextManager.createExitSpan(operationName, contextCarrier, peer); + CarrierItem next = contextCarrier.items(); + while (next.hasNext()) { + next = next.next(); + invocation.getContext().put(next.getHeadKey(), next.getHeadValue()); + } + String url = invocation.getOperationMeta().getOperationPath(); + Tags.URL.set(span, url); + span.setComponent(ComponentsDefine.SERVICECOMB); + SpanLayer.asRPCFramework(span); + } + + @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Object ret) throws Throwable { + Invocation invocation = (Invocation)allArguments[0]; + if (!checkRegisterStatus(invocation)) { + return ret; + } + AbstractSpan span = ContextManager.activeSpan(); + int statusCode = invocation.getStatus().getStatusCode(); + if (statusCode >= 400) { + span.errorOccurred(); + Tags.STATUS_CODE.set(span, Integer.toString(statusCode)); + } + ContextManager.stopSpan(); + return ret; + } + + @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + Invocation invocation = (Invocation)allArguments[0]; + if (!checkRegisterStatus(invocation)) { + return; + } + AbstractSpan span = ContextManager.activeSpan(); + span.errorOccurred(); + span.log(t); + } + + /** + * Serviecomb chassis Consumers and providers need to register at the service center. If the consumer is not + * registered then return false. + */ + private Boolean checkRegisterStatus(Invocation invocation) { + if (null == invocation.getOperationMeta() || null == invocation.getEndpoint()) { + return false; + } + return true; + } + +} diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/ProducerOperationHandlerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/ProducerOperationHandlerInstrumentation.java new file mode 100644 index 000000000..ff55dc307 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/ProducerOperationHandlerInstrumentation.java @@ -0,0 +1,74 @@ +/* + * 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.servicecomb.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 org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +/** + * {@link ProducerOperationHandlerInstrumentation} represents that skywalking intercept {@link + * ProducerOperationHandler#handle(org.apache.servicecomb.core.Invocation, org.apache.servicecomb.swagger.invocation.AsyncResponse)}by + * using {@link ProducerOperationHandlerInterceptor} + * + * @author lytscu + */ +public class ProducerOperationHandlerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.apache.servicecomb.core.handler.impl.ProducerOperationHandler"; + + private static final String INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.servicecomb.v1.ProducerOperationHandlerInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("handle"); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPT_CLASS; + } + + @Override public boolean isOverrideArgs() { + return false; + } + } + }; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/TransportClientHandlerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/TransportClientHandlerInstrumentation.java new file mode 100644 index 000000000..888300218 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/servicecomb/v1/define/TransportClientHandlerInstrumentation.java @@ -0,0 +1,74 @@ +/* + * 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.servicecomb.v1.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.servicecomb.core.handler.impl.TransportClientHandler; +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 org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +/** + * {@link TransportClientHandlerInstrumentation} represents that skywalking intercept {@link TransportClientHandler}by + * using {@linkTransportClientHandlerInterceptor } + * + * @author lytscu + */ +public class TransportClientHandlerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.apache.servicecomb.core.handler.impl.TransportClientHandler"; + + private static final String INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.servicecomb.v1.TransportClientHandlerInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("handle"); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPT_CLASS; + } + + @Override public boolean isOverrideArgs() { + return false; + } + }, + }; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..ea567e625 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1,2 @@ +servicecomb-1.x=org.apache.skywalking.apm.plugin.servicecomb.v1.define.ProducerOperationHandlerInstrumentation +servicecomb-1.x=org.apache.skywalking.apm.plugin.servicecomb.v1.define.TransportClientHandlerInstrumentation diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java new file mode 100644 index 000000000..1ab8e7483 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java @@ -0,0 +1,133 @@ +/* + * 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.servicecomb.v1; + +import org.apache.servicecomb.core.Endpoint; +import org.apache.servicecomb.core.Invocation; +import org.apache.servicecomb.core.definition.OperationMeta; +import org.apache.servicecomb.core.definition.SchemaMeta; +import org.apache.servicecomb.swagger.invocation.InvocationType; +import org.apache.servicecomb.swagger.invocation.SwaggerInvocation; +import java.lang.reflect.Method; +import java.util.List; +import javax.ws.rs.core.Response; +import org.apache.skywalking.apm.agent.core.boot.ServiceManager; +import org.apache.skywalking.apm.agent.core.conf.Config; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; +import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; +import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.test.helper.SegmentHelper; +import org.apache.skywalking.apm.agent.test.helper.SpanHelper; +import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule; +import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; +import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint; +import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(TracingSegmentRunner.class) +public class ProducerOperationHandlerInterceptorTest { + + @Rule + public AgentServiceRule agentServiceRule = new AgentServiceRule(); + @Mock + Response.StatusType statusType; + @SegmentStoragePoint + private SegmentStorage segmentStorage; + private ProducerOperationHandlerInterceptor invocationInterceptor; + @Mock + private OperationMeta operationMeta; + @Mock + private EnhancedInstance enhancedInstance; + @Mock + private Invocation invocation; + @Mock + private Endpoint endpoint; + @Mock + private Method method; + @Mock + private SwaggerInvocation swagger; + private Object[] allArguments; + private Class[] argumentsType; + private Object[] swaggerArguments; + + @Mock + private SchemaMeta schemaMeta; + + @Before + public void setUp() throws Exception { + ServiceManager.INSTANCE.boot(); + invocationInterceptor = new ProducerOperationHandlerInterceptor(); + PowerMockito.mock(Invocation.class); + when(operationMeta.getSchemaMeta()).thenReturn(schemaMeta); + when(endpoint.getAddress()).thenReturn("0.0.0.0:7777"); + when(invocation.getEndpoint()).thenReturn(endpoint); + when(invocation.getMicroserviceQualifiedName()).thenReturn("productorTest"); + when(operationMeta.getOperationPath()).thenReturn("/bmi"); + when(invocation.getOperationMeta()).thenReturn(operationMeta); + when(invocation.getStatus()).thenReturn(statusType); + when(statusType.getStatusCode()).thenReturn(200); + when(method.getName()).thenReturn("producer"); + when(invocation.getInvocationType()).thenReturn(InvocationType.PRODUCER); + Config.Agent.APPLICATION_CODE = "serviceComnTestCases-APP"; + + allArguments = new Object[] {invocation,}; + argumentsType = new Class[] {}; + swaggerArguments = new Class[] {}; + + } + + @Test + public void testConsumer() throws Throwable { + + invocationInterceptor.beforeMethod(enhancedInstance, method, allArguments, argumentsType, null); + invocationInterceptor.afterMethod(enhancedInstance, method, allArguments, argumentsType, null); + + Assert.assertThat(segmentStorage.getTraceSegments().size(), is(1)); + TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); + + List spans = SegmentHelper.getSpans(traceSegment); + assertCombSpan(spans.get(0)); + verify(invocation, times(1)).getContext(); + } + + private void assertCombSpan(AbstractTracingSpan span) { + assertThat(span.getOperationName(), is("productorTest")); + assertThat(SpanHelper.getComponentId(span), is(28)); + List tags = SpanHelper.getTags(span); + assertThat(tags.get(0).getValue(), is("/bmi")); + assertThat(span.isEntry(), is(true)); + } + +} diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java new file mode 100644 index 000000000..0f6972029 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java @@ -0,0 +1,128 @@ +/* + * 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.servicecomb.v1; + +import org.apache.servicecomb.core.Endpoint; +import org.apache.servicecomb.core.Invocation; +import org.apache.servicecomb.core.definition.OperationMeta; +import org.apache.servicecomb.core.definition.SchemaMeta; +import org.apache.servicecomb.core.provider.consumer.ReferenceConfig; +import org.apache.servicecomb.swagger.invocation.InvocationType; +import org.apache.servicecomb.swagger.invocation.SwaggerInvocation; +import java.util.List; +import javax.ws.rs.core.Response; +import org.apache.skywalking.apm.agent.core.boot.ServiceManager; +import org.apache.skywalking.apm.agent.core.conf.Config; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; +import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; +import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.test.helper.SegmentHelper; +import org.apache.skywalking.apm.agent.test.helper.SpanHelper; +import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule; +import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; +import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint; +import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(TracingSegmentRunner.class) +public class TransportClientHandlerInterceptorTest { + + @Rule + public AgentServiceRule agentServiceRule = new AgentServiceRule(); + @Mock + Response.StatusType statusType; + @Mock + ReferenceConfig referenceConfig; + @SegmentStoragePoint + private SegmentStorage segmentStorage; + private TransportClientHandlerInterceptor nextInterceptor; + @Mock + private OperationMeta operationMeta; + @Mock + private EnhancedInstance enhancedInstance; + @Mock + private Invocation invocation; + @Mock + private Endpoint endpoint; + @Mock + private SwaggerInvocation swagger; + private Object[] allArguments; + private Class[] argumentsType; + private Object[] swaggerArguments; + + @Mock + private SchemaMeta schemaMeta; + + @Before + public void setUp() throws Exception { + ServiceManager.INSTANCE.boot(); + nextInterceptor = new TransportClientHandlerInterceptor(); + PowerMockito.mock(Invocation.class); + when(operationMeta.getSchemaMeta()).thenReturn(schemaMeta); + when(endpoint.getAddress()).thenReturn("0.0.0.0:7777"); + when(invocation.getEndpoint()).thenReturn(endpoint); + when(invocation.getMicroserviceQualifiedName()).thenReturn("consumerTest"); + when(operationMeta.getOperationPath()).thenReturn("/bmi"); + when(invocation.getOperationMeta()).thenReturn(operationMeta); + when(invocation.getStatus()).thenReturn(statusType); + when(statusType.getStatusCode()).thenReturn(200); + when(invocation.getInvocationType()).thenReturn(InvocationType.CONSUMER); + Config.Agent.APPLICATION_CODE = "serviceComnTestCases-APP"; + + allArguments = new Object[] {invocation,}; + argumentsType = new Class[] {}; + swaggerArguments = new Class[] {}; + } + + @Test + public void testConsumer() throws Throwable { + nextInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentsType, null); + nextInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentsType, null); + Assert.assertThat(segmentStorage.getTraceSegments().size(), is(1)); + TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); + List spans = SegmentHelper.getSpans(traceSegment); + assertCombSpan(spans.get(0)); + verify(invocation, times(1)).getContext(); + } + + private void assertCombSpan(AbstractTracingSpan span) { + assertThat(span.getOperationName(), is("consumerTest")); + assertThat(SpanHelper.getComponentId(span), is(28)); + List tags = SpanHelper.getTags(span); + assertThat(tags.get(0).getValue(), is("/bmi")); + assertThat(span.isExit(), is(true)); + } + +}