From 890b2ceff15f244ac9a5bf44fba9ba0aa9f5ab8d Mon Sep 17 00:00:00 2001 From: Jon Marius Venstad Date: Wed, 30 Jun 2021 13:36:48 +0200 Subject: Compute benchmark stats difference --- vespa-feed-client/abi-spec.json | 3 ++ .../java/ai/vespa/feed/client/OperationStats.java | 32 ++++++++++++++++++++++ .../vespa/feed/client/HttpRequestStrategyTest.java | 6 ++++ 3 files changed, 41 insertions(+) (limited to 'vespa-feed-client') diff --git a/vespa-feed-client/abi-spec.json b/vespa-feed-client/abi-spec.json index e77f71fd2c5..e1fddfeefef 100644 --- a/vespa-feed-client/abi-spec.json +++ b/vespa-feed-client/abi-spec.json @@ -291,6 +291,7 @@ ], "methods": [ "public void (long, java.util.Map, long, long, long, long, long, long, long)", + "public ai.vespa.feed.client.OperationStats since(ai.vespa.feed.client.OperationStats)", "public long requests()", "public long responses()", "public long successes()", @@ -302,6 +303,8 @@ "public long maxLatencyMillis()", "public long bytesSent()", "public long bytesReceived()", + "public boolean equals(java.lang.Object)", + "public int hashCode()", "public java.lang.String toString()" ], "fields": [] diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/OperationStats.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/OperationStats.java index d36475a51fb..abba0f15880 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/OperationStats.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/OperationStats.java @@ -2,6 +2,8 @@ package ai.vespa.feed.client; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; /** * Statistics for feed operations over HTTP against a Vespa cluster. @@ -34,6 +36,23 @@ public class OperationStats { this.bytesReceived = bytesReceived; } + /** Returns the difference between this and the initial. Min and max latency are not modified. */ + public OperationStats since(OperationStats initial) { + return new OperationStats(requests - initial.requests, + responsesByCode.entrySet().stream() + .collect(Collectors.toMap(entry -> entry.getKey(), + entry -> entry.getValue() - initial.responsesByCode.getOrDefault(entry.getKey(), 0L))), + exceptions - initial.exceptions, + inflight - initial.inflight, + responsesByCode.size() == initial.responsesByCode.size() ? 0 : + (averageLatencyMillis * responsesByCode.size() - initial.averageLatencyMillis * initial.responsesByCode.size()) + / (responsesByCode.size() - initial.responsesByCode.size()), + minLatencyMillis, + maxLatencyMillis, + bytesSent - initial.bytesSent, + bytesReceived - initial.bytesReceived); + } + public long requests() { return requests; } @@ -78,6 +97,19 @@ public class OperationStats { return bytesReceived; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OperationStats that = (OperationStats) o; + return requests == that.requests && inflight == that.inflight && exceptions == that.exceptions && averageLatencyMillis == that.averageLatencyMillis && minLatencyMillis == that.minLatencyMillis && maxLatencyMillis == that.maxLatencyMillis && bytesSent == that.bytesSent && bytesReceived == that.bytesReceived && responsesByCode.equals(that.responsesByCode); + } + + @Override + public int hashCode() { + return Objects.hash(requests, responsesByCode, inflight, exceptions, averageLatencyMillis, minLatencyMillis, maxLatencyMillis, bytesSent, bytesReceived); + } + @Override public String toString() { return "Stats{" + diff --git a/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpRequestStrategyTest.java b/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpRequestStrategyTest.java index beb231b61d4..c40735b3b2a 100644 --- a/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpRequestStrategyTest.java +++ b/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpRequestStrategyTest.java @@ -91,6 +91,7 @@ class HttpRequestStrategyTest { .setConnectionsPerEndpoint(1) .setMaxStreamPerConnection(minStreams), new BenchmarkingCluster(cluster)); + OperationStats initial = strategy.stats(); DocumentId id1 = DocumentId.of("ns", "type", "1"); DocumentId id2 = DocumentId.of("ns", "type", "2"); @@ -176,6 +177,11 @@ class HttpRequestStrategyTest { codes.put(500, 3L); assertEquals(codes, strategy.stats().responsesByCode()); assertEquals(3, strategy.stats().exceptions()); + + assertEquals(strategy.stats(), strategy.stats().since(initial)); + assertEquals(0, strategy.stats().since(strategy.stats()).averageLatencyMillis()); + assertEquals(0, strategy.stats().since(strategy.stats()).requests()); + assertEquals(0, strategy.stats().since(strategy.stats()).bytesSent()); } @Test -- cgit v1.2.3