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..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,7 +5,10 @@ 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; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; @@ -15,8 +18,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 +28,8 @@ import java.net.URI; import java.time.Duration; import java.util.Collection; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -148,11 +153,32 @@ 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", singletonList(singletonMap("service", serviceName))); + methodConfig.put("retryPolicy", retryConfig); + + return singletonMap("methodConfig", singletonList(methodConfig)); + } + @Override public TelemetryExporterBuilder setProxyOptions(ProxyOptions proxyOptions) { delegate.setProxyOptions(proxyOptions);