From e0d39e8e3834fbb201d911c6d65b77c05b05843e Mon Sep 17 00:00:00 2001
From: Jack Berg <34418638+jack-berg@users.noreply.github.com>
Date: Fri, 3 Apr 2026 09:52:38 -0500
Subject: [PATCH 1/2] Delete ManagedChannelUtil, which is only used in tests
---
exporters/common/build.gradle.kts | 1 -
.../internal/grpc/ManagedChannelUtil.java | 50 -------------------
.../internal/grpc/ManagedChannelUtilTest.java | 50 -------------------
...anagedChannelTelemetryExporterBuilder.java | 32 ++++++++++--
4 files changed, 29 insertions(+), 104 deletions(-)
delete mode 100644 exporters/common/src/main/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtil.java
delete mode 100644 exporters/common/src/test/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtilTest.java
diff --git a/exporters/common/build.gradle.kts b/exporters/common/build.gradle.kts
index 8efac3a8435..3f46660d830 100644
--- a/exporters/common/build.gradle.kts
+++ b/exporters/common/build.gradle.kts
@@ -73,7 +73,6 @@ dependencies {
testImplementation("com.google.protobuf:protobuf-java-util")
testImplementation("com.linecorp.armeria:armeria-junit5")
- testImplementation("org.skyscreamer:jsonassert")
testImplementation("com.google.api.grpc:proto-google-common-protos")
testImplementation("io.grpc:grpc-testing")
testImplementation("edu.berkeley.cs.jqf:jqf-fuzz")
diff --git a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtil.java b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtil.java
deleted file mode 100644
index efb08ee5544..00000000000
--- a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtil.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.exporter.internal.grpc;
-
-import static java.util.stream.Collectors.toList;
-
-import io.grpc.ManagedChannelBuilder;
-import io.opentelemetry.exporter.internal.RetryUtil;
-import io.opentelemetry.sdk.common.export.RetryPolicy;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Utilities for working with gRPC channels.
- *
- *
This class is internal and is hence not for public use. Its APIs are unstable and can change
- * at any time.
- */
-public final class ManagedChannelUtil {
-
- /**
- * Convert the {@link RetryPolicy} into a gRPC service config for the {@code serviceName}. The
- * resulting map can be passed to {@link ManagedChannelBuilder#defaultServiceConfig(Map)}.
- */
- public static Map toServiceConfig(String serviceName, RetryPolicy retryPolicy) {
- List retryableStatusCodes =
- RetryUtil.retryableGrpcStatusCodes().stream().map(Double::parseDouble).collect(toList());
-
- Map retryConfig = new HashMap<>();
- retryConfig.put("retryableStatusCodes", retryableStatusCodes);
- retryConfig.put("maxAttempts", (double) retryPolicy.getMaxAttempts());
- retryConfig.put("initialBackoff", retryPolicy.getInitialBackoff().toMillis() / 1000.0 + "s");
- retryConfig.put("maxBackoff", retryPolicy.getMaxBackoff().toMillis() / 1000.0 + "s");
- retryConfig.put("backoffMultiplier", retryPolicy.getBackoffMultiplier());
-
- Map methodConfig = new HashMap<>();
- methodConfig.put(
- "name", Collections.singletonList(Collections.singletonMap("service", serviceName)));
- methodConfig.put("retryPolicy", retryConfig);
-
- return Collections.singletonMap("methodConfig", Collections.singletonList(methodConfig));
- }
-
- private ManagedChannelUtil() {}
-}
diff --git a/exporters/common/src/test/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtilTest.java b/exporters/common/src/test/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtilTest.java
deleted file mode 100644
index 70dd3d167a3..00000000000
--- a/exporters/common/src/test/java/io/opentelemetry/exporter/internal/grpc/ManagedChannelUtilTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.exporter.internal.grpc;
-
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.grpc.ManagedChannelBuilder;
-import io.opentelemetry.sdk.common.export.RetryPolicy;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.skyscreamer.jsonassert.JSONAssert;
-
-class ManagedChannelUtilTest {
-
- @Test
- void toServiceConfig() throws Exception {
- // Validate that the map matches the protobuf to JSON translation of the
- // grpc.service_config.ServiceConfig protobuf definition described at:
- // https://github.com/grpc/grpc/blob/master/doc/service_config.md
- Map serviceConfig =
- ManagedChannelUtil.toServiceConfig(
- "opentelemetry.proto.MyService", RetryPolicy.getDefault());
- String expectedServiceConfig =
- "{\n"
- + " \"methodConfig\": [{\n"
- + " \"retryPolicy\": {\n"
- + " \"backoffMultiplier\": 1.5,\n"
- + " \"maxAttempts\": 5.0,\n"
- + " \"initialBackoff\": \"1.0s\",\n"
- + " \"retryableStatusCodes\": [1.0, 4.0, 8.0, 10.0, 11.0, 14.0, 15.0],\n"
- + " \"maxBackoff\": \"5.0s\"\n"
- + " },\n"
- + " \"name\": [{\n"
- + " \"service\": \"opentelemetry.proto.MyService\"\n"
- + " }]\n"
- + " }]\n"
- + "}";
- JSONAssert.assertEquals(
- expectedServiceConfig, new ObjectMapper().writeValueAsString(serviceConfig), false);
-
- // Validate that the map format does not throw when passed to managed channel builder.
- // Any type mismatch will throw.
- ManagedChannelBuilder> builder = ManagedChannelBuilder.forTarget("localhost");
- assertThatCode(() -> builder.defaultServiceConfig(serviceConfig)).doesNotThrowAnyException();
- }
-}
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 cbd0168789b..9e931c5d568 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
@@ -6,6 +6,7 @@
package io.opentelemetry.exporter.otlp.testing.internal;
import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
@@ -15,8 +16,8 @@
import io.netty.handler.ssl.SslContext;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.common.ComponentLoader;
+import io.opentelemetry.exporter.internal.RetryUtil;
import io.opentelemetry.exporter.internal.TlsConfigHelper;
-import io.opentelemetry.exporter.internal.grpc.ManagedChannelUtil;
import io.opentelemetry.exporter.otlp.internal.OtlpUserAgent;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
@@ -25,6 +26,9 @@
import java.net.URI;
import java.time.Duration;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
@@ -148,11 +152,33 @@ public TelemetryExporterBuilder setRetryPolicy(@Nullable RetryPolicy retryPol
throw new IllegalStateException("Can't happen");
}
requireNonNull(channelBuilder, "channel");
- channelBuilder.defaultServiceConfig(
- ManagedChannelUtil.toServiceConfig(grpcServiceName, retryPolicy));
+ channelBuilder.defaultServiceConfig(toServiceConfig(grpcServiceName, retryPolicy));
return this;
}
+ /**
+ * Convert the {@link RetryPolicy} into a gRPC service config for the {@code serviceName}. The
+ * resulting map can be passed to {@link ManagedChannelBuilder#defaultServiceConfig(Map)}.
+ */
+ private static Map toServiceConfig(String serviceName, RetryPolicy retryPolicy) {
+ List retryableStatusCodes =
+ RetryUtil.retryableGrpcStatusCodes().stream().map(Double::parseDouble).collect(toList());
+
+ Map retryConfig = new HashMap<>();
+ retryConfig.put("retryableStatusCodes", retryableStatusCodes);
+ retryConfig.put("maxAttempts", (double) retryPolicy.getMaxAttempts());
+ retryConfig.put("initialBackoff", retryPolicy.getInitialBackoff().toMillis() / 1000.0 + "s");
+ retryConfig.put("maxBackoff", retryPolicy.getMaxBackoff().toMillis() / 1000.0 + "s");
+ retryConfig.put("backoffMultiplier", retryPolicy.getBackoffMultiplier());
+
+ Map methodConfig = new HashMap<>();
+ methodConfig.put(
+ "name", Collections.singletonList(Collections.singletonMap("service", serviceName)));
+ methodConfig.put("retryPolicy", retryConfig);
+
+ return Collections.singletonMap("methodConfig", Collections.singletonList(methodConfig));
+ }
+
@Override
public TelemetryExporterBuilder setProxyOptions(ProxyOptions proxyOptions) {
delegate.setProxyOptions(proxyOptions);
From 8115baf1f2e6920eb8bfbde84458b9a83588797d Mon Sep 17 00:00:00 2001
From: Jack Berg <34418638+jack-berg@users.noreply.github.com>
Date: Fri, 3 Apr 2026 09:59:53 -0500
Subject: [PATCH 2/2] static imports
---
.../internal/ManagedChannelTelemetryExporterBuilder.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
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 9e931c5d568..844c59603e3 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
@@ -5,6 +5,8 @@
package io.opentelemetry.exporter.otlp.testing.internal;
+import static java.util.Collections.singletonList;
+import static java.util.Collections.singletonMap;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
@@ -26,7 +28,6 @@
import java.net.URI;
import java.time.Duration;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -172,11 +173,10 @@ public TelemetryExporterBuilder setRetryPolicy(@Nullable RetryPolicy retryPol
retryConfig.put("backoffMultiplier", retryPolicy.getBackoffMultiplier());
Map methodConfig = new HashMap<>();
- methodConfig.put(
- "name", Collections.singletonList(Collections.singletonMap("service", serviceName)));
+ methodConfig.put("name", singletonList(singletonMap("service", serviceName)));
methodConfig.put("retryPolicy", retryConfig);
- return Collections.singletonMap("methodConfig", Collections.singletonList(methodConfig));
+ return singletonMap("methodConfig", singletonList(methodConfig));
}
@Override