From d211d0120ec04952aba357a36732f6bfbb8f3350 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 17 Sep 2025 09:23:16 +0200 Subject: [PATCH 1/3] add protobuf test --- .../prometheus/PrometheusHttpServerTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index 2b1f27b8a3e..42b7289dd62 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -239,6 +239,24 @@ void fetchOpenMetrics() { + "# EOF\n"); } + @Test + void fetchProtobuf() { + AggregatedHttpResponse response = + client + .execute( + RequestHeaders.of( + HttpMethod.GET, + "/metrics", + HttpHeaderNames.ACCEPT, + "Accept: application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily")) + .aggregate() + .join(); + assertThat(response.status()).isEqualTo(HttpStatus.OK); + assertThat(response.headers().get(HttpHeaderNames.CONTENT_TYPE)) + .isEqualTo("application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited"); + // don't decode the protobuf, just verify it doesn't throw an exception + } + @SuppressWarnings("ConcatenationWithEmptyString") @Test void fetchFiltered() { From aa6500762ab39582fc3350e3eb62b6461a075f81 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 17 Sep 2025 09:39:56 +0200 Subject: [PATCH 2/3] fix protobuf --- exporters/prometheus/build.gradle.kts | 131 +++++++++--------- sdk-extensions/autoconfigure/build.gradle.kts | 4 +- 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/exporters/prometheus/build.gradle.kts b/exporters/prometheus/build.gradle.kts index 16740f353dc..8edea8f1621 100644 --- a/exporters/prometheus/build.gradle.kts +++ b/exporters/prometheus/build.gradle.kts @@ -1,100 +1,99 @@ plugins { - id("otel.java-conventions") - id("otel.publish-conventions") + id("otel.java-conventions") + id("otel.publish-conventions") } description = "OpenTelemetry Prometheus Exporter" otelJava.moduleName.set("io.opentelemetry.exporter.prometheus") dependencies { - api(project(":sdk:metrics")) - - compileOnly(project(":api:incubator")) - implementation(project(":exporters:common")) - implementation(project(":sdk-extensions:autoconfigure-spi")) - implementation("io.prometheus:prometheus-metrics-exporter-httpserver") { - exclude(group = "io.prometheus", module = "prometheus-metrics-exposition-formats") - } - implementation("io.prometheus:prometheus-metrics-exposition-textformats") - - compileOnly("com.google.auto.value:auto-value-annotations") - - annotationProcessor("com.google.auto.value:auto-value") - - testImplementation(project(":sdk:testing")) - testImplementation("io.opentelemetry.proto:opentelemetry-proto") - testImplementation("io.prometheus:prometheus-metrics-exposition-formats-no-protobuf") - testImplementation("com.sun.net.httpserver:http") - testImplementation("com.google.guava:guava") - testImplementation("com.linecorp.armeria:armeria") - testImplementation("com.linecorp.armeria:armeria-junit5") - testImplementation("com.linecorp.armeria:armeria-grpc-protocol") - testImplementation("com.fasterxml.jackson.jr:jackson-jr-stree") - testImplementation("com.fasterxml.jackson.jr:jackson-jr-objects") - testImplementation("org.testcontainers:junit-jupiter") + api(project(":sdk:metrics")) + + compileOnly(project(":api:incubator")) + implementation(project(":exporters:common")) + implementation(project(":sdk-extensions:autoconfigure-spi")) + implementation("io.prometheus:prometheus-metrics-exporter-httpserver") { + exclude(group = "io.prometheus", module = "prometheus-metrics-exposition-formats") + } + implementation("io.prometheus:prometheus-metrics-exposition-formats-no-protobuf") + + compileOnly("com.google.auto.value:auto-value-annotations") + + annotationProcessor("com.google.auto.value:auto-value") + + testImplementation(project(":sdk:testing")) + testImplementation("io.opentelemetry.proto:opentelemetry-proto") + testImplementation("com.sun.net.httpserver:http") + testImplementation("com.google.guava:guava") + testImplementation("com.linecorp.armeria:armeria") + testImplementation("com.linecorp.armeria:armeria-junit5") + testImplementation("com.linecorp.armeria:armeria-grpc-protocol") + testImplementation("com.fasterxml.jackson.jr:jackson-jr-stree") + testImplementation("com.fasterxml.jackson.jr:jackson-jr-objects") + testImplementation("org.testcontainers:junit-jupiter") } tasks { - check { - dependsOn(testing.suites) - } + check { + dependsOn(testing.suites) + } } // TODO(anuraaga): Move to conventions. testing { - suites { - register("testJpms") { - targets { - all { - testTask.configure { - enabled = gradle.startParameter.projectProperties.get("testJavaVersion") != "8" - } + suites { + register("testJpms") { + targets { + all { + testTask.configure { + enabled = gradle.startParameter.projectProperties.get("testJavaVersion") != "8" + } + } + } } - } } - } } sourceSets { - val module by creating - main { - output.dir(mapOf("builtBy" to "compileModuleJava"), module.java.destinationDirectory) - } + val module by creating + main { + output.dir(mapOf("builtBy" to "compileModuleJava"), module.java.destinationDirectory) + } } configurations { - named("moduleImplementation") { - extendsFrom(configurations["implementation"]) - } + named("moduleImplementation") { + extendsFrom(configurations["implementation"]) + } } tasks { - jar { - manifest.attributes.remove("Automatic-Module-Name") + jar { + manifest.attributes.remove("Automatic-Module-Name") - exclude("**/HackForJpms.class") - } + exclude("**/HackForJpms.class") + } - compileJava { - exclude("module-info.java") - } + compileJava { + exclude("module-info.java") + } - withType().configureEach { - exclude("module-info.java") - } + withType().configureEach { + exclude("module-info.java") + } - named("compileModuleJava") { - with(options) { - release.set(9) + named("compileModuleJava") { + with(options) { + release.set(9) + } } - } - named("compileTestJpmsJava") { - with(options) { - release.set(9) - compilerArgs.add("--add-modules=org.junit.jupiter.api") - compilerArgs.add("--add-reads=io.opentelemetry.exporters.prometheus.test=org.junit.jupiter.api") + named("compileTestJpmsJava") { + with(options) { + release.set(9) + compilerArgs.add("--add-modules=org.junit.jupiter.api") + compilerArgs.add("--add-reads=io.opentelemetry.exporters.prometheus.test=org.junit.jupiter.api") + } } - } } diff --git a/sdk-extensions/autoconfigure/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts index 72d6b88bec6..3d54ea736c4 100644 --- a/sdk-extensions/autoconfigure/build.gradle.kts +++ b/sdk-extensions/autoconfigure/build.gradle.kts @@ -52,7 +52,9 @@ testing { implementation(project(":exporters:logging-otlp")) implementation(project(":exporters:otlp:all")) implementation(project(":exporters:prometheus")) - implementation("io.prometheus:prometheus-metrics-exporter-httpserver") + implementation("io.prometheus:prometheus-metrics-exporter-httpserver") { + exclude(group = "io.prometheus", module = "prometheus-metrics-exposition-formats") + } implementation(project(":exporters:zipkin")) implementation(project(":sdk:testing")) implementation(project(":sdk:trace-shaded-deps")) From 1efe21585ebfd681154b2a6ff51538373698ec1e Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 17 Sep 2025 09:59:27 +0200 Subject: [PATCH 3/3] fix protobuf --- exporters/prometheus/build.gradle.kts | 130 +++++++++--------- .../prometheus/PrometheusHttpServerTest.java | 3 +- 2 files changed, 67 insertions(+), 66 deletions(-) diff --git a/exporters/prometheus/build.gradle.kts b/exporters/prometheus/build.gradle.kts index 8edea8f1621..492c7085ba7 100644 --- a/exporters/prometheus/build.gradle.kts +++ b/exporters/prometheus/build.gradle.kts @@ -1,99 +1,99 @@ plugins { - id("otel.java-conventions") - id("otel.publish-conventions") + id("otel.java-conventions") + id("otel.publish-conventions") } description = "OpenTelemetry Prometheus Exporter" otelJava.moduleName.set("io.opentelemetry.exporter.prometheus") dependencies { - api(project(":sdk:metrics")) - - compileOnly(project(":api:incubator")) - implementation(project(":exporters:common")) - implementation(project(":sdk-extensions:autoconfigure-spi")) - implementation("io.prometheus:prometheus-metrics-exporter-httpserver") { - exclude(group = "io.prometheus", module = "prometheus-metrics-exposition-formats") - } - implementation("io.prometheus:prometheus-metrics-exposition-formats-no-protobuf") - - compileOnly("com.google.auto.value:auto-value-annotations") - - annotationProcessor("com.google.auto.value:auto-value") - - testImplementation(project(":sdk:testing")) - testImplementation("io.opentelemetry.proto:opentelemetry-proto") - testImplementation("com.sun.net.httpserver:http") - testImplementation("com.google.guava:guava") - testImplementation("com.linecorp.armeria:armeria") - testImplementation("com.linecorp.armeria:armeria-junit5") - testImplementation("com.linecorp.armeria:armeria-grpc-protocol") - testImplementation("com.fasterxml.jackson.jr:jackson-jr-stree") - testImplementation("com.fasterxml.jackson.jr:jackson-jr-objects") - testImplementation("org.testcontainers:junit-jupiter") + api(project(":sdk:metrics")) + + compileOnly(project(":api:incubator")) + implementation(project(":exporters:common")) + implementation(project(":sdk-extensions:autoconfigure-spi")) + implementation("io.prometheus:prometheus-metrics-exporter-httpserver") { + exclude(group = "io.prometheus", module = "prometheus-metrics-exposition-formats") + } + implementation("io.prometheus:prometheus-metrics-exposition-formats-no-protobuf") + + compileOnly("com.google.auto.value:auto-value-annotations") + + annotationProcessor("com.google.auto.value:auto-value") + + testImplementation(project(":sdk:testing")) + testImplementation("io.opentelemetry.proto:opentelemetry-proto") + testImplementation("com.sun.net.httpserver:http") + testImplementation("com.google.guava:guava") + testImplementation("com.linecorp.armeria:armeria") + testImplementation("com.linecorp.armeria:armeria-junit5") + testImplementation("com.linecorp.armeria:armeria-grpc-protocol") + testImplementation("com.fasterxml.jackson.jr:jackson-jr-stree") + testImplementation("com.fasterxml.jackson.jr:jackson-jr-objects") + testImplementation("org.testcontainers:junit-jupiter") } tasks { - check { - dependsOn(testing.suites) - } + check { + dependsOn(testing.suites) + } } // TODO(anuraaga): Move to conventions. testing { - suites { - register("testJpms") { - targets { - all { - testTask.configure { - enabled = gradle.startParameter.projectProperties.get("testJavaVersion") != "8" - } - } - } + suites { + register("testJpms") { + targets { + all { + testTask.configure { + enabled = gradle.startParameter.projectProperties.get("testJavaVersion") != "8" + } } + } } + } } sourceSets { - val module by creating - main { - output.dir(mapOf("builtBy" to "compileModuleJava"), module.java.destinationDirectory) - } + val module by creating + main { + output.dir(mapOf("builtBy" to "compileModuleJava"), module.java.destinationDirectory) + } } configurations { - named("moduleImplementation") { - extendsFrom(configurations["implementation"]) - } + named("moduleImplementation") { + extendsFrom(configurations["implementation"]) + } } tasks { - jar { - manifest.attributes.remove("Automatic-Module-Name") + jar { + manifest.attributes.remove("Automatic-Module-Name") - exclude("**/HackForJpms.class") - } + exclude("**/HackForJpms.class") + } - compileJava { - exclude("module-info.java") - } + compileJava { + exclude("module-info.java") + } - withType().configureEach { - exclude("module-info.java") - } + withType().configureEach { + exclude("module-info.java") + } - named("compileModuleJava") { - with(options) { - release.set(9) - } + named("compileModuleJava") { + with(options) { + release.set(9) } + } - named("compileTestJpmsJava") { - with(options) { - release.set(9) - compilerArgs.add("--add-modules=org.junit.jupiter.api") - compilerArgs.add("--add-reads=io.opentelemetry.exporters.prometheus.test=org.junit.jupiter.api") - } + named("compileTestJpmsJava") { + with(options) { + release.set(9) + compilerArgs.add("--add-modules=org.junit.jupiter.api") + compilerArgs.add("--add-reads=io.opentelemetry.exporters.prometheus.test=org.junit.jupiter.api") } + } } diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index 42b7289dd62..791c46165ef 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -253,7 +253,8 @@ void fetchProtobuf() { .join(); assertThat(response.status()).isEqualTo(HttpStatus.OK); assertThat(response.headers().get(HttpHeaderNames.CONTENT_TYPE)) - .isEqualTo("application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited"); + .isEqualTo( + "application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited"); // don't decode the protobuf, just verify it doesn't throw an exception }