diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1bb7d149b3e..6597c77bf0b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -18,7 +18,7 @@ # Shared communication /communication/*.* @DataDog/apm-java -/communication/otlp-exporter/ @DataDog/apm-sdk-capabilities-java +/communication/otlp-exporter/ @DataDog/apm-sdk-capabilities-java /communication/src/*/*/datadog/communication/*.* @DataDog/apm-java /communication/src/*/*/datadog/communication/ddagent/ @DataDog/apm-java /communication/src/*/*/datadog/communication/http/ @DataDog/apm-java diff --git a/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpCanonicalResourceAttributes.java b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpCanonicalResourceAttributes.java new file mode 100644 index 00000000000..91f8be054ef --- /dev/null +++ b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpCanonicalResourceAttributes.java @@ -0,0 +1,40 @@ +package datadog.communication.otlp; + +import static datadog.communication.ddagent.TracerVersion.TRACER_VERSION; + +import datadog.trace.api.Config; +import java.util.function.BiConsumer; + +/** + * The resource attributes every OTLP export reports. Shared by the tracer and the profiler so both + * describe the same producer, and kept in one place so an attribute is added exactly once. + */ +public final class OtlpCanonicalResourceAttributes { + private OtlpCanonicalResourceAttributes() {} + + /** + * Visits {@code service.name}, {@code deployment.environment.name} and {@code service.version} + * (when not empty), {@code host.name} (when reported and not empty) and the {@code + * telemetry.sdk.*} attributes, in that order. + */ + public static void visit(Config config, BiConsumer visitor) { + visitor.accept("service.name", config.getServiceName()); + String env = config.getEnv(); + if (!env.isEmpty()) { + visitor.accept("deployment.environment.name", env); + } + String version = config.getVersion(); + if (!version.isEmpty()) { + visitor.accept("service.version", version); + } + if (config.isReportHostName()) { + String hostName = config.getHostName(); + if (hostName != null && !hostName.isEmpty()) { + visitor.accept("host.name", hostName); + } + } + visitor.accept("telemetry.sdk.name", "datadog"); + visitor.accept("telemetry.sdk.version", TRACER_VERSION); + visitor.accept("telemetry.sdk.language", "java"); + } +} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpGrpcSender.java b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpGrpcSender.java similarity index 89% rename from dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpGrpcSender.java rename to communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpGrpcSender.java index b2cf4423c66..b063b7189e0 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpGrpcSender.java +++ b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpGrpcSender.java @@ -1,14 +1,11 @@ -package datadog.trace.core.otlp.common; +package datadog.communication.otlp; import static datadog.communication.http.OkHttpUtils.buildHttp2Client; import static datadog.communication.http.OkHttpUtils.isPlainHttp; import datadog.communication.http.HttpRetryPolicy; -import datadog.communication.otlp.OtlpGrpcRequestBody; -import datadog.communication.otlp.OtlpPayload; import datadog.logging.RatelimitedLogger; import datadog.trace.api.config.OtlpConfig.Compression; -import datadog.trace.common.writer.RemoteApi; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.HttpUrl; @@ -17,7 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** Sends chunks of OTLP data over GRPC. */ +/** OTLP export over gRPC. The HTTP variant is {@link OtlpHttpSender}. */ public final class OtlpGrpcSender implements OtlpSender { private static final Logger LOGGER = LoggerFactory.getLogger(OtlpGrpcSender.class); private static final RatelimitedLogger RATELIMITED_LOGGER = @@ -55,7 +52,7 @@ public OtlpGrpcSender( } @Override - public RemoteApi.Response send(OtlpPayload payload) { + public OtlpResponse send(OtlpPayload payload) { return OtlpSenderSupport.send(client, retryPolicy, makeRequest(payload), RATELIMITED_LOGGER); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpHttpSender.java b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpHttpSender.java similarity index 89% rename from dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpHttpSender.java rename to communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpHttpSender.java index 867671644b1..d0541e168e1 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpHttpSender.java +++ b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpHttpSender.java @@ -1,14 +1,11 @@ -package datadog.trace.core.otlp.common; +package datadog.communication.otlp; import static datadog.communication.http.OkHttpUtils.buildHttpClient; import static datadog.communication.http.OkHttpUtils.isPlainHttp; import datadog.communication.http.HttpRetryPolicy; -import datadog.communication.otlp.OtlpHttpRequestBody; -import datadog.communication.otlp.OtlpPayload; import datadog.logging.RatelimitedLogger; import datadog.trace.api.config.OtlpConfig.Compression; -import datadog.trace.common.writer.RemoteApi; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.HttpUrl; @@ -17,7 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** Sends chunks of OTLP data over HTTP. */ +/** OTLP export over HTTP. The gRPC variant is {@link OtlpGrpcSender}. */ public final class OtlpHttpSender implements OtlpSender { private static final Logger LOGGER = LoggerFactory.getLogger(OtlpHttpSender.class); private static final RatelimitedLogger RATELIMITED_LOGGER = @@ -59,7 +56,7 @@ public HttpUrl url() { } @Override - public RemoteApi.Response send(OtlpPayload payload) { + public OtlpResponse send(OtlpPayload payload) { return OtlpSenderSupport.send(client, retryPolicy, makeRequest(payload), RATELIMITED_LOGGER); } diff --git a/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpResponse.java b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpResponse.java new file mode 100644 index 00000000000..0a4ba7d3b0b --- /dev/null +++ b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpResponse.java @@ -0,0 +1,74 @@ +package datadog.communication.otlp; + +import java.util.Optional; +import java.util.OptionalInt; + +/** + * The outcome of a single OTLP export attempt. + * + *

