From cf7431292f1a56d9b0d217f2e0bd22088abb7963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Wed, 11 Oct 2017 15:19:12 +0800 Subject: [PATCH 01/12] Update README_ZH.md --- README_ZH.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_ZH.md b/README_ZH.md index 599d3bf3b..053748ddd 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -54,9 +54,9 @@ This project adheres to the Contributor Covenant [code of conduct](CODE_OF_CONDU # Test reports - 自动化集成测试报告 - - [Java探针测试报告](https://github.com/sky-walking/agent-integration-test-report) + - [Java探针测试报告](https://github.com/SkywalkingTest/agent-integration-test-report) - 性能测试报告 - - [Java探针测试报告](https://sky-walking.github.io/Agent-Benchmarks/) +  - [Java探针测试报告](https://skywalkingtest.github.io/Agent-Benchmarks/) # Contact Us * 直接提交Issue From 4f77c305a3eea32bad09ba16af96548e37320299 Mon Sep 17 00:00:00 2001 From: IluckySi <1151262684@qq.com> Date: Wed, 11 Oct 2017 15:19:39 +0800 Subject: [PATCH 02/12] Update byte-buddy to latest version 1.7.6 which permit repeated exception in method signature --- apm-sniffer/apm-agent-core/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apm-sniffer/apm-agent-core/pom.xml b/apm-sniffer/apm-agent-core/pom.xml index e6d717a79..5b995f1e9 100644 --- a/apm-sniffer/apm-agent-core/pom.xml +++ b/apm-sniffer/apm-agent-core/pom.xml @@ -36,6 +36,7 @@ UTF-8 9.4.2.v20170220 1.4.0 + 1.7.6 org.skywalking.apm.dependencies com.lmax.disruptor @@ -65,12 +66,12 @@ net.bytebuddy byte-buddy - 1.7.1 + ${bytebuddy.version} net.bytebuddy byte-buddy-agent - 1.5.7 + ${bytebuddy.version} test From cc2007ee63cb4bc594367460ce0eb88d43b97bc0 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Wed, 11 Oct 2017 15:51:05 +0800 Subject: [PATCH 03/12] fix jetty plugin works incorrect --- .../jetty/v9/server/HandleInterceptor.java | 10 +++-- ...ntation.java => JettyInstrumentation.java} | 9 +++-- .../src/main/resources/skywalking-plugin.def | 2 +- .../v9/server/HandleInterceptorTest.java | 37 ++++++++++--------- 4 files changed, 32 insertions(+), 26 deletions(-) rename apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/{HandlerListInstrumentation.java => JettyInstrumentation.java} (84%) diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptor.java index 35633385a..c94834d1c 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptor.java @@ -21,6 +21,7 @@ package org.skywalking.apm.plugin.jetty.v9.server; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.server.HttpChannel; import org.skywalking.apm.agent.core.context.CarrierItem; import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; @@ -36,8 +37,8 @@ public class HandleInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - String requestURI = (String)allArguments[0]; - HttpServletRequest servletRequest = (HttpServletRequest)allArguments[2]; + HttpChannel httpChannel = (HttpChannel)allArguments[0]; + HttpServletRequest servletRequest = httpChannel.getRequest(); ContextCarrier contextCarrier = new ContextCarrier(); @@ -47,7 +48,7 @@ public class HandleInterceptor implements InstanceMethodsAroundInterceptor { next.setHeadValue(servletRequest.getHeader(next.getHeadKey())); } - AbstractSpan span = ContextManager.createEntrySpan(requestURI, contextCarrier); + AbstractSpan span = ContextManager.createEntrySpan(servletRequest.getRequestURI(), contextCarrier); Tags.URL.set(span, servletRequest.getRequestURL().toString()); Tags.HTTP.METHOD.set(span, servletRequest.getMethod()); span.setComponent(ComponentsDefine.JETTY_SERVER); @@ -57,7 +58,8 @@ public class HandleInterceptor implements InstanceMethodsAroundInterceptor { @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - HttpServletResponse servletResponse = (HttpServletResponse)allArguments[3]; + HttpChannel httpChannel = (HttpChannel)allArguments[0]; + HttpServletResponse servletResponse = httpChannel.getResponse(); AbstractSpan span = ContextManager.activeSpan(); if (servletResponse.getStatus() >= 400) { span.errorOccurred(); diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/HandlerListInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/JettyInstrumentation.java similarity index 84% rename from apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/HandlerListInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/JettyInstrumentation.java index e2cf781f6..0004ab160 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/HandlerListInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/java/org/skywalking/apm/plugin/jetty/v9/server/define/JettyInstrumentation.java @@ -26,17 +26,18 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMet import org.skywalking.apm.agent.core.plugin.match.ClassMatch; import static net.bytebuddy.matcher.ElementMatchers.named; +import static org.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; /** - * {@link HandlerListInstrumentation} enhance the handle method in org.eclipse.jetty.server.handler.HandlerList + * {@link JettyInstrumentation} enhance the handle method in org.eclipse.jetty.server.handler.HandlerList * by org.skywalking.apm.plugin.jetty.v9.server.HandleInterceptor * * @author zhangxin */ -public class HandlerListInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class JettyInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "org.eclipse.jetty.server.handler.HandlerList"; + private static final String ENHANCE_CLASS = "org.eclipse.jetty.server.Server"; private static final String ENHANCE_METHOD = "handle"; private static final String INTERCEPTOR_CLASS = "org.skywalking.apm.plugin.jetty.v9.server.HandleInterceptor"; @@ -48,7 +49,7 @@ public class HandlerListInstrumentation extends ClassInstanceMethodsEnhancePlugi return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named(ENHANCE_METHOD); + return named(ENHANCE_METHOD).and(takesArgumentWithType(0, "org.eclipse.jetty.server.HttpChannel")); } @Override public String getMethodsInterceptor() { diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/resources/skywalking-plugin.def index 0c7fcd02d..053c257c2 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/main/resources/skywalking-plugin.def @@ -1 +1 @@ -jetty-server-9.x=org.skywalking.apm.plugin.jetty.v9.server.define.HandlerListInstrumentation +jetty-server-9.x=org.skywalking.apm.plugin.jetty.v9.server.define.JettyInstrumentation diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java index bbc59cbc7..089a565cc 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java @@ -19,9 +19,9 @@ package org.skywalking.apm.plugin.jetty.v9.server; import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -58,7 +58,7 @@ import static org.skywalking.apm.agent.test.tools.SpanAssert.assertTag; @PowerMockRunnerDelegate(TracingSegmentRunner.class) public class HandleInterceptorTest { - private HandleInterceptor tomcatInvokeInterceptor; + private HandleInterceptor jettyInvokeInterceptor; @SegmentStoragePoint private SegmentStorage segmentStorage; @@ -66,36 +66,39 @@ public class HandleInterceptorTest { public AgentServiceRule serviceRule = new AgentServiceRule(); @Mock - private HttpServletRequest request; + private Request request; @Mock - private Request baseRequest; - @Mock - private HttpServletResponse response; + private Response response; @Mock private MethodInterceptResult methodInterceptResult; @Mock private EnhancedInstance enhancedInstance; + @Mock + private HttpChannel httpChannel; + private Object[] arguments; private Class[] argumentType; @Before public void setUp() throws Exception { - tomcatInvokeInterceptor = new HandleInterceptor(); + jettyInvokeInterceptor = new HandleInterceptor(); when(request.getRequestURI()).thenReturn("/test/testRequestURL"); when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL")); when(response.getStatus()).thenReturn(200); - arguments = new Object[] {"/test/testRequestURL", baseRequest, request, response}; - argumentType = new Class[] {String.class, baseRequest.getClass(), request.getClass(), response.getClass()}; + when(httpChannel.getResponse()).thenReturn(response); + when(httpChannel.getRequest()).thenReturn(request); + arguments = new Object[] {httpChannel}; + argumentType = new Class[] {httpChannel.getClass()}; } @Test public void testWithoutSerializedContextData() throws Throwable { - tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); - tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); + jettyInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); + jettyInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); assertThat(segmentStorage.getTraceSegments().size(), is(1)); TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); @@ -107,8 +110,8 @@ public class HandleInterceptorTest { public void testWithSerializedContextData() throws Throwable { when(request.getHeader(SW3CarrierItem.HEADER_NAME)).thenReturn("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); - tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); - tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); + jettyInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); + jettyInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); assertThat(segmentStorage.getTraceSegments().size(), is(1)); TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); @@ -120,9 +123,9 @@ public class HandleInterceptorTest { @Test public void testWithOccurException() throws Throwable { - tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); - tomcatInvokeInterceptor.handleMethodException(enhancedInstance, null, arguments, argumentType, new RuntimeException()); - tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); + jettyInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); + jettyInvokeInterceptor.handleMethodException(enhancedInstance, null, arguments, argumentType, new RuntimeException()); + jettyInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); assertThat(segmentStorage.getTraceSegments().size(), is(1)); TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); From f310dc3fb8b468d72b010fcc308ee4eb80d716aa Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Wed, 11 Oct 2017 16:52:37 +0800 Subject: [PATCH 04/12] Named thread.It is useful when debugging. --- .../core/boot/DefaultNamedThreadFactory.java | 40 +++++++++++++++++++ .../apm/agent/core/jvm/JVMService.java | 6 +-- .../remote/AppAndServiceRegisterClient.java | 3 +- .../remote/CollectorDiscoveryService.java | 3 +- .../agent/core/remote/GRPCChannelManager.java | 3 +- .../agent/core/sampling/SamplingService.java | 3 +- 6 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java new file mode 100644 index 000000000..0d8252b51 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java @@ -0,0 +1,40 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ +package org.skywalking.apm.agent.core.boot; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author zhangkewei + */ +public class DefaultNamedThreadFactory implements ThreadFactory { + private static final AtomicInteger BOOT_SERVICE_SEQ = new AtomicInteger(0); + private final AtomicInteger threadSeq = new AtomicInteger(0); + private final String namePrefix; + public DefaultNamedThreadFactory(String name) { + namePrefix = "SkywalkingAgent-" + BOOT_SERVICE_SEQ.incrementAndGet() + "-" + name + "-"; + } + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(); + t.setName(namePrefix + threadSeq.getAndIncrement()); + t.setDaemon(true); + return t; + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/jvm/JVMService.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/jvm/JVMService.java index 633dfc838..2977e8ea0 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/jvm/JVMService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/jvm/JVMService.java @@ -25,6 +25,7 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.skywalking.apm.agent.core.boot.BootService; +import org.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; import org.skywalking.apm.agent.core.boot.ServiceManager; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; @@ -57,7 +58,6 @@ public class JVMService implements BootService, Runnable { private volatile ScheduledFuture collectMetricFuture; private volatile ScheduledFuture sendMetricFuture; private Sender sender; - @Override public void beforeBoot() throws Throwable { queue = new LinkedBlockingQueue(Config.Jvm.BUFFER_SIZE); @@ -68,10 +68,10 @@ public class JVMService implements BootService, Runnable { @Override public void boot() throws Throwable { collectMetricFuture = Executors - .newSingleThreadScheduledExecutor() + .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("JVMService-produce")) .scheduleAtFixedRate(this, 0, 1, TimeUnit.SECONDS); sendMetricFuture = Executors - .newSingleThreadScheduledExecutor() + .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("JVMService-consume")) .scheduleAtFixedRate(sender, 0, 1, TimeUnit.SECONDS); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java index f0e192384..3378592b7 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java @@ -24,6 +24,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.skywalking.apm.agent.core.boot.BootService; +import org.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; import org.skywalking.apm.agent.core.boot.ServiceManager; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; @@ -89,7 +90,7 @@ public class AppAndServiceRegisterClient implements BootService, GRPCChannelList @Override public void boot() throws Throwable { applicationRegisterFuture = Executors - .newSingleThreadScheduledExecutor() + .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("AppAndServiceRegisterClient")) .scheduleAtFixedRate(this, 0, Config.Collector.APP_AND_SERVICE_REGISTER_CHECK_INTERVAL, TimeUnit.SECONDS); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java index b8a042831..434df7404 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/CollectorDiscoveryService.java @@ -22,6 +22,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.skywalking.apm.agent.core.boot.BootService; +import org.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; import org.skywalking.apm.agent.core.conf.Config; /** @@ -39,7 +40,7 @@ public class CollectorDiscoveryService implements BootService { @Override public void boot() throws Throwable { - future = Executors.newSingleThreadScheduledExecutor() + future = Executors.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("CollectorDiscoveryService")) .scheduleAtFixedRate(new DiscoveryRestServiceClient(), 0, Config.Collector.DISCOVERY_CHECK_INTERVAL, TimeUnit.SECONDS); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java index 687d2391d..4e7fc4c81 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java @@ -32,6 +32,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.skywalking.apm.agent.core.boot.BootService; +import org.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; import org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; @@ -58,7 +59,7 @@ public class GRPCChannelManager implements BootService, Runnable { @Override public void boot() throws Throwable { connectCheckFuture = Executors - .newSingleThreadScheduledExecutor() + .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("GRPCChannelManager")) .scheduleAtFixedRate(this, 0, GRPC_CHANNEL_CHECK_INTERVAL, TimeUnit.SECONDS); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java index a3658ceb8..e62999425 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/sampling/SamplingService.java @@ -24,6 +24,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.skywalking.apm.agent.core.boot.BootService; +import org.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.context.trace.TraceSegment; import org.skywalking.apm.logging.ILog; @@ -63,7 +64,7 @@ public class SamplingService implements BootService { on = true; this.resetSamplingFactor(); ScheduledExecutorService service = Executors - .newSingleThreadScheduledExecutor(); + .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("SamplingService")); scheduledFuture = service.scheduleAtFixedRate(new Runnable() { @Override public void run() { From 21c4bae343abb4b7e8d411eaf6020d85d27bea8d Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Wed, 11 Oct 2017 18:35:53 +0800 Subject: [PATCH 05/12] NoopSpan.errorOccurred return null on invoke log method --- .../org/skywalking/apm/agent/core/context/trace/NoopSpan.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java index 716beb72c..8f129d643 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java @@ -39,7 +39,7 @@ public class NoopSpan implements AbstractSpan { } @Override public AbstractSpan errorOccurred() { - return null; + return this; } public void finish() { From 18ad12b0e3d0ecbcf77b457b4612c0a19ac58c63 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Wed, 11 Oct 2017 21:46:52 +0800 Subject: [PATCH 06/12] fix issue that cannot generate segment cost data when the segment without entry span --- .../segment/cost/SegmentCostSpanListener.java | 21 ++----------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java index 179d23c54..2973cefa5 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java @@ -21,10 +21,7 @@ package org.skywalking.apm.collector.agentstream.worker.segment.cost; import java.util.ArrayList; import java.util.List; import org.skywalking.apm.collector.agentstream.worker.cache.ServiceCache; -import org.skywalking.apm.collector.agentstream.worker.segment.EntrySpanListener; -import org.skywalking.apm.collector.agentstream.worker.segment.ExitSpanListener; import org.skywalking.apm.collector.agentstream.worker.segment.FirstSpanListener; -import org.skywalking.apm.collector.agentstream.worker.segment.LocalSpanListener; import org.skywalking.apm.collector.core.framework.CollectorContextHelper; import org.skywalking.apm.collector.core.util.TimeBucketUtils; import org.skywalking.apm.collector.storage.define.segment.SegmentCostDataDefine; @@ -39,7 +36,7 @@ import org.slf4j.LoggerFactory; /** * @author pengys5 */ -public class SegmentCostSpanListener implements EntrySpanListener, ExitSpanListener, LocalSpanListener, FirstSpanListener { +public class SegmentCostSpanListener implements FirstSpanListener { private final Logger logger = LoggerFactory.getLogger(SegmentCostSpanListener.class); @@ -50,10 +47,7 @@ public class SegmentCostSpanListener implements EntrySpanListener, ExitSpanListe @Override public void parseFirst(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { timeBucket = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(spanObject.getStartTime()); - } - @Override - public void parseEntry(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { SegmentCostDataDefine.SegmentCost segmentCost = new SegmentCostDataDefine.SegmentCost(); segmentCost.setSegmentId(segmentId); segmentCost.setApplicationId(applicationId); @@ -68,17 +62,6 @@ public class SegmentCostSpanListener implements EntrySpanListener, ExitSpanListe } segmentCosts.add(segmentCost); - isError = isError || spanObject.getIsError(); - } - - @Override - public void parseExit(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { - isError = isError || spanObject.getIsError(); - } - - @Override - public void parseLocal(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { - isError = isError || spanObject.getIsError(); } @Override public void build() { @@ -96,4 +79,4 @@ public class SegmentCostSpanListener implements EntrySpanListener, ExitSpanListe } } } -} \ No newline at end of file +} From 44b05064e45fbd2425b396c24b7cc707b1867c71 Mon Sep 17 00:00:00 2001 From: wusheng Date: Wed, 11 Oct 2017 21:54:10 +0800 Subject: [PATCH 07/12] Rename apache copyright file. --- HEADER => ApacheCopyright | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename HEADER => ApacheCopyright (100%) diff --git a/HEADER b/ApacheCopyright similarity index 100% rename from HEADER rename to ApacheCopyright From 945d4abe03e2aba974b580205dc31941ec9e72c4 Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Thu, 12 Oct 2017 10:09:20 +0800 Subject: [PATCH 08/12] test cases for DefaultNamedThreadFactory --- .../boot/DefaultNamedThreadFactoryTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactoryTest.java diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactoryTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactoryTest.java new file mode 100644 index 000000000..8d1662767 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactoryTest.java @@ -0,0 +1,41 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ +package org.skywalking.apm.agent.core.boot; + +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; + +/** + * @author zhangkewei + */ +public class DefaultNamedThreadFactoryTest { + + @Test + public void testNamedThread() throws Exception { + Thread newThread = new DefaultNamedThreadFactory("DefaultNamedThreadFactoryTest").newThread(new Runnable() { + @Override + public void run() { + + } + }); + newThread.start(); + assertNotNull(newThread.getName()); + assert(newThread.getName().contains("DefaultNamedThreadFactoryTest")); + } +} From 6d1aade56486aff59f8934734720e831246a2875 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Thu, 12 Oct 2017 10:05:49 +0800 Subject: [PATCH 09/12] fix status of isError flag is incorrect --- .../segment/cost/SegmentCostSpanListener.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java index 2973cefa5..ace252874 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/segment/cost/SegmentCostSpanListener.java @@ -21,7 +21,10 @@ package org.skywalking.apm.collector.agentstream.worker.segment.cost; import java.util.ArrayList; import java.util.List; import org.skywalking.apm.collector.agentstream.worker.cache.ServiceCache; +import org.skywalking.apm.collector.agentstream.worker.segment.EntrySpanListener; +import org.skywalking.apm.collector.agentstream.worker.segment.ExitSpanListener; import org.skywalking.apm.collector.agentstream.worker.segment.FirstSpanListener; +import org.skywalking.apm.collector.agentstream.worker.segment.LocalSpanListener; import org.skywalking.apm.collector.core.framework.CollectorContextHelper; import org.skywalking.apm.collector.core.util.TimeBucketUtils; import org.skywalking.apm.collector.storage.define.segment.SegmentCostDataDefine; @@ -36,7 +39,7 @@ import org.slf4j.LoggerFactory; /** * @author pengys5 */ -public class SegmentCostSpanListener implements FirstSpanListener { +public class SegmentCostSpanListener implements EntrySpanListener, ExitSpanListener, LocalSpanListener,FirstSpanListener { private final Logger logger = LoggerFactory.getLogger(SegmentCostSpanListener.class); @@ -62,6 +65,22 @@ public class SegmentCostSpanListener implements FirstSpanListener { } segmentCosts.add(segmentCost); + isError = isError || spanObject.getIsError(); + } + + @Override + public void parseEntry(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { + isError = isError || spanObject.getIsError(); + } + + @Override + public void parseExit(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { + isError = isError || spanObject.getIsError(); + } + + @Override + public void parseLocal(SpanObject spanObject, int applicationId, int applicationInstanceId, String segmentId) { + isError = isError || spanObject.getIsError(); } @Override public void build() { From fd28612e7ca7c30dfa858ab7d713ec2c05e7b0d4 Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Thu, 12 Oct 2017 15:14:56 +0800 Subject: [PATCH 10/12] fixed BootService cann't run issue. --- .../apm/agent/core/boot/DefaultNamedThreadFactory.java | 3 +-- .../agent/core/remote/AppAndServiceRegisterClient.java | 1 + .../apm/agent/core/remote/GRPCChannelManager.java | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java index 0d8252b51..5a804b3a5 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java @@ -32,8 +32,7 @@ public class DefaultNamedThreadFactory implements ThreadFactory { } @Override public Thread newThread(Runnable r) { - Thread t = new Thread(); - t.setName(namePrefix + threadSeq.getAndIncrement()); + Thread t = new Thread(null, r,namePrefix + threadSeq.getAndIncrement(),0); t.setDaemon(true); return t; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java index 3378592b7..0149fceaa 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java @@ -106,6 +106,7 @@ public class AppAndServiceRegisterClient implements BootService, GRPCChannelList @Override public void run() { + logger.debug("AppAndServiceRegisterClient running, status:{}.",status); boolean shouldTry = true; while (CONNECTED.equals(status) && shouldTry) { shouldTry = false; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java index 4e7fc4c81..1fb385d0f 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java @@ -33,12 +33,11 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.skywalking.apm.agent.core.boot.BootService; import org.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; +import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; -import static org.skywalking.apm.agent.core.conf.Config.Collector.GRPC_CHANNEL_CHECK_INTERVAL; - /** * @author wusheng */ @@ -60,7 +59,7 @@ public class GRPCChannelManager implements BootService, Runnable { public void boot() throws Throwable { connectCheckFuture = Executors .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("GRPCChannelManager")) - .scheduleAtFixedRate(this, 0, GRPC_CHANNEL_CHECK_INTERVAL, TimeUnit.SECONDS); + .scheduleAtFixedRate(this, 0, Config.Collector.GRPC_CHANNEL_CHECK_INTERVAL, TimeUnit.SECONDS); } @Override @@ -72,10 +71,12 @@ public class GRPCChannelManager implements BootService, Runnable { public void shutdown() throws Throwable { connectCheckFuture.cancel(true); managedChannel.shutdownNow(); + logger.debug("Selected collector grpc service shutdown."); } @Override public void run() { + logger.debug("Selected collector grpc service running, reconnect:{}.",reconnect); if (reconnect) { if (RemoteDownstreamConfig.Collector.GRPC_SERVERS.size() > 0) { int index = random.nextInt() % RemoteDownstreamConfig.Collector.GRPC_SERVERS.size(); @@ -101,7 +102,7 @@ public class GRPCChannelManager implements BootService, Runnable { } } - logger.debug("Selected collector grpc service is not available. Wait {} seconds to retry", GRPC_CHANNEL_CHECK_INTERVAL); + logger.debug("Selected collector grpc service is not available. Wait {} seconds to retry", Config.Collector.GRPC_CHANNEL_CHECK_INTERVAL); } } From 7f60b2763ac9e65fd46d19d895dd40219c9ace51 Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Thu, 12 Oct 2017 15:37:41 +0800 Subject: [PATCH 11/12] Random.nextInt() may return negative value.This will cause GRPCChannelManager stop. --- .../apm/agent/core/boot/DefaultNamedThreadFactory.java | 2 +- .../skywalking/apm/agent/core/remote/GRPCChannelManager.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java index 5a804b3a5..55395d810 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/boot/DefaultNamedThreadFactory.java @@ -32,7 +32,7 @@ public class DefaultNamedThreadFactory implements ThreadFactory { } @Override public Thread newThread(Runnable r) { - Thread t = new Thread(null, r,namePrefix + threadSeq.getAndIncrement(),0); + Thread t = new Thread(r,namePrefix + threadSeq.getAndIncrement()); t.setDaemon(true); return t; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java index 1fb385d0f..8f5e264ef 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/remote/GRPCChannelManager.java @@ -79,9 +79,10 @@ public class GRPCChannelManager implements BootService, Runnable { logger.debug("Selected collector grpc service running, reconnect:{}.",reconnect); if (reconnect) { if (RemoteDownstreamConfig.Collector.GRPC_SERVERS.size() > 0) { - int index = random.nextInt() % RemoteDownstreamConfig.Collector.GRPC_SERVERS.size(); - String server = RemoteDownstreamConfig.Collector.GRPC_SERVERS.get(index); + String server = ""; try { + int index = Math.abs(random.nextInt()) % RemoteDownstreamConfig.Collector.GRPC_SERVERS.size(); + server = RemoteDownstreamConfig.Collector.GRPC_SERVERS.get(index); String[] ipAndPort = server.split(":"); ManagedChannelBuilder channelBuilder = NettyChannelBuilder.forAddress(ipAndPort[0], Integer.parseInt(ipAndPort[1])) From d47aa797c97beb3290221a7ee5a7650a24208101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Thu, 12 Oct 2017 16:37:52 +0800 Subject: [PATCH 12/12] Update README_ZH.md --- README_ZH.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_ZH.md b/README_ZH.md index 053748ddd..27414f1cd 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -12,7 +12,7 @@ Sky Walking | [English](README.md) * 自动java探针,**不需要修改应用程序源代码** - * 高性能探针,针对单实例5000tps的应用,在**不需要采样的情况下**,只增加**10%**的CPU开销。 +  * 高性能探针,针对单实例5000tps的应用,在**全量采集的情况下**,只增加**10%**的CPU开销。 * [中间件,框架与类库支持列表](https://github.com/wu-sheng/sky-walking/wiki/3.2-supported-list). * 手动探针 * [使用OpenTracing手动探针API](http://opentracing.io/documentation/pages/supported-tracers)