diff --git a/hippo4j-example/hippo4j-core-nacos-spring-boot-starter-example/src/main/resources/bootstrap.properties b/hippo4j-example/hippo4j-core-nacos-spring-boot-starter-example/src/main/resources/bootstrap.properties index 085bd572..c6c6be70 100644 --- a/hippo4j-example/hippo4j-core-nacos-spring-boot-starter-example/src/main/resources/bootstrap.properties +++ b/hippo4j-example/hippo4j-core-nacos-spring-boot-starter-example/src/main/resources/bootstrap.properties @@ -18,7 +18,7 @@ spring.cloud.nacos.config.extension-configs[0].refresh=true spring.dynamic.thread-pool.enable=true spring.dynamic.thread-pool.banner=true spring.dynamic.thread-pool.collect=true -spring.dynamic.thread-pool.collect-type=metric +spring.dynamic.thread-pool.collect-type=log,prometheus spring.dynamic.thread-pool.check-state-interval=5 spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT diff --git a/hippo4j-monitor/hippo4j-monitor-base/pom.xml b/hippo4j-monitor/hippo4j-monitor-base/pom.xml new file mode 100644 index 00000000..9aec021a --- /dev/null +++ b/hippo4j-monitor/hippo4j-monitor-base/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + cn.hippo4j + hippo4j-monitor + ${revision} + + hippo4j-monitor-base + + + + cn.hippo4j + hippo4j-core + + + + + + + src/main/resources + + **/*.txt + **/*.json + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + ${project.artifactId} + ${project.version} + ${maven.build.timestamp} + chen.ma + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + + + + + diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/AbstractDynamicThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/AbstractDynamicThreadPoolMonitor.java similarity index 93% rename from hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/AbstractDynamicThreadPoolMonitor.java rename to hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/AbstractDynamicThreadPoolMonitor.java index c93c73fc..ec36de7e 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/AbstractDynamicThreadPoolMonitor.java +++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/AbstractDynamicThreadPoolMonitor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package cn.hippo4j.core.springboot.starter.monitor; +package com.example.monitor.base; import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage; @@ -26,9 +26,6 @@ import java.util.List; /** * Abstract dynamic thread-pool monitor. - * - * @author chen.ma - * @date 2022/3/25 12:07 */ @RequiredArgsConstructor public abstract class AbstractDynamicThreadPoolMonitor implements DynamicThreadPoolMonitor { @@ -36,7 +33,7 @@ public abstract class AbstractDynamicThreadPoolMonitor implements DynamicThreadP private final ThreadPoolRunStateHandler threadPoolRunStateHandler; /** - * Execute. + * Execute collection thread pool running data. * * @param poolRunStateInfo */ diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/DynamicThreadPoolMonitor.java similarity index 90% rename from hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitor.java rename to hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/DynamicThreadPoolMonitor.java index eeaa2a65..171df74e 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitor.java +++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/DynamicThreadPoolMonitor.java @@ -15,13 +15,10 @@ * limitations under the License. */ -package cn.hippo4j.core.springboot.starter.monitor; +package com.example.monitor.base; /** * Dynamic thread-pool monitor. - * - * @author chen.ma - * @date 2022/3/25 19:03 */ public interface DynamicThreadPoolMonitor extends ThreadPoolMonitor { diff --git a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/MonitorTypeEnum.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/MonitorTypeEnum.java new file mode 100644 index 00000000..4907c8cc --- /dev/null +++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/MonitorTypeEnum.java @@ -0,0 +1,26 @@ +/* + * 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 com.example.monitor.base; + +/** + * Monitor type enum. + */ +public enum MonitorTypeEnum { + + LOG, PROMETHEUS, SERVER +} diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/ThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/ThreadPoolMonitor.java similarity index 91% rename from hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/ThreadPoolMonitor.java rename to hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/ThreadPoolMonitor.java index 66cb6972..dc3d0c26 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/ThreadPoolMonitor.java +++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/com/example/monitor/base/ThreadPoolMonitor.java @@ -15,13 +15,10 @@ * limitations under the License. */ -package cn.hippo4j.core.springboot.starter.monitor; +package com.example.monitor.base; /** * Thread-pool monitor. - * - * @author chen.ma - * @date 2022/3/25 19:03 */ public interface ThreadPoolMonitor { diff --git a/hippo4j-monitor/hippo4j-monitor-log/pom.xml b/hippo4j-monitor/hippo4j-monitor-log/pom.xml new file mode 100644 index 00000000..b2d454d7 --- /dev/null +++ b/hippo4j-monitor/hippo4j-monitor-log/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + cn.hippo4j + hippo4j-monitor + ${revision} + + hippo4j-monitor-log + + + + cn.hippo4j + hippo4j-monitor-base + ${revision} + + + + + + + src/main/resources + + **/*.txt + **/*.json + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + ${project.artifactId} + ${project.version} + ${maven.build.timestamp} + chen.ma + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + + + + + diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/LogMonitorHandler.java b/hippo4j-monitor/hippo4j-monitor-log/src/main/java/cn/hippo4j/monitor/log/LogMonitorHandler.java similarity index 92% rename from hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/LogMonitorHandler.java rename to hippo4j-monitor/hippo4j-monitor-log/src/main/java/cn/hippo4j/monitor/log/LogMonitorHandler.java index f6d0aee7..36c6a010 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/LogMonitorHandler.java +++ b/hippo4j-monitor/hippo4j-monitor-log/src/main/java/cn/hippo4j/monitor/log/LogMonitorHandler.java @@ -15,18 +15,16 @@ * limitations under the License. */ -package cn.hippo4j.core.springboot.starter.monitor; +package cn.hippo4j.monitor.log; import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.common.toolkit.JSONUtil; import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; +import com.example.monitor.base.AbstractDynamicThreadPoolMonitor; import lombok.extern.slf4j.Slf4j; /** - * Log monitor handler. - * - * @author chen.ma - * @date 2022/3/25 19:22 + * Log monitor handler */ @Slf4j public class LogMonitorHandler extends AbstractDynamicThreadPoolMonitor { diff --git a/hippo4j-monitor/hippo4j-monitor-prometheus/pom.xml b/hippo4j-monitor/hippo4j-monitor-prometheus/pom.xml new file mode 100644 index 00000000..67acbaf0 --- /dev/null +++ b/hippo4j-monitor/hippo4j-monitor-prometheus/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + cn.hippo4j + hippo4j-monitor + ${revision} + + hippo4j-monitor-prometheus + + + + cn.hippo4j + hippo4j-monitor-base + ${revision} + + + + io.micrometer + micrometer-core + ${micrometer-core.version} + + + + + + + src/main/resources + + **/*.txt + **/*.json + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + ${project.artifactId} + ${project.version} + ${maven.build.timestamp} + chen.ma + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + + + + + diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/MetricMonitorHandler.java b/hippo4j-monitor/hippo4j-monitor-prometheus/src/main/java/cn/hippo4j/monitor/prometheus/PrometheusMonitorHandler.java similarity index 92% rename from hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/MetricMonitorHandler.java rename to hippo4j-monitor/hippo4j-monitor-prometheus/src/main/java/cn/hippo4j/monitor/prometheus/PrometheusMonitorHandler.java index 25b8cdbe..95ccc803 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/MetricMonitorHandler.java +++ b/hippo4j-monitor/hippo4j-monitor-prometheus/src/main/java/cn/hippo4j/monitor/prometheus/PrometheusMonitorHandler.java @@ -15,12 +15,13 @@ * limitations under the License. */ -package cn.hippo4j.core.springboot.starter.monitor; +package cn.hippo4j.monitor.prometheus; import cn.hippo4j.common.config.ApplicationContextHolder; import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; import cn.hutool.core.bean.BeanUtil; +import com.example.monitor.base.AbstractDynamicThreadPoolMonitor; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.micrometer.core.instrument.Metrics; @@ -30,12 +31,9 @@ import org.springframework.core.env.Environment; import java.util.Map; /** - * Metric monitor handler. - * - * @author chen.ma - * @date 2022/3/25 20:37 + * Prometheus monitor handler. */ -public class MetricMonitorHandler extends AbstractDynamicThreadPoolMonitor { +public class PrometheusMonitorHandler extends AbstractDynamicThreadPoolMonitor { private final static String METRIC_NAME_PREFIX = "dynamic.thread-pool"; @@ -45,7 +43,7 @@ public class MetricMonitorHandler extends AbstractDynamicThreadPoolMonitor { private final Map RUN_STATE_CACHE = Maps.newConcurrentMap(); - public MetricMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { + public PrometheusMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { super(threadPoolRunStateHandler); } @@ -57,13 +55,11 @@ public class MetricMonitorHandler extends AbstractDynamicThreadPoolMonitor { } else { BeanUtil.copyProperties(poolRunStateInfo, stateInfo); } - Environment environment = ApplicationContextHolder.getInstance().getEnvironment(); String applicationName = environment.getProperty("spring.application.name", "application"); Iterable tags = Lists.newArrayList( Tag.of(DYNAMIC_THREAD_POOL_ID_TAG, poolRunStateInfo.getTpId()), Tag.of(APPLICATION_NAME_TAG, applicationName)); - // load Metrics.gauge(metricName("current.load"), tags, poolRunStateInfo, ThreadPoolRunStateInfo::getSimpleCurrentLoad); Metrics.gauge(metricName("peak.load"), tags, poolRunStateInfo, ThreadPoolRunStateInfo::getSimplePeakLoad); @@ -88,6 +84,6 @@ public class MetricMonitorHandler extends AbstractDynamicThreadPoolMonitor { @Override public String getType() { - return "metric"; + return "prometheus"; } } diff --git a/hippo4j-monitor/pom.xml b/hippo4j-monitor/pom.xml new file mode 100644 index 00000000..386cbaf2 --- /dev/null +++ b/hippo4j-monitor/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + cn.hippo4j + hippo4j-all + ${revision} + + hippo4j-monitor + pom + + + hippo4j-monitor-base + hippo4j-monitor-log + hippo4j-monitor-prometheus + + + + + + src/main/resources + + **/*.txt + **/*.json + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + ${project.artifactId} + ${project.version} + ${maven.build.timestamp} + chen.ma + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + + + + + diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/pom.xml b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/pom.xml index 032e4ce7..b0413e06 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/pom.xml +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/pom.xml @@ -63,20 +63,25 @@ - io.micrometer - micrometer-core - ${micrometer-core.version} - true + cn.hippo4j + hippo4j-adapter-base cn.hippo4j - hippo4j-adapter-base + hippo4j-spring-boot-starter-adapter-web cn.hippo4j - hippo4j-spring-boot-starter-adapter-web + hippo4j-monitor-log + ${revision} + + + + cn.hippo4j + hippo4j-monitor-prometheus + ${revision} diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/BootstrapCoreProperties.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/BootstrapCoreProperties.java index d93e8f4d..8f6a9e50 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/BootstrapCoreProperties.java +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/BootstrapCoreProperties.java @@ -18,8 +18,8 @@ package cn.hippo4j.core.springboot.starter.config; import cn.hippo4j.core.config.BootstrapPropertiesInterface; -import cn.hippo4j.core.springboot.starter.monitor.DynamicThreadPoolMonitor; import cn.hippo4j.core.springboot.starter.parser.ConfigFileTypeEnum; +import com.example.monitor.base.DynamicThreadPoolMonitor; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -56,7 +56,7 @@ public class BootstrapCoreProperties implements BootstrapPropertiesInterface { private Boolean collect = Boolean.TRUE; /** - * Type of collection thread pool running data. eg: log,metric. Multiple can be used at the same time. + * Type of collection thread pool running data. eg: log,prometheus. Multiple can be used at the same time. * Custom SPI support {@link DynamicThreadPoolMonitor}. */ private String collectType; diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/DynamicThreadPoolCoreAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/DynamicThreadPoolCoreAutoConfiguration.java index d2d28cb9..dbbc7107 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/DynamicThreadPoolCoreAutoConfiguration.java +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/DynamicThreadPoolCoreAutoConfiguration.java @@ -21,11 +21,8 @@ import cn.hippo4j.common.config.ApplicationContextHolder; import cn.hippo4j.core.config.UtilAutoConfiguration; import cn.hippo4j.core.enable.MarkerConfiguration; import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler; -import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; import cn.hippo4j.core.handler.DynamicThreadPoolBannerHandler; import cn.hippo4j.core.springboot.starter.monitor.DynamicThreadPoolMonitorExecutor; -import cn.hippo4j.core.springboot.starter.monitor.LogMonitorHandler; -import cn.hippo4j.core.springboot.starter.monitor.MetricMonitorHandler; import cn.hippo4j.core.springboot.starter.notify.CoreNotifyConfigBuilder; import cn.hippo4j.core.springboot.starter.refresher.event.AdapterExecutorsListener; import cn.hippo4j.core.springboot.starter.refresher.event.ExecutorsListener; @@ -51,10 +48,7 @@ import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; /** - * Dynamic thread-pool auto configuration. - * - * @author chen.ma - * @date 2022/2/25 00:21 + * Dynamic thread-pool core auto-configuration. */ @Configuration @AllArgsConstructor @@ -64,7 +58,8 @@ import org.springframework.core.annotation.Order; @ConditionalOnProperty(prefix = BootstrapCoreProperties.PREFIX, value = "enable", matchIfMissing = true, havingValue = "true") @Import({ ConfigHandlerConfiguration.EmbeddedNacos.class, ConfigHandlerConfiguration.EmbeddedNacosCloud.class, - ConfigHandlerConfiguration.EmbeddedApollo.class, ConfigHandlerConfiguration.EmbeddedZookeeper.class + ConfigHandlerConfiguration.EmbeddedApollo.class, ConfigHandlerConfiguration.EmbeddedZookeeper.class, + MonitorHandlerConfiguration.EmbeddedLogMonitor.class, MonitorHandlerConfiguration.EmbeddedPrometheusMonitor.class }) public class DynamicThreadPoolCoreAutoConfiguration { @@ -97,16 +92,6 @@ public class DynamicThreadPoolCoreAutoConfiguration { return new DynamicThreadPoolMonitorExecutor(bootstrapCoreProperties); } - @Bean - public LogMonitorHandler hippo4jLogMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { - return new LogMonitorHandler(threadPoolRunStateHandler); - } - - @Bean - public MetricMonitorHandler hippo4jMetricMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { - return new MetricMonitorHandler(threadPoolRunStateHandler); - } - @Bean @SuppressWarnings("all") public ExecutorsListener hippo4jExecutorsListener(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/MonitorHandlerConfiguration.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/MonitorHandlerConfiguration.java new file mode 100644 index 00000000..28f0b77b --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/MonitorHandlerConfiguration.java @@ -0,0 +1,52 @@ +/* + * 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 cn.hippo4j.core.springboot.starter.config; + +import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; +import cn.hippo4j.core.springboot.starter.config.condition.LogMonitorCondition; +import cn.hippo4j.core.springboot.starter.config.condition.PrometheusMonitorCondition; +import cn.hippo4j.monitor.log.LogMonitorHandler; +import cn.hippo4j.monitor.prometheus.PrometheusMonitorHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +/** + * Monitor handler configuration. + */ +@Configuration(proxyBeanMethods = false) +public class MonitorHandlerConfiguration { + + @Conditional(LogMonitorCondition.class) + static class EmbeddedLogMonitor { + + @Bean + public LogMonitorHandler logMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { + return new LogMonitorHandler(threadPoolRunStateHandler); + } + } + + @Conditional(PrometheusMonitorCondition.class) + static class EmbeddedPrometheusMonitor { + + @Bean + public PrometheusMonitorHandler prometheusMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { + return new PrometheusMonitorHandler(threadPoolRunStateHandler); + } + } +} diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/condition/LogMonitorCondition.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/condition/LogMonitorCondition.java new file mode 100644 index 00000000..d3a8e4f8 --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/condition/LogMonitorCondition.java @@ -0,0 +1,37 @@ +/* + * 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 cn.hippo4j.core.springboot.starter.config.condition; + +import cn.hippo4j.common.toolkit.StringUtil; +import cn.hippo4j.core.springboot.starter.config.BootstrapCoreProperties; +import com.example.monitor.base.MonitorTypeEnum; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * Log monitor condition. + */ +public class LogMonitorCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + String collectType = context.getEnvironment().getProperty(BootstrapCoreProperties.PREFIX + ".collect-type", ""); + return StringUtil.isNotEmpty(collectType) && collectType.contains(MonitorTypeEnum.LOG.name().toLowerCase()) ? true : false; + } +} diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/condition/PrometheusMonitorCondition.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/condition/PrometheusMonitorCondition.java new file mode 100644 index 00000000..5db7b9dc --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/config/condition/PrometheusMonitorCondition.java @@ -0,0 +1,37 @@ +/* + * 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 cn.hippo4j.core.springboot.starter.config.condition; + +import cn.hippo4j.common.toolkit.StringUtil; +import cn.hippo4j.core.springboot.starter.config.BootstrapCoreProperties; +import com.example.monitor.base.MonitorTypeEnum; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * Prometheus monitor condition. + */ +public class PrometheusMonitorCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + String collectType = context.getEnvironment().getProperty(BootstrapCoreProperties.PREFIX + "collect-type", ""); + return StringUtil.isNotEmpty(collectType) && collectType.contains(MonitorTypeEnum.PROMETHEUS.name().toLowerCase()) ? true : false; + } +} diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitorExecutor.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitorExecutor.java index f75c8fa6..a489022d 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitorExecutor.java +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/springboot/starter/monitor/DynamicThreadPoolMonitorExecutor.java @@ -22,6 +22,8 @@ import cn.hippo4j.common.toolkit.StringUtil; import cn.hippo4j.core.executor.support.ThreadFactoryBuilder; import cn.hippo4j.core.spi.DynamicThreadPoolServiceLoader; import cn.hippo4j.core.springboot.starter.config.BootstrapCoreProperties; +import com.example.monitor.base.DynamicThreadPoolMonitor; +import com.example.monitor.base.ThreadPoolMonitor; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -56,15 +58,11 @@ public class DynamicThreadPoolMonitorExecutor implements ApplicationRunner { if (!properties.getCollect() || StringUtil.isBlank(collectType)) { return; } - log.info("Start monitoring the running status of dynamic thread pool."); threadPoolMonitors = Lists.newArrayList(); - - String collectTaskName = "client.scheduled.collect.data"; collectExecutor = new ScheduledThreadPoolExecutor( new Integer(1), - ThreadFactoryBuilder.builder().daemon(true).prefix(collectTaskName).build()); - + ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.collect.data").build()); // Get dynamic thread pool monitoring component. List collectTypes = Arrays.asList(collectType.split(",")); ApplicationContextHolder.getBeansOfType(ThreadPoolMonitor.class) @@ -76,7 +74,6 @@ public class DynamicThreadPoolMonitorExecutor implements ApplicationRunner { Collection dynamicThreadPoolMonitors = DynamicThreadPoolServiceLoader.getSingletonServiceInstances(DynamicThreadPoolMonitor.class); dynamicThreadPoolMonitors.stream().filter(each -> collectTypes.contains(each.getType())).forEach(each -> threadPoolMonitors.add(each)); - // Execute dynamic thread pool monitoring component. collectExecutor.scheduleWithFixedDelay( () -> scheduleRunnable(), diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml index 79cdc118..4c97def7 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml @@ -96,6 +96,12 @@ cn.hippo4j hippo4j-spring-boot-starter-adapter-web + + + cn.hippo4j + hippo4j-monitor-prometheus + ${revision} + diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java index d167eac3..73d6c0b9 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/BootstrapProperties.java @@ -18,6 +18,7 @@ package cn.hippo4j.springboot.starter.config; import cn.hippo4j.core.config.BootstrapPropertiesInterface; +import com.example.monitor.base.DynamicThreadPoolMonitor; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -61,6 +62,7 @@ public class BootstrapProperties implements BootstrapPropertiesInterface { * Report type */ private String reportType; + /** * Namespace */ @@ -86,6 +88,12 @@ public class BootstrapProperties implements BootstrapPropertiesInterface { */ private Boolean collect = true; + /** + * Type of collection thread pool running data. eg: server,prometheus. Multiple can be used at the same time. + * Custom SPI support {@link DynamicThreadPoolMonitor}. + */ + private String collectType; + /** * Task buffer container capacity */ diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java index 359bbb62..683dadeb 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java @@ -53,6 +53,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.env.ConfigurableEnvironment; @@ -69,6 +70,7 @@ import org.springframework.core.env.ConfigurableEnvironment; @EnableConfigurationProperties(BootstrapProperties.class) @ConditionalOnProperty(prefix = BootstrapProperties.PREFIX, value = "enable", matchIfMissing = true, havingValue = "true") @ImportAutoConfiguration({HttpClientConfiguration.class, NettyClientConfiguration.class, DiscoveryConfiguration.class, MessageConfiguration.class, UtilAutoConfiguration.class}) +@Import(MonitorHandlerConfiguration.EmbeddedPrometheusMonitor.class) public class DynamicThreadPoolAutoConfiguration { private final BootstrapProperties properties; diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/MonitorHandlerConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/MonitorHandlerConfiguration.java new file mode 100644 index 00000000..ab556baa --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/MonitorHandlerConfiguration.java @@ -0,0 +1,41 @@ +/* + * 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 cn.hippo4j.springboot.starter.config; + +import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler; +import cn.hippo4j.monitor.prometheus.PrometheusMonitorHandler; +import cn.hippo4j.springboot.starter.config.condition.PrometheusMonitorCondition; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +/** + * Monitor handler configuration. + */ +@Configuration(proxyBeanMethods = false) +public class MonitorHandlerConfiguration { + + @Conditional(PrometheusMonitorCondition.class) + static class EmbeddedPrometheusMonitor { + + @Bean + public PrometheusMonitorHandler prometheusMonitorHandler(ThreadPoolRunStateHandler threadPoolRunStateHandler) { + return new PrometheusMonitorHandler(threadPoolRunStateHandler); + } + } +} diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/condition/PrometheusMonitorCondition.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/condition/PrometheusMonitorCondition.java new file mode 100644 index 00000000..7bde825f --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/condition/PrometheusMonitorCondition.java @@ -0,0 +1,37 @@ +/* + * 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 cn.hippo4j.springboot.starter.config.condition; + +import cn.hippo4j.common.toolkit.StringUtil; +import cn.hippo4j.springboot.starter.config.BootstrapProperties; +import com.example.monitor.base.MonitorTypeEnum; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * Prometheus monitor condition. + */ +public class PrometheusMonitorCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + String collectType = context.getEnvironment().getProperty(BootstrapProperties.PREFIX + ".collect-type", ""); + return StringUtil.isNotEmpty(collectType) && collectType.contains(MonitorTypeEnum.PROMETHEUS.name().toLowerCase()) ? true : false; + } +} diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java index 9650cee6..acc4fd89 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/monitor/ReportingEventExecutor.java @@ -19,13 +19,17 @@ package cn.hippo4j.springboot.starter.monitor; import cn.hippo4j.common.config.ApplicationContextHolder; import cn.hippo4j.common.monitor.Message; +import cn.hippo4j.common.toolkit.ThreadUtil; +import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage; +import cn.hippo4j.core.executor.support.ThreadFactoryBuilder; import cn.hippo4j.springboot.starter.config.BootstrapProperties; import cn.hippo4j.springboot.starter.monitor.collect.Collector; -import cn.hippo4j.springboot.starter.remote.ServerHealthCheck; import cn.hippo4j.springboot.starter.monitor.send.MessageSender; -import cn.hippo4j.core.executor.support.ThreadFactoryBuilder; -import cn.hippo4j.common.toolkit.ThreadUtil; +import cn.hippo4j.springboot.starter.remote.ServerHealthCheck; import cn.hutool.core.collection.CollUtil; +import com.example.monitor.base.MonitorTypeEnum; +import com.example.monitor.base.ThreadPoolMonitor; +import com.google.common.base.Strings; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -68,6 +72,11 @@ public class ReportingEventExecutor implements Runnable, CommandLineRunner, Disp */ private Map collectors; + /** + * Thread pool monitoring collection. + */ + private Map threadPoolMonitors; + /** * Buffer container for data collection, waiting * for ReportingEventExecutor to report to the server. @@ -95,25 +104,39 @@ public class ReportingEventExecutor implements Runnable, CommandLineRunner, Disp @Override public void run(String... args) { - if (properties.getCollect()) { - Integer bufferSize = properties.getTaskBufferSize(); - messageCollectVessel = new ArrayBlockingQueue(bufferSize); - String collectVesselTaskName = "client.scheduled.collect.data"; - collectVesselExecutor = new ScheduledThreadPoolExecutor( - new Integer(1), - ThreadFactoryBuilder.builder().daemon(true).prefix(collectVesselTaskName).build()); + if (!properties.getCollect()) { + return; + } + String collectType = Optional.ofNullable(Strings.emptyToNull(properties.getCollectType())).orElse(MonitorTypeEnum.SERVER.name().toLowerCase()); + collectVesselExecutor = new ScheduledThreadPoolExecutor( + new Integer(collectType.split(",").length), + ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.collect.data").build()); + if (collectType.contains(MonitorTypeEnum.PROMETHEUS.name().toLowerCase()) + || collectType.contains(MonitorTypeEnum.LOG.name().toLowerCase())) { + // Get all dynamic thread pool monitoring components. + threadPoolMonitors = ApplicationContextHolder.getBeansOfType(ThreadPoolMonitor.class); + collectVesselExecutor.scheduleWithFixedDelay( + () -> dynamicThreadPoolMonitor(), + properties.getInitialDelay(), + properties.getCollectInterval(), + TimeUnit.MILLISECONDS); + } + if (collectType.contains(MonitorTypeEnum.SERVER.name().toLowerCase())) { collectVesselExecutor.scheduleWithFixedDelay( () -> runTimeGatherTask(), properties.getInitialDelay(), properties.getCollectInterval(), TimeUnit.MILLISECONDS); - // Start reporting monitoring data thread - String reportingTaskName = "client.thread.reporting.task"; - ThreadUtil.newThread(this, reportingTaskName, Boolean.TRUE).start(); + Integer bufferSize = properties.getTaskBufferSize(); + messageCollectVessel = new ArrayBlockingQueue(bufferSize); // Get all data collection components, currently only historical operation data collection. collectors = ApplicationContextHolder.getBeansOfType(Collector.class); + // Start reporting monitoring data thread. + ThreadUtil.newThread(this, "client.thread.reporting.task", Boolean.TRUE).start(); + } + if (GlobalThreadPoolManage.getThreadPoolNum() > 0) { + log.info("Dynamic thread pool :: [{}]. The dynamic thread pool starts data collection and reporting. ", getThreadPoolNum()); } - log.info("Dynamic thread pool :: [{}]. The dynamic thread pool starts data collection and reporting. ", getThreadPoolNum()); } @Override @@ -121,6 +144,10 @@ public class ReportingEventExecutor implements Runnable, CommandLineRunner, Disp Optional.ofNullable(collectVesselExecutor).ifPresent((each) -> each.shutdown()); } + private void dynamicThreadPoolMonitor() { + threadPoolMonitors.forEach((beanName, monitor) -> monitor.collect()); + } + /** * Collect dynamic thread pool data and add buffer queues. */ diff --git a/pom.xml b/pom.xml index 29f8ee86..88be63ec 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ hippo4j-discovery hippo4j-example hippo4j-message + hippo4j-monitor hippo4j-server hippo4j-spring-boot hippo4j-tool