Skip to content

Commit cab94ca

Browse files
hgromerHernan Gelaf-Romer
authored andcommitted
HBASE-29090: Add server-side load metrics to client results (apache#6623)
Co-authored-by: Hernan Gelaf-Romer <[email protected]> Signed-off-by: Nick Dimiduk <[email protected]> Signed-off-by: Ray Mattingly <[email protected]>
1 parent 32139b6 commit cab94ca

File tree

22 files changed

+575
-94
lines changed

22 files changed

+575
-94
lines changed

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

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public static final class Builder {
7070
private byte[] value;
7171
private Filter filter;
7272
private TimeRange timeRange;
73+
private boolean queryMetricsEnabled = false;
7374

7475
private Builder(byte[] row) {
7576
this.row = Preconditions.checkNotNull(row, "row is null");
@@ -133,6 +134,21 @@ public Builder timeRange(TimeRange timeRange) {
133134
return this;
134135
}
135136

137+
/**
138+
* Enables the return of {@link QueryMetrics} alongside the corresponding result for this query
139+
* <p>
140+
* This is intended for advanced users who need result-granular, server-side metrics
141+
* <p>
142+
* Does not work
143+
* @param queryMetricsEnabled {@code true} to enable collection of per-result query metrics
144+
* {@code false} to disable metrics collection (resulting in
145+
* {@code null} metrics)
146+
*/
147+
public Builder queryMetricsEnabled(boolean queryMetricsEnabled) {
148+
this.queryMetricsEnabled = queryMetricsEnabled;
149+
return this;
150+
}
151+
136152
private void preCheck(Row action) {
137153
Preconditions.checkNotNull(action, "action is null");
138154
if (!Bytes.equals(row, action.getRow())) {
@@ -154,9 +170,10 @@ private void preCheck(Row action) {
154170
public CheckAndMutate build(Put put) {
155171
preCheck(put);
156172
if (filter != null) {
157-
return new CheckAndMutate(row, filter, timeRange, put);
173+
return new CheckAndMutate(row, filter, timeRange, put, queryMetricsEnabled);
158174
} else {
159-
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, put);
175+
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, put,
176+
queryMetricsEnabled);
160177
}
161178
}
162179

@@ -168,9 +185,10 @@ public CheckAndMutate build(Put put) {
168185
public CheckAndMutate build(Delete delete) {
169186
preCheck(delete);
170187
if (filter != null) {
171-
return new CheckAndMutate(row, filter, timeRange, delete);
188+
return new CheckAndMutate(row, filter, timeRange, delete, queryMetricsEnabled);
172189
} else {
173-
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, delete);
190+
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, delete,
191+
queryMetricsEnabled);
174192
}
175193
}
176194

@@ -182,9 +200,10 @@ public CheckAndMutate build(Delete delete) {
182200
public CheckAndMutate build(Increment increment) {
183201
preCheck(increment);
184202
if (filter != null) {
185-
return new CheckAndMutate(row, filter, timeRange, increment);
203+
return new CheckAndMutate(row, filter, timeRange, increment, queryMetricsEnabled);
186204
} else {
187-
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, increment);
205+
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, increment,
206+
queryMetricsEnabled);
188207
}
189208
}
190209

@@ -196,9 +215,10 @@ public CheckAndMutate build(Increment increment) {
196215
public CheckAndMutate build(Append append) {
197216
preCheck(append);
198217
if (filter != null) {
199-
return new CheckAndMutate(row, filter, timeRange, append);
218+
return new CheckAndMutate(row, filter, timeRange, append, queryMetricsEnabled);
200219
} else {
201-
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, append);
220+
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, append,
221+
queryMetricsEnabled);
202222
}
203223
}
204224

@@ -210,9 +230,10 @@ public CheckAndMutate build(Append append) {
210230
public CheckAndMutate build(RowMutations mutations) {
211231
preCheck(mutations);
212232
if (filter != null) {
213-
return new CheckAndMutate(row, filter, timeRange, mutations);
233+
return new CheckAndMutate(row, filter, timeRange, mutations, queryMetricsEnabled);
214234
} else {
215-
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, mutations);
235+
return new CheckAndMutate(row, family, qualifier, op, value, timeRange, mutations,
236+
queryMetricsEnabled);
216237
}
217238
}
218239
}
@@ -234,9 +255,10 @@ public static Builder newBuilder(byte[] row) {
234255
private final Filter filter;
235256
private final TimeRange timeRange;
236257
private final Row action;
258+
private final boolean queryMetricsEnabled;
237259

238260
private CheckAndMutate(byte[] row, byte[] family, byte[] qualifier, final CompareOperator op,
239-
byte[] value, TimeRange timeRange, Row action) {
261+
byte[] value, TimeRange timeRange, Row action, boolean queryMetricsEnabled) {
240262
this.row = row;
241263
this.family = family;
242264
this.qualifier = qualifier;
@@ -245,9 +267,11 @@ private CheckAndMutate(byte[] row, byte[] family, byte[] qualifier, final Compar
245267
this.filter = null;
246268
this.timeRange = timeRange != null ? timeRange : TimeRange.allTime();
247269
this.action = action;
270+
this.queryMetricsEnabled = queryMetricsEnabled;
248271
}
249272

250-
private CheckAndMutate(byte[] row, Filter filter, TimeRange timeRange, Row action) {
273+
private CheckAndMutate(byte[] row, Filter filter, TimeRange timeRange, Row action,
274+
boolean queryMetricsEnabled) {
251275
this.row = row;
252276
this.family = null;
253277
this.qualifier = null;
@@ -256,6 +280,7 @@ private CheckAndMutate(byte[] row, Filter filter, TimeRange timeRange, Row actio
256280
this.filter = filter;
257281
this.timeRange = timeRange != null ? timeRange : TimeRange.allTime();
258282
this.action = action;
283+
this.queryMetricsEnabled = queryMetricsEnabled;
259284
}
260285

261286
/** Returns the row */
@@ -326,4 +351,9 @@ public TimeRange getTimeRange() {
326351
public Row getAction() {
327352
return action;
328353
}
354+
355+
/** Returns whether query metrics are enabled */
356+
public boolean isQueryMetricsEnabled() {
357+
return queryMetricsEnabled;
358+
}
329359
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class CheckAndMutateResult {
2727
private final boolean success;
2828
private final Result result;
2929

30+
private QueryMetrics metrics = null;
31+
3032
public CheckAndMutateResult(boolean success, Result result) {
3133
this.success = success;
3234
this.result = result;
@@ -41,4 +43,13 @@ public boolean isSuccess() {
4143
public Result getResult() {
4244
return result;
4345
}
46+
47+
public CheckAndMutateResult setMetrics(QueryMetrics metrics) {
48+
this.metrics = metrics;
49+
return this;
50+
}
51+
52+
public QueryMetrics getMetrics() {
53+
return metrics;
54+
}
4455
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ public Get(Get get) {
9696
this.setFilter(get.getFilter());
9797
this.setReplicaId(get.getReplicaId());
9898
this.setConsistency(get.getConsistency());
99+
this.setQueryMetricsEnabled(get.isQueryMetricsEnabled());
99100
// from Get
100101
this.cacheBlocks = get.getCacheBlocks();
101102
this.maxVersions = get.getMaxVersions();
@@ -511,6 +512,7 @@ public Map<String, Object> toMap(int maxCols) {
511512
map.put("colFamTimeRangeMap", colFamTimeRangeMapStr);
512513
}
513514
map.put("priority", getPriority());
515+
map.put("queryMetricsEnabled", queryMetricsEnabled);
514516
return map;
515517
}
516518

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

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -744,10 +744,8 @@ public boolean checkAndPut(final byte[] row, final byte[] family, final byte[] q
744744
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE)
745745
.setContainerOperations(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE,
746746
HBaseSemanticAttributes.Operation.PUT);
747-
return TraceUtil.trace(
748-
() -> doCheckAndMutate(row, family, qualifier, CompareOperator.EQUAL, value, null, null, put)
749-
.isSuccess(),
750-
supplier);
747+
return TraceUtil.trace(() -> doCheckAndMutate(row, family, qualifier, CompareOperator.EQUAL,
748+
value, null, null, put, false).isSuccess(), supplier);
751749
}
752750

753751
@Override
@@ -759,7 +757,7 @@ public boolean checkAndPut(final byte[] row, final byte[] family, final byte[] q
759757
.setContainerOperations(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE,
760758
HBaseSemanticAttributes.Operation.PUT);
761759
return TraceUtil.trace(() -> doCheckAndMutate(row, family, qualifier,
762-
toCompareOperator(compareOp), value, null, null, put).isSuccess(), supplier);
760+
toCompareOperator(compareOp), value, null, null, put, false).isSuccess(), supplier);
763761
}
764762

765763
@Override
@@ -771,7 +769,7 @@ public boolean checkAndPut(final byte[] row, final byte[] family, final byte[] q
771769
.setContainerOperations(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE,
772770
HBaseSemanticAttributes.Operation.PUT);
773771
return TraceUtil.trace(
774-
() -> doCheckAndMutate(row, family, qualifier, op, value, null, null, put).isSuccess(),
772+
() -> doCheckAndMutate(row, family, qualifier, op, value, null, null, put, false).isSuccess(),
775773
supplier);
776774
}
777775

@@ -784,7 +782,7 @@ public boolean checkAndDelete(final byte[] row, final byte[] family, final byte[
784782
.setContainerOperations(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE,
785783
HBaseSemanticAttributes.Operation.DELETE);
786784
return TraceUtil.trace(() -> doCheckAndMutate(row, family, qualifier, CompareOperator.EQUAL,
787-
value, null, null, delete).isSuccess(), supplier);
785+
value, null, null, delete, false).isSuccess(), supplier);
788786
}
789787

790788
@Override
@@ -796,7 +794,7 @@ public boolean checkAndDelete(final byte[] row, final byte[] family, final byte[
796794
.setContainerOperations(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE,
797795
HBaseSemanticAttributes.Operation.DELETE);
798796
return TraceUtil.trace(() -> doCheckAndMutate(row, family, qualifier,
799-
toCompareOperator(compareOp), value, null, null, delete).isSuccess(), supplier);
797+
toCompareOperator(compareOp), value, null, null, delete, false).isSuccess(), supplier);
800798
}
801799

802800
@Override
@@ -807,9 +805,9 @@ public boolean checkAndDelete(final byte[] row, final byte[] family, final byte[
807805
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE)
808806
.setContainerOperations(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE,
809807
HBaseSemanticAttributes.Operation.DELETE);
810-
return TraceUtil.trace(
811-
() -> doCheckAndMutate(row, family, qualifier, op, value, null, null, delete).isSuccess(),
812-
supplier);
808+
return TraceUtil
809+
.trace(() -> doCheckAndMutate(row, family, qualifier, op, value, null, null, delete, false)
810+
.isSuccess(), supplier);
813811
}
814812

815813
@Override
@@ -826,7 +824,8 @@ public CheckAndMutateWithFilterBuilder checkAndMutate(byte[] row, Filter filter)
826824

827825
private CheckAndMutateResult doCheckAndMutate(final byte[] row, final byte[] family,
828826
final byte[] qualifier, final CompareOperator op, final byte[] value, final Filter filter,
829-
final TimeRange timeRange, final RowMutations rm) throws IOException {
827+
final TimeRange timeRange, final RowMutations rm, boolean queryMetricsEnabled)
828+
throws IOException {
830829
long nonceGroup = getNonceGroup();
831830
long nonce = getNonce();
832831
CancellableRegionServerCallable<MultiResponse> callable =
@@ -835,9 +834,9 @@ private CheckAndMutateResult doCheckAndMutate(final byte[] row, final byte[] fam
835834
rm.getMaxPriority(), requestAttributes) {
836835
@Override
837836
protected MultiResponse rpcCall() throws Exception {
838-
MultiRequest request =
839-
RequestConverter.buildMultiRequest(getLocation().getRegionInfo().getRegionName(), row,
840-
family, qualifier, op, value, filter, timeRange, rm, nonceGroup, nonce);
837+
MultiRequest request = RequestConverter.buildMultiRequest(
838+
getLocation().getRegionInfo().getRegionName(), row, family, qualifier, op, value,
839+
filter, timeRange, rm, nonceGroup, nonce, queryMetricsEnabled);
841840
ClientProtos.MultiResponse response = doMulti(request);
842841
ClientProtos.RegionActionResult res = response.getRegionActionResultList().get(0);
843842
if (res.hasException()) {
@@ -880,7 +879,7 @@ public boolean checkAndMutate(final byte[] row, final byte[] family, final byte[
880879
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE)
881880
.setContainerOperations(rm);
882881
return TraceUtil.trace(() -> doCheckAndMutate(row, family, qualifier,
883-
toCompareOperator(compareOp), value, null, null, rm).isSuccess(), supplier);
882+
toCompareOperator(compareOp), value, null, null, rm, false).isSuccess(), supplier);
884883
}
885884

886885
@Override
@@ -891,7 +890,7 @@ public boolean checkAndMutate(final byte[] row, final byte[] family, final byte[
891890
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE)
892891
.setContainerOperations(rm);
893892
return TraceUtil.trace(
894-
() -> doCheckAndMutate(row, family, qualifier, op, value, null, null, rm).isSuccess(),
893+
() -> doCheckAndMutate(row, family, qualifier, op, value, null, null, rm, false).isSuccess(),
895894
supplier);
896895
}
897896

@@ -910,28 +909,31 @@ public CheckAndMutateResult checkAndMutate(CheckAndMutate checkAndMutate) throws
910909
}
911910
return doCheckAndMutate(checkAndMutate.getRow(), checkAndMutate.getFamily(),
912911
checkAndMutate.getQualifier(), checkAndMutate.getCompareOp(), checkAndMutate.getValue(),
913-
checkAndMutate.getFilter(), checkAndMutate.getTimeRange(), (Mutation) action);
912+
checkAndMutate.getFilter(), checkAndMutate.getTimeRange(), (Mutation) action,
913+
checkAndMutate.isQueryMetricsEnabled());
914914
} else {
915915
return doCheckAndMutate(checkAndMutate.getRow(), checkAndMutate.getFamily(),
916916
checkAndMutate.getQualifier(), checkAndMutate.getCompareOp(), checkAndMutate.getValue(),
917-
checkAndMutate.getFilter(), checkAndMutate.getTimeRange(), (RowMutations) action);
917+
checkAndMutate.getFilter(), checkAndMutate.getTimeRange(), (RowMutations) action,
918+
checkAndMutate.isQueryMetricsEnabled());
918919
}
919920
}, supplier);
920921
}
921922

