From ac68ec6d0b94bf64bbc88d87a76bd2c8cdb85942 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 26 Sep 2022 15:36:08 -0500 Subject: [PATCH 1/4] Add User-Agent header to OTLP exporter requests --- .../OtlpHttpMetricExporterBuilder.java | 2 + .../trace/OtlpHttpSpanExporterBuilder.java | 2 + .../OtlpGrpcMetricExporterBuilder.java | 2 + .../trace/OtlpGrpcSpanExporterBuilder.java | 2 + exporters/otlp/common/build.gradle.kts | 2 +- .../exporter/internal/otlp/OtlpUserAgent.java | 62 +++++++++++++++++++ .../internal/otlp/OtlpUserAgentTest.java | 32 ++++++++++ .../OtlpHttpLogRecordExporterBuilder.java | 2 + .../OtlpGrpcLogRecordExporterBuilder.java | 2 + .../AbstractGrpcTelemetryExporterTest.java | 8 +++ ...anagedChannelTelemetryExporterBuilder.java | 5 ++ 11 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java create mode 100644 exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java index 33f30d01306..03b1ea0e737 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java @@ -9,6 +9,7 @@ import static java.util.Objects.requireNonNull; import io.opentelemetry.exporter.internal.okhttp.OkHttpExporterBuilder; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.otlp.metrics.MetricsRequestMarshaler; import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; @@ -38,6 +39,7 @@ public final class OtlpHttpMetricExporterBuilder { OtlpHttpMetricExporterBuilder() { delegate = new OkHttpExporterBuilder<>("otlp", "metric", DEFAULT_ENDPOINT); + OtlpUserAgent.addUserAgentHeader(delegate::addHeader); } /** diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java index cdfb34f0e72..0f268cbb83e 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.internal.okhttp.OkHttpExporterBuilder; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.otlp.traces.TraceRequestMarshaler; import java.time.Duration; import java.util.concurrent.TimeUnit; @@ -27,6 +28,7 @@ public final class OtlpHttpSpanExporterBuilder { OtlpHttpSpanExporterBuilder() { delegate = new OkHttpExporterBuilder<>("otlp", "span", DEFAULT_ENDPOINT); + OtlpUserAgent.addUserAgentHeader(delegate::addHeader); } /** diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java index 99998b37ce0..72ea4a6d35e 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java @@ -11,6 +11,7 @@ import io.grpc.ManagedChannel; import io.opentelemetry.exporter.internal.grpc.GrpcExporter; import io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.otlp.metrics.MetricsRequestMarshaler; import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; @@ -56,6 +57,7 @@ public final class OtlpGrpcMetricExporterBuilder { DEFAULT_ENDPOINT, () -> MarshalerMetricsServiceGrpc::newFutureStub, GRPC_ENDPOINT_PATH); + OtlpUserAgent.addUserAgentHeader(delegate::addHeader); } /** diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java index 5db960af3fb..43a9b1923d4 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.internal.grpc.GrpcExporter; import io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.otlp.traces.TraceRequestMarshaler; import java.net.URI; import java.time.Duration; @@ -41,6 +42,7 @@ public final class OtlpGrpcSpanExporterBuilder { DEFAULT_ENDPOINT, () -> MarshalerTraceServiceGrpc::newFutureStub, GRPC_ENDPOINT_PATH); + OtlpUserAgent.addUserAgentHeader(delegate::addHeader); } /** diff --git a/exporters/otlp/common/build.gradle.kts b/exporters/otlp/common/build.gradle.kts index 92bbc4ae27d..b91716e7c17 100644 --- a/exporters/otlp/common/build.gradle.kts +++ b/exporters/otlp/common/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } description = "OpenTelemetry Protocol Exporter" -otelJava.moduleName.set("io.opentelemetry.exporter.otlp.internal") +otelJava.moduleName.set("io.opentelemetry.exporter.internal.otlp") val versions: Map by project dependencies { diff --git a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java new file mode 100644 index 00000000000..10f7b2b4a7d --- /dev/null +++ b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.internal.otlp; + +import io.opentelemetry.sdk.resources.Resource; +import java.util.Properties; +import java.util.function.BiConsumer; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class OtlpUserAgent { + + private static final String userAgent; + + static { + userAgent = "OTel OTLP Exporter Java/" + readVersion(); + } + + private static String readVersion() { + Properties properties = new Properties(); + try { + properties.load( + Resource.class.getResourceAsStream( + "/io/opentelemetry/exporter/internal/otlp/version.properties")); + } catch (Exception e) { + // we left the attribute empty + return "unknown"; + } + return properties.getProperty("sdk.version", "unknown"); + } + + /** + * Return an OTLP {@code User-Agent} header value of the form {@code "OTel OTLP Exporter + * Java/{version}"}. + * + * @see OTLP + * Exporter User Agent + */ + public static String getUserAgent() { + return userAgent; + } + + /** + * Call the {@code consumer with} an OTLP {@code User-Agent} header value of the form {@code "OTel + * OTLP Exporter Java/{version}"}. + * + * @see OTLP + * Exporter User Agent + */ + public static void addUserAgentHeader(BiConsumer consumer) { + consumer.accept("User-Agent", userAgent); + } + + private OtlpUserAgent() {} +} diff --git a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java new file mode 100644 index 00000000000..804247d4bcf --- /dev/null +++ b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.internal.otlp; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.Test; + +class OtlpUserAgentTest { + + @Test + void getUserAgent() { + assertThat(OtlpUserAgent.getUserAgent()).matches("OTel OTLP Exporter Java/1.*"); + } + + @Test + void addUserAgentHeader() { + AtomicReference keyRef = new AtomicReference<>(); + AtomicReference valueRef = new AtomicReference<>(); + OtlpUserAgent.addUserAgentHeader( + (key, value) -> { + keyRef.set(key); + valueRef.set(value); + }); + assertThat(keyRef.get()).isEqualTo("User-Agent"); + assertThat(valueRef.get()).matches("OTel OTLP Exporter Java/1.*"); + } +} diff --git a/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java b/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java index 3f540464dfa..3357c8f9e5a 100644 --- a/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java +++ b/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.internal.okhttp.OkHttpExporterBuilder; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler; import java.time.Duration; import java.util.concurrent.TimeUnit; @@ -23,6 +24,7 @@ public final class OtlpHttpLogRecordExporterBuilder { OtlpHttpLogRecordExporterBuilder() { delegate = new OkHttpExporterBuilder<>("otlp", "log", DEFAULT_ENDPOINT); + OtlpUserAgent.addUserAgentHeader(delegate::addHeader); } /** diff --git a/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java b/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java index b9622be35d3..6c78c79fd1f 100644 --- a/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java +++ b/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.internal.grpc.GrpcExporter; import io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler; import java.net.URI; import java.time.Duration; @@ -41,6 +42,7 @@ public final class OtlpGrpcLogRecordExporterBuilder { DEFAULT_ENDPOINT, () -> MarshalerLogsServiceGrpc::newFutureStub, GRPC_ENDPOINT_PATH); + OtlpUserAgent.addUserAgentHeader(delegate::addHeader); } /** diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java index a775bf77f4a..274e8a383aa 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java @@ -216,6 +216,14 @@ void export() { assertThat(exporter.export(telemetry).join(10, TimeUnit.SECONDS).isSuccess()).isTrue(); List expectedResourceTelemetry = toProto(telemetry); assertThat(exportedResourceTelemetry).containsExactlyElementsOf(expectedResourceTelemetry); + + // Assert request contains OTLP spec compliant User-Agent header + assertThat(httpRequests) + .singleElement() + .satisfies( + req -> { + assertThat(req.headers().get("User-Agent")).matches("OTel OTLP Exporter Java/1.*"); + }); } @Test diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java index 1402819ca7c..dfbece6af51 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java @@ -10,6 +10,7 @@ import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.exporter.internal.grpc.ManagedChannelUtil; +import io.opentelemetry.exporter.internal.otlp.OtlpUserAgent; import io.opentelemetry.exporter.internal.retry.RetryPolicy; import io.opentelemetry.sdk.common.CompletableResultCode; import java.net.URI; @@ -51,6 +52,10 @@ public TelemetryExporterBuilder setEndpoint(String endpoint) { if (!uri.getScheme().equals("https")) { channelBuilder.usePlaintext(); } + // User-Agent can only be set at the channel level with upstream gRPC client. If a user wants + // the User-Agent to be spec compliant they must add manually set the user agent when building + // their channel. + channelBuilder.userAgent(OtlpUserAgent.getUserAgent()); return this; } From bbb7cd8ebbc8fd52bc0c6f2635b467a535c59ba2 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Tue, 27 Sep 2022 10:03:45 -0500 Subject: [PATCH 2/4] PR feedback --- .../exporter/internal/otlp/OtlpUserAgent.java | 11 ++--------- .../exporter/internal/otlp/OtlpUserAgentTest.java | 4 ++-- .../internal/AbstractGrpcTelemetryExporterTest.java | 2 +- .../ManagedChannelTelemetryExporterBuilder.java | 2 +- 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java index 10f7b2b4a7d..b5f747ace5e 100644 --- a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java +++ b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java @@ -5,7 +5,6 @@ package io.opentelemetry.exporter.internal.otlp; -import io.opentelemetry.sdk.resources.Resource; import java.util.Properties; import java.util.function.BiConsumer; @@ -15,18 +14,12 @@ */ public class OtlpUserAgent { - private static final String userAgent; - - static { - userAgent = "OTel OTLP Exporter Java/" + readVersion(); - } + private static final String userAgent = "OTel OTLP Exporter Java/" + readVersion(); private static String readVersion() { Properties properties = new Properties(); try { - properties.load( - Resource.class.getResourceAsStream( - "/io/opentelemetry/exporter/internal/otlp/version.properties")); + properties.load(OtlpUserAgent.class.getResourceAsStream("version.properties")); } catch (Exception e) { // we left the attribute empty return "unknown"; diff --git a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java index 804247d4bcf..c0333a2eb05 100644 --- a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java +++ b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgentTest.java @@ -14,7 +14,7 @@ class OtlpUserAgentTest { @Test void getUserAgent() { - assertThat(OtlpUserAgent.getUserAgent()).matches("OTel OTLP Exporter Java/1.*"); + assertThat(OtlpUserAgent.getUserAgent()).matches("OTel OTLP Exporter Java/1\\..*"); } @Test @@ -27,6 +27,6 @@ void addUserAgentHeader() { valueRef.set(value); }); assertThat(keyRef.get()).isEqualTo("User-Agent"); - assertThat(valueRef.get()).matches("OTel OTLP Exporter Java/1.*"); + assertThat(valueRef.get()).matches("OTel OTLP Exporter Java/1\\..*"); } } diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java index 274e8a383aa..77ec4f65cd6 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java @@ -222,7 +222,7 @@ void export() { .singleElement() .satisfies( req -> { - assertThat(req.headers().get("User-Agent")).matches("OTel OTLP Exporter Java/1.*"); + assertThat(req.headers().get("User-Agent")).matches("OTel OTLP Exporter Java/1\\..*"); }); } diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java index dfbece6af51..8a00a522395 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java @@ -53,7 +53,7 @@ public TelemetryExporterBuilder setEndpoint(String endpoint) { channelBuilder.usePlaintext(); } // User-Agent can only be set at the channel level with upstream gRPC client. If a user wants - // the User-Agent to be spec compliant they must add manually set the user agent when building + // the User-Agent to be spec compliant they must manually set the user agent when building // their channel. channelBuilder.userAgent(OtlpUserAgent.getUserAgent()); return this; From b472dec81a9dac0463274663f201ac0c5dd2c416 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 3 Oct 2022 11:20:12 -0500 Subject: [PATCH 3/4] Make OtlpUserAgent final --- .../io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java index b5f747ace5e..77ee6489832 100644 --- a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java +++ b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/OtlpUserAgent.java @@ -12,7 +12,7 @@ * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ -public class OtlpUserAgent { +public final class OtlpUserAgent { private static final String userAgent = "OTel OTLP Exporter Java/" + readVersion(); From c371e02dbf32ed59f954a96ba4ba9cb1a62b850b Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Tue, 18 Oct 2022 13:38:43 -0500 Subject: [PATCH 4/4] Add user agent note to managed channel --- .../exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java | 4 ++++ .../exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java | 4 ++++ .../exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java index 72ea4a6d35e..d87a79c76ad 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java @@ -64,6 +64,10 @@ public final class OtlpGrpcMetricExporterBuilder { * Sets the managed chanel to use when communicating with the backend. Takes precedence over * {@link #setEndpoint(String)} if both are called. * + *

Note: calling this overrides the spec compliant {@code User-Agent} header. To ensure spec + * compliance, set {@link io.grpc.ManagedChannelBuilder#userAgent(String)} to {@link + * OtlpUserAgent#getUserAgent()} when building the channel. + * * @param channel the channel to use * @return this builder's instance * @deprecated Use {@link #setEndpoint(String)}. If you have a use case not satisfied by the diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java index 43a9b1923d4..b8e376326a8 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java @@ -49,6 +49,10 @@ public final class OtlpGrpcSpanExporterBuilder { * Sets the managed chanel to use when communicating with the backend. Takes precedence over * {@link #setEndpoint(String)} if both are called. * + *

Note: calling this overrides the spec compliant {@code User-Agent} header. To ensure spec + * compliance, set {@link io.grpc.ManagedChannelBuilder#userAgent(String)} to {@link + * OtlpUserAgent#getUserAgent()} when building the channel. + * * @param channel the channel to use * @return this builder's instance * @deprecated Use {@link #setEndpoint(String)}. If you have a use case not satisfied by the diff --git a/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java b/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java index 6c78c79fd1f..b9ee0ac7f0c 100644 --- a/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java +++ b/exporters/otlp/logs/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java @@ -49,6 +49,10 @@ public final class OtlpGrpcLogRecordExporterBuilder { * Sets the managed chanel to use when communicating with the backend. Takes precedence over * {@link #setEndpoint(String)} if both are called. * + *

Note: calling this overrides the spec compliant {@code User-Agent} header. To ensure spec + * compliance, set {@link io.grpc.ManagedChannelBuilder#userAgent(String)} to {@link + * OtlpUserAgent#getUserAgent()} when building the channel. + * * @param channel the channel to use * @return this builder's instance * @deprecated Use {@link #setEndpoint(String)}. If you have a use case not satisfied by the