diff --git hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSource.java hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSource.java index d98837f..3877aae 100644 --- hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSource.java +++ hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSource.java @@ -95,6 +95,11 @@ public interface MetricsHBaseServerSource extends ExceptionTrackingSource { String NUM_LIFO_MODE_SWITCHES_NAME = "numLifoModeSwitches"; String NUM_LIFO_MODE_SWITCHES_DESC = "Total number of calls in general queue which " + "were served from the tail of the queue"; + // Direct Memory Usage metrics + String NETTY_DM_USAGE_NAME = "nettyDirectMemoryUsage"; + + String NETTY_DM_USAGE_DESC = "Current Netty direct memory usage."; + void authorizationSuccess(); diff --git hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapper.java hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapper.java index c66ec59..9e5a549 100644 --- hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapper.java +++ hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapper.java @@ -56,4 +56,6 @@ public interface MetricsHBaseServerWrapper { int getActiveReadRpcHandlerCount(); int getActiveScanRpcHandlerCount(); + + long getNettyDmUsage(); } diff --git hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java index 45f60c4..88673ce 100644 --- hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java +++ hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java @@ -179,7 +179,9 @@ public class MetricsHBaseServerSourceImpl extends ExceptionTrackingSourceImpl .addGauge(Interns.info(NUM_ACTIVE_READ_HANDLER_NAME, NUM_ACTIVE_READ_HANDLER_DESC), wrapper.getActiveReadRpcHandlerCount()) .addGauge(Interns.info(NUM_ACTIVE_SCAN_HANDLER_NAME, NUM_ACTIVE_SCAN_HANDLER_DESC), - wrapper.getActiveScanRpcHandlerCount()); + wrapper.getActiveScanRpcHandlerCount()) + .addGauge(Interns.info(NETTY_DM_USAGE_NAME, NETTY_DM_USAGE_DESC), + wrapper.getNettyDmUsage()); } metricsRegistry.snapshot(mrb, all); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperImpl.java hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperImpl.java index e7341c5..c855b94 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperImpl.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperImpl.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.ipc; +import org.apache.hadoop.hbase.util.DirectMemoryUtils; import org.apache.yetus.audience.InterfaceAudience; @InterfaceAudience.Private @@ -169,4 +170,13 @@ public class MetricsHBaseServerWrapperImpl implements MetricsHBaseServerWrapper } return server.getScheduler().getActiveScanRpcHandlerCount(); } + + @Override + public long getNettyDmUsage() { + if (!isServerStarted() || this.server.getScheduler() == null) { + return 0L; + } + + return DirectMemoryUtils.getNettyDirectMemoryUsage(); + } } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java index 607efe1..a4a61a8 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java @@ -32,11 +32,15 @@ import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; +import org.apache.hbase.thirdparty.io.netty.buffer.ByteBufAllocatorMetric; +import org.apache.hbase.thirdparty.io.netty.buffer.ByteBufAllocatorMetricProvider; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hbase.thirdparty.com.google.common.base.Preconditions; +import org.apache.hbase.thirdparty.io.netty.buffer.PooledByteBufAllocator; + /** * Utilities for interacting with and monitoring DirectByteBuffer allocations. @@ -125,6 +129,16 @@ public class DirectMemoryUtils { } /** + * @return the current amount of direct memory used by netty module. + */ + public static long getNettyDirectMemoryUsage() { + + ByteBufAllocatorMetric metric = ((ByteBufAllocatorMetricProvider) + PooledByteBufAllocator.DEFAULT).metric(); + return metric.usedDirectMemory(); + } + + /** * DirectByteBuffers are garbage collected by using a phantom reference and a * reference queue. Every once a while, the JVM checks the reference queue and * cleans the DirectByteBuffers. However, as this doesn't happen diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperStub.java hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperStub.java index 748ee3d..e56ea7a 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperStub.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerWrapperStub.java @@ -103,4 +103,7 @@ public class MetricsHBaseServerWrapperStub implements MetricsHBaseServerWrapper{ public int getActiveScanRpcHandlerCount() { return 6; } + + @Override + public long getNettyDmUsage() { return 100L; } }