diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/results/AppPerfResults.java b/benchmark-overhead/src/test/java/io/opentelemetry/results/AppPerfResults.java index f243211fce..3482410002 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/results/AppPerfResults.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/results/AppPerfResults.java @@ -21,6 +21,8 @@ public class AppPerfResults { final float maxThreadContextSwitchRate; final long startupDurationMs; final long peakThreadCount; + final long averageNetworkRead; + final long averageNetworkWrite; private AppPerfResults(Builder builder) { this.agent = builder.agent; @@ -35,6 +37,8 @@ public class AppPerfResults { this.maxThreadContextSwitchRate = builder.maxThreadContextSwitchRate; this.startupDurationMs = builder.startupDurationMs; this.peakThreadCount = builder.peakThreadCount; + this.averageNetworkRead = builder.averageNetworkRead; + this.averageNetworkWrite = builder.averageNetworkWrite; } double getTotalAllocatedMB() { @@ -61,6 +65,8 @@ public class AppPerfResults { private MinMax heapUsed; private float maxThreadContextSwitchRate; private long peakThreadCount; + public long averageNetworkRead; + public long averageNetworkWrite; AppPerfResults build() { return new AppPerfResults(this); @@ -125,6 +131,16 @@ public class AppPerfResults { this.peakThreadCount = peakThreadCount; return this; } + + Builder averageNetworkRead(long averageNetworkRead){ + this.averageNetworkRead = averageNetworkRead; + return this; + } + + Builder averageNetworkWrite(long averageNetworkWrite){ + this.averageNetworkWrite = averageNetworkWrite; + return this; + } } public static class MinMax { diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/results/CsvPersister.java b/benchmark-overhead/src/test/java/io/opentelemetry/results/CsvPersister.java index e549e805cb..93c695fb2d 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/results/CsvPersister.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/results/CsvPersister.java @@ -39,6 +39,8 @@ class CsvPersister implements ResultsPersister { sb.append(",").append(result.iterationP95); sb.append(",").append(result.requestAvg); sb.append(",").append(result.requestP95); + sb.append(",").append(result.averageNetworkRead); + sb.append(",").append(result.averageNetworkWrite); sb.append(",").append(result.peakThreadCount); }); sb.append("\n"); @@ -79,6 +81,8 @@ class CsvPersister implements ResultsPersister { sb.append(",").append(agent).append(":iterationP95"); sb.append(",").append(agent).append(":requestAvg"); sb.append(",").append(agent).append(":requestP95"); + sb.append(",").append(agent).append(":netReadAvg"); + sb.append(",").append(agent).append(":netWriteAvg"); sb.append(",").append(agent).append(":peakThreadCount"); }); sb.append("\n"); diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/results/PrintStreamPersister.java b/benchmark-overhead/src/test/java/io/opentelemetry/results/PrintStreamPersister.java index 4f3e3c9662..d930d44e40 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/results/PrintStreamPersister.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/results/PrintStreamPersister.java @@ -41,6 +41,8 @@ class PrintStreamPersister implements ResultsPersister { display(sorted, "Req. p95", res -> format(res.requestP95)); display(sorted, "Iter. mean", res -> format(res.iterationAvg)); display(sorted, "Iter. p95", res -> format(res.iterationP95)); + display(sorted, "Net read avg (bps)", res -> format(res.averageNetworkRead)); + display(sorted, "Net write avg (bps)", res -> format(res.averageNetworkWrite)); display(sorted, "Peak threads", res -> String.valueOf(res.peakThreadCount)); } diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/results/ResultsCollector.java b/benchmark-overhead/src/test/java/io/opentelemetry/results/ResultsCollector.java index f54466f48d..c173351338 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/results/ResultsCollector.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/results/ResultsCollector.java @@ -75,7 +75,17 @@ public class ResultsCollector { .totalAllocated(readTotalAllocated(jfrFile)) .heapUsed(readHeapUsed(jfrFile)) .maxThreadContextSwitchRate(readMaxThreadContextSwitchRate(jfrFile)) - .peakThreadCount(readPeakThreadCount(jfrFile)); + .peakThreadCount(readPeakThreadCount(jfrFile)) + .averageNetworkRead(computeAverageNetworkRead(jfrFile)) + .averageNetworkWrite(computeAverageNetworkWrite(jfrFile)); + } + + private long computeAverageNetworkRead(Path jfrFile) throws IOException { + return JFRUtils.findAverageLong(jfrFile, "jdk.NetworkUtilization", "readRate"); + } + + private long computeAverageNetworkWrite(Path jfrFile) throws IOException { + return JFRUtils.findAverageLong(jfrFile, "jdk.NetworkUtilization", "writeRate"); } private long readPeakThreadCount(Path jfrFile) throws IOException { diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/util/JFRUtils.java b/benchmark-overhead/src/test/java/io/opentelemetry/util/JFRUtils.java index 63dd2af429..a996dd3674 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/util/JFRUtils.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/util/JFRUtils.java @@ -34,6 +34,12 @@ public class JFRUtils { }); } + public static long findAverageLong(Path jfrFile, String eventName, String valueKey) throws IOException { + return reduce(jfrFile, eventName, valueKey, + new AverageSupport(), + AverageSupport::add).average(); + } + private static T reduce(Path jfrFile, String eventName, String valueKey, T initial, BiFunction reducer) throws IOException { RecordingFile recordingFile = new RecordingFile(jfrFile); @@ -47,4 +53,18 @@ public class JFRUtils { } return result; } + + static class AverageSupport { + long count; + long total; + AverageSupport add(long value){ + count++; + total += value; + return this; + } + long average(){ + if(count == 0) return -1; + return total/count; + } + } }