922923
private CheckAndMutateResult doCheckAndMutate(final byte[] row, final byte[] family,
923924
final byte[] qualifier, final CompareOperator op, final byte[] value, final Filter filter,
924-
final TimeRange timeRange, final Mutation mutation) throws IOException {
925+
final TimeRange timeRange, final Mutation mutation, boolean queryMetricsEnabled)
926+
throws IOException {
925927
long nonceGroup = getNonceGroup();
926928
long nonce = getNonce();
927929
ClientServiceCallable<CheckAndMutateResult> callable =
928930
new ClientServiceCallable<CheckAndMutateResult>(this.connection, getName(), row,
929931
this.rpcControllerFactory.newController(), mutation.getPriority(), requestAttributes) {
930932
@Override
931933
protected CheckAndMutateResult rpcCall() throws Exception {
932-
MutateRequest request =
933-
RequestConverter.buildMutateRequest(getLocation().getRegionInfo().getRegionName(), row,
934-
family, qualifier, op, value, filter, timeRange, mutation, nonceGroup, nonce);
934+
MutateRequest request = RequestConverter.buildMutateRequest(
935+
getLocation().getRegionInfo().getRegionName(), row, family, qualifier, op, value,
936+
filter, timeRange, mutation, nonceGroup, nonce, queryMetricsEnabled);
935937
MutateResponse response = doMutate(request);
936938
if (response.hasResult()) {
937939
return new CheckAndMutateResult(response.getProcessed(),
@@ -1419,7 +1421,7 @@ public boolean thenPut(Put put) throws IOException {
14191421
return TraceUtil.trace(() -> {
14201422
validatePut(put);
14211423
preCheck();
1422-
return doCheckAndMutate(row, family, qualifier, op, value, null, timeRange, put)
1424+
return doCheckAndMutate(row, family, qualifier, op, value, null, timeRange, put, false)
14231425
.isSuccess();
14241426
}, supplier);
14251427
}
@@ -1430,7 +1432,7 @@ public boolean thenDelete(Delete delete) throws IOException {
14301432
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE);
14311433
return TraceUtil.trace(() -> {
14321434
preCheck();
1433-
return doCheckAndMutate(row, family, qualifier, op, value, null, timeRange, delete)
1435+
return doCheckAndMutate(row, family, qualifier, op, value, null, timeRange, delete, false)
14341436
.isSuccess();
14351437
}, supplier);
14361438
}
@@ -1441,7 +1443,7 @@ public boolean thenMutate(RowMutations mutation) throws IOException {
14411443
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE);
14421444
return TraceUtil.trace(() -> {
14431445
preCheck();
1444-
return doCheckAndMutate(row, family, qualifier, op, value, null, timeRange, mutation)
1446+
return doCheckAndMutate(row, family, qualifier, op, value, null, timeRange, mutation, false)
14451447
.isSuccess();
14461448
}, supplier);
14471449
}
@@ -1475,26 +1477,28 @@ public boolean thenPut(Put put) throws IOException {
14751477
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE);
14761478
return TraceUtil.trace(() -> {
14771479
validatePut(put);
1478-
return doCheckAndMutate(row, null, null, null, null, filter, timeRange, put).isSuccess();
1480+
return doCheckAndMutate(row, null, null, null, null, filter, timeRange, put, false)
1481+
.isSuccess();
14791482
}, supplier);
14801483
}
14811484

14821485
@Override
14831486
public boolean thenDelete(Delete delete) throws IOException {
14841487
final Supplier<Span> supplier = new TableOperationSpanBuilder(connection)
14851488
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE);
1486-
return TraceUtil.trace(
1487-
() -> doCheckAndMutate(row, null, null, null, null, filter, timeRange, delete).isSuccess(),
1488-
supplier);
1489+
return TraceUtil
1490+
.trace(() -> doCheckAndMutate(row, null, null, null, null, filter, timeRange, delete, false)
1491+
.isSuccess(), supplier);
14891492
}
14901493

14911494
@Override
14921495
public boolean thenMutate(RowMutations mutation) throws IOException {
14931496
final Supplier<Span> supplier = new TableOperationSpanBuilder(connection)
14941497
.setTableName(tableName).setOperation(HBaseSemanticAttributes.Operation.CHECK_AND_MUTATE);
1495-
return TraceUtil
1496-
.trace(() -> doCheckAndMutate(row, null, null, null, null, filter, timeRange, mutation)
1497-
.isSuccess(), supplier);
1498+
return TraceUtil.trace(
1499+
() -> doCheckAndMutate(row, null, null, null, null, filter, timeRange, mutation, false)
1500+
.isSuccess(),
1501+
supplier);
14981502
}
14991503
}
15001504
}

0 commit comments

Comments
 (0)