HBASE-23172 HBase Canary region success count metrics reflect column family successes, not region successes

This commit is contained in:
Caroline Zhou 2019-10-16 15:50:25 -07:00 committed by stack
parent da9a53ed4d
commit af1910ccf3
2 changed files with 52 additions and 29 deletions

View File

@ -273,7 +273,7 @@ public class CanaryTool implements Tool, Canary {
public static class RegionStdOutSink extends StdOutSink { public static class RegionStdOutSink extends StdOutSink {
private Map<String, LongAdder> perTableReadLatency = new HashMap<>(); private Map<String, LongAdder> perTableReadLatency = new HashMap<>();
private LongAdder writeLatency = new LongAdder(); private LongAdder writeLatency = new LongAdder();
private final Map<String, RegionTaskResult> regionMap = new ConcurrentHashMap<>(); private final Map<String, List<RegionTaskResult>> regionMap = new ConcurrentHashMap<>();
public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) { public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {
incReadFailureCount(); incReadFailureCount();
@ -289,10 +289,13 @@ public class CanaryTool implements Tool, Canary {
public void publishReadTiming(ServerName serverName, RegionInfo region, public void publishReadTiming(ServerName serverName, RegionInfo region,
ColumnFamilyDescriptor column, long msTime) { ColumnFamilyDescriptor column, long msTime) {
RegionTaskResult rtr = new RegionTaskResult(region, region.getTable(), serverName, column);
rtr.setReadSuccess();
rtr.setReadLatency(msTime);
List<RegionTaskResult> rtrs = regionMap.get(region.getRegionNameAsString());
rtrs.add(rtr);
// Note that read success count will be equal to total column family read successes.
incReadSuccessCount(); incReadSuccessCount();
RegionTaskResult res = this.regionMap.get(region.getRegionNameAsString());
res.setReadSuccess();
res.setReadLatency(msTime);
LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName, LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,
column.getNameAsString(), msTime); column.getNameAsString(), msTime);
} }
@ -311,10 +314,13 @@ public class CanaryTool implements Tool, Canary {
public void publishWriteTiming(ServerName serverName, RegionInfo region, public void publishWriteTiming(ServerName serverName, RegionInfo region,
ColumnFamilyDescriptor column, long msTime) { ColumnFamilyDescriptor column, long msTime) {
RegionTaskResult rtr = new RegionTaskResult(region, region.getTable(), serverName, column);
rtr.setWriteSuccess();
rtr.setWriteLatency(msTime);
List<RegionTaskResult> rtrs = regionMap.get(region.getRegionNameAsString());
rtrs.add(rtr);
// Note that write success count will be equal to total column family write successes.
incWriteSuccessCount(); incWriteSuccessCount();
RegionTaskResult res = this.regionMap.get(region.getRegionNameAsString());
res.setWriteSuccess();
res.setWriteLatency(msTime);
LOG.info("Write to {} on {} {} in {}ms", LOG.info("Write to {} on {} {} in {}ms",
region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime); region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);
} }
@ -337,7 +343,7 @@ public class CanaryTool implements Tool, Canary {
return this.writeLatency; return this.writeLatency;
} }
public Map<String, RegionTaskResult> getRegionMap() { public Map<String, List<RegionTaskResult>> getRegionMap() {
return this.regionMap; return this.regionMap;
} }
@ -1046,15 +1052,18 @@ public class CanaryTool implements Tool, Canary {
private RegionInfo region; private RegionInfo region;
private TableName tableName; private TableName tableName;
private ServerName serverName; private ServerName serverName;
private ColumnFamilyDescriptor column;
private AtomicLong readLatency = null; private AtomicLong readLatency = null;
private AtomicLong writeLatency = null; private AtomicLong writeLatency = null;
private boolean readSuccess = false; private boolean readSuccess = false;
private boolean writeSuccess = false; private boolean writeSuccess = false;
public RegionTaskResult(RegionInfo region, TableName tableName, ServerName serverName) { public RegionTaskResult(RegionInfo region, TableName tableName, ServerName serverName,
ColumnFamilyDescriptor column) {
this.region = region; this.region = region;
this.tableName = tableName; this.tableName = tableName;
this.serverName = serverName; this.serverName = serverName;
this.column = column;
} }
public RegionInfo getRegionInfo() { public RegionInfo getRegionInfo() {
@ -1081,6 +1090,14 @@ public class CanaryTool implements Tool, Canary {
return this.serverName.getServerName(); return this.serverName.getServerName();
} }
public ColumnFamilyDescriptor getColumnFamily() {
return this.column;
}
public String getColumnFamilyNameAsString() {
return this.column.getNameAsString();
}
public long getReadLatency() { public long getReadLatency() {
if (this.readLatency == null) { if (this.readLatency == null) {
return -1; return -1;
@ -1566,9 +1583,8 @@ public class CanaryTool implements Tool, Canary {
RegionInfo region = location.getRegion(); RegionInfo region = location.getRegion();
tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink)sink, tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink)sink,
taskType, rawScanEnabled, rwLatency)); taskType, rawScanEnabled, rwLatency));
Map<String, RegionTaskResult> regionMap = ((RegionStdOutSink) sink).getRegionMap(); Map<String, List<RegionTaskResult>> regionMap = ((RegionStdOutSink) sink).getRegionMap();
regionMap.put(region.getRegionNameAsString(), new RegionTaskResult(region, regionMap.put(region.getRegionNameAsString(), new ArrayList<RegionTaskResult>());
region.getTable(), rs));
} }
return executor.invokeAll(tasks); return executor.invokeAll(tasks);
} }

