From dce71968eb509cfa3516599df3c3916008fd864f Mon Sep 17 00:00:00 2001 From: Alexander Schwartz Date: Wed, 22 May 2024 16:06:05 +0200 Subject: [PATCH] Exclude the Highcharts dependency and provide a minimal replacement Relates to #809 Signed-off-by: Alexander Schwartz --- benchmark/pom.xml | 9 ++- .../gatling/chart/ComponentDummy.java | 30 ++++++++ .../gatling/chart/ComponentLibraryDummy.java | 64 ++++++++++++++++++ ....gatling.charts.component.ComponentLibrary | 1 + .../ROOT/images/report/beeswarm-chart.png | Bin 70050 -> 0 bytes .../report/custom-report/report-header.png | Bin 44013 -> 0 bytes .../gatling-standard-report/overview.png | Bin 90202 -> 51457 bytes ...response-times-and-requests-per-second.png | Bin 97274 -> 0 bytes .../ROOT/pages/report/standard-report.adoc | 5 +- 9 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentDummy.java create mode 100644 benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentLibraryDummy.java create mode 100644 benchmark/src/main/resources/META-INF/services/io.gatling.charts.component.ComponentLibrary delete mode 100644 doc/benchmark/modules/ROOT/images/report/beeswarm-chart.png delete mode 100644 doc/benchmark/modules/ROOT/images/report/custom-report/report-header.png delete mode 100644 doc/benchmark/modules/ROOT/images/report/gatling-standard-report/response-times-and-requests-per-second.png diff --git a/benchmark/pom.xml b/benchmark/pom.xml index dc317c17c..7816ff867 100644 --- a/benchmark/pom.xml +++ b/benchmark/pom.xml @@ -23,8 +23,8 @@ ${scala.version} - io.gatling.highcharts - gatling-charts-highcharts + io.gatling + gatling-app ${gatling.version} @@ -41,6 +41,11 @@ + + io.gatling + gatling-recorder + ${gatling.version} + org.codehaus.janino janino diff --git a/benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentDummy.java b/benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentDummy.java new file mode 100644 index 000000000..e78c25c83 --- /dev/null +++ b/benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentDummy.java @@ -0,0 +1,30 @@ +package org.keycloak.benchmark.gatling.chart; + +import io.gatling.charts.component.Component; +import scala.collection.immutable.Seq; +import scala.jdk.javaapi.CollectionConverters; + +import java.util.Collections; + +/** + * This is a dummy component which will show up as empty in Gatling's HTML report. + * It is a minimal replacement for the Highcharts library which is excluded for licensing restrictions. + + * @author Alexander Schwartz + */ +public class ComponentDummy implements Component { + @Override + public String html() { + return ""; + } + + @Override + public String js() { + return ""; + } + + @Override + public Seq jsFiles() { + return CollectionConverters.asScala(Collections.emptyIterator()).toSeq(); + } +} diff --git a/benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentLibraryDummy.java b/benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentLibraryDummy.java new file mode 100644 index 000000000..7771e1500 --- /dev/null +++ b/benchmark/src/main/java/org/keycloak/benchmark/gatling/chart/ComponentLibraryDummy.java @@ -0,0 +1,64 @@ +package org.keycloak.benchmark.gatling.chart; + +import io.gatling.charts.component.Component; +import io.gatling.charts.component.ComponentLibrary; +import io.gatling.charts.stats.CountsVsTimePlot; +import io.gatling.charts.stats.IntVsTimePlot; +import io.gatling.charts.stats.PercentVsTimePlot; +import io.gatling.charts.stats.PercentilesVsTimePlot; +import io.gatling.charts.stats.PieSlice; +import io.gatling.charts.stats.Series; +import scala.collection.immutable.Seq; + +/** + * This is a dummy component which will show up as empty in Gatling's HTML report. + * It is a minimal replacement for the Highcharts library which is excluded for licensing restrictions. + * + * @author Alexander Schwartz + */ +public class ComponentLibraryDummy implements ComponentLibrary { + @Override + public String getAllUsersJs(long runStart, Series series) { + return ""; + } + + @Override + public Component getActiveSessionsComponent(long runStart, Seq> series) { + return new ComponentDummy(); + } + + @Override + public Component getRangesComponent(String chartTitle, String eventName, boolean large) { + return new ComponentDummy(); + } + + @Override + public Component getRequestCountPolarComponent() { + return new ComponentDummy(); + } + + @Override + public Component getDistributionComponent(String title, String yAxisName, Series durationsSuccess, Series durationsFailure) { + return new ComponentDummy(); + } + + @Override + public Component getPercentilesOverTimeComponent(String yAxisName, long runStart, Series successSeries) { + return new ComponentDummy(); + } + + @Override + public Component getRequestsComponent(long runStart, Series counts, Series pieSeries) { + return new ComponentDummy(); + } + + @Override + public Component getResponsesComponent(long runStart, Series counts, Series pieSeries) { + return new ComponentDummy(); + } + + @Override + public Component getResponseTimeScatterComponent(Series successData, Series failuresData) { + return new ComponentDummy(); + } +} diff --git a/benchmark/src/main/resources/META-INF/services/io.gatling.charts.component.ComponentLibrary b/benchmark/src/main/resources/META-INF/services/io.gatling.charts.component.ComponentLibrary new file mode 100644 index 000000000..e6f84469b --- /dev/null +++ b/benchmark/src/main/resources/META-INF/services/io.gatling.charts.component.ComponentLibrary @@ -0,0 +1 @@ +org.keycloak.benchmark.gatling.chart.ComponentLibraryDummy diff --git a/doc/benchmark/modules/ROOT/images/report/beeswarm-chart.png b/doc/benchmark/modules/ROOT/images/report/beeswarm-chart.png deleted file mode 100644 index 653d2ef2bfc0d818eaa9584bcebac083420cb4ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70050 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