From f310dc3fb8b468d72b010fcc308ee4eb80d716aa Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Wed, 11 Oct 2017 16:52:37 +0800 Subject: [PATCH 1/3] 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 2/3] 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 945d4abe03e2aba974b580205dc31941ec9e72c4 Mon Sep 17 00:00:00 2001 From: zhangkewei Date: Thu, 12 Oct 2017 10:09:20 +0800 Subject: [PATCH 3/3] 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")); + } +}