HBASE-26154: Adds exception metrics for QuotaExceededException and RpcThrottlingException (#3545)

Signed-off-by: Xiaolin Ha <haxiaolin@apache.org>
Signed-off-by: Pankaj Kumar<pankajkumar@apache.org>
This commit is contained in:
Bryan Beaudreault 2021-08-02 00:20:17 -04:00 committed by GitHub
parent b248730126
commit 2e9ab3ce94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 53 additions and 2 deletions

View File

@ -41,6 +41,8 @@ public interface ExceptionTrackingSource extends BaseSource {
"rest of the requests will have to be retried."; "rest of the requests will have to be retried.";
String EXCEPTIONS_CALL_QUEUE_TOO_BIG = "exceptions.callQueueTooBig"; String EXCEPTIONS_CALL_QUEUE_TOO_BIG = "exceptions.callQueueTooBig";
String EXCEPTIONS_CALL_QUEUE_TOO_BIG_DESC = "Call queue is full"; String EXCEPTIONS_CALL_QUEUE_TOO_BIG_DESC = "Call queue is full";
String EXCEPTIONS_QUOTA_EXCEEDED = "exceptions.quotaExceeded";
String EXCEPTIONS_RPC_THROTTLING = "exceptions.rpcThrottling";
void exception(); void exception();
@ -56,4 +58,6 @@ public interface ExceptionTrackingSource extends BaseSource {
void tooBusyException(); void tooBusyException();
void multiActionTooLargeException(); void multiActionTooLargeException();
void callQueueTooBigException(); void callQueueTooBigException();
void quotaExceededException();
void rpcThrottlingException();
} }

View File

@ -38,6 +38,8 @@ public class ExceptionTrackingSourceImpl extends BaseSourceImpl
protected MutableFastCounter exceptionsMoved; protected MutableFastCounter exceptionsMoved;
protected MutableFastCounter exceptionsMultiTooLarge; protected MutableFastCounter exceptionsMultiTooLarge;
protected MutableFastCounter exceptionsCallQueueTooBig; protected MutableFastCounter exceptionsCallQueueTooBig;
protected MutableFastCounter exceptionsQuotaExceeded;
protected MutableFastCounter exceptionsRpcThrottling;
public ExceptionTrackingSourceImpl(String metricsName, String metricsDescription, public ExceptionTrackingSourceImpl(String metricsName, String metricsDescription,
String metricsContext, String metricsJmxContext) { String metricsContext, String metricsJmxContext) {
@ -66,6 +68,10 @@ public class ExceptionTrackingSourceImpl extends BaseSourceImpl
.newCounter(EXCEPTIONS_MULTI_TOO_LARGE_NAME, EXCEPTIONS_MULTI_TOO_LARGE_DESC, 0L); .newCounter(EXCEPTIONS_MULTI_TOO_LARGE_NAME, EXCEPTIONS_MULTI_TOO_LARGE_DESC, 0L);
this.exceptionsCallQueueTooBig = this.getMetricsRegistry() this.exceptionsCallQueueTooBig = this.getMetricsRegistry()
.newCounter(EXCEPTIONS_CALL_QUEUE_TOO_BIG, EXCEPTIONS_CALL_QUEUE_TOO_BIG_DESC, 0L); .newCounter(EXCEPTIONS_CALL_QUEUE_TOO_BIG, EXCEPTIONS_CALL_QUEUE_TOO_BIG_DESC, 0L);
this.exceptionsQuotaExceeded = this.getMetricsRegistry()
.newCounter(EXCEPTIONS_QUOTA_EXCEEDED, EXCEPTIONS_TYPE_DESC, 0L);
this.exceptionsRpcThrottling = this.getMetricsRegistry()
.newCounter(EXCEPTIONS_RPC_THROTTLING, EXCEPTIONS_TYPE_DESC, 0L);
} }
@Override @Override
@ -117,4 +123,14 @@ public class ExceptionTrackingSourceImpl extends BaseSourceImpl
public void callQueueTooBigException() { public void callQueueTooBigException() {
exceptionsCallQueueTooBig.incr(); exceptionsCallQueueTooBig.incr();
} }
@Override
public void quotaExceededException() {
exceptionsQuotaExceeded.incr();
}
@Override
public void rpcThrottlingException() {
exceptionsRpcThrottling.incr();
}
} }

