Skip to content

Commit 971e9bd

Browse files
author
liwang
committed
ZOOKEEPER-4983: Add client-triggered operation count metrics
Author: Li Wang <liwang@apple.com>
1 parent 66c4efe commit 971e9bd

File tree

4 files changed

+300
-0
lines changed

4 files changed

+300
-0
lines changed

zookeeper-server/src/main/java/org/apache/zookeeper/server/FinalRequestProcessor.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.apache.zookeeper.data.ACL;
5050
import org.apache.zookeeper.data.Id;
5151
import org.apache.zookeeper.data.Stat;
52+
import org.apache.zookeeper.metrics.Counter;
5253
import org.apache.zookeeper.proto.AddWatchRequest;
5354
import org.apache.zookeeper.proto.CheckWatchesRequest;
5455
import org.apache.zookeeper.proto.Create2Response;
@@ -213,20 +214,23 @@ public void processRequest(Request request) {
213214
switch (request.type) {
214215
case OpCode.ping: {
215216
lastOp = "PING";
217+
incrementOpCount(ServerMetrics.getMetrics().PING_OP_COUNT);
216218
updateStats(request, lastOp, lastZxid);
217219

218220
responseSize = cnxn.sendResponse(new ReplyHeader(ClientCnxn.PING_XID, lastZxid, 0), null, "response");
219221
return;
220222
}
221223
case OpCode.createSession: {
222224
lastOp = "SESS";
225+
incrementOpCount(ServerMetrics.getMetrics().CREATE_SESSION_OP_COUNT);
223226
updateStats(request, lastOp, lastZxid);
224227

225228
zks.finishSessionInit(request.cnxn, true);
226229
return;
227230
}
228231
case OpCode.multi: {
229232
lastOp = "MULT";
233+
incrementOpCount(ServerMetrics.getMetrics().MULTI_OP_COUNT);
230234
rsp = new MultiResponse();
231235

232236
for (ProcessTxnResult subTxnResult : rc.multiResult) {
@@ -269,6 +273,7 @@ public void processRequest(Request request) {
269273
}
270274
case OpCode.multiRead: {
271275
lastOp = "MLTR";
276+
incrementOpCount(ServerMetrics.getMetrics().MULTI_READ_OP_COUNT);
272277
MultiOperationRecord multiReadRecord = request.readRequestRecord(MultiOperationRecord::new);
273278
rsp = new MultiResponse();
274279
OpResult subResult;
@@ -297,6 +302,7 @@ public void processRequest(Request request) {
297302
}
298303
case OpCode.create: {
299304
lastOp = "CREA";
305+
incrementOpCount(ServerMetrics.getMetrics().CREATE_OP_COUNT);
300306
rsp = new CreateResponse(rc.path);
301307
err = Code.get(rc.err);
302308
requestPathMetricsCollector.registerRequest(request.type, rc.path);
@@ -306,6 +312,7 @@ public void processRequest(Request request) {
306312
case OpCode.createTTL:
307313
case OpCode.createContainer: {
308314
lastOp = "CREA";
315+
incrementOpCount(ServerMetrics.getMetrics().CREATE_OP_COUNT);
309316
rsp = new Create2Response(rc.path, rc.stat);
310317
err = Code.get(rc.err);
311318
requestPathMetricsCollector.registerRequest(request.type, rc.path);
@@ -314,19 +321,22 @@ public void processRequest(Request request) {
314321
case OpCode.delete:
315322
case OpCode.deleteContainer: {
316323
lastOp = "DELE";
324+
incrementOpCount(ServerMetrics.getMetrics().DELETE_OP_COUNT);
317325
err = Code.get(rc.err);
318326
requestPathMetricsCollector.registerRequest(request.type, rc.path);
319327
break;
320328
}
321329
case OpCode.setData: {
322330
lastOp = "SETD";
331+
incrementOpCount(ServerMetrics.getMetrics().SET_DATA_OP_COUNT);
323332
rsp = new SetDataResponse(rc.stat);
324333
err = Code.get(rc.err);
325334
requestPathMetricsCollector.registerRequest(request.type, rc.path);
326335
break;
327336
}
328337
case OpCode.reconfig: {
329338
lastOp = "RECO";
339+
incrementOpCount(ServerMetrics.getMetrics().RECONFIG_OP_COUNT);
330340
rsp = new GetDataResponse(
331341
((QuorumZooKeeperServer) zks).self.getQuorumVerifier().toString().getBytes(UTF_8),
332342
rc.stat);
@@ -335,31 +345,36 @@ public void processRequest(Request request) {
335345
}
336346
case OpCode.setACL: {
337347
lastOp = "SETA";
348+
incrementOpCount(ServerMetrics.getMetrics().SET_ACL_OP_COUNT);
338349
rsp = new SetACLResponse(rc.stat);
339350
err = Code.get(rc.err);
340351
requestPathMetricsCollector.registerRequest(request.type, rc.path);
341352
break;
342353
}
343354
case OpCode.closeSession: {
344355
lastOp = "CLOS";
356+
incrementOpCount(ServerMetrics.getMetrics().CLOSE_SESSION_OP_COUNT);
345357
err = Code.get(rc.err);
346358
break;
347359
}
348360
case OpCode.sync: {
349361
lastOp = "SYNC";
362+
incrementOpCount(ServerMetrics.getMetrics().SYNC_OP_COUNT);
350363
SyncRequest syncRequest = request.readRequestRecord(SyncRequest::new);
351364
rsp = new SyncResponse(syncRequest.getPath());
352365
requestPathMetricsCollector.registerRequest(request.type, syncRequest.getPath());
353366
break;
354367
}
355368
case OpCode.check: {
356369
lastOp = "CHEC";
370+
incrementOpCount(ServerMetrics.getMetrics().CHECK_OP_COUNT);
357371
rsp = new SetDataResponse(rc.stat);
358372
err = Code.get(rc.err);
359373
break;
360374
}
361375
case OpCode.exists: {
362376
lastOp = "EXIS";
377+
incrementOpCount(ServerMetrics.getMetrics().EXISTS_OP_COUNT);
363378
ExistsRequest existsRequest = request.readRequestRecord(ExistsRequest::new);
364379
path = existsRequest.getPath();
365380
if (path.indexOf('\0') != -1) {
@@ -382,6 +397,7 @@ public void processRequest(Request request) {
382397
}
383398
case OpCode.getData: {
384399
lastOp = "GETD";
400+
incrementOpCount(ServerMetrics.getMetrics().GET_DATA_OP_COUNT);
385401
GetDataRequest getDataRequest = request.readRequestRecord(GetDataRequest::new);
386402
path = getDataRequest.getPath();
387403
rsp = handleGetDataRequest(getDataRequest, cnxn, request.authInfo);
@@ -390,6 +406,7 @@ public void processRequest(Request request) {
390406
}
391407
case OpCode.setWatches: {
392408
lastOp = "SETW";
409+
incrementOpCount(ServerMetrics.getMetrics().SET_WATCHES_OP_COUNT);
393410
SetWatches setWatches = request.readRequestRecord(SetWatches::new);
394411
long relativeZxid = setWatches.getRelativeZxid();
395412
zks.getZKDatabase()
@@ -405,6 +422,7 @@ public void processRequest(Request request) {
405422
}
406423
case OpCode.setWatches2: {
407424
lastOp = "STW2";
425+
incrementOpCount(ServerMetrics.getMetrics().SET_WATCHES_OP_COUNT);
408426
SetWatches2 setWatches = request.readRequestRecord(SetWatches2::new);
409427
long relativeZxid = setWatches.getRelativeZxid();
410428
zks.getZKDatabase().setWatches(relativeZxid,
@@ -418,13 +436,15 @@ public void processRequest(Request request) {
418436
}
419437
case OpCode.addWatch: {
420438
lastOp = "ADDW";
439+
incrementOpCount(ServerMetrics.getMetrics().ADD_WATCH_OP_COUNT);
421440
AddWatchRequest addWatcherRequest = request.readRequestRecord(AddWatchRequest::new);
422441
zks.getZKDatabase().addWatch(addWatcherRequest.getPath(), cnxn, addWatcherRequest.getMode());
423442
rsp = new ErrorResponse(0);
424443
break;
425444
}
426445
case OpCode.getACL: {
427446
lastOp = "GETA";
447+
incrementOpCount(ServerMetrics.getMetrics().GET_ACL_OP_COUNT);
428448
GetACLRequest getACLRequest = request.readRequestRecord(GetACLRequest::new);
429449
path = getACLRequest.getPath();
430450
DataNode n = zks.getZKDatabase().getNode(path);
@@ -467,6 +487,7 @@ public void processRequest(Request request) {
467487
}
468488
case OpCode.getChildren: {
469489
lastOp = "GETC";
490+
incrementOpCount(ServerMetrics.getMetrics().GET_CHILDREN_OP_COUNT);
470491
GetChildrenRequest getChildrenRequest = request.readRequestRecord(GetChildrenRequest::new);
471492
path = getChildrenRequest.getPath();
472493
rsp = handleGetChildrenRequest(getChildrenRequest, cnxn, request.authInfo);
@@ -475,6 +496,7 @@ public void processRequest(Request request) {
475496
}
476497
case OpCode.getAllChildrenNumber: {
477498
lastOp = "GETACN";
499+
incrementOpCount(ServerMetrics.getMetrics().GET_ALL_CHILDREN_NUMBER_OP_COUNT);
478500
GetAllChildrenNumberRequest getAllChildrenNumberRequest = request.readRequestRecord(GetAllChildrenNumberRequest::new);
479501
path = getAllChildrenNumberRequest.getPath();
480502
DataNode n = zks.getZKDatabase().getNode(path);
@@ -494,6 +516,7 @@ public void processRequest(Request request) {
494516
}
495517
case OpCode.getChildren2: {
496518
lastOp = "GETC";
519+
incrementOpCount(ServerMetrics.getMetrics().GET_CHILDREN_OP_COUNT);
497520
GetChildren2Request getChildren2Request = request.readRequestRecord(GetChildren2Request::new);
498521
Stat stat = new Stat();
499522
path = getChildren2Request.getPath();
@@ -515,6 +538,7 @@ public void processRequest(Request request) {
515538
}
516539
case OpCode.checkWatches: {
517540
lastOp = "CHKW";
541+
incrementOpCount(ServerMetrics.getMetrics().CHECK_WATCHES_OP_COUNT);
518542
CheckWatchesRequest checkWatches = request.readRequestRecord(CheckWatchesRequest::new);
519543
WatcherType type = WatcherType.fromInt(checkWatches.getType());
520544
path = checkWatches.getPath();
@@ -528,6 +552,7 @@ public void processRequest(Request request) {
528552
}
529553
case OpCode.removeWatches: {
530554
lastOp = "REMW";
555+
incrementOpCount(ServerMetrics.getMetrics().REMOVE_WATCHES_OP_COUNT);
531556
RemoveWatchesRequest removeWatches = request.readRequestRecord(RemoveWatchesRequest::new);
532557
WatcherType type = WatcherType.fromInt(removeWatches.getType());
533558
path = removeWatches.getPath();
@@ -541,11 +566,13 @@ public void processRequest(Request request) {
541566
}
542567
case OpCode.whoAmI: {
543568
lastOp = "HOMI";
569+
incrementOpCount(ServerMetrics.getMetrics().WHO_AM_I_OP_COUNT);
544570
rsp = new WhoAmIResponse(AuthUtil.getClientInfos(request.authInfo));
545571
break;
546572
}
547573
case OpCode.getEphemerals: {
548574
lastOp = "GETE";
575+
incrementOpCount(ServerMetrics.getMetrics().GET_EPHEMERALS_OP_COUNT);
549576
GetEphemeralsRequest getEphemerals = request.readRequestRecord(GetEphemeralsRequest::new);
550577
String prefixPath = getEphemerals.getPrefixPath();
551578
Set<String> allEphems = zks.getZKDatabase().getDataTree().getEphemerals(request.sessionId);
@@ -677,4 +704,9 @@ private void updateStats(Request request, String lastOp, long lastZxid) {
677704
request.cnxn.updateStatsForResponse(request.cxid, lastZxid, lastOp, request.createTime, currentTime);
678705
}
679706

707+
private void incrementOpCount(final Counter specificCounter) {
708+
final ServerMetrics metrics = ServerMetrics.getMetrics();
709+
specificCounter.add(1);
710+
metrics.TOTAL_OP_COUNT.add(1);
711+
}
680712
}

zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,36 @@ private ServerMetrics(MetricsProvider metricsProvider) {
271271
QUOTA_EXCEEDED_ERROR_PER_NAMESPACE = metricsContext.getCounterSet(QuotaMetricsUtils.QUOTA_EXCEEDED_ERROR_PER_NAMESPACE);
272272

273273
TTL_NODE_DELETED_COUNT = metricsContext.getCounter("ttl_node_deleted_count");
274+
275+
/**
276+
* Operation count metrics
277+
*/
278+
TOTAL_OP_COUNT = metricsContext.getCounter("total_op_count");
279+
PING_OP_COUNT = metricsContext.getCounter("ping_op_count");
280+
CREATE_SESSION_OP_COUNT = metricsContext.getCounter("create_session_op_count");
281+
CLOSE_SESSION_OP_COUNT = metricsContext.getCounter("close_session_op_count");
282+
MULTI_OP_COUNT = metricsContext.getCounter("multi_op_count");
283+
CREATE_OP_COUNT = metricsContext.getCounter("create_op_count");
284+
DELETE_OP_COUNT = metricsContext.getCounter("delete_op_count");
285+
SET_DATA_OP_COUNT = metricsContext.getCounter("set_data_op_count");
286+
EXISTS_OP_COUNT = metricsContext.getCounter("exists_op_count");
287+
GET_DATA_OP_COUNT = metricsContext.getCounter("get_data_op_count");
288+
GET_CHILDREN_OP_COUNT = metricsContext.getCounter("get_children_op_count");
289+
SYNC_OP_COUNT = metricsContext.getCounter("sync_op_count");
290+
GET_ACL_OP_COUNT = metricsContext.getCounter("get_acl_op_count");
291+
SET_ACL_OP_COUNT = metricsContext.getCounter("set_acl_op_count");
292+
CHECK_OP_COUNT = metricsContext.getCounter("check_op_count");
293+
SET_WATCHES_OP_COUNT = metricsContext.getCounter("set_watches_op_count");
294+
MULTI_READ_OP_COUNT = metricsContext.getCounter("multi_read_op_count");
295+
RECONFIG_OP_COUNT = metricsContext.getCounter("reconfig_op_count");
296+
ADD_WATCH_OP_COUNT = metricsContext.getCounter("add_watch_op_count");
297+
CHECK_WATCHES_OP_COUNT = metricsContext.getCounter("check_watches_op_count");
298+
REMOVE_WATCHES_OP_COUNT = metricsContext.getCounter("remove_watches_op_count");
299+
WHO_AM_I_OP_COUNT = metricsContext.getCounter("who_am_i_op_count");
300+
GET_EPHEMERALS_OP_COUNT = metricsContext.getCounter("get_ephemerals_op_count");
301+
GET_ALL_CHILDREN_NUMBER_OP_COUNT = metricsContext.getCounter("get_all_children_number_op_count");
302+
SASL_OP_COUNT = metricsContext.getCounter("sasl_op_count");
303+
AUTH_OP_COUNT = metricsContext.getCounter("auth_op_count");
274304
}
275305

276306
/**
@@ -554,6 +584,36 @@ private ServerMetrics(MetricsProvider metricsProvider) {
554584
*/
555585
public final Counter TTL_NODE_DELETED_COUNT;
556586

587+
/**
588+
* Operation count metrics
589+
*/
590+
public final Counter TOTAL_OP_COUNT;
591+
public final Counter PING_OP_COUNT;
592+
public final Counter CREATE_SESSION_OP_COUNT;
593+
public final Counter CLOSE_SESSION_OP_COUNT;
594+
public final Counter MULTI_OP_COUNT;
595+
public final Counter CREATE_OP_COUNT;
596+
public final Counter DELETE_OP_COUNT;
597+
public final Counter SET_DATA_OP_COUNT;
598+
public final Counter EXISTS_OP_COUNT;
599+
public final Counter GET_DATA_OP_COUNT;
600+
public final Counter GET_CHILDREN_OP_COUNT;
601+
public final Counter SYNC_OP_COUNT;
602+
public final Counter GET_ACL_OP_COUNT;
603+
public final Counter SET_ACL_OP_COUNT;
604+
public final Counter CHECK_OP_COUNT;
605+
public final Counter SET_WATCHES_OP_COUNT;
606+
public final Counter MULTI_READ_OP_COUNT;
607+
public final Counter RECONFIG_OP_COUNT;
608+
public final Counter ADD_WATCH_OP_COUNT;
609+
public final Counter CHECK_WATCHES_OP_COUNT;
610+
public final Counter REMOVE_WATCHES_OP_COUNT;
611+
public final Counter WHO_AM_I_OP_COUNT;
612+
public final Counter GET_EPHEMERALS_OP_COUNT;
613+
public final Counter GET_ALL_CHILDREN_NUMBER_OP_COUNT;
614+
public final Counter SASL_OP_COUNT;
615+
public final Counter AUTH_OP_COUNT;
616+
557617
private final MetricsProvider metricsProvider;
558618

559619
public void resetAll() {

zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,7 @@ public void processPacket(ServerCnxn cnxn, RequestHeader h, RequestRecord reques
16971697

16981698
if (h.getType() == OpCode.auth) {
16991699
LOG.info("got auth packet {}", cnxn.getRemoteSocketAddress());
1700+
ServerMetrics.getMetrics().AUTH_OP_COUNT.add(1);
17001701
AuthPacket authPacket = request.readRecord(AuthPacket::new);
17011702
String scheme = authPacket.getScheme();
17021703
ServerAuthenticationProvider ap = ProviderRegistry.getServerProvider(scheme);
@@ -1737,6 +1738,7 @@ public void processPacket(ServerCnxn cnxn, RequestHeader h, RequestRecord reques
17371738
}
17381739
return;
17391740
} else if (h.getType() == OpCode.sasl) {
1741+
ServerMetrics.getMetrics().SASL_OP_COUNT.add(1);
17401742
processSasl(request, cnxn, h);
17411743
} else {
17421744
if (!authHelper.enforceAuthentication(cnxn, h.getXid())) {

0 commit comments

Comments
 (0)