A transport failure or timeout carries only the exception: the payload was not delivered, so + * no status code exists. A delivered payload carries the HTTP status code and is successful or not + * according to that code. A successful response can still carry a parse exception when its body + * could not be read; the payload itself was accepted. + */ +public final class OtlpResponse { + /** The endpoint accepted the payload and returned no body. */ + public static OtlpResponse success(final int status) { + return new OtlpResponse(true, status, null, null); + } + + /** The endpoint accepted the payload and returned a body. */ + public static OtlpResponse success(final int status, String response) { + return new OtlpResponse(true, status, null, response); + } + + /** The endpoint accepted the payload, but the response body could not be parsed. */ + public static OtlpResponse successWithParseError(final int status, final Throwable exception) { + return new OtlpResponse(true, status, exception, null); + } + + /** The endpoint received the payload but rejected it. */ + public static OtlpResponse failed(final int status) { + return new OtlpResponse(false, status, null, null); + } + + /** The endpoint rejected the payload; the body may carry diagnostics. */ + public static OtlpResponse failed(final int status, String response) { + return new OtlpResponse(false, status, null, response); + } + + /** The payload never reached the endpoint. */ + public static OtlpResponse failed(final Throwable exception) { + return new OtlpResponse(false, null, exception, null); + } + + private final boolean success; + private final Integer status; + private final Throwable exception; + private final String response; + + private OtlpResponse( + final boolean success, final Integer status, final Throwable exception, String response) { + this.success = success; + this.status = status; + this.exception = exception; + this.response = response; + } + + public boolean success() { + return success; + } + + public OptionalInt status() { + return status == null ? OptionalInt.empty() : OptionalInt.of(status); + } + + public Optional exception() { + return Optional.ofNullable(exception); + } + + /** The raw response body, or empty for failed communication attempts (no body received) */ + public Optional response() { + return Optional.ofNullable(response); + } +} diff --git a/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpSender.java b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpSender.java new file mode 100644 index 00000000000..a9b8dda2603 --- /dev/null +++ b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpSender.java @@ -0,0 +1,11 @@ +package datadog.communication.otlp; + +/** + * Sends OTLP payloads to a configured endpoint. Shared by the tracer's OTLP exporters and the + * profile exporter so they all reuse one transport implementation. + */ +public interface OtlpSender { + OtlpResponse send(OtlpPayload payload); + + void shutdown(); +} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpSenderSupport.java b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpSenderSupport.java similarity index 71% rename from dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpSenderSupport.java rename to communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpSenderSupport.java index 3e27cc9e020..2a7149d48cd 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpSenderSupport.java +++ b/communication/otlp-exporter/src/main/java/datadog/communication/otlp/OtlpSenderSupport.java @@ -1,12 +1,11 @@ -package datadog.trace.core.otlp.common; +package datadog.communication.otlp; import static datadog.communication.http.OkHttpUtils.sendWithRetries; -import static datadog.trace.common.writer.RemoteApi.Response.failed; -import static datadog.trace.common.writer.RemoteApi.Response.success; +import static datadog.communication.otlp.OtlpResponse.failed; +import static datadog.communication.otlp.OtlpResponse.success; import datadog.communication.http.HttpRetryPolicy; import datadog.logging.RatelimitedLogger; -import datadog.trace.common.writer.RemoteApi; import java.io.IOException; import okhttp3.OkHttpClient; @@ -14,8 +13,12 @@ final class OtlpSenderSupport { private OtlpSenderSupport() {} - /** Executes the given request with retries, logging failures via the rate-limited logger. */ - static RemoteApi.Response send( + /** + * Sends the request and maps every outcome to an {@link OtlpResponse}. Transport failures are + * returned instead of thrown, so a broken endpoint degrades to logged warnings and cannot break + * the caller's export loop. + */ + static OtlpResponse send( OkHttpClient client, HttpRetryPolicy.Factory retryPolicy, okhttp3.Request request, diff --git a/communication/otlp-exporter/src/test/java/datadog/communication/otlp/OtlpCanonicalResourceAttributesTest.java b/communication/otlp-exporter/src/test/java/datadog/communication/otlp/OtlpCanonicalResourceAttributesTest.java new file mode 100644 index 00000000000..ac4d28de7de --- /dev/null +++ b/communication/otlp-exporter/src/test/java/datadog/communication/otlp/OtlpCanonicalResourceAttributesTest.java @@ -0,0 +1,75 @@ +package datadog.communication.otlp; + +import static datadog.communication.ddagent.TracerVersion.TRACER_VERSION; +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import datadog.trace.api.Config; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class OtlpCanonicalResourceAttributesTest { + + @Test + void visitsAllAttributesInOrder() { + Config config = config("env", "1.0", true, "host"); + + assertEquals( + asList( + "service.name=svc", + "deployment.environment.name=env", + "service.version=1.0", + "host.name=host", + "telemetry.sdk.name=datadog", + "telemetry.sdk.version=" + TRACER_VERSION, + "telemetry.sdk.language=java"), + visit(config)); + } + + @Test + void skipsEmptyAndUnreportedAttributes() { + Config config = config("", "", false, "host"); + + assertEquals( + asList( + "service.name=svc", + "telemetry.sdk.name=datadog", + "telemetry.sdk.version=" + TRACER_VERSION, + "telemetry.sdk.language=java"), + visit(config)); + } + + @Test + void skipsEmptyHostName() { + Config config = config("env", "1.0", true, ""); + + assertEquals( + asList( + "service.name=svc", + "deployment.environment.name=env", + "service.version=1.0", + "telemetry.sdk.name=datadog", + "telemetry.sdk.version=" + TRACER_VERSION, + "telemetry.sdk.language=java"), + visit(config)); + } + + private static Config config(String env, String version, boolean reportHost, String host) { + Config config = mock(Config.class); + when(config.getServiceName()).thenReturn("svc"); + when(config.getEnv()).thenReturn(env); + when(config.getVersion()).thenReturn(version); + when(config.isReportHostName()).thenReturn(reportHost); + when(config.getHostName()).thenReturn(host); + return config; + } + + private static List visit(Config config) { + List visited = new ArrayList<>(); + OtlpCanonicalResourceAttributes.visit(config, (k, v) -> visited.add(k + "=" + v)); + return visited; + } +} diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpSenderSupportTest.java b/communication/otlp-exporter/src/test/java/datadog/communication/otlp/OtlpSenderSupportTest.java similarity index 87% rename from dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpSenderSupportTest.java rename to communication/otlp-exporter/src/test/java/datadog/communication/otlp/OtlpSenderSupportTest.java index 2d033113213..1b79fcbd13a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpSenderSupportTest.java +++ b/communication/otlp-exporter/src/test/java/datadog/communication/otlp/OtlpSenderSupportTest.java @@ -1,4 +1,4 @@ -package datadog.trace.core.otlp.common; +package datadog.communication.otlp; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -12,7 +12,6 @@ import datadog.communication.http.HttpRetryPolicy; import datadog.communication.http.OkHttpUtils; import datadog.logging.RatelimitedLogger; -import datadog.trace.common.writer.RemoteApi; import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -39,8 +38,7 @@ void successfulResponseIsReturnedWithoutLogging() throws IOException { .when(() -> OkHttpUtils.sendWithRetries(client, retryPolicy, request)) .thenReturn(response); - RemoteApi.Response result = - OtlpSenderSupport.send(client, retryPolicy, request, ratelimitedLogger); + OtlpResponse result = OtlpSenderSupport.send(client, retryPolicy, request, ratelimitedLogger); assertTrue(result.success()); assertEquals(200, result.status().getAsInt()); @@ -56,8 +54,7 @@ void unsuccessfulResponseIsReturnedAndLogged() throws IOException { .when(() -> OkHttpUtils.sendWithRetries(client, retryPolicy, request)) .thenReturn(response); - RemoteApi.Response result = - OtlpSenderSupport.send(client, retryPolicy, request, ratelimitedLogger); + OtlpResponse result = OtlpSenderSupport.send(client, retryPolicy, request, ratelimitedLogger); assertFalse(result.success()); assertEquals(500, result.status().getAsInt()); @@ -73,8 +70,7 @@ void ioExceptionIsReturnedAsFailureAndLogged() throws IOException { .when(() -> OkHttpUtils.sendWithRetries(client, retryPolicy, request)) .thenThrow(exception); - RemoteApi.Response result = - OtlpSenderSupport.send(client, retryPolicy, request, ratelimitedLogger); + OtlpResponse result = OtlpSenderSupport.send(client, retryPolicy, request, ratelimitedLogger); assertFalse(result.success()); assertTrue(result.exception().isPresent()); diff --git a/communication/otlp-exporter/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/communication/otlp-exporter/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/communication/otlp-exporter/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpPayloadDispatcher.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpPayloadDispatcher.java index 4eba27f60f9..1506d45d792 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpPayloadDispatcher.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpPayloadDispatcher.java @@ -1,9 +1,10 @@ package datadog.trace.common.writer; import datadog.communication.otlp.OtlpPayload; +import datadog.communication.otlp.OtlpResponse; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.telemetry.OtlpTelemetry; import datadog.trace.core.CoreSpan; -import datadog.trace.core.otlp.common.OtlpSender; import datadog.trace.core.otlp.trace.OtlpTraceCollector; import java.util.Collection; import java.util.Collections; @@ -39,7 +40,7 @@ public void flush() { OtlpPayload payload = collector.collectTraces(); if (payload != OtlpPayload.EMPTY) { OtlpTelemetry.getInstance().onTracesExportAttempt(); - RemoteApi.Response response = sender.send(payload); + OtlpResponse response = sender.send(payload); OtlpTelemetry.getInstance().onTracesExportComplete(response.success()); } } catch (RuntimeException e) { // don't catch severe Errors diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java index 1650a77b52a..a84374ccbb2 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java @@ -6,13 +6,13 @@ import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_TRACES_TIMEOUT; import datadog.communication.ddagent.DroppingPolicy; +import datadog.communication.otlp.OtlpGrpcSender; +import datadog.communication.otlp.OtlpHttpSender; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.config.OtlpConfig; import datadog.trace.common.sampling.SingleSpanSampler; import datadog.trace.common.writer.ddagent.Prioritization; import datadog.trace.core.monitor.HealthMetrics; -import datadog.trace.core.otlp.common.OtlpGrpcSender; -import datadog.trace.core.otlp.common.OtlpHttpSender; -import datadog.trace.core.otlp.common.OtlpSender; import datadog.trace.core.otlp.trace.OtlpTraceCollector; import datadog.trace.core.otlp.trace.OtlpTraceJsonCollector; import datadog.trace.core.otlp.trace.OtlpTraceProtoCollector; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java index 6489c7ae5bf..05686b3b892 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java @@ -1,9 +1,9 @@ package datadog.trace.core.otlp.common; -import static datadog.communication.ddagent.TracerVersion.TRACER_VERSION; import static datadog.trace.api.DDTags.SDK_OTLP_EXPORT; import static java.util.Arrays.asList; +import datadog.communication.otlp.OtlpCanonicalResourceAttributes; import datadog.trace.api.Config; import datadog.trace.api.ProcessTags; import java.util.HashSet; @@ -46,26 +46,7 @@ private OtlpResourceAttributes() {} */ static void visitResourceAttributes( Config config, Map extraAttributes, BiConsumer visitor) { - String serviceName = config.getServiceName(); - String env = config.getEnv(); - String version = config.getVersion(); - - visitor.accept("service.name", serviceName); - if (!env.isEmpty()) { - visitor.accept("deployment.environment.name", env); - } - if (!version.isEmpty()) { - visitor.accept("service.version", version); - } - if (config.isReportHostName()) { - String hostName = config.getHostName(); - if (hostName != null && !hostName.isEmpty()) { - visitor.accept("host.name", hostName); - } - } - visitor.accept("telemetry.sdk.name", "datadog"); - visitor.accept("telemetry.sdk.version", TRACER_VERSION); - visitor.accept("telemetry.sdk.language", "java"); + OtlpCanonicalResourceAttributes.visit(config, visitor::accept); config .getGlobalTags() diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpSender.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpSender.java deleted file mode 100644 index c17043bbcc8..00000000000 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpSender.java +++ /dev/null @@ -1,11 +0,0 @@ -package datadog.trace.core.otlp.common; - -import datadog.communication.otlp.OtlpPayload; -import datadog.trace.common.writer.RemoteApi; - -/** Sends chunks of OTLP data. */ -public interface OtlpSender { - RemoteApi.Response send(OtlpPayload payload); - - void shutdown(); -} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java index e01c0a1fb2b..496d169b75c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java @@ -3,13 +3,13 @@ import static datadog.trace.util.AgentThreadFactory.AgentThread.OTLP_LOGS_EXPORTER; import static datadog.trace.util.AgentThreadFactory.newAgentThread; +import datadog.communication.otlp.OtlpGrpcSender; +import datadog.communication.otlp.OtlpHttpSender; import datadog.communication.otlp.OtlpPayload; +import datadog.communication.otlp.OtlpResponse; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.Config; import datadog.trace.api.telemetry.OtlpTelemetry; -import datadog.trace.common.writer.RemoteApi; -import datadog.trace.core.otlp.common.OtlpGrpcSender; -import datadog.trace.core.otlp.common.OtlpHttpSender; -import datadog.trace.core.otlp.common.OtlpSender; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -111,7 +111,7 @@ private void export() { OtlpPayload payload = collector.waitForLogs(intervalMillis); if (payload != OtlpPayload.EMPTY) { int logRecordCount = collector.getLogRecordCount(); - RemoteApi.Response response = sender.send(payload); + OtlpResponse response = sender.send(payload); if (response.success()) { OtlpTelemetry.getInstance().onLogRecordsSubmitted(logRecordCount); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsSenderFactory.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsSenderFactory.java index 6ab62caeb8d..b16d91b9bda 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsSenderFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsSenderFactory.java @@ -1,9 +1,9 @@ package datadog.trace.core.otlp.metrics; +import datadog.communication.otlp.OtlpGrpcSender; +import datadog.communication.otlp.OtlpHttpSender; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.Config; -import datadog.trace.core.otlp.common.OtlpGrpcSender; -import datadog.trace.core.otlp.common.OtlpHttpSender; -import datadog.trace.core.otlp.common.OtlpSender; import javax.annotation.Nullable; /** diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java index 9e3e2920521..8ccab0dee48 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java @@ -3,12 +3,12 @@ import static datadog.trace.util.AgentThreadFactory.AgentThread.OTLP_METRICS_EXPORTER; import datadog.communication.otlp.OtlpPayload; +import datadog.communication.otlp.OtlpResponse; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.Config; import datadog.trace.api.config.OtlpConfig; import datadog.trace.api.telemetry.OtlpTelemetry; import datadog.trace.api.time.SystemTimeSource; -import datadog.trace.common.writer.RemoteApi; -import datadog.trace.core.otlp.common.OtlpSender; import datadog.trace.util.AgentTaskScheduler; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; @@ -93,7 +93,7 @@ private void export() { OtlpPayload payload = collector.collectMetrics(); if (payload != OtlpPayload.EMPTY) { OtlpTelemetry.getInstance().onMetricsExportAttempt(); - RemoteApi.Response response = sender.send(payload); + OtlpResponse response = sender.send(payload); OtlpTelemetry.getInstance().onMetricsExportComplete(response.success()); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java index 696b3bc08b4..7acc5300901 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java @@ -7,6 +7,8 @@ import static datadog.trace.bootstrap.otlp.common.OtlpAttributeVisitor.STRING_ATTRIBUTE; import datadog.communication.otlp.OtlpPayload; +import datadog.communication.otlp.OtlpResponse; +import datadog.communication.otlp.OtlpSender; import datadog.metrics.api.Histogram; import datadog.trace.api.Config; import datadog.trace.api.config.OtlpConfig; @@ -21,10 +23,8 @@ import datadog.trace.bootstrap.otlp.metrics.OtlpMetricsVisitor; import datadog.trace.common.metrics.AggregateEntry; import datadog.trace.common.metrics.MetricWriter; -import datadog.trace.common.writer.RemoteApi; import datadog.trace.core.otlp.common.OtlpResourceJson; import datadog.trace.core.otlp.common.OtlpResourceProto; -import datadog.trace.core.otlp.common.OtlpSender; import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; @@ -162,7 +162,7 @@ public void finishBucket() { OtlpPayload payload = collector.collectMetrics(this::emit, startNanos, endNanos); if (payload != OtlpPayload.EMPTY) { OtlpTelemetry.getInstance().onMetricsExportAttempt(); - RemoteApi.Response response = sender.send(payload); + OtlpResponse response = sender.send(payload); OtlpTelemetry.getInstance().onMetricsExportComplete(response.success()); } } finally { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java index 5b0fb731bf3..9f9b4dd0ecd 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java @@ -13,10 +13,11 @@ import static org.mockito.Mockito.when; import datadog.communication.otlp.OtlpPayload; +import datadog.communication.otlp.OtlpResponse; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.sampling.PrioritySampling; import datadog.trace.api.telemetry.OtlpTelemetry; import datadog.trace.core.CoreSpan; -import datadog.trace.core.otlp.common.OtlpSender; import datadog.trace.core.otlp.trace.OtlpTraceCollector; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -39,7 +40,7 @@ class OtlpPayloadDispatcherTest { @BeforeEach void stubSuccessfulSend() { - lenient().when(sender.send(any())).thenReturn(RemoteApi.Response.success(200)); + lenient().when(sender.send(any())).thenReturn(OtlpResponse.success(200)); OtlpTelemetry.getInstance().prepareMetrics(); OtlpTelemetry.getInstance().drain(); } @@ -172,7 +173,7 @@ void dispatcherRemainsUsableAfterCollectorFailure() { @Test void flushRecordsSuccessfulExportTelemetry() { - RemoteApi.Response response = RemoteApi.Response.success(200); + OtlpResponse response = OtlpResponse.success(200); when(sender.send(any())).thenReturn(response); OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector); @@ -187,7 +188,7 @@ void flushRecordsSuccessfulExportTelemetry() { @Test void flushRecordsFailedExportTelemetry() { - RemoteApi.Response response = RemoteApi.Response.failed(500); + OtlpResponse response = OtlpResponse.failed(500); when(sender.send(any())).thenReturn(response); OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java index df86d4384e3..159a45467eb 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java @@ -6,9 +6,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.verify; +import datadog.communication.otlp.OtlpGrpcSender; +import datadog.communication.otlp.OtlpSender; import datadog.trace.api.config.OtlpConfig; -import datadog.trace.core.otlp.common.OtlpGrpcSender; -import datadog.trace.core.otlp.common.OtlpSender; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java index 9a7c8bdc946..363c14d32a7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java @@ -219,10 +219,10 @@ void testWriterCreationForLlmObservability( } @TableTest({ - "scenario | protocol | compression | endpoint | expectedSenderClass | expectedUrl | expectedGzip", - "http no gzip | HTTP_PROTOBUF | NONE | 'http://otel-collector:4318/v1/traces' | datadog.trace.core.otlp.common.OtlpHttpSender | 'http://otel-collector:4318/v1/traces' | false ", - "http gzip | HTTP_PROTOBUF | GZIP | 'http://otel-collector:4318/v1/traces' | datadog.trace.core.otlp.common.OtlpHttpSender | 'http://otel-collector:4318/v1/traces' | true ", - "grpc no gzip | GRPC | NONE | 'http://otel-collector:4317' | datadog.trace.core.otlp.common.OtlpGrpcSender | 'http://otel-collector:4317/opentelemetry.proto.collector.trace.v1.TraceService/Export' | false " + "scenario | protocol | compression | endpoint | expectedSenderClass | expectedUrl | expectedGzip", + "http no gzip | HTTP_PROTOBUF | NONE | 'http://otel-collector:4318/v1/traces' | datadog.communication.otlp.OtlpHttpSender | 'http://otel-collector:4318/v1/traces' | false ", + "http gzip | HTTP_PROTOBUF | GZIP | 'http://otel-collector:4318/v1/traces' | datadog.communication.otlp.OtlpHttpSender | 'http://otel-collector:4318/v1/traces' | true ", + "grpc no gzip | GRPC | NONE | 'http://otel-collector:4317' | datadog.communication.otlp.OtlpGrpcSender | 'http://otel-collector:4317/opentelemetry.proto.collector.trace.v1.TraceService/Export' | false " }) void testWriterCreationForOtlpWriter( OtlpConfig.Protocol protocol, diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsServiceTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsServiceTest.java index 0954e0e56d2..d03712a7a6a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsServiceTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsServiceTest.java @@ -5,8 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import datadog.communication.otlp.OtlpHttpSender; import datadog.trace.api.Config; -import datadog.trace.core.otlp.common.OtlpHttpSender; import java.util.Properties; import org.junit.jupiter.api.Test; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsServiceTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsServiceTest.java index 70e719a3dbb..60a0575f7ad 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsServiceTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsServiceTest.java @@ -5,8 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import datadog.communication.otlp.OtlpHttpSender; import datadog.trace.api.Config; -import datadog.trace.core.otlp.common.OtlpHttpSender; import java.util.Properties; import org.junit.jupiter.api.Test; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java index 6280775f539..01658ad92e6 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java @@ -1,6 +1,6 @@ package datadog.trace.core.otlp.metrics; -import static datadog.trace.common.writer.RemoteApi.Response.success; +import static datadog.communication.otlp.OtlpResponse.success; import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -12,13 +12,13 @@ import com.google.protobuf.CodedInputStream; import com.google.protobuf.WireFormat; import datadog.communication.otlp.OtlpPayload; +import datadog.communication.otlp.OtlpResponse; +import datadog.communication.otlp.OtlpSender; import datadog.metrics.api.Histograms; import datadog.metrics.impl.DDSketchHistograms; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.common.metrics.AggregateEntry; import datadog.trace.common.metrics.AggregateEntryTestUtils; -import datadog.trace.common.writer.RemoteApi; -import datadog.trace.core.otlp.common.OtlpSender; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -68,7 +68,7 @@ private static final class CapturingSender implements OtlpSender { byte[] lastPayload; @Override - public RemoteApi.Response send(OtlpPayload payload) { + public OtlpResponse send(OtlpPayload payload) { sendCount++; java.nio.ByteBuffer content = payload.getContent(); byte[] bytes = new byte[content.remaining()];