Skip to content

Commit a0bd41a

Browse files
mokai87m00822998
authored andcommitted
HBASE-27638 Get slow/large log response that matched the ‘CLIENT_IP' without client port (apache#5087)
1 parent 4617d43 commit a0bd41a

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/namequeues/LogHandlerUtils.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.ArrayList;
2121
import java.util.List;
2222
import org.apache.commons.lang3.StringUtils;
23+
import org.apache.hadoop.hbase.util.Addressing;
2324
import org.apache.yetus.audience.InterfaceAudience;
2425

2526
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
@@ -68,7 +69,7 @@ private static List<TooSlowLog.SlowLogPayload> filterLogs(
6869
if (tableName != null && slowLogPayload.getRegionName().startsWith(tableName)) {
6970
totalFilterMatches++;
7071
}
71-
if (slowLogPayload.getClientAddress().equals(clientAddress)) {
72+
if (isClientAddressMatched(slowLogPayload, clientAddress)) {
7273
totalFilterMatches++;
7374
}
7475
if (slowLogPayload.getUserName().equals(userName)) {
@@ -92,6 +93,17 @@ private static List<TooSlowLog.SlowLogPayload> filterLogs(
9293
return filteredSlowLogPayloads;
9394
}
9495

96+
private static boolean isClientAddressMatched(TooSlowLog.SlowLogPayload slowLogPayload,
97+
String clientAddress) {
98+
String clientAddressInPayload = slowLogPayload.getClientAddress();
99+
int portPos = clientAddressInPayload.lastIndexOf(Addressing.HOSTNAME_PORT_SEPARATOR);
100+
if (portPos < 1) {
101+
return clientAddressInPayload.equals(clientAddress);
102+
}
103+
return clientAddressInPayload.equals(clientAddress)
104+
|| clientAddressInPayload.substring(0, portPos).equals(clientAddress);
105+
}
106+
95107
public static List<TooSlowLog.SlowLogPayload> getFilteredLogs(
96108
AdminProtos.SlowLogResponseRequest request, List<TooSlowLog.SlowLogPayload> logPayloadList) {
97109
int totalFilters = getTotalFiltersCount(request);

hbase-server/src/test/java/org/apache/hadoop/hbase/namequeues/TestNamedQueueRecorder.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,60 @@ public void testSlowLogFilters() throws Exception {
381381
HBASE_TESTING_UTILITY.waitFor(3000, () -> getSlowLogPayloads(requestSlowLog).size() == 15));
382382
}
383383

384+
@Test
385+
public void testSlowLogFilterWithClientAddress() throws Exception {
386+
Configuration conf = applySlowLogRecorderConf(10);
387+
Constructor<NamedQueueRecorder> constructor =
388+
NamedQueueRecorder.class.getDeclaredConstructor(Configuration.class);
389+
constructor.setAccessible(true);
390+
namedQueueRecorder = constructor.newInstance(conf);
391+
AdminProtos.SlowLogResponseRequest request =
392+
AdminProtos.SlowLogResponseRequest.newBuilder().build();
393+
Assert.assertEquals(getSlowLogPayloads(request).size(), 0);
394+
395+
String[] clientAddressArray = new String[] { "[127:1:1:1:1:1:1:1]:1", "[127:1:1:1:1:1:1:1]:2",
396+
"[127:1:1:1:1:1:1:1]:3", "127.0.0.1:1", "127.0.0.1:2" };
397+
boolean isSlowLog;
398+
boolean isLargeLog;
399+
for (int i = 0; i < 10; i++) {
400+
if (i % 2 == 0) {
401+
isSlowLog = true;
402+
isLargeLog = false;
403+
} else {
404+
isSlowLog = false;
405+
isLargeLog = true;
406+
}
407+
RpcLogDetails rpcLogDetails = getRpcLogDetails("userName_" + (i + 1),
408+
clientAddressArray[i % 5], "class_" + (i + 1), isSlowLog, isLargeLog);
409+
namedQueueRecorder.addRecord(rpcLogDetails);
410+
}
411+
412+
AdminProtos.SlowLogResponseRequest largeLogRequestIPv6WithPort =
413+
AdminProtos.SlowLogResponseRequest.newBuilder()
414+
.setLogType(AdminProtos.SlowLogResponseRequest.LogType.LARGE_LOG)
415+
.setClientAddress("[127:1:1:1:1:1:1:1]:2").build();
416+
Assert.assertNotEquals(-1, HBASE_TESTING_UTILITY.waitFor(3000,
417+
() -> getSlowLogPayloads(largeLogRequestIPv6WithPort).size() == 1));
418+
AdminProtos.SlowLogResponseRequest largeLogRequestIPv6WithoutPort =
419+
AdminProtos.SlowLogResponseRequest.newBuilder()
420+
.setLogType(AdminProtos.SlowLogResponseRequest.LogType.LARGE_LOG)
421+
.setClientAddress("[127:1:1:1:1:1:1:1]").build();
422+
Assert.assertNotEquals(-1, HBASE_TESTING_UTILITY.waitFor(3000,
423+
() -> getSlowLogPayloads(largeLogRequestIPv6WithoutPort).size() == 3));
424+
AdminProtos.SlowLogResponseRequest largeLogRequestIPv4WithPort =
425+
AdminProtos.SlowLogResponseRequest.newBuilder()
426+
.setLogType(AdminProtos.SlowLogResponseRequest.LogType.LARGE_LOG)
427+
.setClientAddress("127.0.0.1:1").build();
428+
Assert.assertNotEquals(-1, HBASE_TESTING_UTILITY.waitFor(3000,
429+
() -> getSlowLogPayloads(largeLogRequestIPv4WithPort).size() == 1));
430+
AdminProtos.SlowLogResponseRequest largeLogRequestIPv4WithoutPort =
431+
AdminProtos.SlowLogResponseRequest.newBuilder()
432+
.setLogType(AdminProtos.SlowLogResponseRequest.LogType.LARGE_LOG)
433+
.setClientAddress("127.0.0.1").build();
434+
Assert.assertNotEquals(-1, HBASE_TESTING_UTILITY.waitFor(3000,
435+
() -> getSlowLogPayloads(largeLogRequestIPv4WithoutPort).size() == 2));
436+
}
437+
384438
@Test
385439
public void testConcurrentSlowLogEvents() throws Exception {
386440

hbase-shell/src/main/ruby/shell/commands/get_largelog_responses.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ def help
4444
=> get largelog responses only related to meta
4545
region
4646
hbase> get_largelog_responses '*', {'TABLE_NAME' => 't1'} => get largelog responses only related to t1 table
47+
hbase> get_largelog_responses '*', {'CLIENT_IP' => '192.162.1.40'}
48+
=> get largelog responses only related to the given
49+
client IP address
50+
hbase> get_largelog_responses '*', {'CLIENT_IP' => '192.162.1.40:60225'}
51+
=> get largelog responses only related to the given
52+
client IP address and port
4753
hbase> get_largelog_responses '*', {'CLIENT_IP' => '192.162.1.40:60225', 'LIMIT' => 100}
4854
=> get largelog responses with given client
4955
IP address and get 100 records limit

hbase-shell/src/main/ruby/shell/commands/get_slowlog_responses.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ def help
4444
=> get slowlog responses only related to meta
4545
region
4646
hbase> get_slowlog_responses '*', {'TABLE_NAME' => 't1'} => get slowlog responses only related to t1 table
47+
hbase> get_slowlog_responses '*', {'CLIENT_IP' => '192.162.1.40'}
48+
=> get slowlog responses only related to the given
49+
client IP address
50+
hbase> get_slowlog_responses '*', {'CLIENT_IP' => '192.162.1.40:60225'}
51+
=> get slowlog responses only related to the given
52+
client IP address and port
4753
hbase> get_slowlog_responses '*', {'CLIENT_IP' => '192.162.1.40:60225', 'LIMIT' => 100}
4854
=> get slowlog responses with given client
4955
IP address and get 100 records limit

0 commit comments

Comments
 (0)