diff --git a/adapter/adapter-brpc/src/main/java/org/dromara/dynamictp/apapter/brpc/client/StarlightClientDtpAdapter.java b/adapter/adapter-brpc/src/main/java/org/dromara/dynamictp/apapter/brpc/client/StarlightClientDtpAdapter.java index 324e66459..1cdacf8c5 100644 --- a/adapter/adapter-brpc/src/main/java/org/dromara/dynamictp/apapter/brpc/client/StarlightClientDtpAdapter.java +++ b/adapter/adapter-brpc/src/main/java/org/dromara/dynamictp/apapter/brpc/client/StarlightClientDtpAdapter.java @@ -29,7 +29,6 @@ import org.dromara.dynamictp.common.util.ReflectionUtil; import org.dromara.dynamictp.jvmti.JVMTI; -import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -63,7 +62,7 @@ protected void initialize() { super.initialize(); List starlightClients = Lists.newArrayList(); - starlightClients.addAll(Arrays.asList(JVMTI.getInstances(StarlightClient.class))); + starlightClients.addAll(JVMTI.getInstances(StarlightClient.class)); if (CollectionUtils.isEmpty(starlightClients)) { log.warn("Cannot find beans of type StarlightClient."); return; diff --git a/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java b/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java index da374c050..5b76765f1 100644 --- a/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java +++ b/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java @@ -22,7 +22,7 @@ import io.grpc.internal.ServerImpl; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.common.util.ReflectionUtil; @@ -59,7 +59,7 @@ public void refresh(DtpProperties dtpProperties) { @Override protected void initialize() { val beans = JVMTI.getInstances(ServerImpl.class); - if (ArrayUtils.isEmpty(beans)) { + if (CollectionUtils.isEmpty(beans)) { log.warn("Cannot find beans of type ServerImpl."); return; } diff --git a/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java b/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java index 5faba6596..a653d71e8 100644 --- a/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java +++ b/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java @@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService; @@ -70,7 +71,7 @@ protected void initialize() { public void adaptConsumerExecutors() { val beans = JVMTI.getInstances(DefaultMQPushConsumer.class); - if (ArrayUtils.isEmpty(beans)) { + if (CollectionUtils.isEmpty(beans)) { log.warn("Cannot find beans of type DefaultMQPushConsumer."); return; } @@ -97,7 +98,7 @@ public void adaptConsumerExecutors() { public void adaptProducerExecutors() { val beans = JVMTI.getInstances(DefaultMQProducer.class); - if (ArrayUtils.isEmpty(beans)) { + if (CollectionUtils.isEmpty(beans)) { log.warn("Cannot find beans of type DefaultMQProducer."); return; } diff --git a/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java b/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java index df68112c0..3670a8414 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java +++ b/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java @@ -89,9 +89,9 @@ public void run() { double processCpuUsage = (double) elapsedCpu / elapsedTime / cpuCores; prevProcessCpuTime = newProcessCpuTime; prevUpTime = newUpTime; - currProcessCpuUsage = Math.min(processCpuUsage, 1); + currProcessCpuUsage = processCpuUsage; } catch (Throwable e) { - log.warn("Get system metrics error.", e); + log.error("Get system metrics error.", e); } } } diff --git a/example/example-consul-cloud/pom.xml b/example/example-consul-cloud/pom.xml index 937532bb7..830759aaf 100644 --- a/example/example-consul-cloud/pom.xml +++ b/example/example-consul-cloud/pom.xml @@ -70,6 +70,11 @@ org.springframework.boot spring-boot-starter-undertow + + + org.dromara.dynamictp + dynamic-tp-extension-skywalking + \ No newline at end of file diff --git a/extension/extension-skywalking/src/main/java/org/dromara/dynamictp/extension/skywalking/init/SwInitializer.java b/extension/extension-skywalking/src/main/java/org/dromara/dynamictp/extension/skywalking/init/SwInitializer.java index 056d9885c..ff83ffd95 100644 --- a/extension/extension-skywalking/src/main/java/org/dromara/dynamictp/extension/skywalking/init/SwInitializer.java +++ b/extension/extension-skywalking/src/main/java/org/dromara/dynamictp/extension/skywalking/init/SwInitializer.java @@ -18,10 +18,11 @@ package org.dromara.dynamictp.extension.skywalking.init; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.core.support.init.DtpInitializer; import org.dromara.dynamictp.jvmti.JVMTI; -import java.util.Objects; +import java.util.List; import static org.dromara.dynamictp.common.constant.DynamicTpConst.DTP_EXECUTE_ENHANCED; import static org.dromara.dynamictp.common.constant.DynamicTpConst.FALSE_STR; @@ -49,8 +50,8 @@ public String getName() { @Override public void init() { try { - ClassLoader[] classLoaders = JVMTI.getInstances(ClassLoader.class); - if (Objects.isNull(classLoaders)) { + List classLoaders = JVMTI.getInstances(ClassLoader.class); + if (CollectionUtils.isEmpty(classLoaders)) { return; } for (ClassLoader cl : classLoaders) { @@ -65,7 +66,7 @@ public void init() { } } } catch (Throwable e) { - log.error("DynamicTp {} init error", getName(), e); + log.error("DynamicTp {} init failed", getName(), e); } } diff --git a/jvmti/jvmti-runtime/src/main/java/org/dromara/dynamictp/jvmti/JVMTI.java b/jvmti/jvmti-runtime/src/main/java/org/dromara/dynamictp/jvmti/JVMTI.java index a6af3ae3d..2f9a6e5a7 100644 --- a/jvmti/jvmti-runtime/src/main/java/org/dromara/dynamictp/jvmti/JVMTI.java +++ b/jvmti/jvmti-runtime/src/main/java/org/dromara/dynamictp/jvmti/JVMTI.java @@ -18,10 +18,15 @@ package org.dromara.dynamictp.jvmti; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.scijava.nativelib.JniExtractor; import org.scijava.nativelib.NativeLoader; import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; /** * Use JVMTI technology to implement some things that Java code can't do. @@ -36,18 +41,22 @@ public class JVMTI { private static final String LIB_NAME = "JniLibrary"; + private static final AtomicBoolean AVAILABLE = new AtomicBoolean(false); + static { try { final JniExtractor extractor = NativeLoader.getJniExtractor(); final String path = extractor.extractJni("", LIB_NAME).getAbsolutePath(); System.load(path); + AVAILABLE.set(true); } catch (Throwable ignored) { try { File path = new File(JVMTI.class.getProtectionDomain().getCodeSource().getLocation().getPath()); String libPath = new File(path, JVMTIUtils.detectLibName()).getAbsolutePath(); System.load(libPath); + AVAILABLE.set(true); } catch (Throwable t) { - log.error("JVMTI init failed !", t); + log.error("JVMTI initialization failed, currently only linux and macos are supported!", t); } } } @@ -61,14 +70,14 @@ public class JVMTI { * @throws RuntimeException if find many instances */ public static T getInstance(final Class klass) { - final T[] instances = getInstances0(klass, 1); - if (null == instances || instances.length == 0) { + final List instances = getInstances(klass, 1); + if (CollectionUtils.isEmpty(instances)) { return null; } - if (instances.length > 1) { + if (instances.size() > 1) { throw new RuntimeException("expect only one instance, actually find many instances !"); } - return instances[0]; + return instances.get(0); } /** @@ -80,8 +89,8 @@ public static T getInstance(final Class klass) { * @param class type * @return current surviving instances */ - public static T[] getInstances(final Class klass) { - return getInstances0(klass, -1); + public static List getInstances(final Class klass) { + return getInstances(klass, -1); } /** @@ -95,8 +104,11 @@ public static T[] getInstances(final Class klass) { * It is recommended to pass in a small {@code limit} value which is larger than 0. * @return current surviving instances */ - public static T[] getInstances(final Class klass, final int limit) { - return getInstances0(klass, limit); + public static List getInstances(final Class klass, final int limit) { + if (!AVAILABLE.get()) { + return Collections.emptyList(); + } + return Arrays.asList(getInstances0(klass, limit)); } /**