View File

@ -32,6 +32,7 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ScheduledThreadPoolExecutor;
@ -146,6 +147,10 @@ public class TestCanaryTool {
String[] args = { "-writeSniffing", "-t", "10000", "testCanaryRegionTaskResult" }; String[] args = { "-writeSniffing", "-t", "10000", "testCanaryRegionTaskResult" };
assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args)); assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));
assertTrue("canary should expect to scan at least 1 region",
sink.getTotalExpectedRegions() > 0);
assertTrue("there should be no read failures", sink.getReadFailureCount() == 0);
assertTrue("there should be no write failures", sink.getWriteFailureCount() == 0);
assertTrue("verify read success count > 0", sink.getReadSuccessCount() > 0); assertTrue("verify read success count > 0", sink.getReadSuccessCount() > 0);
assertTrue("verify write success count > 0", sink.getWriteSuccessCount() > 0); assertTrue("verify write success count > 0", sink.getWriteSuccessCount() > 0);
verify(sink, atLeastOnce()).publishReadTiming(isA(ServerName.class), isA(RegionInfo.class), verify(sink, atLeastOnce()).publishReadTiming(isA(ServerName.class), isA(RegionInfo.class),
@ -153,20 +158,21 @@ public class TestCanaryTool {
verify(sink, atLeastOnce()).publishWriteTiming(isA(ServerName.class), isA(RegionInfo.class), verify(sink, atLeastOnce()).publishWriteTiming(isA(ServerName.class), isA(RegionInfo.class),
isA(ColumnFamilyDescriptor.class), anyLong()); isA(ColumnFamilyDescriptor.class), anyLong());
assertTrue("canary should expect to scan at least 1 region", assertEquals("canary region success count should equal total expected regions",
sink.getTotalExpectedRegions() > 0); sink.getReadSuccessCount() + sink.getWriteSuccessCount(), sink.getTotalExpectedRegions());
Map<String, CanaryTool.RegionTaskResult> regionMap = sink.getRegionMap(); Map<String, List<CanaryTool.RegionTaskResult>> regionMap = sink.getRegionMap();
assertFalse("verify region map has size > 0", regionMap.isEmpty()); assertFalse("verify region map has size > 0", regionMap.isEmpty());
for (String regionName : regionMap.keySet()) { for (String regionName : regionMap.keySet()) {
CanaryTool.RegionTaskResult res = regionMap.get(regionName); for (CanaryTool.RegionTaskResult res: regionMap.get(regionName)) {
assertNotNull("verify each expected region has a RegionTaskResult object in the map", res);
assertNotNull("verify getRegionNameAsString()", regionName); assertNotNull("verify getRegionNameAsString()", regionName);
assertNotNull("verify getRegionInfo()", res.getRegionInfo()); assertNotNull("verify getRegionInfo()", res.getRegionInfo());
assertNotNull("verify getTableName()", res.getTableName()); assertNotNull("verify getTableName()", res.getTableName());
assertNotNull("verify getTableNameAsString()", res.getTableNameAsString()); assertNotNull("verify getTableNameAsString()", res.getTableNameAsString());
assertNotNull("verify getServerName()", res.getServerName()); assertNotNull("verify getServerName()", res.getServerName());
assertNotNull("verify getServerNameAsString()", res.getServerNameAsString()); assertNotNull("verify getServerNameAsString()", res.getServerNameAsString());
assertNotNull("verify getColumnFamily()", res.getColumnFamily());
assertNotNull("verify getColumnFamilyNameAsString()", res.getColumnFamilyNameAsString());
if (regionName.contains(CanaryTool.DEFAULT_WRITE_TABLE_NAME.getNameAsString())) { if (regionName.contains(CanaryTool.DEFAULT_WRITE_TABLE_NAME.getNameAsString())) {
assertTrue("write to region " + regionName + " succeeded", res.isWriteSuccess()); assertTrue("write to region " + regionName + " succeeded", res.isWriteSuccess());
@ -177,6 +183,7 @@ public class TestCanaryTool {
} }
} }
} }
}
@Test @Test
public void testReadTableTimeouts() throws Exception { public void testReadTableTimeouts() throws Exception {