Skip to content

Commit bf191cb

Browse files
authored
interop-testing: aggregate accumulated stats by RPC methods in xDS test client (#7603)
Update xDS interop test proto to aggregate accumulated stats based on RPC methods (mirroring 643e5bcd1e8db931cf76a3be19cd9bba223ee987 in C-core's change). Updated the xDS interop test client to support querying accumulated stats aggregated to RPC methods.
1 parent fbc48a8 commit bf191cb

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

interop-testing/src/main/java/io/grpc/testing/integration/XdsTestClient.java

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
import java.util.concurrent.ExecutionException;
6161
import java.util.concurrent.Executors;
6262
import java.util.concurrent.TimeUnit;
63-
import java.util.concurrent.atomic.AtomicInteger;
6463
import java.util.concurrent.atomic.AtomicReference;
6564
import java.util.logging.Level;
6665
import java.util.logging.Logger;
@@ -73,9 +72,9 @@ public final class XdsTestClient {
7372
private final Set<XdsStatsWatcher> watchers = new HashSet<>();
7473
private final Object lock = new Object();
7574
private final List<ManagedChannel> channels = new ArrayList<>();
76-
private final AtomicInteger rpcsStarted = new AtomicInteger();
77-
private final AtomicInteger rpcsFailed = new AtomicInteger();
78-
private final AtomicInteger rpcsSucceeded = new AtomicInteger();
75+
private final Map<String, Integer> rpcsStartedByMethod = new HashMap<>();
76+
private final Map<String, Integer> rpcsFailedByMethod = new HashMap<>();
77+
private final Map<String, Integer> rpcsSucceededByMethod = new HashMap<>();
7978

8079
private int numChannels = 1;
8180
private boolean printResponse = false;
@@ -333,7 +332,6 @@ public void onError(Throwable t) {
333332
@Override
334333
public void onNext(EmptyProtos.Empty response) {}
335334
});
336-
rpcsStarted.getAndIncrement();
337335
} else if (rpcType == RpcType.UNARY_CALL) {
338336
SimpleRequest request = SimpleRequest.newBuilder().setFillServerId(true).build();
339337
stub.unaryCall(
@@ -373,19 +371,39 @@ public void onNext(SimpleResponse response) {
373371
}
374372
}
375373
});
376-
rpcsStarted.getAndIncrement();
374+
} else {
375+
throw new AssertionError("Unknown RPC type: " + rpcType);
376+
}
377+
synchronized (lock) {
378+
Integer startedBase = rpcsStartedByMethod.get(rpcType.name());
379+
if (startedBase == null) {
380+
startedBase = 0;
381+
}
382+
rpcsStartedByMethod.put(rpcType.name(), startedBase + 1);
377383
}
378384
}
379385

380386
private void handleRpcCompleted(long requestId, RpcType rpcType, String hostname,
381387
Set<XdsStatsWatcher> watchers) {
382-
rpcsSucceeded.getAndIncrement();
388+
synchronized (lock) {
389+
Integer succeededBase = rpcsSucceededByMethod.get(rpcType.name());
390+
if (succeededBase == null) {
391+
succeededBase = 0;
392+
}
393+
rpcsSucceededByMethod.put(rpcType.name(), succeededBase + 1);
394+
}
383395
notifyWatchers(watchers, rpcType, requestId, hostname);
384396
}
385397

386398
private void handleRpcError(long requestId, RpcType rpcType, String hostname,
387399
Set<XdsStatsWatcher> watchers) {
388-
rpcsFailed.getAndIncrement();
400+
synchronized (lock) {
401+
Integer failedBase = rpcsFailedByMethod.get(rpcType.name());
402+
if (failedBase == null) {
403+
failedBase = 0;
404+
}
405+
rpcsFailedByMethod.put(rpcType.name(), failedBase + 1);
406+
}
389407
notifyWatchers(watchers, rpcType, requestId, hostname);
390408
}
391409
}
@@ -457,12 +475,15 @@ public void getClientStats(
457475
@Override
458476
public void getClientAccumulatedStats(LoadBalancerAccumulatedStatsRequest request,
459477
StreamObserver<LoadBalancerAccumulatedStatsResponse> responseObserver) {
460-
responseObserver.onNext(
461-
LoadBalancerAccumulatedStatsResponse.newBuilder()
462-
.setNumRpcsStarted(rpcsStarted.get())
463-
.setNumRpcsSucceeded(rpcsSucceeded.get())
464-
.setNumRpcsFailed(rpcsFailed.get())
465-
.build());
478+
LoadBalancerAccumulatedStatsResponse.Builder responseBuilder =
479+
LoadBalancerAccumulatedStatsResponse.newBuilder();
480+
synchronized (lock) {
481+
responseBuilder
482+
.putAllNumRpcsStartedByMethod(rpcsStartedByMethod)
483+
.putAllNumRpcsSucceededByMethod(rpcsSucceededByMethod)
484+
.putAllNumRpcsFailedByMethod(rpcsFailedByMethod);
485+
}
486+
responseObserver.onNext(responseBuilder.build());
466487
responseObserver.onCompleted();
467488
}
468489
}

interop-testing/src/main/proto/grpc/testing/messages.proto

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,12 @@ message LoadBalancerAccumulatedStatsRequest {}
208208

209209
// Accumulated stats for RPCs sent by a test client.
210210
message LoadBalancerAccumulatedStatsResponse {
211-
// The total number of RPCs have ever issued.
212-
int32 num_rpcs_started = 1;
213-
// The total number of RPCs have ever completed successfully.
214-
int32 num_rpcs_succeeded = 2;
215-
// The total number of RPCs have ever failed.
216-
int32 num_rpcs_failed = 3;
211+
// The total number of RPCs have ever issued for each type.
212+
map<string, int32> num_rpcs_started_by_method = 1;
213+
// The total number of RPCs have ever completed successfully for each type.
214+
map<string, int32> num_rpcs_succeeded_by_method = 2;
215+
// The total number of RPCs have ever failed for each type.
216+
map<string, int32> num_rpcs_failed_by_method = 3;
217217
}
218218

219219
// Configurations for a test client.

0 commit comments

Comments
 (0)