View File

@ -184,7 +184,7 @@ public class MetricsAssertHelperImpl implements MetricsAssertHelper {
@Override @Override
public void assertCounter(String name, long expected, BaseSource source) { public void assertCounter(String name, long expected, BaseSource source) {
long found = getCounter(name, source); long found = getCounter(name, source);
assertEquals("Metrics Counters should be equal", (long) Long.valueOf(expected), found); assertEquals(name + "(" + found + ") should be equal", (long) Long.valueOf(expected), found);
} }
@Override @Override

View File

@ -24,15 +24,21 @@ import org.apache.hadoop.hbase.MultiActionResultTooLarge;
import org.apache.hadoop.hbase.NotServingRegionException; import org.apache.hadoop.hbase.NotServingRegionException;
import org.apache.hadoop.hbase.RegionTooBusyException; import org.apache.hadoop.hbase.RegionTooBusyException;
import org.apache.hadoop.hbase.UnknownScannerException; import org.apache.hadoop.hbase.UnknownScannerException;
import org.apache.hadoop.hbase.quotas.QuotaExceededException;
import org.apache.hadoop.hbase.quotas.RpcThrottlingException;
import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hadoop.hbase.CompatibilitySingletonFactory; import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException; import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;
import org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException; import org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException;
import org.apache.hadoop.hbase.exceptions.RegionMovedException; import org.apache.hadoop.hbase.exceptions.RegionMovedException;
import org.apache.hadoop.hbase.exceptions.ScannerResetException; import org.apache.hadoop.hbase.exceptions.ScannerResetException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@InterfaceAudience.Private @InterfaceAudience.Private
public class MetricsHBaseServer { public class MetricsHBaseServer {
private static final Logger LOG = LoggerFactory.getLogger(MetricsHBaseServer.class);
private MetricsHBaseServerSource source; private MetricsHBaseServerSource source;
private MetricsHBaseServerWrapper serverWrapper; private MetricsHBaseServerWrapper serverWrapper;
@ -116,6 +122,12 @@ public class MetricsHBaseServer {
source.multiActionTooLargeException(); source.multiActionTooLargeException();
} else if (throwable instanceof CallQueueTooBigException) { } else if (throwable instanceof CallQueueTooBigException) {
source.callQueueTooBigException(); source.callQueueTooBigException();
} else if (throwable instanceof QuotaExceededException) {
source.quotaExceededException();
} else if (throwable instanceof RpcThrottlingException) {
source.rpcThrottlingException();
} else if (LOG.isDebugEnabled()) {
LOG.debug("Unknown exception type", throwable);
} }
} }
} }

View File

