This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.3 by this push:
     new 04f3fe7d2b add netty4 metrics. (#12695)
04f3fe7d2b is described below

commit 04f3fe7d2b9231ea5fca2bccf308cdcbf56249af
Author: 胡俊 <[email protected]>
AuthorDate: Wed Aug 9 15:46:03 2023 +0800

    add netty4 metrics. (#12695)
---
 .artifacts                                         |  1 +
 .../org/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 ++
 .../org/apache/dubbo/metrics/MetricsConstants.java |  4 +-
 .../metrics/collector/CombMetricsCollector.java    |  4 +
 .../metrics/data/ApplicationStatComposite.java     |  6 ++
 .../dubbo/metrics/data/BaseStatComposite.java      |  4 +
 .../dubbo/metrics/model/MetricsCategory.java       |  1 +
 .../apache/dubbo/metrics/model/key/MetricsKey.java | 21 +++++
 .../metrics/collector/DefaultMetricsCollector.java |  3 +-
 .../dubbo/metrics/event/DefaultSubDispatcher.java  |  7 +-
 .../dubbo/metrics/event/RequestBeforeEvent.java    | 51 ------------
 .../apache/dubbo/metrics/event/RequestEvent.java   | 23 ++++-
 .../filter/support/MetricsClusterFilter.java       |  4 +-
 .../collector/AggregateMetricsCollectorTest.java   |  6 +-
 .../metrics/collector/DefaultCollectorTest.java    |  4 +-
 dubbo-metrics/{ => dubbo-metrics-netty}/pom.xml    | 21 ++---
 .../metrics/registry/NettyMetricsConstants.java    | 44 ++++++++++
 .../registry/collector/NettyMetricsCollector.java  | 97 ++++++++++++++++++++++
 .../dubbo/metrics/registry/event/NettyEvent.java   | 54 ++++++++++++
 .../metrics/registry/event/NettySubDispatcher.java | 53 ++++++++++++
 ...apache.dubbo.metrics.collector.MetricsCollector |  1 +
 dubbo-metrics/pom.xml                              |  1 +
 dubbo-remoting/dubbo-remoting-netty4/pom.xml       | 11 ++-
 .../remoting/transport/netty4/NettyServer.java     | 26 ++++++
 dubbo-test/dubbo-dependencies-all/pom.xml          |  7 ++
 28 files changed, 402 insertions(+), 84 deletions(-)

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 @@
             </xsd:annotation>
         </xsd:attribute>
 
+        <xsd:attribute name="enable-netty" type="xsd:boolean" default="true">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Enable netty metrics when 
collecting. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
         <xsd:attribute name="export-metrics-service" type="xsd:boolean" 
default="true">
             <xsd:annotation>
                 <xsd:documentation><![CDATA[ Enable export metrics service. 
]]></xsd:documentation>
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 @@
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-netty</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
 
         <!-- tracing -->
         <dependency>
@@ -688,6 +695,7 @@
                                     
<include>org.apache.dubbo:dubbo-metrics-registry</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-metadata</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-config-center</include>
+                                    
<include>org.apache.dubbo:dubbo-metrics-netty</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-prometheus</include>
                                     
<include>org.apache.dubbo:dubbo-tracing</include>
                                     
<include>org.apache.dubbo:dubbo-monitor-api</include>
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 @@
                 <artifactId>dubbo-metrics-config-center</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metrics-netty</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
             <!-- tracing -->
             <dependency>
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<E extends 
TimeCounterEvent> 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<MetricSample> export(MetricsCategory category) {
         List<MetricSample> 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<RequestEvent>
 
     @Override
     public boolean isSupport(MetricsEvent event) {
-        return event instanceof RequestEvent || event instanceof 
RequestBeforeEvent;
+        return event instanceof RequestEvent;
     }
 
     public SimpleMetricsCountSampler<String, MetricsEvent.Type, 
ApplicationMetric> applicationSampler = new SimpleMetricsCountSampler<String, 
MetricsEvent.Type, ApplicationMetric>() {
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<RequestBeforeEvent>() {
+        super.addListener(new MetricsListener<RequestEvent>() {
 
             @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/pom.xml b/dubbo-metrics/dubbo-metrics-netty/pom.xml
similarity index 73%
copy from dubbo-metrics/pom.xml
copy to dubbo-metrics/dubbo-metrics-netty/pom.xml
index c10defb8d6..95067ef1b0 100644
--- a/dubbo-metrics/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-netty/pom.xml
@@ -13,39 +13,28 @@
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-  -->
+-->
 <project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
     <modelVersion>4.0.0</modelVersion>
-    <modules>
-        <module>dubbo-metrics-api</module>
-        <module>dubbo-metrics-default</module>
-        <module>dubbo-metrics-registry</module>
-        <module>dubbo-metrics-metadata</module>
-        <module>dubbo-metrics-prometheus</module>
-        <module>dubbo-metrics-config-center</module>
-        <module>dubbo-tracing</module>
-    </modules>
     <parent>
         <groupId>org.apache.dubbo</groupId>
-        <artifactId>dubbo-parent</artifactId>
+        <artifactId>dubbo-metrics</artifactId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
-    <artifactId>dubbo-metrics</artifactId>
-    <packaging>pom</packaging>
+    <artifactId>dubbo-metrics-netty</artifactId>
+    <packaging>jar</packaging>
     <name>${project.artifactId}</name>
     <description>The metrics module of dubbo project</description>
     <properties>
         <skip_maven_deploy>false</skip_maven_deploy>
     </properties>
-
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-test-check</artifactId>
+            <artifactId>dubbo-metrics-api</artifactId>
             <version>${project.parent.version}</version>
-            <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
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<MetricsKey> 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<NettyEvent> {
+
+    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<MetricSample> collect() {
+        List<MetricSample> 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<String, Long> 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 @@
         <module>dubbo-metrics-prometheus</module>
         <module>dubbo-metrics-config-center</module>
         <module>dubbo-tracing</module>
+        <module>dubbo-metrics-netty</module>
     </modules>
     <parent>
         <groupId>org.apache.dubbo</groupId>
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 @@
             <artifactId>dubbo-remoting-api</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-api</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-netty</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-handler-proxy</artifactId>
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<String, Long> 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 @@
             <artifactId>dubbo-metrics-config-center</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-netty</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-metrics-prometheus</artifactId>

Reply via email to