Skip to content

Commit ae0decb

Browse files
author
Ray Mattingly
committed
HBASE-27536: improve slowlog payload
1 parent dcfde79 commit ae0decb

File tree

7 files changed

+341
-22
lines changed

7 files changed

+341
-22
lines changed

hbase-client/src/main/java/org/apache/hadoop/hbase/client/OnlineLogRecord.java

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.apache.hadoop.hbase.client;
1919

20+
import java.util.List;
2021
import org.apache.commons.lang3.builder.EqualsBuilder;
2122
import org.apache.commons.lang3.builder.HashCodeBuilder;
2223
import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -71,6 +72,10 @@ final public class OnlineLogRecord extends LogEntry {
7172
private final int multiGetsCount;
7273
private final int multiMutationsCount;
7374
private final int multiServiceCalls;
75+
private final Scan scan;
76+
private final List<Operation> multi;
77+
private final Get get;
78+
private final Mutation mutate;
7479

7580
public long getStartTime() {
7681
return startTime;
@@ -128,11 +133,28 @@ public int getMultiServiceCalls() {
128133
return multiServiceCalls;
129134
}
130135

136+
public Scan getScan() {
137+
return scan;
138+
}
139+
140+
public List<Operation> getMulti() {
141+
return multi;
142+
}
143+
144+
public Get getGet() {
145+
return get;
146+
}
147+
148+
public Mutation getMutate() {
149+
return mutate;
150+
}
151+
131152
private OnlineLogRecord(final long startTime, final int processingTime, final int queueTime,
132153
final long responseSize, final String clientAddress, final String serverClass,
133154
final String methodName, final String callDetails, final String param, final String regionName,
134155
final String userName, final int multiGetsCount, final int multiMutationsCount,
135-
final int multiServiceCalls) {
156+
final int multiServiceCalls, final Scan scan, final List<Operation> multi, final Get get,
157+
final Mutation mutate) {
136158
this.startTime = startTime;
137159
this.processingTime = processingTime;
138160
this.queueTime = queueTime;
@@ -147,6 +169,10 @@ private OnlineLogRecord(final long startTime, final int processingTime, final in
147169
this.multiGetsCount = multiGetsCount;
148170
this.multiMutationsCount = multiMutationsCount;
149171
this.multiServiceCalls = multiServiceCalls;
172+
this.scan = scan;
173+
this.multi = multi;
174+
this.get = get;
175+
this.mutate = mutate;
150176
}
151177

152178
public static class OnlineLogRecordBuilder {
@@ -164,6 +190,10 @@ public static class OnlineLogRecordBuilder {
164190
private int multiGetsCount;
165191
private int multiMutationsCount;
166192
private int multiServiceCalls;
193+
private Scan scan = null;
194+
private List<Operation> multi = null;
195+
private Get get = null;
196+
private Mutation mutate = null;
167197

168198
public OnlineLogRecordBuilder setStartTime(long startTime) {
169199
this.startTime = startTime;
@@ -235,10 +265,30 @@ public OnlineLogRecordBuilder setMultiServiceCalls(int multiServiceCalls) {
235265
return this;
236266
}
237267

268+
public OnlineLogRecordBuilder setScan(Scan scan) {
269+
this.scan = scan;
270+
return this;
271+
}
272+
273+
public OnlineLogRecordBuilder setMulti(List<Operation> multi) {
274+
this.multi = multi;
275+
return this;
276+
}
277+
278+
public OnlineLogRecordBuilder setGet(Get get) {
279+
this.get = get;
280+
return this;
281+
}
282+
283+
public OnlineLogRecordBuilder setMutate(Mutation mutate) {
284+
this.mutate = mutate;
285+
return this;
286+
}
287+
238288
public OnlineLogRecord build() {
239289
return new OnlineLogRecord(startTime, processingTime, queueTime, responseSize, clientAddress,
240290
serverClass, methodName, callDetails, param, regionName, userName, multiGetsCount,
241-
multiMutationsCount, multiServiceCalls);
291+
multiMutationsCount, multiServiceCalls, scan, multi, get, mutate);
242292
}
243293
}
244294

@@ -261,15 +311,17 @@ public boolean equals(Object o) {
261311
.append(multiServiceCalls, that.multiServiceCalls).append(clientAddress, that.clientAddress)
262312
.append(serverClass, that.serverClass).append(methodName, that.methodName)
263313
.append(callDetails, that.callDetails).append(param, that.param)
264-
.append(regionName, that.regionName).append(userName, that.userName).isEquals();
314+
.append(regionName, that.regionName).append(userName, that.userName).append(scan, that.scan)
315+
.append(multi, that.multi).append(get, that.get).append(mutate, that.mutate).isEquals();
265316
}
266317

267318
@Override
268319
public int hashCode() {
269320
return new HashCodeBuilder(17, 37).append(startTime).append(processingTime).append(queueTime)
270321
.append(responseSize).append(clientAddress).append(serverClass).append(methodName)
271322
.append(callDetails).append(param).append(regionName).append(userName).append(multiGetsCount)
272-
.append(multiMutationsCount).append(multiServiceCalls).toHashCode();
323+
.append(multiMutationsCount).append(multiServiceCalls).append(scan).append(multi).append(get)
324+
.append(mutate).toHashCode();
273325
}
274326

275327
@Override
@@ -286,7 +338,8 @@ public String toString() {
286338
.append("callDetails", callDetails).append("param", param).append("regionName", regionName)
287339
.append("userName", userName).append("multiGetsCount", multiGetsCount)
288340
.append("multiMutationsCount", multiMutationsCount)
289-
.append("multiServiceCalls", multiServiceCalls).toString();
341+
.append("multiServiceCalls", multiServiceCalls).append("scan", scan).append("multi", multi)
342+
.append("get", get).append("mutate", mutate).toString();
290343
}
291344

292345
}

hbase-client/src/main/java/org/apache/hadoop/hbase/client/SlowLogParams.java

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.apache.commons.lang3.builder.ToStringBuilder;
2424
import org.apache.yetus.audience.InterfaceAudience;
2525

26+
import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
27+
2628
/**
2729
* SlowLog params object that contains detailed info as params and region name : to be used for
2830
* filter purpose
@@ -32,15 +34,63 @@ public class SlowLogParams {
3234

3335
private final String regionName;
3436
private final String params;
37+
private final ClientProtos.Scan scan;
38+
private final ClientProtos.MultiRequest multi;
39+
private final ClientProtos.Get get;
40+
private final ClientProtos.MutationProto mutate;
41+
42+
public SlowLogParams(String regionName, String params, ClientProtos.Scan scan) {
43+
this.regionName = regionName;
44+
this.params = params;
45+
this.scan = scan;
46+
this.multi = null;
47+
this.get = null;
48+
this.mutate = null;
49+
}
50+
51+
public SlowLogParams(String regionName, String params, ClientProtos.MultiRequest multi) {
52+
this.regionName = regionName;
53+
this.params = params;
54+
this.scan = null;
55+
this.multi = multi;
56+
this.get = null;
57+
this.mutate = null;
58+
}
59+
60+
public SlowLogParams(String regionName, String params, ClientProtos.Get get) {
61+
this.regionName = regionName;
62+
this.params = params;
63+
this.scan = null;
64+
this.multi = null;
65+
this.get = get;
66+
this.mutate = null;
67+
}
68+
69+
public SlowLogParams(String regionName, String params, ClientProtos.MutationProto mutate) {
70+
this.regionName = regionName;
71+
this.params = params;
72+
this.scan = null;
73+
this.multi = null;
74+
this.get = null;
75+
this.mutate = mutate;
76+
}
3577

3678
public SlowLogParams(String regionName, String params) {
3779
this.regionName = regionName;
3880
this.params = params;
81+
this.scan = null;
82+
this.multi = null;
83+
this.get = null;
84+
this.mutate = null;
3985
}
4086

4187
public SlowLogParams(String params) {
4288
this.regionName = StringUtils.EMPTY;
4389
this.params = params;
90+
this.scan = null;
91+
this.multi = null;
92+
this.get = null;
93+
this.mutate = null;
4494
}
4595

4696
public String getRegionName() {
@@ -51,9 +101,26 @@ public String getParams() {
51101
return params;
52102
}
53103

104+
public ClientProtos.Scan getScan() {
105+
return scan;
106+
}
107+
108+
public ClientProtos.MultiRequest getMulti() {
109+
return multi;
110+
}
111+
112+
public ClientProtos.Get getGet() {
113+
return get;
114+
}
115+
116+
public ClientProtos.MutationProto getMutate() {
117+
return mutate;
118+
}
119+
54120
@Override
55121
public String toString() {
56122
return new ToStringBuilder(this).append("regionName", regionName).append("params", params)
123+
.append("scan", scan).append("multi", multi).append("get", get).append("mutate", mutate)
57124
.toString();
58125
}
59126

@@ -67,11 +134,13 @@ public boolean equals(Object o) {
67134
}
68135
SlowLogParams that = (SlowLogParams) o;
69136
return new EqualsBuilder().append(regionName, that.regionName).append(params, that.params)
70-
.isEquals();
137+
.append(scan, that.scan).append(multi, that.multi).append(get, that.get)
138+
.append(mutate, that.mutate).isEquals();
71139
}
72140

73141
@Override
74142
public int hashCode() {
75-
return new HashCodeBuilder(17, 37).append(regionName).append(params).toHashCode();
143+
return new HashCodeBuilder(17, 37).append(regionName).append(params).append(scan).append(multi)
144+
.append(get).append(mutate).toHashCode();
76145
}
77146
}

hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import org.apache.hadoop.hbase.client.LogEntry;
8888
import org.apache.hadoop.hbase.client.Mutation;
8989
import org.apache.hadoop.hbase.client.OnlineLogRecord;
90+
import org.apache.hadoop.hbase.client.Operation;
9091
import org.apache.hadoop.hbase.client.PackagePrivateFieldAccessor;
9192
import org.apache.hadoop.hbase.client.Put;
9293
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
@@ -129,6 +130,8 @@
129130
import org.apache.hadoop.hbase.util.VersionInfo;
130131
import org.apache.hadoop.ipc.RemoteException;
131132
import org.apache.yetus.audience.InterfaceAudience;
133+
import org.slf4j.Logger;
134+
import org.slf4j.LoggerFactory;
132135

133136
import org.apache.hbase.thirdparty.com.google.common.io.ByteStreams;
134137
import org.apache.hbase.thirdparty.com.google.gson.JsonArray;
@@ -229,6 +232,8 @@
229232
@InterfaceAudience.Private // TODO: some clients (Hive, etc) use this class
230233
public final class ProtobufUtil {
231234

235+
private static final Logger LOG = LoggerFactory.getLogger(ProtobufUtil.class.getName());
236+
232237
private ProtobufUtil() {
233238
}
234239

@@ -1072,6 +1077,22 @@ public static ClientProtos.Scan toScan(final Scan scan) throws IOException {
10721077
return scanBuilder.build();
10731078
}
10741079

1080+
public static List<Operation> toMulti(MultiRequest multiRequest) {
1081+
return multiRequest.getRegionActionList().stream().map(RegionAction::getActionList)
1082+
.flatMap(Collection::stream).map(action -> {
1083+
try {
1084+
if (action.hasGet()) {
1085+
return ProtobufUtil.toGet(action.getGet());
1086+
} else if (action.hasMutation()) {
1087+
return ProtobufUtil.toMutation(action.getMutation());
1088+
}
1089+
} catch (IOException e) {
1090+
LOG.warn("Unable to convert RegionAction to client model: {}", action, e);
1091+
}
1092+
return null;
1093+
}).filter(Objects::nonNull).collect(Collectors.toList());
1094+
}
1095+
10751096
/**
10761097
* Convert a protocol buffer Scan to a client Scan
10771098
* @param proto the protocol buffer Scan to convert
@@ -2139,41 +2160,62 @@ private static String getStringForByteString(ByteString bs) {
21392160

21402161
/**
21412162
* Return SlowLogParams to maintain recent online slowlog responses
2142-
* @param message Message object {@link Message}
2163+
* @param message Message object {@link Message}
2164+
* @param slowLogOperationMessagePayloadEnabled whether to include the {@link Message} in the
2165+
* payload
21432166
* @return SlowLogParams with regionName(for filter queries) and params
21442167
*/
2145-
public static SlowLogParams getSlowLogParams(Message message) {
2168+
public static SlowLogParams getSlowLogParams(Message message,
2169+
boolean slowLogOperationMessagePayloadEnabled) {
21462170
if (message == null) {
21472171
return null;
21482172
}
21492173
if (message instanceof ScanRequest) {
21502174
ScanRequest scanRequest = (ScanRequest) message;
21512175
String regionName = getStringForByteString(scanRequest.getRegion().getValue());
21522176
String params = TextFormat.shortDebugString(message);
2153-
return new SlowLogParams(regionName, params);
2177+
if (slowLogOperationMessagePayloadEnabled) {
2178+
return new SlowLogParams(regionName, params, scanRequest.getScan());
2179+
} else {
2180+
return new SlowLogParams(regionName, params);
2181+
}
21542182
} else if (message instanceof MutationProto) {
21552183
MutationProto mutationProto = (MutationProto) message;
21562184
String params = "type= " + mutationProto.getMutateType().toString();
2157-
return new SlowLogParams(params);
2185+
if (slowLogOperationMessagePayloadEnabled) {
2186+
return new SlowLogParams(null, params, mutationProto);
2187+
} else {
2188+
return new SlowLogParams(params);
2189+
}
21582190
} else if (message instanceof GetRequest) {
21592191
GetRequest getRequest = (GetRequest) message;
21602192
String regionName = getStringForByteString(getRequest.getRegion().getValue());
21612193
String params =
21622194
"region= " + regionName + ", row= " + getStringForByteString(getRequest.getGet().getRow());
2163-
return new SlowLogParams(regionName, params);
2195+
if (slowLogOperationMessagePayloadEnabled) {
2196+
return new SlowLogParams(regionName, params, getRequest.getGet());
2197+
} else {
2198+
return new SlowLogParams(regionName, params);
2199+
}
21642200
} else if (message instanceof MultiRequest) {
21652201
MultiRequest multiRequest = (MultiRequest) message;
2166-
int actionsCount = multiRequest.getRegionActionList().stream()
2167-
.mapToInt(ClientProtos.RegionAction::getActionCount).sum();
21682202
RegionAction actions = multiRequest.getRegionActionList().get(0);
21692203
String regionName = getStringForByteString(actions.getRegion().getValue());
2170-
String params = "region= " + regionName + ", for " + actionsCount + " action(s)";
2171-
return new SlowLogParams(regionName, params);
2204+
String params = getShortTextFormat(multiRequest);
2205+
if (slowLogOperationMessagePayloadEnabled) {
2206+
return new SlowLogParams(regionName, params, multiRequest);
2207+
} else {
2208+
return new SlowLogParams(regionName, params);
2209+
}
21722210
} else if (message instanceof MutateRequest) {
21732211
MutateRequest mutateRequest = (MutateRequest) message;
21742212
String regionName = getStringForByteString(mutateRequest.getRegion().getValue());
21752213
String params = "region= " + regionName;
2176-
return new SlowLogParams(regionName, params);
2214+
if (slowLogOperationMessagePayloadEnabled) {
2215+
return new SlowLogParams(regionName, params, mutateRequest.getMutation());
2216+
} else {
2217+
return new SlowLogParams(regionName, params);
2218+
}
21772219
} else if (message instanceof CoprocessorServiceRequest) {
21782220
CoprocessorServiceRequest coprocessorServiceRequest = (CoprocessorServiceRequest) message;
21792221
String params = "coprocessorService= " + coprocessorServiceRequest.getCall().getServiceName()
@@ -3376,10 +3418,23 @@ private static LogEntry getSlowLogRecord(final TooSlowLog.SlowLogPayload slowLog
33763418
.setQueueTime(slowLogPayload.getQueueTime()).setRegionName(slowLogPayload.getRegionName())
33773419
.setResponseSize(slowLogPayload.getResponseSize())
33783420
.setServerClass(slowLogPayload.getServerClass()).setStartTime(slowLogPayload.getStartTime())
3379-
.setUserName(slowLogPayload.getUserName()).build();
3421+
.setUserName(slowLogPayload.getUserName())
3422+
.setScan(catchAll(() -> ProtobufUtil.toScan(slowLogPayload.getScan())))
3423+
.setMulti(catchAll(() -> ProtobufUtil.toMulti(slowLogPayload.getMulti())))
3424+
.setGet(catchAll(() -> ProtobufUtil.toGet(slowLogPayload.getGet())))
3425+
.setMutate(catchAll(() -> ProtobufUtil.toMutation(slowLogPayload.getMutate()))).build();
33803426
return onlineLogRecord;
33813427
}
33823428

3429+
private static <T> T catchAll(Callable<T> callable) {
3430+
try {
3431+
return callable.call();
3432+
} catch (Exception e) {
3433+
LOG.warn("");
3434+
}
3435+
return null;
3436+
}
3437+
33833438
/**
33843439
* Convert AdminProtos#SlowLogResponses to list of {@link OnlineLogRecord}
33853440
* @param logEntry slowlog response protobuf instance

0 commit comments

Comments
 (0)