@ -31,9 +31,13 @@ import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;
import org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException; import org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException;
import org.apache.hadoop.hbase.exceptions.RegionMovedException; import org.apache.hadoop.hbase.exceptions.RegionMovedException;
import org.apache.hadoop.hbase.exceptions.ScannerResetException; import org.apache.hadoop.hbase.exceptions.ScannerResetException;
import org.apache.hadoop.hbase.quotas.QuotaExceededException;
import org.apache.hadoop.hbase.quotas.RpcThrottlingException;
import org.apache.hadoop.hbase.thrift.generated.IOError; import org.apache.hadoop.hbase.thrift.generated.IOError;
import org.apache.hadoop.hbase.thrift2.generated.TIOError; import org.apache.hadoop.hbase.thrift2.generated.TIOError;
import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* This class is for maintaining the various statistics of thrift server * This class is for maintaining the various statistics of thrift server
@ -42,6 +46,7 @@ import org.apache.yetus.audience.InterfaceAudience;
@InterfaceAudience.Private @InterfaceAudience.Private
public class ThriftMetrics { public class ThriftMetrics {
private static final Logger LOG = LoggerFactory.getLogger(ThriftMetrics.class);
public enum ThriftServerType { public enum ThriftServerType {
ONE, ONE,
@ -145,6 +150,12 @@ public class ThriftMetrics {
source.multiActionTooLargeException(); source.multiActionTooLargeException();
} else if (throwable instanceof CallQueueTooBigException) { } else if (throwable instanceof CallQueueTooBigException) {
source.callQueueTooBigException(); source.callQueueTooBigException();
} else if (throwable instanceof QuotaExceededException) {
source.quotaExceededException();
} else if (throwable instanceof RpcThrottlingException) {
source.rpcThrottlingException();
} else if (LOG.isDebugEnabled()) {
LOG.debug("Unknown exception type", throwable);
} }
} }
} }

View File

@ -40,6 +40,8 @@ import org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException;
import org.apache.hadoop.hbase.exceptions.RegionMovedException; import org.apache.hadoop.hbase.exceptions.RegionMovedException;
import org.apache.hadoop.hbase.exceptions.ScannerResetException; import org.apache.hadoop.hbase.exceptions.ScannerResetException;
import org.apache.hadoop.hbase.metrics.ExceptionTrackingSource; import org.apache.hadoop.hbase.metrics.ExceptionTrackingSource;
import org.apache.hadoop.hbase.quotas.QuotaExceededException;
import org.apache.hadoop.hbase.quotas.RpcThrottlingException;
import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Bytes;
/** /**
@ -79,6 +81,10 @@ public class ErrorThrowingGetObserver implements RegionCoprocessor, RegionObserv
throw new RegionTooBusyException("Failing for test"); throw new RegionTooBusyException("Failing for test");
case OUT_OF_ORDER_SCANNER_NEXT: case OUT_OF_ORDER_SCANNER_NEXT:
throw new OutOfOrderScannerNextException("Failing for test"); throw new OutOfOrderScannerNextException("Failing for test");
case QUOTA_EXCEEDED:
throw new QuotaExceededException("Failing for test");
case RPC_THROTTLING:
throw new RpcThrottlingException("Failing for test");
default: default:
throw new DoNotRetryIOException("Failing for test"); throw new DoNotRetryIOException("Failing for test");
} }
@ -94,7 +100,9 @@ public class ErrorThrowingGetObserver implements RegionCoprocessor, RegionObserv
SCANNER_RESET(ExceptionTrackingSource.EXCEPTIONS_SCANNER_RESET_NAME), SCANNER_RESET(ExceptionTrackingSource.EXCEPTIONS_SCANNER_RESET_NAME),
UNKNOWN_SCANNER(ExceptionTrackingSource.EXCEPTIONS_UNKNOWN_NAME), UNKNOWN_SCANNER(ExceptionTrackingSource.EXCEPTIONS_UNKNOWN_NAME),
REGION_TOO_BUSY(ExceptionTrackingSource.EXCEPTIONS_BUSY_NAME), REGION_TOO_BUSY(ExceptionTrackingSource.EXCEPTIONS_BUSY_NAME),
OUT_OF_ORDER_SCANNER_NEXT(ExceptionTrackingSource.EXCEPTIONS_OOO_NAME); OUT_OF_ORDER_SCANNER_NEXT(ExceptionTrackingSource.EXCEPTIONS_OOO_NAME),
QUOTA_EXCEEDED(ExceptionTrackingSource.EXCEPTIONS_QUOTA_EXCEEDED),
RPC_THROTTLING(ExceptionTrackingSource.EXCEPTIONS_RPC_THROTTLING);
private final String metricName; private final String metricName;