From 04f3fe7d2b9231ea5fca2bccf308cdcbf56249af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E4=BF=8A?= Date: Wed, 9 Aug 2023 15:46:03 +0800 Subject: [PATCH] add netty4 metrics. (#12695) --- .artifacts | 1 + .../apache/dubbo/config/MetricsConfig.java | 13 +++ .../src/main/resources/META-INF/dubbo.xsd | 6 ++ dubbo-distribution/dubbo-all/pom.xml | 8 ++ dubbo-distribution/dubbo-bom/pom.xml | 5 + .../dubbo/metrics/MetricsConstants.java | 4 +- .../collector/CombMetricsCollector.java | 4 + .../data/ApplicationStatComposite.java | 6 ++ .../dubbo/metrics/data/BaseStatComposite.java | 4 + .../dubbo/metrics/model/MetricsCategory.java | 1 + .../dubbo/metrics/model/key/MetricsKey.java | 21 ++++ .../collector/DefaultMetricsCollector.java | 3 +- .../metrics/event/DefaultSubDispatcher.java | 7 +- .../metrics/event/RequestBeforeEvent.java | 51 ---------- .../dubbo/metrics/event/RequestEvent.java | 23 ++++- .../filter/support/MetricsClusterFilter.java | 4 +- .../AggregateMetricsCollectorTest.java | 6 +- .../collector/DefaultCollectorTest.java | 4 +- dubbo-metrics/dubbo-metrics-netty/pom.xml | 40 ++++++++ .../registry/NettyMetricsConstants.java | 44 +++++++++ .../collector/NettyMetricsCollector.java | 97 +++++++++++++++++++ .../metrics/registry/event/NettyEvent.java | 54 +++++++++++ .../registry/event/NettySubDispatcher.java | 53 ++++++++++ ...e.dubbo.metrics.collector.MetricsCollector | 1 + dubbo-metrics/pom.xml | 1 + dubbo-remoting/dubbo-remoting-netty4/pom.xml | 11 ++- .../transport/netty4/NettyServer.java | 26 +++++ dubbo-test/dubbo-dependencies-all/pom.xml | 7 ++ 28 files changed, 437 insertions(+), 68 deletions(-) delete mode 100644 dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestBeforeEvent.java create mode 100644 dubbo-metrics/dubbo-metrics-netty/pom.xml create mode 100644 dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/NettyMetricsConstants.java create mode 100644 dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/collector/NettyMetricsCollector.java create mode 100644 dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettyEvent.java create mode 100644 dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettySubDispatcher.java create mode 100644 dubbo-metrics/dubbo-metrics-netty/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector diff --git a/.artifacts b/.artifacts index 8e3789b5bb..be912a56f7 100644 --- a/.artifacts +++ b/.artifacts @@ -65,6 +65,7 @@ dubbo-metrics-metadata dubbo-metrics-prometheus dubbo-metrics-registry dubbo-metrics-config-center +dubbo-metrics-netty dubbo-monitor dubbo-monitor-api dubbo-monitor-common diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java index 067833b2b0..37cd727f4c 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java @@ -61,6 +61,11 @@ public class MetricsConfig extends AbstractConfig { */ private Boolean exportMetricsService; + /** + * Enable netty metrics. + */ + private Boolean enableNetty; + /** * @deprecated After metrics config is refactored. * This parameter should no longer use and will be deleted in the future. @@ -223,4 +228,12 @@ public class MetricsConfig extends AbstractConfig { public void setEnableRpc(Boolean enableRpc) { this.enableRpc = enableRpc; } + + public Boolean getEnableNetty() { + return enableNetty; + } + + public void setEnableNetty(Boolean enableNetty) { + this.enableNetty = enableNetty; + } } diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd index a2bcbee0bd..ea3e643132 100644 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd +++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd @@ -1092,6 +1092,12 @@ + + + + + + diff --git a/dubbo-distribution/dubbo-all/pom.xml b/dubbo-distribution/dubbo-all/pom.xml index 838b31caee..89e2b77abc 100644 --- a/dubbo-distribution/dubbo-all/pom.xml +++ b/dubbo-distribution/dubbo-all/pom.xml @@ -232,6 +232,13 @@ compile true + + org.apache.dubbo + dubbo-metrics-netty + ${project.version} + compile + true + @@ -688,6 +695,7 @@ org.apache.dubbo:dubbo-metrics-registry org.apache.dubbo:dubbo-metrics-metadata org.apache.dubbo:dubbo-metrics-config-center + org.apache.dubbo:dubbo-metrics-netty org.apache.dubbo:dubbo-metrics-prometheus org.apache.dubbo:dubbo-tracing org.apache.dubbo:dubbo-monitor-api diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml index 1ce62e76e6..9757c56352 100644 --- a/dubbo-distribution/dubbo-bom/pom.xml +++ b/dubbo-distribution/dubbo-bom/pom.xml @@ -276,6 +276,11 @@ dubbo-metrics-config-center ${project.version} + + org.apache.dubbo + dubbo-metrics-netty + ${project.version} + diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricsConstants.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricsConstants.java index a99e4c6657..b03a63dddc 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricsConstants.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricsConstants.java @@ -22,8 +22,8 @@ public interface MetricsConstants { String INVOCATION = "metric_filter_invocation"; String METHOD_METRICS = "metric_filter_method_metrics"; String INVOCATION_METRICS_COUNTER = "metric_filter_invocation_counter"; - String INVOCATION_SIDE = "metric_filter_side"; + String INVOCATION_REQUEST_ERROR = "metric_request_error"; String ATTACHMENT_KEY_SERVICE = "serviceKey"; String ATTACHMENT_KEY_SIZE = "size"; @@ -32,4 +32,6 @@ public interface MetricsConstants { int SELF_INCREMENT_SIZE = 1; + String NETTY_METRICS_MAP = "nettyMetricsMap"; + } diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/CombMetricsCollector.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/CombMetricsCollector.java index 81ae03eb40..f79d3e7bc5 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/CombMetricsCollector.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/CombMetricsCollector.java @@ -80,6 +80,10 @@ public abstract class CombMetricsCollector extends A stats.calcMethodKeyRt(invocation, registryOpType, responseTime); } + public void setAppNum(MetricsKey metricsKey,Long num) { + stats.setAppKey(metricsKey, num); + } + @Override public void increment(MethodMetric methodMetric, MetricsKeyWrapper wrapper, int size) { this.stats.incrementMethodKey(wrapper, methodMetric, size); diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ApplicationStatComposite.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ApplicationStatComposite.java index 47a432e480..0d539095a6 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ApplicationStatComposite.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ApplicationStatComposite.java @@ -60,6 +60,12 @@ public class ApplicationStatComposite extends AbstractMetricsExport { applicationNumStats.get(metricsKey).getAndAdd(size); } + public void setAppKey(MetricsKey metricsKey, Long num){ + if (!applicationNumStats.containsKey(metricsKey)) { + return; + } + applicationNumStats.get(metricsKey).set(num); + } public List export(MetricsCategory category) { List list = new ArrayList<>(); diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/BaseStatComposite.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/BaseStatComposite.java index c7ddd9dee0..ccaeaac0f2 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/BaseStatComposite.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/BaseStatComposite.java @@ -118,4 +118,8 @@ public abstract class BaseStatComposite implements MetricsExport { public RtStatComposite getRtStatComposite() { return rtStatComposite; } + + public void setAppKey(MetricsKey metricsKey, Long num) { + applicationStatComposite.setAppKey(metricsKey, num); + } } diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java index 0eecdda807..e071a7ddff 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java @@ -29,4 +29,5 @@ public enum MetricsCategory { REGISTRY, METADATA, THREAD_POOL, + NETTY, } diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java index 6b5329edc2..5f0c003876 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java @@ -123,6 +123,18 @@ public enum MetricsKey { // consumer metrics key INVOKER_NO_AVAILABLE_COUNT("dubbo.consumer.invoker.no.available.count", "Request Throw No Invoker Available Exception Count"), + + // netty metrics key + NETTY_ALLOCATOR_HEAP_MEMORY_USED("netty.allocator.memory.used", "Netty Allocator Memory Used"), + NETTY_ALLOCATOR_DIRECT_MEMORY_USED("netty.allocator.direct.memory.used", "Netty Allocator Direct Memory Used"), + NETTY_ALLOCATOR_PINNED_DIRECT_MEMORY("netty.allocator.pinned.direct.memory", "Netty Allocator Pinned Direct Memory"), + NETTY_ALLOCATOR_PINNED_HEAP_MEMORY("netty.allocator.pinned.heap.memory", "Netty Allocator Pinned Heap Memory"), + NETTY_ALLOCATOR_HEAP_ARENAS_NUM("netty.allocator.heap.arenas.num", "Netty Allocator Heap Arenas Num"), + NETTY_ALLOCATOR_DIRECT_ARENAS_NUM("netty.allocator.direct.arenas.num", "Netty Allocator Direct Arenas Num"), + NETTY_ALLOCATOR_NORMAL_CACHE_SIZE("netty.allocator.normal.cache.size", "Netty Allocator Normal Cache Size"), + NETTY_ALLOCATOR_SMALL_CACHE_SIZE("netty.allocator.small.cache.size", "Netty Allocator Small Cache Size"), + NETTY_ALLOCATOR_THREAD_LOCAL_CACHES_NUM("netty.allocator.thread.local.caches.num", "Netty Allocator Thread Local Caches Num"), + NETTY_ALLOCATOR_CHUNK_SIZE("netty.allocator.chunk.size", "Netty Allocator Chunk Size"), ; private String name; @@ -136,6 +148,15 @@ public enum MetricsKey { return String.format(name, type); } + public static MetricsKey getMetricsByName(String name){ + for (MetricsKey metricsKey : MetricsKey.values()) { + if (metricsKey.getName().equals(name)) { + return metricsKey; + } + } + return null; + } + public final String getDescription() { return this.description; } diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java index c4c3ef9ec0..4581141771 100644 --- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java +++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java @@ -29,7 +29,6 @@ import org.apache.dubbo.metrics.data.MethodStatComposite; import org.apache.dubbo.metrics.data.RtStatComposite; import org.apache.dubbo.metrics.event.DefaultSubDispatcher; import org.apache.dubbo.metrics.event.MetricsEvent; -import org.apache.dubbo.metrics.event.RequestBeforeEvent; import org.apache.dubbo.metrics.event.RequestEvent; import org.apache.dubbo.metrics.model.ApplicationMetric; import org.apache.dubbo.metrics.model.MetricsCategory; @@ -138,7 +137,7 @@ public class DefaultMetricsCollector extends CombMetricsCollector @Override public boolean isSupport(MetricsEvent event) { - return event instanceof RequestEvent || event instanceof RequestBeforeEvent; + return event instanceof RequestEvent; } public SimpleMetricsCountSampler applicationSampler = new SimpleMetricsCountSampler() { diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java index 9894c67d11..807736709b 100644 --- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java +++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java @@ -43,17 +43,16 @@ public final class DefaultSubDispatcher extends SimpleMetricsEventMulticaster { super.addListener(categoryOverall.getFinish().getEventFunc().apply(collector)); super.addListener(categoryOverall.getError().getEventFunc().apply(collector)); - super.addListener(new MetricsListener() { + super.addListener(new MetricsListener() { @Override public boolean isSupport(MetricsEvent event) { - return event instanceof RequestBeforeEvent; + return event instanceof RequestEvent && ((RequestEvent) event).isRequestErrorEvent(); } - private final MetricsPlaceValue dynamicPlaceType = MetricsPlaceValue.of(CommonConstants.CONSUMER, MetricsLevel.METHOD); @Override - public void onEvent(RequestBeforeEvent event) { + public void onEvent(RequestEvent event) { MetricsSupport.increment(METRIC_REQUESTS_SERVICE_UNAVAILABLE_FAILED, dynamicPlaceType, (MethodMetricsCollector) collector, event); } }); diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestBeforeEvent.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestBeforeEvent.java deleted file mode 100644 index 5b7d7c64da..0000000000 --- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestBeforeEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.dubbo.metrics.event; - -import org.apache.dubbo.metrics.MetricsConstants; -import org.apache.dubbo.metrics.model.MethodMetric; -import org.apache.dubbo.metrics.model.MetricsSupport; -import org.apache.dubbo.metrics.model.key.MetricsKey; -import org.apache.dubbo.metrics.model.key.MetricsLevel; -import org.apache.dubbo.metrics.model.key.TypeWrapper; -import org.apache.dubbo.rpc.Invocation; -import org.apache.dubbo.rpc.model.ApplicationModel; - -import static org.apache.dubbo.metrics.MetricsConstants.ATTACHMENT_KEY_SERVICE; - -/** - * Acts on MetricsClusterFilter to monitor exceptions that occur before request execution - */ -public class RequestBeforeEvent extends TimeCounterEvent { - - public RequestBeforeEvent(ApplicationModel source, String appName, MetricsDispatcher metricsDispatcher, TypeWrapper typeWrapper) { - super(source, appName, metricsDispatcher, typeWrapper); - - } - - private static final TypeWrapper REQUEST_BEFORE_EVENT = new TypeWrapper(MetricsLevel.METHOD, MetricsKey.METRIC_REQUESTS); - public static RequestBeforeEvent toEvent(ApplicationModel applicationModel, String appName, MetricsDispatcher metricsDispatcher, Invocation invocation, String side) { - RequestBeforeEvent event = new RequestBeforeEvent(applicationModel, appName, metricsDispatcher, REQUEST_BEFORE_EVENT); - event.putAttachment(ATTACHMENT_KEY_SERVICE, MetricsSupport.getInterfaceName(invocation)); - event.putAttachment(MetricsConstants.INVOCATION_SIDE, side); - event.putAttachment(MetricsConstants.INVOCATION, invocation); - event.putAttachment(MetricsConstants.METHOD_METRICS, new MethodMetric(applicationModel, invocation)); - return event; - } - -} diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestEvent.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestEvent.java index acb0aad159..93ad680df1 100644 --- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestEvent.java +++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/RequestEvent.java @@ -23,6 +23,7 @@ import org.apache.dubbo.metrics.collector.DefaultMetricsCollector; import org.apache.dubbo.metrics.exception.MetricsNeverHappenException; import org.apache.dubbo.metrics.model.MethodMetric; import org.apache.dubbo.metrics.model.MetricsSupport; +import org.apache.dubbo.metrics.model.key.MetricsKey; import org.apache.dubbo.metrics.model.key.MetricsLevel; import org.apache.dubbo.metrics.model.key.TypeWrapper; import org.apache.dubbo.rpc.Invocation; @@ -39,7 +40,8 @@ import static org.apache.dubbo.metrics.model.key.MetricsKey.METRIC_REQUEST_BUSIN * Request related events */ public class RequestEvent extends TimeCounterEvent { - private static final TypeWrapper TYPE_WRAPPER = new TypeWrapper(MetricsLevel.SERVICE, METRIC_REQUESTS, METRIC_REQUESTS_SUCCEED, METRIC_REQUEST_BUSINESS_FAILED); + private static final TypeWrapper REQUEST_EVENT = new TypeWrapper(MetricsLevel.SERVICE, METRIC_REQUESTS, METRIC_REQUESTS_SUCCEED, METRIC_REQUEST_BUSINESS_FAILED); + private static final TypeWrapper REQUEST_ERROR_EVENT = new TypeWrapper(MetricsLevel.METHOD, MetricsKey.METRIC_REQUESTS); public RequestEvent(ApplicationModel applicationModel, String appName, MetricsDispatcher metricsDispatcher, DefaultMetricsCollector collector, TypeWrapper TYPE_WRAPPER) { super(applicationModel, appName, metricsDispatcher, TYPE_WRAPPER); @@ -56,7 +58,7 @@ public class RequestEvent extends TimeCounterEvent { MetricsDispatcher metricsDispatcher, DefaultMetricsCollector collector, Invocation invocation, String side) { MethodMetric methodMetric = new MethodMetric(applicationModel, invocation); - RequestEvent requestEvent = new RequestEvent(applicationModel, appName, metricsDispatcher, collector, TYPE_WRAPPER); + RequestEvent requestEvent = new RequestEvent(applicationModel, appName, metricsDispatcher, collector, REQUEST_EVENT); requestEvent.putAttachment(MetricsConstants.INVOCATION, invocation); requestEvent.putAttachment(MetricsConstants.METHOD_METRICS, methodMetric); requestEvent.putAttachment(ATTACHMENT_KEY_SERVICE, MetricsSupport.getInterfaceName(invocation)); @@ -74,4 +76,21 @@ public class RequestEvent extends TimeCounterEvent { } super.putAttachment(METRIC_THROWABLE, ((Result) postResult).getException()); } + + /** + * Acts on MetricsClusterFilter to monitor exceptions that occur before request execution + */ + public static RequestEvent toRequestErrorEvent(ApplicationModel applicationModel, String appName, MetricsDispatcher metricsDispatcher, Invocation invocation, String side, int code) { + RequestEvent event = new RequestEvent(applicationModel, appName, metricsDispatcher, null, REQUEST_ERROR_EVENT); + event.putAttachment(ATTACHMENT_KEY_SERVICE, MetricsSupport.getInterfaceName(invocation)); + event.putAttachment(MetricsConstants.INVOCATION_SIDE, side); + event.putAttachment(MetricsConstants.INVOCATION, invocation); + event.putAttachment(MetricsConstants.INVOCATION_REQUEST_ERROR, code); + event.putAttachment(MetricsConstants.METHOD_METRICS, new MethodMetric(applicationModel, invocation)); + return event; + } + + public boolean isRequestErrorEvent(){ + return super.getAttachmentValue(MetricsConstants.INVOCATION_REQUEST_ERROR) != null; + } } diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/MetricsClusterFilter.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/MetricsClusterFilter.java index 03c9018517..5634202384 100644 --- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/MetricsClusterFilter.java +++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/MetricsClusterFilter.java @@ -22,7 +22,7 @@ import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.metrics.collector.DefaultMetricsCollector; import org.apache.dubbo.metrics.event.MetricsDispatcher; import org.apache.dubbo.metrics.event.MetricsEventBus; -import org.apache.dubbo.metrics.event.RequestBeforeEvent; +import org.apache.dubbo.metrics.event.RequestEvent; import org.apache.dubbo.rpc.BaseFilter; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; @@ -73,7 +73,7 @@ public class MetricsClusterFilter implements ClusterFilter, BaseFilter.Listener, if (t instanceof RpcException) { RpcException e = (RpcException) t; if (e.isForbidden()) { - MetricsEventBus.publish(RequestBeforeEvent.toEvent(applicationModel, appName, metricsDispatcher, invocation, CONSUMER_SIDE)); + MetricsEventBus.publish(RequestEvent.toRequestErrorEvent(applicationModel, appName, metricsDispatcher, invocation, CONSUMER_SIDE, e.getCode())); } } } diff --git a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java index a99be4735d..652d335ab8 100644 --- a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java +++ b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java @@ -31,7 +31,6 @@ import org.apache.dubbo.metrics.TestMetricsInvoker; import org.apache.dubbo.metrics.aggregate.TimeWindowCounter; import org.apache.dubbo.metrics.event.MetricsDispatcher; import org.apache.dubbo.metrics.event.MetricsEventBus; -import org.apache.dubbo.metrics.event.RequestBeforeEvent; import org.apache.dubbo.metrics.event.RequestEvent; import org.apache.dubbo.metrics.filter.MetricsFilter; import org.apache.dubbo.metrics.listener.MetricsListener; @@ -143,9 +142,10 @@ class AggregateMetricsCollectorTest { void testListener() { AggregateMetricsCollector metricsCollector = new AggregateMetricsCollector(applicationModel); RequestEvent event = RequestEvent.toRequestEvent(applicationModel, null, null, null, invocation, MetricsSupport.getSide(invocation)); - RequestBeforeEvent beforeEvent = new RequestBeforeEvent(applicationModel, null, null, new TypeWrapper(MetricsLevel.METHOD, MetricsKey.METRIC_REQUESTS)); + RequestEvent beforeEvent = RequestEvent.toRequestErrorEvent(applicationModel, null, null, invocation, MetricsSupport.getSide(invocation), RpcException.FORBIDDEN_EXCEPTION); + Assertions.assertTrue(metricsCollector.isSupport(event)); - Assertions.assertFalse(metricsCollector.isSupport(beforeEvent)); + Assertions.assertTrue(metricsCollector.isSupport(beforeEvent)); } @AfterEach diff --git a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java index 6113908990..450da8a7c6 100644 --- a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java +++ b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java @@ -22,7 +22,6 @@ import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.metrics.TestMetricsInvoker; import org.apache.dubbo.metrics.event.MetricsDispatcher; -import org.apache.dubbo.metrics.event.RequestBeforeEvent; import org.apache.dubbo.metrics.event.RequestEvent; import org.apache.dubbo.metrics.filter.MetricsFilter; import org.apache.dubbo.metrics.model.MetricsSupport; @@ -114,7 +113,8 @@ class DefaultCollectorTest { void testListener() { DefaultMetricsCollector metricsCollector = new DefaultMetricsCollector(applicationModel); RequestEvent event = RequestEvent.toRequestEvent(applicationModel, null, null, null, invocation, MetricsSupport.getSide(invocation)); - RequestBeforeEvent beforeEvent = new RequestBeforeEvent(applicationModel, null, null, new TypeWrapper(MetricsLevel.METHOD, MetricsKey.METRIC_REQUESTS)); + RequestEvent beforeEvent = RequestEvent.toRequestErrorEvent(applicationModel, null, null, invocation, MetricsSupport.getSide(invocation), RpcException.FORBIDDEN_EXCEPTION); + Assertions.assertTrue(metricsCollector.isSupport(event)); Assertions.assertTrue(metricsCollector.isSupport(beforeEvent)); } diff --git a/dubbo-metrics/dubbo-metrics-netty/pom.xml b/dubbo-metrics/dubbo-metrics-netty/pom.xml new file mode 100644 index 0000000000..95067ef1b0 --- /dev/null +++ b/dubbo-metrics/dubbo-metrics-netty/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + org.apache.dubbo + dubbo-metrics + ${revision} + ../pom.xml + + dubbo-metrics-netty + jar + ${project.artifactId} + The metrics module of dubbo project + + false + + + + org.apache.dubbo + dubbo-metrics-api + ${project.parent.version} + + + diff --git a/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/NettyMetricsConstants.java b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/NettyMetricsConstants.java new file mode 100644 index 0000000000..236ba2d254 --- /dev/null +++ b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/NettyMetricsConstants.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dubbo.metrics.registry; + +import org.apache.dubbo.metrics.model.key.MetricsKey; + +import java.util.Arrays; +import java.util.List; + +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_CHUNK_SIZE; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_DIRECT_ARENAS_NUM; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_DIRECT_MEMORY_USED; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_HEAP_ARENAS_NUM; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_HEAP_MEMORY_USED; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_NORMAL_CACHE_SIZE; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_PINNED_DIRECT_MEMORY; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_PINNED_HEAP_MEMORY; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_SMALL_CACHE_SIZE; +import static org.apache.dubbo.metrics.model.key.MetricsKey.NETTY_ALLOCATOR_THREAD_LOCAL_CACHES_NUM; + +public interface NettyMetricsConstants { + + // App-level + List APP_LEVEL_KEYS = Arrays.asList(NETTY_ALLOCATOR_HEAP_MEMORY_USED,NETTY_ALLOCATOR_DIRECT_MEMORY_USED + ,NETTY_ALLOCATOR_PINNED_DIRECT_MEMORY,NETTY_ALLOCATOR_PINNED_HEAP_MEMORY,NETTY_ALLOCATOR_HEAP_ARENAS_NUM + ,NETTY_ALLOCATOR_DIRECT_ARENAS_NUM,NETTY_ALLOCATOR_NORMAL_CACHE_SIZE,NETTY_ALLOCATOR_SMALL_CACHE_SIZE,NETTY_ALLOCATOR_THREAD_LOCAL_CACHES_NUM + ,NETTY_ALLOCATOR_CHUNK_SIZE); + +} diff --git a/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/collector/NettyMetricsCollector.java b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/collector/NettyMetricsCollector.java new file mode 100644 index 0000000000..e6d871c8db --- /dev/null +++ b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/collector/NettyMetricsCollector.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dubbo.metrics.registry.collector; + +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.config.context.ConfigManager; +import org.apache.dubbo.metrics.collector.CombMetricsCollector; +import org.apache.dubbo.metrics.collector.MetricsCollector; +import org.apache.dubbo.metrics.data.ApplicationStatComposite; +import org.apache.dubbo.metrics.data.BaseStatComposite; +import org.apache.dubbo.metrics.data.RtStatComposite; +import org.apache.dubbo.metrics.data.ServiceStatComposite; +import org.apache.dubbo.metrics.model.MetricsCategory; +import org.apache.dubbo.metrics.model.sample.MetricSample; +import org.apache.dubbo.metrics.registry.NettyMetricsConstants; +import org.apache.dubbo.metrics.registry.event.NettyEvent; +import org.apache.dubbo.metrics.registry.event.NettySubDispatcher; +import org.apache.dubbo.rpc.model.ApplicationModel; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + + +/** + * Netty implementation of {@link MetricsCollector} + */ +@Activate +public class NettyMetricsCollector extends CombMetricsCollector { + + private Boolean collectEnabled = null; + private final ApplicationModel applicationModel; + + public NettyMetricsCollector(ApplicationModel applicationModel) { + super(new BaseStatComposite(applicationModel) { + @Override + protected void init(ApplicationStatComposite applicationStatComposite) { + super.init(applicationStatComposite); + applicationStatComposite.init(NettyMetricsConstants.APP_LEVEL_KEYS); + } + + @Override + protected void init(ServiceStatComposite serviceStatComposite) { + super.init(serviceStatComposite); + } + + @Override + protected void init(RtStatComposite rtStatComposite) { + super.init(rtStatComposite); + } + }); + super.setEventMulticaster(new NettySubDispatcher(this)); + this.applicationModel = applicationModel; + } + + public void setCollectEnabled(Boolean collectEnabled) { + if (collectEnabled != null) { + this.collectEnabled = collectEnabled; + } + } + + @Override + public boolean isCollectEnabled() { + if (collectEnabled == null) { + ConfigManager configManager = applicationModel.getApplicationConfigManager(); + configManager.getMetrics().ifPresent(metricsConfig -> setCollectEnabled(metricsConfig.getEnableNetty())); + } + return Optional.ofNullable(collectEnabled).orElse(true); + } + + + @Override + public List collect() { + List list = new ArrayList<>(); + if (!isCollectEnabled()) { + return list; + } + list.addAll(super.export(MetricsCategory.NETTY)); + return list; + } + +} diff --git a/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettyEvent.java b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettyEvent.java new file mode 100644 index 0000000000..72c8aff56f --- /dev/null +++ b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettyEvent.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dubbo.metrics.registry.event; + +import org.apache.dubbo.common.beans.factory.ScopeBeanFactory; +import org.apache.dubbo.metrics.event.TimeCounterEvent; +import org.apache.dubbo.metrics.model.key.MetricsLevel; +import org.apache.dubbo.metrics.model.key.TypeWrapper; +import org.apache.dubbo.metrics.registry.collector.NettyMetricsCollector; +import org.apache.dubbo.rpc.model.ApplicationModel; + +import static org.apache.dubbo.metrics.MetricsConstants.NETTY_METRICS_MAP; + + +/** + * Netty related events + */ +public class NettyEvent extends TimeCounterEvent { + public NettyEvent(ApplicationModel applicationModel, TypeWrapper typeWrapper) { + super(applicationModel,typeWrapper); + ScopeBeanFactory beanFactory = getSource().getBeanFactory(); + NettyMetricsCollector collector; + if (!beanFactory.isDestroyed()) { + collector = beanFactory.getBean(NettyMetricsCollector.class); + super.setAvailable(collector != null && collector.isCollectEnabled()); + } + } + + public static NettyEvent toNettyEvent(ApplicationModel applicationModel) { + return new NettyEvent(applicationModel, new TypeWrapper(MetricsLevel.APP, null,null, null)) { + @Override + public void customAfterPost(Object postResult) { + super.putAttachment(NETTY_METRICS_MAP, postResult); + } + }; + } + + +} diff --git a/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettySubDispatcher.java b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettySubDispatcher.java new file mode 100644 index 0000000000..040014c3f2 --- /dev/null +++ b/dubbo-metrics/dubbo-metrics-netty/src/main/java/org/apache/dubbo/metrics/registry/event/NettySubDispatcher.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dubbo.metrics.registry.event; + +import org.apache.dubbo.metrics.event.MetricsEvent; +import org.apache.dubbo.metrics.event.SimpleMetricsEventMulticaster; +import org.apache.dubbo.metrics.event.TimeCounterEvent; +import org.apache.dubbo.metrics.listener.AbstractMetricsKeyListener; +import org.apache.dubbo.metrics.model.key.MetricsKey; +import org.apache.dubbo.metrics.registry.collector.NettyMetricsCollector; + +import java.util.Collections; + +import java.util.Map; + +import static org.apache.dubbo.metrics.MetricsConstants.NETTY_METRICS_MAP; + +public final class NettySubDispatcher extends SimpleMetricsEventMulticaster { + + public NettySubDispatcher(NettyMetricsCollector collector) { + super.addListener(new AbstractMetricsKeyListener(null) { + @Override + public boolean isSupport(MetricsEvent event) { + return true; + } + + @Override + public void onEventFinish(TimeCounterEvent event) { + Map lastNumMap = Collections.unmodifiableMap(event.getAttachmentValue(NETTY_METRICS_MAP)); + lastNumMap.forEach( + (k, v) -> { + MetricsKey metricsKey = MetricsKey.getMetricsByName(k); + collector.setAppNum(metricsKey, v); + }); + } + }); + } +} diff --git a/dubbo-metrics/dubbo-metrics-netty/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector b/dubbo-metrics/dubbo-metrics-netty/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector new file mode 100644 index 0000000000..29c24de5ad --- /dev/null +++ b/dubbo-metrics/dubbo-metrics-netty/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector @@ -0,0 +1 @@ +org.apache.dubbo.metrics.registry.collector.NettyMetricsCollector diff --git a/dubbo-metrics/pom.xml b/dubbo-metrics/pom.xml index c10defb8d6..014632df63 100644 --- a/dubbo-metrics/pom.xml +++ b/dubbo-metrics/pom.xml @@ -25,6 +25,7 @@ dubbo-metrics-prometheus dubbo-metrics-config-center dubbo-tracing + dubbo-metrics-netty org.apache.dubbo diff --git a/dubbo-remoting/dubbo-remoting-netty4/pom.xml b/dubbo-remoting/dubbo-remoting-netty4/pom.xml index 447da39ef6..f94dce6bf3 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/pom.xml +++ b/dubbo-remoting/dubbo-remoting-netty4/pom.xml @@ -40,7 +40,16 @@ dubbo-remoting-api ${project.parent.version} - + + org.apache.dubbo + dubbo-metrics-api + ${project.parent.version} + + + org.apache.dubbo + dubbo-metrics-netty + ${project.parent.version} + io.netty netty-handler-proxy diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java index 8511370b5d..6acf226391 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java @@ -20,8 +20,12 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.config.ConfigurationUtils; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.ClassUtils; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.NetUtils; +import org.apache.dubbo.metrics.event.MetricsEventBus; +import org.apache.dubbo.metrics.model.key.MetricsKey; +import org.apache.dubbo.metrics.registry.event.NettyEvent; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.ChannelHandler; import org.apache.dubbo.remoting.Constants; @@ -30,6 +34,7 @@ import org.apache.dubbo.remoting.transport.AbstractServer; import org.apache.dubbo.remoting.transport.dispatcher.ChannelHandlers; import org.apache.dubbo.remoting.transport.netty4.ssl.SslServerTlsHandler; import org.apache.dubbo.remoting.utils.UrlUtils; +import org.apache.dubbo.rpc.model.ApplicationModel; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; @@ -44,6 +49,7 @@ import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -109,6 +115,26 @@ public class NettyServer extends AbstractServer { channelFuture.syncUninterruptibly(); channel = channelFuture.channel(); + // metrics + if (isSupportMetrics()) { + ApplicationModel applicationModel = ApplicationModel.defaultModel(); + MetricsEventBus.post(NettyEvent.toNettyEvent(applicationModel), () -> { + Map dataMap = new HashMap<>(); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_HEAP_MEMORY_USED.getName(), PooledByteBufAllocator.DEFAULT.metric().usedHeapMemory()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_DIRECT_MEMORY_USED.getName(), PooledByteBufAllocator.DEFAULT.metric().usedDirectMemory()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_HEAP_ARENAS_NUM.getName(), (long) PooledByteBufAllocator.DEFAULT.numHeapArenas()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_DIRECT_ARENAS_NUM.getName(), (long) PooledByteBufAllocator.DEFAULT.numDirectArenas()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_NORMAL_CACHE_SIZE.getName(), (long) PooledByteBufAllocator.DEFAULT.normalCacheSize()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_SMALL_CACHE_SIZE.getName(), (long) PooledByteBufAllocator.DEFAULT.smallCacheSize()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_THREAD_LOCAL_CACHES_NUM.getName(), (long) PooledByteBufAllocator.DEFAULT.numThreadLocalCaches()); + dataMap.put(MetricsKey.NETTY_ALLOCATOR_CHUNK_SIZE.getName(), (long) PooledByteBufAllocator.DEFAULT.chunkSize()); + return dataMap; + }); + } + } + + private boolean isSupportMetrics() { + return ClassUtils.isPresent("io.netty.buffer.PooledByteBufAllocatorMetric", NettyServer.class.getClassLoader()); } protected EventLoopGroup createBossGroup() { diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml b/dubbo-test/dubbo-dependencies-all/pom.xml index 9f407a4dbb..0216003790 100644 --- a/dubbo-test/dubbo-dependencies-all/pom.xml +++ b/dubbo-test/dubbo-dependencies-all/pom.xml @@ -203,6 +203,13 @@ dubbo-metrics-config-center ${project.version} + + + org.apache.dubbo + dubbo-metrics-netty + ${project.version} + + org.apache.dubbo dubbo-metrics-prometheus