From 4d5c613ac1a75df5b5121bcdde62acc4a1910cfc Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 25 Jan 2026 07:09:53 -0500 Subject: [PATCH 1/8] Run integration tests in matrix Signed-off-by: Jay DeLuca --- .../workflows/java-version-matrix-tests.yml | 71 +++++++++++++++++++ .../client/it/common/ExporterTest.java | 6 +- .../metrics/it/pushgateway/PushGatewayIT.java | 6 +- 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/java-version-matrix-tests.yml diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml new file mode 100644 index 000000000..6658116c7 --- /dev/null +++ b/.github/workflows/java-version-matrix-tests.yml @@ -0,0 +1,71 @@ +--- +name: Java Version Matrix Tests + +on: + pull_request: + paths: + - 'integration-tests/**' + - 'prometheus-metrics-core/**' + - 'prometheus-metrics-exporter-*/**' + - 'prometheus-metrics-exposition-*/**' + - '.github/workflows/java-version-matrix-tests.yml' + push: + branches: + - main + workflow_dispatch: + +permissions: {} + +jobs: + integration-tests: + name: Integration Tests (Java ${{ matrix.java-version }}) + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + java-version: [8, 11, 17, 21, 25] + test-module: + - it-exporter + - it-pushgateway + steps: + - name: Check out + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Set up mise + uses: jdx/mise-action@6d1e696aa24c1aa1bcc1adea0212707c71ab78a8 # v3.6.1 + with: + version: v2026.1.4 + sha256: 79c798e39b83f0dd80108eaa88c6ca63689695ae975fd6786e7a353ef9f87002 + + - name: Cache local Maven repository + uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5.0.2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build project artifacts + run: mise exec -- ./mvnw install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn + + - name: Run integration tests for ${{ matrix.test-module }} + env: + TEST_JAVA_VERSION: ${{ matrix.java-version }} + run: | + cd integration-tests/${{ matrix.test-module }} + mise exec -- ../../mvnw verify -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn + + summary: + name: Matrix Test Summary + runs-on: ubuntu-24.04 + needs: integration-tests + if: always() + steps: + - name: Check matrix results + run: | + if [ "${{ needs.integration-tests.result }}" == "failure" ]; then + echo "::error::One or more Java version matrix tests failed" + exit 1 + fi \ No newline at end of file diff --git a/integration-tests/it-common/src/test/java/io/prometheus/client/it/common/ExporterTest.java b/integration-tests/it-common/src/test/java/io/prometheus/client/it/common/ExporterTest.java index 605e760f4..3cb9fc895 100644 --- a/integration-tests/it-common/src/test/java/io/prometheus/client/it/common/ExporterTest.java +++ b/integration-tests/it-common/src/test/java/io/prometheus/client/it/common/ExporterTest.java @@ -33,8 +33,12 @@ public ExporterTest(String sampleApp) throws IOException, URISyntaxException { this.sampleAppVolume = Volume.create("it-exporter") .copy("../../it-" + sampleApp + "/target/" + sampleApp + ".jar"); + String javaVersion = System.getenv("TEST_JAVA_VERSION"); + if (javaVersion == null || javaVersion.isEmpty()) { + javaVersion = "25"; + } this.sampleAppContainer = - new GenericContainer<>("eclipse-temurin:25") + new GenericContainer<>("eclipse-temurin:" + javaVersion) .withFileSystemBind(sampleAppVolume.getHostPath(), "/app", BindMode.READ_ONLY) .withWorkingDirectory("/app") .withLogConsumer(LogConsumer.withPrefix(sampleApp)) diff --git a/integration-tests/it-pushgateway/src/test/java/io/prometheus/metrics/it/pushgateway/PushGatewayIT.java b/integration-tests/it-pushgateway/src/test/java/io/prometheus/metrics/it/pushgateway/PushGatewayIT.java index 29a8fad72..c8c0fb946 100644 --- a/integration-tests/it-pushgateway/src/test/java/io/prometheus/metrics/it/pushgateway/PushGatewayIT.java +++ b/integration-tests/it-pushgateway/src/test/java/io/prometheus/metrics/it/pushgateway/PushGatewayIT.java @@ -33,6 +33,10 @@ public class PushGatewayIT { public void setUp() throws IOException, URISyntaxException { Network network = Network.newNetwork(); sampleAppVolume = Volume.create("it-pushgateway").copy("pushgateway-test-app.jar"); + String javaVersion = System.getenv("TEST_JAVA_VERSION"); + if (javaVersion == null || javaVersion.isEmpty()) { + javaVersion = "25"; + } pushGatewayContainer = new GenericContainer<>("prom/pushgateway:v1.8.0") .withExposedPorts(9091) @@ -41,7 +45,7 @@ public void setUp() throws IOException, URISyntaxException { .withLogConsumer(LogConsumer.withPrefix("pushgateway")) .waitingFor(Wait.forListeningPort()); sampleAppContainer = - new GenericContainer<>("eclipse-temurin:25") + new GenericContainer<>("eclipse-temurin:" + javaVersion) .withFileSystemBind(sampleAppVolume.getHostPath(), "/app", BindMode.READ_ONLY) .withNetwork(network) .withWorkingDirectory("/app") From d9df6eb1f403134523f317137a7d99f492ea6efa Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 25 Jan 2026 07:18:32 -0500 Subject: [PATCH 2/8] consolidate jobs Signed-off-by: Jay DeLuca --- .../workflows/java-version-matrix-tests.yml | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 6658116c7..92279d097 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -18,15 +18,12 @@ permissions: {} jobs: integration-tests: - name: Integration Tests (Java ${{ matrix.java-version }}) + name: Java ${{ matrix.java-version }} runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: java-version: [8, 11, 17, 21, 25] - test-module: - - it-exporter - - it-pushgateway steps: - name: Check out uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -47,25 +44,28 @@ jobs: restore-keys: | ${{ runner.os }}-maven- - - name: Build project artifacts - run: mise exec -- ./mvnw install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn + - name: Build core library artifacts + run: mise exec -- ./mvnw install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn -pl '!integration-tests' - - name: Run integration tests for ${{ matrix.test-module }} - env: - TEST_JAVA_VERSION: ${{ matrix.java-version }} + - name: Clean and rebuild sample apps targeting Java ${{ matrix.java-version }} run: | - cd integration-tests/${{ matrix.test-module }} - mise exec -- ../../mvnw verify -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn + cd integration-tests + if [ "${{ matrix.java-version }}" = "8" ]; then + # Java 8 doesn't support --release flag, use source/target instead + mise exec -- ../mvnw clean install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ + -Djava.version=8 \ + -Dmaven.compiler.source=8 \ + -Dmaven.compiler.target=8 + else + # Java 9+ supports --release flag for better compatibility + mise exec -- ../mvnw clean install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ + -Djava.version=${{ matrix.java-version }} \ + -Dmaven.compiler.release=${{ matrix.java-version }} + fi - summary: - name: Matrix Test Summary - runs-on: ubuntu-24.04 - needs: integration-tests - if: always() - steps: - - name: Check matrix results + - name: Run integration tests in parallel + env: + TEST_JAVA_VERSION: ${{ matrix.java-version }} run: | - if [ "${{ needs.integration-tests.result }}" == "failure" ]; then - echo "::error::One or more Java version matrix tests failed" - exit 1 - fi \ No newline at end of file + cd integration-tests + mise exec -- ../mvnw verify -T 2C -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ No newline at end of file From cb493b926653599328179ac1e69a6b38cce5ee7b Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 25 Jan 2026 07:55:06 -0500 Subject: [PATCH 3/8] remove 8 Signed-off-by: Jay DeLuca --- .../workflows/java-version-matrix-tests.yml | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 92279d097..40bab234d 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -23,7 +23,8 @@ jobs: strategy: fail-fast: false matrix: - java-version: [8, 11, 17, 21, 25] + # Note: Java 8 runtime testing is skipped due to Spotless incompatibility + java-version: [11, 17, 21, 25] steps: - name: Check out uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -47,25 +48,23 @@ jobs: - name: Build core library artifacts run: mise exec -- ./mvnw install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn -pl '!integration-tests' - - name: Clean and rebuild sample apps targeting Java ${{ matrix.java-version }} + - name: Install integration-tests parent POM run: | cd integration-tests - if [ "${{ matrix.java-version }}" = "8" ]; then - # Java 8 doesn't support --release flag, use source/target instead - mise exec -- ../mvnw clean install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ - -Djava.version=8 \ - -Dmaven.compiler.source=8 \ - -Dmaven.compiler.target=8 - else - # Java 9+ supports --release flag for better compatibility - mise exec -- ../mvnw clean install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ - -Djava.version=${{ matrix.java-version }} \ - -Dmaven.compiler.release=${{ matrix.java-version }} - fi + mise exec -- ../mvnw clean install -N -Dspotless.skip=true - - name: Run integration tests in parallel + - name: Rebuild sample apps targeting Java ${{ matrix.java-version }} + run: | + cd integration-tests + mise exec -- ../mvnw install -DskipTests -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ + -Djava.version=${{ matrix.java-version }} \ + -Dmaven.compiler.release=${{ matrix.java-version }} \ + -pl it-common,it-exporter,it-pushgateway + + - name: Run integration tests env: TEST_JAVA_VERSION: ${{ matrix.java-version }} run: | cd integration-tests - mise exec -- ../mvnw verify -T 2C -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ No newline at end of file + mise exec -- ../mvnw verify -T 2C -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ + -pl it-exporter,it-pushgateway \ No newline at end of file From 7cce92d8c56b1ca11580e96912f2cbe688f346e7 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 25 Jan 2026 08:11:49 -0500 Subject: [PATCH 4/8] test failing the build Signed-off-by: Jay DeLuca --- .github/workflows/java-version-matrix-tests.yml | 2 +- .../metrics/it/exporter/httpserver/HTTPServerSample.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 40bab234d..01b750d91 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -1,5 +1,5 @@ --- -name: Java Version Matrix Tests +name: Integration Tests - Java Version Compatibility Matrix on: pull_request: diff --git a/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java b/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java index 8490cd64e..160a995e9 100644 --- a/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java +++ b/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java @@ -65,7 +65,7 @@ private static void run(Mode mode, int port) throws IOException, InterruptedExce PrometheusRegistry.defaultRegistry.register(failingCollector); } - HTTPServer server = HTTPServer.builder().port(port).buildAndStart(); + HTTPServer server = HTTPServer.builder().metricsHandlerPath("/").port(port).buildAndStart(); System.out.println( "HTTPServer listening on port http://localhost:" + server.getPort() + "/metrics"); From d6f523c5b321bb3ef227c039a520c3c682c20d2d Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 25 Jan 2026 08:27:29 -0500 Subject: [PATCH 5/8] ensure all it tests run Signed-off-by: Jay DeLuca --- .github/workflows/java-version-matrix-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 01b750d91..646cb24a7 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -59,7 +59,7 @@ jobs: mise exec -- ../mvnw install -DskipTests -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ -Djava.version=${{ matrix.java-version }} \ -Dmaven.compiler.release=${{ matrix.java-version }} \ - -pl it-common,it-exporter,it-pushgateway + -pl it-common,it-exporter/it-exporter-httpserver-sample,it-exporter/it-exporter-servlet-tomcat-sample,it-exporter/it-exporter-servlet-jetty-sample,it-exporter/it-exporter-no-protobuf,it-pushgateway - name: Run integration tests env: @@ -67,4 +67,4 @@ jobs: run: | cd integration-tests mise exec -- ../mvnw verify -T 2C -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ - -pl it-exporter,it-pushgateway \ No newline at end of file + -pl it-exporter/it-exporter-test,it-exporter/it-no-protobuf-test,it-pushgateway \ No newline at end of file From 1e113a080517f0bff130fcc1223f978a33cf9776 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Sun, 25 Jan 2026 10:02:11 -0500 Subject: [PATCH 6/8] fix pom Signed-off-by: Jay DeLuca --- .github/workflows/java-version-matrix-tests.yml | 4 +++- .../metrics/it/exporter/httpserver/HTTPServerSample.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 646cb24a7..9af8cb7b0 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -48,10 +48,12 @@ jobs: - name: Build core library artifacts run: mise exec -- ./mvnw install -DskipTests -Dspotless.check.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn -pl '!integration-tests' - - name: Install integration-tests parent POM + - name: Install parent POMs run: | cd integration-tests mise exec -- ../mvnw clean install -N -Dspotless.skip=true + cd it-exporter + mise exec -- ../../mvnw install -N -Dspotless.skip=true - name: Rebuild sample apps targeting Java ${{ matrix.java-version }} run: | diff --git a/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java b/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java index 160a995e9..8490cd64e 100644 --- a/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java +++ b/integration-tests/it-exporter/it-exporter-httpserver-sample/src/main/java/io/prometheus/metrics/it/exporter/httpserver/HTTPServerSample.java @@ -65,7 +65,7 @@ private static void run(Mode mode, int port) throws IOException, InterruptedExce PrometheusRegistry.defaultRegistry.register(failingCollector); } - HTTPServer server = HTTPServer.builder().metricsHandlerPath("/").port(port).buildAndStart(); + HTTPServer server = HTTPServer.builder().port(port).buildAndStart(); System.out.println( "HTTPServer listening on port http://localhost:" + server.getPort() + "/metrics"); From 8623d8aaafce8a33a6d0fac24e6b08b6814254f7 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 26 Jan 2026 07:09:24 -0500 Subject: [PATCH 7/8] clean build Signed-off-by: Jay DeLuca --- .github/workflows/java-version-matrix-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 9af8cb7b0..b534d6309 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -58,7 +58,7 @@ jobs: - name: Rebuild sample apps targeting Java ${{ matrix.java-version }} run: | cd integration-tests - mise exec -- ../mvnw install -DskipTests -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ + mise exec -- ../mvnw clean install -DskipTests -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ -Djava.version=${{ matrix.java-version }} \ -Dmaven.compiler.release=${{ matrix.java-version }} \ -pl it-common,it-exporter/it-exporter-httpserver-sample,it-exporter/it-exporter-servlet-tomcat-sample,it-exporter/it-exporter-servlet-jetty-sample,it-exporter/it-exporter-no-protobuf,it-pushgateway From 0a41e915e7066e2b3edda0e3cf518bfab659aa17 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 26 Jan 2026 07:20:23 -0500 Subject: [PATCH 8/8] only test jetty and tomcat on 17+ Signed-off-by: Jay DeLuca --- .github/workflows/java-version-matrix-tests.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index b534d6309..fbdbab48f 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -58,15 +58,27 @@ jobs: - name: Rebuild sample apps targeting Java ${{ matrix.java-version }} run: | cd integration-tests + # Note: Jetty 12 and Tomcat 11 require Java 17+, so servlet samples are skipped for Java 11 + if [ "${{ matrix.java-version }}" = "11" ]; then + MODULES="it-common,it-exporter/it-exporter-httpserver-sample,it-exporter/it-exporter-no-protobuf,it-pushgateway" + else + MODULES="it-common,it-exporter/it-exporter-httpserver-sample,it-exporter/it-exporter-servlet-tomcat-sample,it-exporter/it-exporter-servlet-jetty-sample,it-exporter/it-exporter-no-protobuf,it-pushgateway" + fi mise exec -- ../mvnw clean install -DskipTests -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ -Djava.version=${{ matrix.java-version }} \ -Dmaven.compiler.release=${{ matrix.java-version }} \ - -pl it-common,it-exporter/it-exporter-httpserver-sample,it-exporter/it-exporter-servlet-tomcat-sample,it-exporter/it-exporter-servlet-jetty-sample,it-exporter/it-exporter-no-protobuf,it-pushgateway + -pl $MODULES - name: Run integration tests env: TEST_JAVA_VERSION: ${{ matrix.java-version }} run: | cd integration-tests + # Note: Servlet tests require Java 17+ (due to Jetty 12 and Tomcat 11) + if [ "${{ matrix.java-version }}" = "11" ]; then + TEST_MODULES="it-exporter/it-no-protobuf-test,it-pushgateway" + else + TEST_MODULES="it-exporter/it-exporter-test,it-exporter/it-no-protobuf-test,it-pushgateway" + fi mise exec -- ../mvnw verify -T 2C -Dspotless.skip=true -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn \ - -pl it-exporter/it-exporter-test,it-exporter/it-no-protobuf-test,it-pushgateway \ No newline at end of file + -pl $TEST_MODULES \ No newline at end of file