HBASE-27890 Expose a getter on Connection/AsyncConnection for getting public access to connection metrics
This commit is contained in:
parent
79c985f246
commit
26a3e9ced3
|
@ -237,4 +237,9 @@ public interface AsyncConnection extends Closeable {
|
||||||
*/
|
*/
|
||||||
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)
|
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.HBCK)
|
||||||
Hbck getHbck(ServerName masterServer) throws IOException;
|
Hbck getHbck(ServerName masterServer) throws IOException;
|
||||||
|
|
||||||
|
/** Returns a statistical sample of {@link MetricsConnection} */
|
||||||
|
default MetricsConnectionSnapshot getMetrics() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -453,4 +453,9 @@ public class AsyncConnectionImpl implements AsyncConnection {
|
||||||
Optional<MetricsConnection> getConnectionMetrics() {
|
Optional<MetricsConnection> getConnectionMetrics() {
|
||||||
return metrics;
|
return metrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetricsConnectionSnapshot getMetrics() {
|
||||||
|
return metrics.map(MetricsConnection::snapshot).orElse(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,4 +216,9 @@ public interface Connection extends Abortable, Closeable {
|
||||||
default Hbck getHbck(ServerName masterServer) throws IOException {
|
default Hbck getHbck(ServerName masterServer) throws IOException {
|
||||||
return toAsyncConnection().getHbck(masterServer);
|
return toAsyncConnection().getHbck(masterServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns a statistical sample of {@link MetricsConnection} */
|
||||||
|
default MetricsConnectionSnapshot getMetrics() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,4 +226,9 @@ class ConnectionOverAsyncConnection implements Connection {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "connection-over-async-connection-0x" + Integer.toHexString(hashCode());
|
return "connection-over-async-connection-0x" + Integer.toHexString(hashCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MetricsConnectionSnapshot getMetrics() {
|
||||||
|
return conn.getMetrics();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
package org.apache.hadoop.hbase.client;
|
package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
import static com.codahale.metrics.MetricRegistry.name;
|
import static com.codahale.metrics.MetricRegistry.name;
|
||||||
|
import static org.apache.hadoop.hbase.client.MetricsConnectionSnapshot.snapshotMap;
|
||||||
import static org.apache.hadoop.hbase.util.ConcurrentMapUtils.computeIfAbsent;
|
import static org.apache.hadoop.hbase.util.ConcurrentMapUtils.computeIfAbsent;
|
||||||
|
|
||||||
import com.codahale.metrics.Counter;
|
import com.codahale.metrics.Counter;
|
||||||
|
@ -36,6 +37,9 @@ import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.hbase.ServerName;
|
import org.apache.hadoop.hbase.ServerName;
|
||||||
|
import org.apache.hadoop.hbase.client.MetricsConnectionSnapshot.CallTrackerSnapshot;
|
||||||
|
import org.apache.hadoop.hbase.client.MetricsConnectionSnapshot.RegionStatsSnapshot;
|
||||||
|
import org.apache.hadoop.hbase.client.MetricsConnectionSnapshot.RunnerStatsSnapshot;
|
||||||
import org.apache.hadoop.hbase.util.Bytes;
|
import org.apache.hadoop.hbase.util.Bytes;
|
||||||
import org.apache.hadoop.ipc.RemoteException;
|
import org.apache.hadoop.ipc.RemoteException;
|
||||||
import org.apache.yetus.audience.InterfaceAudience;
|
import org.apache.yetus.audience.InterfaceAudience;
|
||||||
|
@ -219,6 +223,10 @@ public final class MetricsConnection implements StatisticTrackable {
|
||||||
this.respHist.update(stats.getResponseSizeBytes());
|
this.respHist.update(stats.getResponseSizeBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "CallTracker:" + name;
|
return "CallTracker:" + name;
|
||||||
|
@ -247,12 +255,12 @@ public final class MetricsConnection implements StatisticTrackable {
|
||||||
protected static class RunnerStats {
|
protected static class RunnerStats {
|
||||||
final Counter normalRunners;
|
final Counter normalRunners;
|
||||||
final Counter delayRunners;
|
final Counter delayRunners;
|
||||||
final Histogram delayIntevalHist;
|
final Histogram delayIntervalHist;
|
||||||
|
|
||||||
public RunnerStats(MetricRegistry registry) {
|
public RunnerStats(MetricRegistry registry) {
|
||||||
this.normalRunners = registry.counter(name(MetricsConnection.class, "normalRunnersCount"));
|
this.normalRunners = registry.counter(name(MetricsConnection.class, "normalRunnersCount"));
|
||||||
this.delayRunners = registry.counter(name(MetricsConnection.class, "delayRunnersCount"));
|
this.delayRunners = registry.counter(name(MetricsConnection.class, "delayRunnersCount"));
|
||||||
this.delayIntevalHist =
|
this.delayIntervalHist =
|
||||||
registry.histogram(name(MetricsConnection.class, "delayIntervalHist"));
|
registry.histogram(name(MetricsConnection.class, "delayIntervalHist"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,11 +273,11 @@ public final class MetricsConnection implements StatisticTrackable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateDelayInterval(long interval) {
|
public void updateDelayInterval(long interval) {
|
||||||
this.delayIntevalHist.update(interval);
|
this.delayIntervalHist.update(interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ConcurrentHashMap<ServerName, ConcurrentMap<byte[], RegionStats>> serverStats =
|
private final ConcurrentHashMap<ServerName, ConcurrentMap<byte[], RegionStats>> serverStats =
|
||||||
new ConcurrentHashMap<>();
|
new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public void updateServerStats(ServerName serverName, byte[] regionName, Object r) {
|
public void updateServerStats(ServerName serverName, byte[] regionName, Object r) {
|
||||||
|
@ -359,6 +367,8 @@ public final class MetricsConnection implements StatisticTrackable {
|
||||||
private final Counter nsLookups;
|
private final Counter nsLookups;
|
||||||
private final Counter nsLookupsFailed;
|
private final Counter nsLookupsFailed;
|
||||||
private final Timer overloadedBackoffTimer;
|
private final Timer overloadedBackoffTimer;
|
||||||
|
private final RatioGauge executorPoolUsageRatio;
|
||||||
|
private final RatioGauge metaPoolUsageRatio;
|
||||||
|
|
||||||
// dynamic metrics
|
// dynamic metrics
|
||||||
|
|
||||||
|
@ -379,46 +389,20 @@ public final class MetricsConnection implements StatisticTrackable {
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
addThreadPools(batchPool, metaPool);
|
addThreadPools(batchPool, metaPool);
|
||||||
this.registry = new MetricRegistry();
|
this.registry = new MetricRegistry();
|
||||||
this.registry.register(getExecutorPoolName(), new RatioGauge() {
|
this.executorPoolUsageRatio = new RatioGauge() {
|
||||||
@Override
|
@Override
|
||||||
protected Ratio getRatio() {
|
protected Ratio getRatio() {
|
||||||
int numerator = 0;
|
return calculateThreadPoolUsageRatio(batchPools);
|
||||||
int denominator = 0;
|
|
||||||
for (Supplier<ThreadPoolExecutor> poolSupplier : batchPools) {
|
|
||||||
ThreadPoolExecutor pool = poolSupplier.get();
|
|
||||||
if (pool != null) {
|
|
||||||
int activeCount = pool.getActiveCount();
|
|
||||||
int maxPoolSize = pool.getMaximumPoolSize();
|
|
||||||
/* The max thread usage ratio among batch pools of all connections */
|
|
||||||
if (numerator == 0 || (numerator * maxPoolSize) < (activeCount * denominator)) {
|
|
||||||
numerator = activeCount;
|
|
||||||
denominator = maxPoolSize;
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
this.metaPoolUsageRatio = new RatioGauge() {
|
||||||
return Ratio.of(numerator, denominator);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.registry.register(getMetaPoolName(), new RatioGauge() {
|
|
||||||
@Override
|
@Override
|
||||||
protected Ratio getRatio() {
|
protected Ratio getRatio() {
|
||||||
int numerator = 0;
|
return calculateThreadPoolUsageRatio(metaPools);
|
||||||
int denominator = 0;
|
|
||||||
for (Supplier<ThreadPoolExecutor> poolSupplier : metaPools) {
|
|
||||||
ThreadPoolExecutor pool = poolSupplier.get();
|
|
||||||
if (pool != null) {
|
|
||||||
int activeCount = pool.getActiveCount();
|
|
||||||
int maxPoolSize = pool.getMaximumPoolSize();
|
|
||||||
/* The max thread usage ratio among meta lookup pools of all connections */
|
|
||||||
if (numerator == 0 || (numerator * maxPoolSize) < (activeCount * denominator)) {
|
|
||||||
numerator = activeCount;
|
|
||||||
denominator = maxPoolSize;
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
this.registry.register(getExecutorPoolName(), executorPoolUsageRatio);
|
||||||
return Ratio.of(numerator, denominator);
|
this.registry.register(getMetaPoolName(), metaPoolUsageRatio);
|
||||||
}
|
|
||||||
});
|
|
||||||
this.connectionCount = registry.counter(name(this.getClass(), "connectionCount", scope));
|
this.connectionCount = registry.counter(name(this.getClass(), "connectionCount", scope));
|
||||||
this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));
|
this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));
|
||||||
this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));
|
this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));
|
||||||
|
@ -745,4 +729,51 @@ public final class MetricsConnection implements StatisticTrackable {
|
||||||
public void incrNsLookupsFailed() {
|
public void incrNsLookupsFailed() {
|
||||||
this.nsLookupsFailed.inc();
|
this.nsLookupsFailed.inc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private RatioGauge.Ratio
|
||||||
|
calculateThreadPoolUsageRatio(Iterable<Supplier<ThreadPoolExecutor>> pools) {
|
||||||
|
int numerator = 0;
|
||||||
|
int denominator = 0;
|
||||||
|
for (Supplier<ThreadPoolExecutor> poolSupplier : pools) {
|
||||||
|
ThreadPoolExecutor pool = poolSupplier.get();
|
||||||
|
if (pool != null) {
|
||||||
|
int activeCount = pool.getActiveCount();
|
||||||
|
int maxPoolSize = pool.getMaximumPoolSize();
|
||||||
|
/* The max thread usage ratio among pools of all connections */
|
||||||
|
if (numerator == 0 || (numerator * maxPoolSize) < (activeCount * denominator)) {
|
||||||
|
numerator = activeCount;
|
||||||
|
denominator = maxPoolSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RatioGauge.Ratio.of(numerator, denominator);
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized MetricsConnectionSnapshot snapshot() {
|
||||||
|
return MetricsConnectionSnapshot.newBuilder().connectionCount(connectionCount.getCount())
|
||||||
|
.metaCacheHits(metaCacheHits.getCount()).metaCacheMisses(metaCacheMisses.getCount())
|
||||||
|
.getTrackerSnap(CallTrackerSnapshot.snapshot(getTracker))
|
||||||
|
.scanTrackerSnap(CallTrackerSnapshot.snapshot(scanTracker))
|
||||||
|
.appendTrackerSnap(CallTrackerSnapshot.snapshot(appendTracker))
|
||||||
|
.deleteTrackerSnap(CallTrackerSnapshot.snapshot(deleteTracker))
|
||||||
|
.incrementTrackerSnap(CallTrackerSnapshot.snapshot(incrementTracker))
|
||||||
|
.putTrackerSnap(CallTrackerSnapshot.snapshot(putTracker))
|
||||||
|
.multiTrackerSnap(CallTrackerSnapshot.snapshot(multiTracker))
|
||||||
|
.runnerStatsSnap(RunnerStatsSnapshot.snapshot(runnerStats))
|
||||||
|
.metaCacheNumClearServer(metaCacheNumClearServer.getCount())
|
||||||
|
.metaCacheNumClearRegion(metaCacheNumClearRegion.getCount())
|
||||||
|
.hedgedReadOps(hedgedReadOps.getCount()).hedgedReadWin(hedgedReadWin.getCount())
|
||||||
|
.concurrentCallsPerServerHistSnap(concurrentCallsPerServerHist.getSnapshot())
|
||||||
|
.numActionsPerServerHistSnap(numActionsPerServerHist.getSnapshot())
|
||||||
|
.nsLookups(nsLookups.getCount()).nsLookupsFailed(nsLookupsFailed.getCount())
|
||||||
|
.overloadedBackoffTimerSnap(overloadedBackoffTimer.getSnapshot())
|
||||||
|
.executorPoolUsageRatio(executorPoolUsageRatio.getValue())
|
||||||
|
.metaPoolUsageRatio(metaPoolUsageRatio.getValue())
|
||||||
|
.rpcTimersSnap(snapshotMap(rpcTimers, Timer::getSnapshot))
|
||||||
|
.rpcHistSnap(snapshotMap(rpcHistograms, Histogram::getSnapshot))
|
||||||
|
.cacheDroppingExceptions(snapshotMap(cacheDroppingExceptions, Counter::getCount))
|
||||||
|
.rpcCounters(snapshotMap(rpcCounters, Counter::getCount)).serverStats(snapshotMap(serverStats,
|
||||||
|
regionStatsMap -> snapshotMap(regionStatsMap, RegionStatsSnapshot::snapshot)))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,499 @@
|
||||||
|
/*
|
||||||
|
* 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.hadoop.hbase.client;
|
||||||
|
|
||||||
|
import com.codahale.metrics.Snapshot;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import org.apache.hadoop.hbase.ServerName;
|
||||||
|
import org.apache.yetus.audience.InterfaceAudience;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A statistical sample of {@link MetricsConnection}.
|
||||||
|
*/
|
||||||
|
@InterfaceAudience.Public
|
||||||
|
public final class MetricsConnectionSnapshot {
|
||||||
|
private final long connectionCount;
|
||||||
|
private final long metaCacheHits;
|
||||||
|
private final long metaCacheMisses;
|
||||||
|
private final CallTrackerSnapshot getTrackerSnap;
|
||||||
|
private final CallTrackerSnapshot scanTrackerSnap;
|
||||||
|
private final CallTrackerSnapshot appendTrackerSnap;
|
||||||
|
private final CallTrackerSnapshot deleteTrackerSnap;
|
||||||
|
private final CallTrackerSnapshot incrementTrackerSnap;
|
||||||
|
private final CallTrackerSnapshot putTrackerSnap;
|
||||||
|
private final CallTrackerSnapshot multiTrackerSnap;
|
||||||
|
private final RunnerStatsSnapshot runnerStatsSnap;
|
||||||
|
private final long metaCacheNumClearServer;
|
||||||
|
private final long metaCacheNumClearRegion;
|
||||||
|
private final long hedgedReadOps;
|
||||||
|
private final long hedgedReadWin;
|
||||||
|
private final Snapshot concurrentCallsPerServerHistSnap;
|
||||||
|
private final Snapshot numActionsPerServerHistSnap;
|
||||||
|
private final long nsLookups;
|
||||||
|
private final long nsLookupsFailed;
|
||||||
|
private final Snapshot overloadedBackoffTimerSnap;
|
||||||
|
private final double executorPoolUsageRatio;
|
||||||
|
private final double metaPoolUsageRatio;
|
||||||
|
private final Map<String, Snapshot> rpcTimersSnap;
|
||||||
|
private final Map<String, Snapshot> rpcHistSnap;
|
||||||
|
private final Map<String, Long> cacheDroppingExceptions;
|
||||||
|
private final Map<String, Long> rpcCounters;
|
||||||
|
private final Map<ServerName, Map<byte[], RegionStatsSnapshot>> serverStats;
|
||||||
|
|
||||||
|
public static class CallTrackerSnapshot {
|
||||||
|
private final String name;
|
||||||
|
private final Snapshot callTimerSnap;
|
||||||
|
private final Snapshot reqHistSnap;
|
||||||
|
private final Snapshot respHistSnap;
|
||||||
|
|
||||||
|
public CallTrackerSnapshot(String name, Snapshot callTimerSnap, Snapshot reqHistSnap,
|
||||||
|
Snapshot respHistSnap) {
|
||||||
|
this.name = name;
|
||||||
|
this.callTimerSnap = callTimerSnap;
|
||||||
|
this.reqHistSnap = reqHistSnap;
|
||||||
|
this.respHistSnap = respHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getCallTimerSnap() {
|
||||||
|
return callTimerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getReqHistSnap() {
|
||||||
|
return reqHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getRespHistSnap() {
|
||||||
|
return respHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CallTrackerSnapshot snapshot(MetricsConnection.CallTracker callTracker) {
|
||||||
|
return new CallTrackerSnapshot(callTracker.getName(), callTracker.callTimer.getSnapshot(),
|
||||||
|
callTracker.reqHist.getSnapshot(), callTracker.respHist.getSnapshot());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RunnerStatsSnapshot {
|
||||||
|
private final long normalRunners;
|
||||||
|
private final long delayRunners;
|
||||||
|
private final Snapshot delayIntervalHistSnap;
|
||||||
|
|
||||||
|
public RunnerStatsSnapshot(long normalRunners, long delayRunners,
|
||||||
|
Snapshot delayIntervalHistSnap) {
|
||||||
|
this.normalRunners = normalRunners;
|
||||||
|
this.delayRunners = delayRunners;
|
||||||
|
this.delayIntervalHistSnap = delayIntervalHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getNormalRunners() {
|
||||||
|
return normalRunners;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDelayRunners() {
|
||||||
|
return delayRunners;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getDelayIntervalHistSnap() {
|
||||||
|
return delayIntervalHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RunnerStatsSnapshot snapshot(MetricsConnection.RunnerStats runnerStats) {
|
||||||
|
return new RunnerStatsSnapshot(runnerStats.normalRunners.getCount(),
|
||||||
|
runnerStats.delayRunners.getCount(), runnerStats.delayIntervalHist.getSnapshot());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RegionStatsSnapshot {
|
||||||
|
private final String name;
|
||||||
|
private final Snapshot memstoreLoadHistSnap;
|
||||||
|
private final Snapshot heapOccupancyHistSnap;
|
||||||
|
|
||||||
|
public RegionStatsSnapshot(String name, Snapshot memstoreLoadHistSnap,
|
||||||
|
Snapshot heapOccupancyHistSnap) {
|
||||||
|
this.name = name;
|
||||||
|
this.memstoreLoadHistSnap = memstoreLoadHistSnap;
|
||||||
|
this.heapOccupancyHistSnap = heapOccupancyHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getMemstoreLoadHistSnap() {
|
||||||
|
return memstoreLoadHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getHeapOccupancyHistSnap() {
|
||||||
|
return heapOccupancyHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RegionStatsSnapshot snapshot(MetricsConnection.RegionStats regionStats) {
|
||||||
|
return new RegionStatsSnapshot(regionStats.name, regionStats.memstoreLoadHist.getSnapshot(),
|
||||||
|
regionStats.heapOccupancyHist.getSnapshot());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshot(long connectionCount, long metaCacheHits, long metaCacheMisses,
|
||||||
|
CallTrackerSnapshot getTrackerSnap, CallTrackerSnapshot scanTrackerSnap,
|
||||||
|
CallTrackerSnapshot appendTrackerSnap, CallTrackerSnapshot deleteTrackerSnap,
|
||||||
|
CallTrackerSnapshot incrementTrackerSnap, CallTrackerSnapshot putTrackerSnap,
|
||||||
|
CallTrackerSnapshot multiTrackerSnap, RunnerStatsSnapshot runnerStatsSnap,
|
||||||
|
long metaCacheNumClearServer, long metaCacheNumClearRegion, long hedgedReadOps,
|
||||||
|
long hedgedReadWin, Snapshot concurrentCallsPerServerHistSnap,
|
||||||
|
Snapshot numActionsPerServerHistSnap, long nsLookups, long nsLookupsFailed,
|
||||||
|
Snapshot overloadedBackoffTimerSnap, double executorPoolUsageRatio, double metaPoolUsageRatio,
|
||||||
|
Map<String, Snapshot> rpcTimersSnap, Map<String, Snapshot> rpcHistSnap,
|
||||||
|
Map<String, Long> cacheDroppingExceptions, Map<String, Long> rpcCounters,
|
||||||
|
Map<ServerName, Map<byte[], RegionStatsSnapshot>> serverStats) {
|
||||||
|
this.connectionCount = connectionCount;
|
||||||
|
this.metaCacheHits = metaCacheHits;
|
||||||
|
this.metaCacheMisses = metaCacheMisses;
|
||||||
|
this.getTrackerSnap = getTrackerSnap;
|
||||||
|
this.scanTrackerSnap = scanTrackerSnap;
|
||||||
|
this.appendTrackerSnap = appendTrackerSnap;
|
||||||
|
this.deleteTrackerSnap = deleteTrackerSnap;
|
||||||
|
this.incrementTrackerSnap = incrementTrackerSnap;
|
||||||
|
this.putTrackerSnap = putTrackerSnap;
|
||||||
|
this.multiTrackerSnap = multiTrackerSnap;
|
||||||
|
this.runnerStatsSnap = runnerStatsSnap;
|
||||||
|
this.metaCacheNumClearServer = metaCacheNumClearServer;
|
||||||
|
this.metaCacheNumClearRegion = metaCacheNumClearRegion;
|
||||||
|
this.hedgedReadOps = hedgedReadOps;
|
||||||
|
this.hedgedReadWin = hedgedReadWin;
|
||||||
|
this.concurrentCallsPerServerHistSnap = concurrentCallsPerServerHistSnap;
|
||||||
|
this.numActionsPerServerHistSnap = numActionsPerServerHistSnap;
|
||||||
|
this.nsLookups = nsLookups;
|
||||||
|
this.nsLookupsFailed = nsLookupsFailed;
|
||||||
|
this.overloadedBackoffTimerSnap = overloadedBackoffTimerSnap;
|
||||||
|
this.executorPoolUsageRatio = executorPoolUsageRatio;
|
||||||
|
this.metaPoolUsageRatio = metaPoolUsageRatio;
|
||||||
|
this.rpcTimersSnap = rpcTimersSnap;
|
||||||
|
this.rpcHistSnap = rpcHistSnap;
|
||||||
|
this.cacheDroppingExceptions = cacheDroppingExceptions;
|
||||||
|
this.rpcCounters = rpcCounters;
|
||||||
|
this.serverStats = serverStats;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetricsConnectionSnapshotBuilder newBuilder() {
|
||||||
|
return new MetricsConnectionSnapshotBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
static class MetricsConnectionSnapshotBuilder {
|
||||||
|
private long connectionCount;
|
||||||
|
private long metaCacheHits;
|
||||||
|
private long metaCacheMisses;
|
||||||
|
private CallTrackerSnapshot getTrackerSnap;
|
||||||
|
private CallTrackerSnapshot scanTrackerSnap;
|
||||||
|
private CallTrackerSnapshot appendTrackerSnap;
|
||||||
|
private CallTrackerSnapshot deleteTrackerSnap;
|
||||||
|
private CallTrackerSnapshot incrementTrackerSnap;
|
||||||
|
private CallTrackerSnapshot putTrackerSnap;
|
||||||
|
private CallTrackerSnapshot multiTrackerSnap;
|
||||||
|
private RunnerStatsSnapshot runnerStatsSnap;
|
||||||
|
private long metaCacheNumClearServer;
|
||||||
|
private long metaCacheNumClearRegion;
|
||||||
|
private long hedgedReadOps;
|
||||||
|
private long hedgedReadWin;
|
||||||
|
private Snapshot concurrentCallsPerServerHistSnap;
|
||||||
|
private Snapshot numActionsPerServerHistSnap;
|
||||||
|
private long nsLookups;
|
||||||
|
private long nsLookupsFailed;
|
||||||
|
private Snapshot overloadedBackoffTimerSnap;
|
||||||
|
private double executorPoolUsageRatio;
|
||||||
|
private double metaPoolUsageRatio;
|
||||||
|
private Map<String, Snapshot> rpcTimersSnap;
|
||||||
|
private Map<String, Snapshot> rpcHistSnap;
|
||||||
|
private Map<String, Long> cacheDroppingExceptions;
|
||||||
|
private Map<String, Long> rpcCounters;
|
||||||
|
private Map<ServerName, Map<byte[], RegionStatsSnapshot>> serverStats;
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder connectionCount(long connectionCount) {
|
||||||
|
this.connectionCount = connectionCount;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder metaCacheHits(long metaCacheHits) {
|
||||||
|
this.metaCacheHits = metaCacheHits;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder metaCacheMisses(long metaCacheMisses) {
|
||||||
|
this.metaCacheMisses = metaCacheMisses;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder getTrackerSnap(CallTrackerSnapshot getTrackerSnap) {
|
||||||
|
this.getTrackerSnap = getTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder scanTrackerSnap(CallTrackerSnapshot scanTrackerSnap) {
|
||||||
|
this.scanTrackerSnap = scanTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
appendTrackerSnap(CallTrackerSnapshot appendTrackerSnap) {
|
||||||
|
this.appendTrackerSnap = appendTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
deleteTrackerSnap(CallTrackerSnapshot deleteTrackerSnap) {
|
||||||
|
this.deleteTrackerSnap = deleteTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
incrementTrackerSnap(CallTrackerSnapshot incrementTrackerSnap) {
|
||||||
|
this.incrementTrackerSnap = incrementTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder putTrackerSnap(CallTrackerSnapshot putTrackerSnap) {
|
||||||
|
this.putTrackerSnap = putTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder multiTrackerSnap(CallTrackerSnapshot multiTrackerSnap) {
|
||||||
|
this.multiTrackerSnap = multiTrackerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder runnerStatsSnap(RunnerStatsSnapshot runnerStatsSnap) {
|
||||||
|
this.runnerStatsSnap = runnerStatsSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder metaCacheNumClearServer(long metaCacheNumClearServer) {
|
||||||
|
this.metaCacheNumClearServer = metaCacheNumClearServer;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder metaCacheNumClearRegion(long metaCacheNumClearRegion) {
|
||||||
|
this.metaCacheNumClearRegion = metaCacheNumClearRegion;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder hedgedReadOps(long hedgedReadOps) {
|
||||||
|
this.hedgedReadOps = hedgedReadOps;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder hedgedReadWin(long hedgedReadWin) {
|
||||||
|
this.hedgedReadWin = hedgedReadWin;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
concurrentCallsPerServerHistSnap(Snapshot concurrentCallsPerServerHistSnap) {
|
||||||
|
this.concurrentCallsPerServerHistSnap = concurrentCallsPerServerHistSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
numActionsPerServerHistSnap(Snapshot numActionsPerServerHistSnap) {
|
||||||
|
this.numActionsPerServerHistSnap = numActionsPerServerHistSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder nsLookups(long nsLookups) {
|
||||||
|
this.nsLookups = nsLookups;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder nsLookupsFailed(long nsLookupsFailed) {
|
||||||
|
this.nsLookupsFailed = nsLookupsFailed;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
overloadedBackoffTimerSnap(Snapshot overloadedBackoffTimerSnap) {
|
||||||
|
this.overloadedBackoffTimerSnap = overloadedBackoffTimerSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder executorPoolUsageRatio(double executorPoolUsageRatio) {
|
||||||
|
this.executorPoolUsageRatio = executorPoolUsageRatio;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder metaPoolUsageRatio(double metaPoolUsageRatio) {
|
||||||
|
this.metaPoolUsageRatio = metaPoolUsageRatio;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder rpcTimersSnap(Map<String, Snapshot> rpcTimersSnap) {
|
||||||
|
this.rpcTimersSnap = rpcTimersSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder rpcHistSnap(Map<String, Snapshot> rpcHistSnap) {
|
||||||
|
this.rpcHistSnap = rpcHistSnap;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
cacheDroppingExceptions(Map<String, Long> cacheDroppingExceptions) {
|
||||||
|
this.cacheDroppingExceptions = cacheDroppingExceptions;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder rpcCounters(Map<String, Long> rpcCounters) {
|
||||||
|
this.rpcCounters = rpcCounters;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshotBuilder
|
||||||
|
serverStats(Map<ServerName, Map<byte[], RegionStatsSnapshot>> serverStats) {
|
||||||
|
this.serverStats = serverStats;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetricsConnectionSnapshot build() {
|
||||||
|
return new MetricsConnectionSnapshot(connectionCount, metaCacheHits, metaCacheMisses,
|
||||||
|
getTrackerSnap, scanTrackerSnap, appendTrackerSnap, deleteTrackerSnap, incrementTrackerSnap,
|
||||||
|
putTrackerSnap, multiTrackerSnap, runnerStatsSnap, metaCacheNumClearServer,
|
||||||
|
metaCacheNumClearRegion, hedgedReadOps, hedgedReadWin, concurrentCallsPerServerHistSnap,
|
||||||
|
numActionsPerServerHistSnap, nsLookups, nsLookupsFailed, overloadedBackoffTimerSnap,
|
||||||
|
executorPoolUsageRatio, metaPoolUsageRatio, rpcTimersSnap, rpcHistSnap,
|
||||||
|
cacheDroppingExceptions, rpcCounters, serverStats);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getConnectionCount() {
|
||||||
|
return connectionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMetaCacheHits() {
|
||||||
|
return metaCacheHits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMetaCacheMisses() {
|
||||||
|
return metaCacheMisses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getGetTrackerSnap() {
|
||||||
|
return getTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getScanTrackerSnap() {
|
||||||
|
return scanTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getAppendTrackerSnap() {
|
||||||
|
return appendTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getDeleteTrackerSnap() {
|
||||||
|
return deleteTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getIncrementTrackerSnap() {
|
||||||
|
return incrementTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getPutTrackerSnap() {
|
||||||
|
return putTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallTrackerSnapshot getMultiTrackerSnap() {
|
||||||
|
return multiTrackerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RunnerStatsSnapshot getRunnerStatsSnap() {
|
||||||
|
return runnerStatsSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMetaCacheNumClearServer() {
|
||||||
|
return metaCacheNumClearServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMetaCacheNumClearRegion() {
|
||||||
|
return metaCacheNumClearRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getHedgedReadOps() {
|
||||||
|
return hedgedReadOps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getHedgedReadWin() {
|
||||||
|
return hedgedReadWin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getConcurrentCallsPerServerHistSnap() {
|
||||||
|
return concurrentCallsPerServerHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getNumActionsPerServerHistSnap() {
|
||||||
|
return numActionsPerServerHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getNsLookups() {
|
||||||
|
return nsLookups;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getNsLookupsFailed() {
|
||||||
|
return nsLookupsFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Snapshot getOverloadedBackoffTimerSnap() {
|
||||||
|
return overloadedBackoffTimerSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getExecutorPoolUsageRatio() {
|
||||||
|
return executorPoolUsageRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getMetaPoolUsageRatio() {
|
||||||
|
return metaPoolUsageRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Snapshot> getRpcTimersSnap() {
|
||||||
|
return rpcTimersSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Snapshot> getRpcHistSnap() {
|
||||||
|
return rpcHistSnap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Long> getCacheDroppingExceptions() {
|
||||||
|
return cacheDroppingExceptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Long> getRpcCounters() {
|
||||||
|
return rpcCounters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<ServerName, Map<byte[], RegionStatsSnapshot>> getServerStats() {
|
||||||
|
return serverStats;
|
||||||
|
}
|
||||||
|
|
||||||
|
static <K, IN, OUT> Map<K, OUT> snapshotMap(Map<K, IN> map, Function<IN, OUT> snapshotFunction) {
|
||||||
|
Map<K, OUT> snapshot = new HashMap<>();
|
||||||
|
for (Map.Entry<K, IN> entry : map.entrySet()) {
|
||||||
|
snapshot.put(entry.getKey(), snapshotFunction.apply(entry.getValue()));
|
||||||
|
}
|
||||||
|
return snapshot;
|
||||||
|
}
|
||||||
|
}
|
|
@ -99,7 +99,7 @@ public class TestMetricsConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMetricsWithMutiConnections() throws IOException {
|
public void testMetricsWithMultiConnections() throws IOException {
|
||||||
Configuration conf = new Configuration();
|
Configuration conf = new Configuration();
|
||||||
conf.setBoolean(MetricsConnection.CLIENT_SIDE_METRICS_ENABLED_KEY, true);
|
conf.setBoolean(MetricsConnection.CLIENT_SIDE_METRICS_ENABLED_KEY, true);
|
||||||
conf.set(MetricsConnection.METRICS_SCOPE_KEY, "unit-test");
|
conf.set(MetricsConnection.METRICS_SCOPE_KEY, "unit-test");
|
||||||
|
@ -181,6 +181,7 @@ public class TestMetricsConnection {
|
||||||
MetricsConnection.newCallStats(), null);
|
MetricsConnection.newCallStats(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetricsConnectionSnapshot metricsConnSnap = METRICS.snapshot();
|
||||||
final String rpcCountPrefix = "rpcCount_" + ClientService.getDescriptor().getName() + "_";
|
final String rpcCountPrefix = "rpcCount_" + ClientService.getDescriptor().getName() + "_";
|
||||||
final String rpcFailureCountPrefix =
|
final String rpcFailureCountPrefix =
|
||||||
"rpcFailureCount_" + ClientService.getDescriptor().getName() + "_";
|
"rpcFailureCount_" + ClientService.getDescriptor().getName() + "_";
|
||||||
|
@ -192,6 +193,7 @@ public class TestMetricsConnection {
|
||||||
metricKey = rpcCountPrefix + method;
|
metricKey = rpcCountPrefix + method;
|
||||||
metricVal = METRICS.getRpcCounters().get(metricKey).getCount();
|
metricVal = METRICS.getRpcCounters().get(metricKey).getCount();
|
||||||
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal >= loop);
|
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal >= loop);
|
||||||
|
assertEquals(metricVal, metricsConnSnap.getRpcCounters().get(metricKey).longValue());
|
||||||
|
|
||||||
metricKey = rpcFailureCountPrefix + method;
|
metricKey = rpcFailureCountPrefix + method;
|
||||||
counter = METRICS.getRpcCounters().get(metricKey);
|
counter = METRICS.getRpcCounters().get(metricKey);
|
||||||
|
@ -199,9 +201,12 @@ public class TestMetricsConnection {
|
||||||
if (method.equals("Get") || method.equals("Mutate")) {
|
if (method.equals("Get") || method.equals("Mutate")) {
|
||||||
// no failure
|
// no failure
|
||||||
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == 0);
|
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == 0);
|
||||||
|
assertEquals(0, metricsConnSnap.getRpcCounters().getOrDefault(metricKey, 0L).longValue());
|
||||||
} else {
|
} else {
|
||||||
// has failure
|
// has failure
|
||||||
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop);
|
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop);
|
||||||
|
assertEquals(loop,
|
||||||
|
metricsConnSnap.getRpcCounters().getOrDefault(metricKey, 0L).longValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,18 +215,22 @@ public class TestMetricsConnection {
|
||||||
counter = METRICS.getRpcCounters().get(metricKey);
|
counter = METRICS.getRpcCounters().get(metricKey);
|
||||||
metricVal = (counter != null) ? counter.getCount() : 0;
|
metricVal = (counter != null) ? counter.getCount() : 0;
|
||||||
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop);
|
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop);
|
||||||
|
assertEquals(loop, metricsConnSnap.getRpcCounters().getOrDefault(metricKey, 0L).longValue());
|
||||||
|
|
||||||
// local exception
|
// local exception
|
||||||
metricKey = "rpcLocalExceptions_CallTimeoutException";
|
metricKey = "rpcLocalExceptions_CallTimeoutException";
|
||||||
counter = METRICS.getRpcCounters().get(metricKey);
|
counter = METRICS.getRpcCounters().get(metricKey);
|
||||||
metricVal = (counter != null) ? counter.getCount() : 0;
|
metricVal = (counter != null) ? counter.getCount() : 0;
|
||||||
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop);
|
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop);
|
||||||
|
assertEquals(loop, metricsConnSnap.getRpcCounters().getOrDefault(metricKey, 0L).longValue());
|
||||||
|
|
||||||
// total exception
|
// total exception
|
||||||
metricKey = "rpcTotalExceptions";
|
metricKey = "rpcTotalExceptions";
|
||||||
counter = METRICS.getRpcCounters().get(metricKey);
|
counter = METRICS.getRpcCounters().get(metricKey);
|
||||||
metricVal = (counter != null) ? counter.getCount() : 0;
|
metricVal = (counter != null) ? counter.getCount() : 0;
|
||||||
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop * 2);
|
assertTrue("metric: " + metricKey + " val: " + metricVal, metricVal == loop * 2);
|
||||||
|
assertEquals(loop * 2,
|
||||||
|
metricsConnSnap.getRpcCounters().getOrDefault(metricKey, 0L).longValue());
|
||||||
|
|
||||||
for (MetricsConnection.CallTracker t : new MetricsConnection.CallTracker[] {
|
for (MetricsConnection.CallTracker t : new MetricsConnection.CallTracker[] {
|
||||||
METRICS.getGetTracker(), METRICS.getScanTracker(), METRICS.getMultiTracker(),
|
METRICS.getGetTracker(), METRICS.getScanTracker(), METRICS.getMultiTracker(),
|
||||||
|
|
|
@ -153,7 +153,7 @@ public abstract class ClientPushbackTestBase {
|
||||||
|
|
||||||
assertEquals(1, runnerStats.delayRunners.getCount());
|
assertEquals(1, runnerStats.delayRunners.getCount());
|
||||||
assertEquals(1, runnerStats.normalRunners.getCount());
|
assertEquals(1, runnerStats.normalRunners.getCount());
|
||||||
assertEquals("", runnerStats.delayIntevalHist.getSnapshot().getMean(), (double) backoffTime,
|
assertEquals("", runnerStats.delayIntervalHist.getSnapshot().getMean(), (double) backoffTime,
|
||||||
0.1);
|
0.1);
|
||||||
|
|
||||||
latch.await(backoffTime * 2, TimeUnit.MILLISECONDS);
|
latch.await(backoffTime * 2, TimeUnit.MILLISECONDS);
|
||||||
|
|
Loading…
Reference in New Issue