From aeac3618167af4d1c475546f9f9189e480212c5d Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Wed, 12 Oct 2022 11:19:37 -0500 Subject: [PATCH] Upgrade to otel java 1.19.0 (#6757) Working PR to capture all the changes required to update to otel java 1.19.0. The new log API force allows `:instrumentation-appender-api-internal` and `:instrumentation-appender-sdk-internal`, but necessitates a decent amount of refactoring as a result. The PR points at the `1.19.0-SNAPSHOT`, which I'll update upon publication. Co-authored-by: Mateusz Rzeszutek Co-authored-by: Trask Stalnaker Co-authored-by: Lauri Tulmin --- ...ation.javaagent-instrumentation.gradle.kts | 1 - .../kotlin/otel.java-conventions.gradle.kts | 1 - dependencyManagement/build.gradle.kts | 2 +- docs/contributing/javaagent-structure.md | 3 - examples/distro/agent/build.gradle | 1 + .../testing/agent-for-testing/build.gradle | 1 + .../api/instrumenter/rpc/MetricsView.java | 2 +- .../rpc/RpcServerMetricsTest.java | 7 +- .../build.gradle.kts | 13 --- .../api/appender/internal/LogEmitter.java | 24 ----- .../appender/internal/LogEmitterBuilder.java | 38 -------- .../appender/internal/LogEmitterProvider.java | 21 ----- .../internal/LogEmitterProviderHolder.java | 54 ----------- .../appender/internal/LogRecordBuilder.java | 47 ---------- .../api/appender/internal/NoopLogEmitter.java | 16 ---- .../internal/NoopLogEmitterBuilder.java | 30 ------- .../internal/NoopLogEmitterProvider.java | 16 ---- .../internal/NoopLogRecordBuilder.java | 62 ------------- .../api/appender/internal/Severity.java | 48 ---------- .../LogEmitterProviderHolderTest.java | 66 -------------- .../build.gradle.kts | 15 ---- .../internal/DelegatingLogEmitter.java | 23 ----- .../internal/DelegatingLogEmitterBuilder.java | 38 -------- .../DelegatingLogEmitterProvider.java | 32 ------- .../internal/DelegatingLogRecordBuilder.java | 77 ---------------- .../javaagent/build.gradle.kts | 2 +- .../jul/JavaUtilLoggingHelper.java | 10 +-- .../jul/JavaUtilLoggingInstrumentation.java | 4 +- .../test/groovy/JavaUtilLoggingTest.groovy | 8 +- .../javaagent/build.gradle.kts | 2 +- .../v1_1/JbossLogmanagerInstrumentation.java | 4 +- .../appender/v1_1/LoggingEventMapper.java | 10 +-- .../test/groovy/JbossLogmanagerTest.groovy | 12 +-- .../KotlinCoroutinesInstrumentationTest.kt | 47 +++++----- .../javaagent/build.gradle.kts | 2 +- .../v1_2/Log4jAppenderInstrumentation.java | 4 +- .../log4j/appender/v1_2/LogEventMapper.java | 10 +-- .../src/test/groovy/Log4j1Test.groovy | 12 +-- .../javaagent/build.gradle.kts | 2 +- .../v2_17/Log4jAppenderInstrumentation.java | 4 +- .../log4j/appender/v2_17/Log4jHelper.java | 6 +- .../src/test/groovy/Log4j2Test.groovy | 28 +++--- .../log4j-appender-2.17/library/README.md | 14 ++- .../library/build.gradle.kts | 4 +- .../appender/v2_17/OpenTelemetryAppender.java | 31 +------ .../v2_17/internal/LogEventMapper.java | 6 +- .../OpenTelemetryAppenderConfigTest.java | 57 ++++++------ .../v2_17/internal/LogEventMapperTest.java | 2 +- .../javaagent/build.gradle.kts | 2 +- .../appender/v1_0/LogbackInstrumentation.java | 8 +- .../logback/appender/v1_0/LogbackTest.java | 18 ++-- .../logback-appender-1.0/library/README.md | 14 ++- .../library/build.gradle.kts | 3 +- .../appender/v1_0/OpenTelemetryAppender.java | 29 +----- .../v1_0/internal/LoggingEventMapper.java | 12 +-- .../v1_0/OpenTelemetryAppenderConfigTest.java | 41 ++++----- .../javaagent/build.gradle.kts | 29 ++++++ ...TelemetryApiLogsInstrumentationModule.java | 24 +++++ .../OpenTelemetryLogsInstrumentation.java | 51 +++++++++++ .../bridge/ApplicationLogRecordBuilder.java | 84 +++++++++++++++++ .../logs/bridge/ApplicationLogger.java | 29 ++++++ .../logs/bridge/ApplicationLoggerBuilder.java | 45 ++++++++++ .../bridge/ApplicationLoggerProvider.java | 27 ++++++ .../logs/bridge/LogBridging.java | 47 ++++++++++ .../opentelemetryapi/logs/LoggerTest.java | 89 +++++++++++++++++++ .../build.gradle.kts | 7 +- .../OtelResourceAutoConfiguration.java | 20 ++--- javaagent-bootstrap/build.gradle.kts | 1 - .../bootstrap/AgentLogEmitterProvider.java | 40 --------- javaagent-tooling/build.gradle.kts | 5 +- .../tooling/OpenTelemetryInstaller.java | 13 +-- .../tooling/OpenTelemetryInstallerTest.groovy | 6 +- .../config/ConfigurationFileLoaderTest.java | 2 + javaagent/build.gradle.kts | 5 +- licenses/licenses.md | 58 ++++++------ .../build.gradle.kts | 1 + settings.gradle.kts | 3 +- .../test/InstrumentationSpecification.groovy | 6 +- .../testing/AgentTestRunner.java | 6 +- .../testing/InstrumentationTestRunner.java | 4 +- .../testing/LibraryTestRunner.java | 4 +- .../junit/InstrumentationExtension.java | 6 +- .../common/AgentTestingExporterAccess.java | 14 +-- testing/agent-exporter/build.gradle.kts | 3 - .../exporter/AgentTestingCustomizer.java | 8 +- .../exporter/AgentTestingExporterFactory.java | 2 +- ...ava => OtlpInMemoryLogRecordExporter.java} | 17 ++-- 87 files changed, 701 insertions(+), 1001 deletions(-) delete mode 100644 instrumentation-appender-api-internal/build.gradle.kts delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitter.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterBuilder.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProvider.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolder.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogRecordBuilder.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitter.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterBuilder.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterProvider.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogRecordBuilder.java delete mode 100644 instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/Severity.java delete mode 100644 instrumentation-appender-api-internal/src/test/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolderTest.java delete mode 100644 instrumentation-appender-sdk-internal/build.gradle.kts delete mode 100644 instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitter.java delete mode 100644 instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterBuilder.java delete mode 100644 instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterProvider.java delete mode 100644 instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogRecordBuilder.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/build.gradle.kts create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryApiLogsInstrumentationModule.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryLogsInstrumentation.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogRecordBuilder.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogger.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerBuilder.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerProvider.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/LogBridging.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/LoggerTest.java delete mode 100644 javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentLogEmitterProvider.java rename testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/{OtlpInMemoryLogExporter.java => OtlpInMemoryLogRecordExporter.java} (71%) diff --git a/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-instrumentation.gradle.kts b/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-instrumentation.gradle.kts index 49b5350707..24a561e63d 100644 --- a/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-instrumentation.gradle.kts +++ b/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-instrumentation.gradle.kts @@ -8,7 +8,6 @@ dependencies { add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api") add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv") add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support") - add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal") add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api") add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") diff --git a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts index 23ef33edb9..2ff8aa8a5d 100644 --- a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts @@ -383,7 +383,6 @@ configurations.configureEach { substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv")).using(project(":instrumentation-api-semconv")) substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations")).using(project(":instrumentation-annotations")) substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support")).using(project(":instrumentation-annotations-support")) - substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal")).using(project(":instrumentation-appender-api-internal")) substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap")).using(project(":javaagent-bootstrap")) substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")).using(project(":javaagent-extension-api")) substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")).using(project(":javaagent-tooling")) diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index aff2b22cbf..f5364c34b2 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -12,7 +12,7 @@ val dependencyVersions = hashMapOf() rootProject.extra["versions"] = dependencyVersions // this line is managed by .github/scripts/update-sdk-version.sh -val otelVersion = "1.18.0" +val otelVersion = "1.19.0" rootProject.extra["otelVersion"] = otelVersion diff --git a/docs/contributing/javaagent-structure.md b/docs/contributing/javaagent-structure.md index 007ad8a802..90271abc08 100644 --- a/docs/contributing/javaagent-structure.md +++ b/docs/contributing/javaagent-structure.md @@ -38,9 +38,6 @@ The bootstrap class loader contains several modules: * **The `instrumentation-annotations-support` module**: it contains classes that provide support for annotation-based auto-instrumentation, e.g. the `@WithSpan` annotation. This module is internal and its APIs are considered unstable. -* **The `instrumentation-appender-api-internal` module**: - it contains classes that constitute the "appender API", used by logging instrumentations. This - module is internal and its APIs are considered unstable. * **The `io.opentelemetry.javaagent.bootstrap` package from the `javaagent-extension-api` module**: this package contains several instrumentation utilities that are only usable when an application is instrumented with the javaagent; for example, the `Java8BytecodeBridge` that should be used diff --git a/examples/distro/agent/build.gradle b/examples/distro/agent/build.gradle index 4d400baabf..d2dae6ac33 100644 --- a/examples/distro/agent/build.gradle +++ b/examples/distro/agent/build.gradle @@ -74,6 +74,7 @@ tasks { dependencies { exclude("org.slf4j:slf4j-api") exclude("io.opentelemetry:opentelemetry-api") + exclude("io.opentelemetry:opentelemetry-api-logs") exclude("io.opentelemetry:opentelemetry-context") exclude("io.opentelemetry:opentelemetry-semconv") } diff --git a/examples/distro/testing/agent-for-testing/build.gradle b/examples/distro/testing/agent-for-testing/build.gradle index a515022dee..5026f88df1 100644 --- a/examples/distro/testing/agent-for-testing/build.gradle +++ b/examples/distro/testing/agent-for-testing/build.gradle @@ -71,6 +71,7 @@ tasks { dependencies { exclude("org.slf4j:slf4j-api") exclude("io.opentelemetry:opentelemetry-api") + exclude("io.opentelemetry:opentelemetry-api-logs") exclude("io.opentelemetry:opentelemetry-context") exclude("io.opentelemetry:opentelemetry-semconv") } diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/MetricsView.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/MetricsView.java index 75b5710d5e..16d427c536 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/MetricsView.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/MetricsView.java @@ -57,7 +57,7 @@ final class MetricsView { // the list of rpc server metrics attributes is from // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/rpc.md#attributes Set view = new HashSet<>(alwaysInclude); - view.add(SemanticAttributes.NET_HOST_IP); + view.add(SemanticAttributes.NET_SOCK_HOST_ADDR); view.add(SemanticAttributes.NET_TRANSPORT); return view; } diff --git a/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcServerMetricsTest.java b/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcServerMetricsTest.java index ee1c3eeb49..dae6f1cc2e 100644 --- a/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcServerMetricsTest.java +++ b/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcServerMetricsTest.java @@ -41,14 +41,14 @@ class RpcServerMetricsTest { Attributes responseAttributes1 = Attributes.builder() .put(SemanticAttributes.NET_HOST_NAME, "example.com") - .put(SemanticAttributes.NET_HOST_IP, "127.0.0.1") + .put(SemanticAttributes.NET_SOCK_HOST_ADDR, "127.0.0.1") .put(SemanticAttributes.NET_HOST_PORT, 8080) .put(SemanticAttributes.NET_TRANSPORT, "ip_tcp") .build(); Attributes responseAttributes2 = Attributes.builder() - .put(SemanticAttributes.NET_HOST_IP, "127.0.0.1") + .put(SemanticAttributes.NET_SOCK_HOST_ADDR, "127.0.0.1") .put(SemanticAttributes.NET_HOST_PORT, 8080) .put(SemanticAttributes.NET_TRANSPORT, "ip_tcp") .build(); @@ -120,7 +120,8 @@ class RpcServerMetricsTest { SemanticAttributes.RPC_SERVICE, "myservice.EchoService"), equalTo(SemanticAttributes.RPC_METHOD, "exampleMethod"), - equalTo(SemanticAttributes.NET_HOST_IP, "127.0.0.1"), + equalTo( + SemanticAttributes.NET_SOCK_HOST_ADDR, "127.0.0.1"), equalTo(SemanticAttributes.NET_TRANSPORT, "ip_tcp"))))); } diff --git a/instrumentation-appender-api-internal/build.gradle.kts b/instrumentation-appender-api-internal/build.gradle.kts deleted file mode 100644 index f682e71c00..0000000000 --- a/instrumentation-appender-api-internal/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id("otel.java-conventions") - id("otel.animalsniffer-conventions") - id("otel.jacoco-conventions") - id("otel.japicmp-conventions") - id("otel.publish-conventions") -} - -group = "io.opentelemetry.instrumentation" - -dependencies { - api("io.opentelemetry:opentelemetry-api") -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitter.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitter.java deleted file mode 100644 index 4103bccd76..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitter.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * A {@link LogEmitter} is the entry point into a log pipeline. - * - *

Obtain a log builder via {@link #logBuilder()}, add properties using the setters, and emit it - * via {@link LogRecordBuilder#emit()}. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -@ThreadSafe -public interface LogEmitter { - - /** Return a new {@link LogRecordBuilder} to emit a log. */ - LogRecordBuilder logBuilder(); -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterBuilder.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterBuilder.java deleted file mode 100644 index 121a4aba7c..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterBuilder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -/** - * Builder class for creating {@link LogEmitter} instances. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public interface LogEmitterBuilder { - - /** - * Assign an OpenTelemetry schema URL to the resulting {@link LogEmitter}. - * - * @param schemaUrl the URL of the OpenTelemetry schema being used by this instrumentation library - * @return this - */ - LogEmitterBuilder setSchemaUrl(String schemaUrl); - - /** - * Assign a version to the instrumentation library that is using the resulting {@link LogEmitter}. - * - * @param instrumentationVersion the version of the instrumentation library - * @return this - */ - LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion); - - /** - * Gets or creates a {@link LogEmitter} instance. - * - * @return a log emitter instance configured with the provided options - */ - LogEmitter build(); -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProvider.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProvider.java deleted file mode 100644 index 9b97756857..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public interface LogEmitterProvider { - - /** - * Creates a {@link LogEmitterBuilder} instance. - * - * @param instrumentationName the name of the instrumentation library - * @return a log emitter builder instance - */ - LogEmitterBuilder logEmitterBuilder(String instrumentationName); -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolder.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolder.java deleted file mode 100644 index f5a0a397b7..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolder.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -import java.util.concurrent.atomic.AtomicReference; -import javax.annotation.Nullable; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class LogEmitterProviderHolder { - - private final AtomicReference instance = - new AtomicReference<>(NoopLogEmitterProvider.INSTANCE); - - @Nullable private volatile Throwable setInstanceCaller; - - /** Returns the registered {@link LogEmitterProvider}. */ - public LogEmitterProvider get() { - return instance.get(); - } - - /** - * Sets the {@link LogEmitterProvider} that should be the instance. Future calls to {@link #get()} - * will return the provided {@link LogEmitterProvider} instance. This should be called once as - * early as possible in your application initialization logic, often in a {@code static} block in - * your main class. It should only be called once - an attempt to call it a second time will - * result in an error. If trying to set the instance {@link LogEmitterProvider} multiple times in - * tests, use {@link LogEmitterProviderHolder#resetForTest()} between them. - */ - public void set(LogEmitterProvider logEmitterProvider) { - boolean changed = instance.compareAndSet(NoopLogEmitterProvider.INSTANCE, logEmitterProvider); - if (!changed && (logEmitterProvider != NoopLogEmitterProvider.INSTANCE)) { - throw new IllegalStateException( - "LogEmitterProviderHolder.set has already been called. LogEmitterProviderHolder.set " - + "must be called only once before any calls to LogEmitterProviderHolder.get. " - + "Previous invocation set to cause of this exception.", - setInstanceCaller); - } - setInstanceCaller = new Throwable(); - } - - /** - * Unsets the {@link LogEmitterProvider}. This is only meant to be used from tests which need to - * reconfigure {@link LogEmitterProvider}. - */ - public void resetForTest() { - instance.set(NoopLogEmitterProvider.INSTANCE); - } -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogRecordBuilder.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogRecordBuilder.java deleted file mode 100644 index 82c620961d..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogRecordBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.context.Context; -import java.time.Instant; -import java.util.concurrent.TimeUnit; - -/** - * Used to construct and emit logs from a {@link LogEmitter}. - * - *

Obtain a {@link LogRecordBuilder} via {@link LogEmitter#logBuilder()}, add properties using - * the setters, and emit the log by calling {@link #emit()}. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public interface LogRecordBuilder { - - /** Set the epoch timestamp using the timestamp and unit. */ - LogRecordBuilder setEpoch(long timestamp, TimeUnit unit); - - /** Set the epoch timestamp using the instant. */ - LogRecordBuilder setEpoch(Instant instant); - - /** Set the context. */ - LogRecordBuilder setContext(Context context); - - /** Set the severity. */ - LogRecordBuilder setSeverity(Severity severity); - - /** Set the severity text. */ - LogRecordBuilder setSeverityText(String severityText); - - /** Set the body string. */ - LogRecordBuilder setBody(String body); - - /** Set the attributes. */ - LogRecordBuilder setAllAttributes(Attributes attributes); - - /** Emit the log. */ - void emit(); -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitter.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitter.java deleted file mode 100644 index 2a7ae686c3..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitter.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -final class NoopLogEmitter implements LogEmitter { - - static final LogEmitter INSTANCE = new NoopLogEmitter(); - - @Override - public LogRecordBuilder logBuilder() { - return NoopLogRecordBuilder.INSTANCE; - } -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterBuilder.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterBuilder.java deleted file mode 100644 index 444f069220..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterBuilder.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; - -final class NoopLogEmitterBuilder implements LogEmitterBuilder { - - static final LogEmitterBuilder INSTANCE = new NoopLogEmitterBuilder(); - - @Override - @CanIgnoreReturnValue - public LogEmitterBuilder setSchemaUrl(String schemaUrl) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion) { - return this; - } - - @Override - public LogEmitter build() { - return NoopLogEmitter.INSTANCE; - } -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterProvider.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterProvider.java deleted file mode 100644 index e022b753a7..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -final class NoopLogEmitterProvider implements LogEmitterProvider { - - static final NoopLogEmitterProvider INSTANCE = new NoopLogEmitterProvider(); - - @Override - public LogEmitterBuilder logEmitterBuilder(String instrumentationName) { - return NoopLogEmitterBuilder.INSTANCE; - } -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogRecordBuilder.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogRecordBuilder.java deleted file mode 100644 index 890aa467f9..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogRecordBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.context.Context; -import java.time.Instant; -import java.util.concurrent.TimeUnit; - -final class NoopLogRecordBuilder implements LogRecordBuilder { - - static final LogRecordBuilder INSTANCE = new NoopLogRecordBuilder(); - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setEpoch(long timestamp, TimeUnit unit) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setEpoch(Instant instant) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setContext(Context context) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setSeverity(Severity severity) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setSeverityText(String severityText) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setBody(String body) { - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setAllAttributes(Attributes attributes) { - return this; - } - - @Override - public void emit() {} -} diff --git a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/Severity.java b/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/Severity.java deleted file mode 100644 index 4c71eafb9e..0000000000 --- a/instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/Severity.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public enum Severity { - UNDEFINED_SEVERITY_NUMBER(0), - TRACE(1), - TRACE2(2), - TRACE3(3), - TRACE4(4), - DEBUG(5), - DEBUG2(6), - DEBUG3(7), - DEBUG4(8), - INFO(9), - INFO2(10), - INFO3(11), - INFO4(12), - WARN(13), - WARN2(14), - WARN3(15), - WARN4(16), - ERROR(17), - ERROR2(18), - ERROR3(19), - ERROR4(20), - FATAL(21), - FATAL2(22), - FATAL3(23), - FATAL4(24); - - private final int severityNumber; - - Severity(int severityNumber) { - this.severityNumber = severityNumber; - } - - public int getSeverityNumber() { - return severityNumber; - } -} diff --git a/instrumentation-appender-api-internal/src/test/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolderTest.java b/instrumentation-appender-api-internal/src/test/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolderTest.java deleted file mode 100644 index f9e7ed03e1..0000000000 --- a/instrumentation-appender-api-internal/src/test/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolderTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.appender.internal; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.mockito.Mockito.mock; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -class LogEmitterProviderHolderTest { - - private static final LogEmitterProviderHolder holder = new LogEmitterProviderHolder(); - - @BeforeAll - static void beforeClass() { - holder.resetForTest(); - } - - @AfterEach - void after() { - holder.resetForTest(); - } - - @Test - void testGlobalBeforeSet() { - assertThat(holder.get()).isSameAs(NoopLogEmitterProvider.INSTANCE); - } - - @Test - void setThenSet() { - setLogEmitterProvider(); - assertThatThrownBy(() -> holder.set(mock(LogEmitterProvider.class))) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("LogEmitterProviderHolder.set has already been called") - .hasStackTraceContaining("setLogEmitterProvider"); - } - - @Test - void getThenSet() { - LogEmitterProvider existingProvider = holder.get(); - assertSame(existingProvider, NoopLogEmitterProvider.INSTANCE); - LogEmitterProvider newProvider = mock(LogEmitterProvider.class); - holder.set(newProvider); - assertSame(newProvider, holder.get()); - } - - @Test - void okToSetNoopMultipleTimes() { - holder.set(NoopLogEmitterProvider.INSTANCE); - holder.set(NoopLogEmitterProvider.INSTANCE); - holder.set(NoopLogEmitterProvider.INSTANCE); - holder.set(NoopLogEmitterProvider.INSTANCE); - // pass - } - - private static void setLogEmitterProvider() { - holder.set(mock(LogEmitterProvider.class)); - } -} diff --git a/instrumentation-appender-sdk-internal/build.gradle.kts b/instrumentation-appender-sdk-internal/build.gradle.kts deleted file mode 100644 index fe8c116f7b..0000000000 --- a/instrumentation-appender-sdk-internal/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("otel.java-conventions") - id("otel.animalsniffer-conventions") - id("otel.jacoco-conventions") - id("otel.japicmp-conventions") - id("otel.publish-conventions") -} - -group = "io.opentelemetry.instrumentation" - -dependencies { - api(project(":instrumentation-appender-api-internal")) - - api("io.opentelemetry:opentelemetry-sdk-logs") -} diff --git a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitter.java b/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitter.java deleted file mode 100644 index 4382e4ca0c..0000000000 --- a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitter.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.sdk.appender.internal; - -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitter; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; - -final class DelegatingLogEmitter implements LogEmitter { - - private final io.opentelemetry.sdk.logs.LogEmitter delegate; - - DelegatingLogEmitter(io.opentelemetry.sdk.logs.LogEmitter delegate) { - this.delegate = delegate; - } - - @Override - public LogRecordBuilder logBuilder() { - return new DelegatingLogRecordBuilder(delegate.logRecordBuilder()); - } -} diff --git a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterBuilder.java b/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterBuilder.java deleted file mode 100644 index 76a3b5f14c..0000000000 --- a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterBuilder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.sdk.appender.internal; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitter; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterBuilder; - -final class DelegatingLogEmitterBuilder implements LogEmitterBuilder { - - private final io.opentelemetry.sdk.logs.LogEmitterBuilder delegate; - - DelegatingLogEmitterBuilder(io.opentelemetry.sdk.logs.LogEmitterBuilder delegate) { - this.delegate = delegate; - } - - @Override - @CanIgnoreReturnValue - public LogEmitterBuilder setSchemaUrl(String schemaUrl) { - delegate.setSchemaUrl(schemaUrl); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion) { - delegate.setInstrumentationVersion(instrumentationVersion); - return this; - } - - @Override - public LogEmitter build() { - return new DelegatingLogEmitter(delegate.build()); - } -} diff --git a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterProvider.java b/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterProvider.java deleted file mode 100644 index 88e8a74a7a..0000000000 --- a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.sdk.appender.internal; - -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class DelegatingLogEmitterProvider implements LogEmitterProvider { - - private final SdkLogEmitterProvider delegate; - - public static DelegatingLogEmitterProvider from(SdkLogEmitterProvider delegate) { - return new DelegatingLogEmitterProvider(delegate); - } - - private DelegatingLogEmitterProvider(SdkLogEmitterProvider delegate) { - this.delegate = delegate; - } - - @Override - public LogEmitterBuilder logEmitterBuilder(String instrumentationName) { - return new DelegatingLogEmitterBuilder(delegate.logEmitterBuilder(instrumentationName)); - } -} diff --git a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogRecordBuilder.java b/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogRecordBuilder.java deleted file mode 100644 index 2f91f99e2b..0000000000 --- a/instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogRecordBuilder.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.sdk.appender.internal; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.Severity; -import java.time.Instant; -import java.util.concurrent.TimeUnit; - -final class DelegatingLogRecordBuilder implements LogRecordBuilder { - - private final io.opentelemetry.sdk.logs.LogRecordBuilder delegate; - - DelegatingLogRecordBuilder(io.opentelemetry.sdk.logs.LogRecordBuilder delegate) { - this.delegate = delegate; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setEpoch(long timestamp, TimeUnit unit) { - delegate.setEpoch(timestamp, unit); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setEpoch(Instant instant) { - delegate.setEpoch(instant); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setContext(Context context) { - delegate.setContext(context); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setSeverity(Severity severity) { - delegate.setSeverity(io.opentelemetry.sdk.logs.data.Severity.valueOf(severity.name())); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setSeverityText(String severityText) { - delegate.setSeverityText(severityText); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setBody(String body) { - delegate.setBody(body); - return this; - } - - @Override - @CanIgnoreReturnValue - public LogRecordBuilder setAllAttributes(Attributes attributes) { - delegate.setAllAttributes(attributes); - return this; - } - - @Override - public void emit() { - delegate.emit(); - } -} diff --git a/instrumentation/java-util-logging/javaagent/build.gradle.kts b/instrumentation/java-util-logging/javaagent/build.gradle.kts index f5f3f63c9d..fd5f1a23bc 100644 --- a/instrumentation/java-util-logging/javaagent/build.gradle.kts +++ b/instrumentation/java-util-logging/javaagent/build.gradle.kts @@ -5,7 +5,7 @@ plugins { dependencies { compileOnly(project(":instrumentation:java-util-logging:shaded-stub-for-instrumenting")) - compileOnly(project(":instrumentation-appender-api-internal")) + compileOnly("io.opentelemetry:opentelemetry-api-logs") compileOnly(project(":javaagent-bootstrap")) // ensure no cross interference diff --git a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java index 8847b06724..cccd93eaa5 100644 --- a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java +++ b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java @@ -8,10 +8,10 @@ package io.opentelemetry.javaagent.instrumentation.jul; import application.java.util.logging.Logger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.Severity; -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.io.PrintWriter; @@ -41,7 +41,7 @@ public final class JavaUtilLoggingHelper { instrumentationName = "ROOT"; } LogRecordBuilder builder = - AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder(); + GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder(); mapLogRecord(builder, logRecord); builder.emit(); } @@ -81,7 +81,7 @@ public final class JavaUtilLoggingHelper { Throwable throwable = logRecord.getThrown(); if (throwable != null) { // TODO (trask) extract method for recording exception into - // instrumentation-appender-api-internal + // io.opentelemetry:opentelemetry-api-logs attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); StringWriter writer = new StringWriter(); diff --git a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingInstrumentation.java b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingInstrumentation.java index 019016809c..205b7419f1 100644 --- a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingInstrumentation.java +++ b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingInstrumentation.java @@ -13,7 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import application.java.util.logging.Logger; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; +import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -50,7 +50,7 @@ class JavaUtilLoggingInstrumentation implements TypeInstrumentation { @Advice.Local("otelCallDepth") CallDepth callDepth) { // need to track call depth across all loggers in order to avoid double capture when one // logging framework delegates to another - callDepth = CallDepth.forClass(LogEmitterProvider.class); + callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { JavaUtilLoggingHelper.capture(logger, logRecord); } diff --git a/instrumentation/java-util-logging/javaagent/src/test/groovy/JavaUtilLoggingTest.groovy b/instrumentation/java-util-logging/javaagent/src/test/groovy/JavaUtilLoggingTest.groovy index 8914dd96a4..6918b53feb 100644 --- a/instrumentation/java-util-logging/javaagent/src/test/groovy/JavaUtilLoggingTest.groovy +++ b/instrumentation/java-util-logging/javaagent/src/test/groovy/JavaUtilLoggingTest.groovy @@ -4,7 +4,7 @@ */ import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.sdk.logs.data.Severity +import io.opentelemetry.api.logs.Severity import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import spock.lang.Unroll @@ -50,9 +50,9 @@ class JavaUtilLoggingTest extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) if (testArgs == "params") { assertThat(log.getBody().asString()).isEqualTo("xyz: 123") } else { @@ -81,7 +81,7 @@ class JavaUtilLoggingTest extends AgentInstrumentationSpecification { } } else { Thread.sleep(500) // sleep a bit just to make sure no log is captured - logs.size() == 0 + logRecords.size() == 0 } where: diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/build.gradle.kts b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/build.gradle.kts index e8b23ad938..eda659dd07 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/build.gradle.kts +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/build.gradle.kts @@ -14,7 +14,7 @@ muzzle { dependencies { library("org.jboss.logmanager:jboss-logmanager:1.1.0.GA") - compileOnly(project(":instrumentation-appender-api-internal")) + compileOnly("io.opentelemetry:opentelemetry-api-logs") compileOnly(project(":javaagent-bootstrap")) // ensure no cross interference diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerInstrumentation.java b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerInstrumentation.java index 2315e840e8..9035042eab 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerInstrumentation.java +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerInstrumentation.java @@ -11,7 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; +import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -47,7 +47,7 @@ public class JbossLogmanagerInstrumentation implements TypeInstrumentation { @Advice.Local("otelCallDepth") CallDepth callDepth) { // need to track call depth across all loggers in order to avoid double capture when one // logging framework delegates to another - callDepth = CallDepth.forClass(LogEmitterProvider.class); + callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { LoggingEventMapper.INSTANCE.capture(logger, record); } diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java index acd176a901..dc962bfc77 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java @@ -10,11 +10,11 @@ import static java.util.Collections.emptyList; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.Severity; import io.opentelemetry.instrumentation.api.internal.cache.Cache; -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.io.PrintWriter; @@ -58,7 +58,7 @@ public final class LoggingEventMapper { } LogRecordBuilder builder = - AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder(); + GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder(); String message = record.getFormattedMessage(); if (message != null) { @@ -76,7 +76,7 @@ public final class LoggingEventMapper { Throwable throwable = record.getThrown(); if (throwable != null) { // TODO (trask) extract method for recording exception into - // instrumentation-appender-api-internal + // io.opentelemetry:opentelemetry-api-logs attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); StringWriter writer = new StringWriter(); diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/groovy/JbossLogmanagerTest.groovy b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/groovy/JbossLogmanagerTest.groovy index 0902b49c1a..fd5daefbdf 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/groovy/JbossLogmanagerTest.groovy +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/groovy/JbossLogmanagerTest.groovy @@ -5,7 +5,7 @@ import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.sdk.logs.data.Severity +import io.opentelemetry.api.logs.Severity import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import org.jboss.logmanager.MDC import org.jboss.logmanager.Level @@ -50,9 +50,9 @@ class JbossLogmanagerTest extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("xyz") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(severity) @@ -77,7 +77,7 @@ class JbossLogmanagerTest extends AgentInstrumentationSpecification { } } else { Thread.sleep(500) // sleep a bit just to make sure no log is captured - assertThat(logs.size() == 0).isTrue() + assertThat(logRecords.size() == 0).isTrue() } where: @@ -113,9 +113,9 @@ class JbossLogmanagerTest extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("xyz") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(Severity.INFO) diff --git a/instrumentation/kotlinx-coroutines/javaagent/src/test/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/KotlinCoroutinesInstrumentationTest.kt b/instrumentation/kotlinx-coroutines/javaagent/src/test/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/KotlinCoroutinesInstrumentationTest.kt index dd51496dbd..8747df688c 100644 --- a/instrumentation/kotlinx-coroutines/javaagent/src/test/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/KotlinCoroutinesInstrumentationTest.kt +++ b/instrumentation/kotlinx-coroutines/javaagent/src/test/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/KotlinCoroutinesInstrumentationTest.kt @@ -9,8 +9,9 @@ import io.opentelemetry.context.Context import io.opentelemetry.extension.kotlin.asContextElement import io.opentelemetry.instrumentation.reactor.ContextPropagationOperator import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension +import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat -import io.opentelemetry.sdk.trace.data.SpanData +import io.opentelemetry.sdk.testing.assertj.TraceAssert import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -48,7 +49,6 @@ import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.Arguments.arguments import org.junit.jupiter.params.provider.ArgumentsProvider import org.junit.jupiter.params.provider.ArgumentsSource -import java.time.Duration import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import java.util.function.Consumer @@ -69,7 +69,8 @@ class KotlinCoroutinesInstrumentationTest { singleThread.shutdown() } - @RegisterExtension val testing = AgentInstrumentationExtension.create() + @RegisterExtension + val testing = AgentInstrumentationExtension.create() val tracer = testing.openTelemetry.getTracer("test") @@ -325,42 +326,40 @@ class KotlinCoroutinesInstrumentationTest { // should have the same iteration number (attribute "iter"). // The traces are in some random order, so let's keep track and make sure we see // each iteration # exactly once - val assertions = mutableListOf>>() + val assertions = mutableListOf>() for (i in 0 until numIters) { assertions.add { trace -> - assertThat(trace).satisfiesExactly( - Consumer { - assertThat(it) - .hasName("a") + trace.hasSpansSatisfyingExactly( + { + it.hasName("a") .hasNoParent() }, - Consumer { - assertThat(it) - .hasName("a2") - .hasParent(trace.get(0)) + { + it.hasName("a2") + .hasParent(trace.getSpan(0)) } ) } + } + for (i in 0 until numIters) { assertions.add { trace -> - assertThat(trace).satisfiesExactly( - Consumer { - assertThat(it) - .hasName("b") + trace.hasSpansSatisfyingExactly( + { + it.hasName("b") .hasNoParent() }, - Consumer { - assertThat(it) - .hasName("b2") - .hasParent(trace.get(0)) + { + it.hasName("b2") + .hasParent(trace.getSpan(0)) } ) } } - await().atMost(Duration.ofSeconds(30)).untilAsserted { - val traces = testing.waitForTraces(assertions.size) - assertThat(traces).satisfiesExactlyInAnyOrder(*assertions.toTypedArray()) - } + testing.waitAndAssertSortedTraces( + orderByRootSpanName("a", "b"), + *assertions.toTypedArray() + ) } @ParameterizedTest diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-appender-1.2/javaagent/build.gradle.kts index 6b32996c3b..67f2b2269e 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { // 1.2 introduces MDC and there's no version earlier than 1.2.4 available library("log4j:log4j:1.2.4") - compileOnly(project(":instrumentation-appender-api-internal")) + compileOnly("io.opentelemetry:opentelemetry-api-logs") compileOnly(project(":javaagent-bootstrap")) testImplementation("org.awaitility:awaitility") diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jAppenderInstrumentation.java b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jAppenderInstrumentation.java index 6c82d1c591..1ec27c84bf 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jAppenderInstrumentation.java +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jAppenderInstrumentation.java @@ -11,7 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; +import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -54,7 +54,7 @@ class Log4jAppenderInstrumentation implements TypeInstrumentation { @Advice.Local("otelCallDepth") CallDepth callDepth) { // need to track call depth across all loggers to avoid double capture when one logging // framework delegates to another - callDepth = CallDepth.forClass(LogEmitterProvider.class); + callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { LogEventMapper.INSTANCE.capture(logger, level, message, t); } diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java index 6c6f1838a1..543c24b955 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java @@ -10,11 +10,11 @@ import static java.util.Collections.emptyList; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.Severity; import io.opentelemetry.instrumentation.api.internal.cache.Cache; -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.io.PrintWriter; @@ -64,7 +64,7 @@ public final class LogEventMapper { instrumentationName = "ROOT"; } LogRecordBuilder builder = - AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder(); + GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder(); // message if (message != null) { @@ -82,7 +82,7 @@ public final class LogEventMapper { // throwable if (throwable != null) { // TODO (trask) extract method for recording exception into - // instrumentation-appender-api-internal + // io.opentelemetry:opentelemetry-api-logs attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); StringWriter writer = new StringWriter(); diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/groovy/Log4j1Test.groovy b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/groovy/Log4j1Test.groovy index dd5381c388..009a52ca7b 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/groovy/Log4j1Test.groovy +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/groovy/Log4j1Test.groovy @@ -5,7 +5,7 @@ import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.sdk.logs.data.Severity +import io.opentelemetry.api.logs.Severity import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import org.apache.log4j.Logger import org.apache.log4j.MDC @@ -55,9 +55,9 @@ class Log4j1Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("xyz") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(severity) @@ -82,7 +82,7 @@ class Log4j1Test extends AgentInstrumentationSpecification { } } else { Thread.sleep(500) // sleep a bit just to make sure no log is captured - logs.size() == 0 + logRecords.size() == 0 } where: @@ -118,9 +118,9 @@ class Log4j1Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("xyz") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(Severity.INFO) diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts index 90f12f9915..01814acaaa 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts @@ -14,7 +14,7 @@ muzzle { dependencies { library("org.apache.logging.log4j:log4j-core:2.17.0") - compileOnly(project(":instrumentation-appender-api-internal")) + compileOnly("io.opentelemetry:opentelemetry-api-logs") compileOnly(project(":javaagent-bootstrap")) implementation(project(":instrumentation:log4j:log4j-appender-2.17:library")) diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java index 2327e1bea6..fe3d742bb4 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java @@ -14,7 +14,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; +import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -67,7 +67,7 @@ class Log4jAppenderInstrumentation implements TypeInstrumentation { @Advice.Local("otelCallDepth") CallDepth callDepth) { // need to track call depth across all loggers in order to avoid double capture when one // logging framework delegates to another - callDepth = CallDepth.forClass(LogEmitterProvider.class); + callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { Log4jHelper.capture(logger, level, marker, message, t); } diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java index 6906d6cb18..d15cddca5f 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java @@ -7,10 +7,10 @@ package io.opentelemetry.javaagent.instrumentation.log4j.appender.v2_17; import static java.util.Collections.emptyList; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper; -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import java.util.List; import java.util.Map; @@ -59,7 +59,7 @@ public final class Log4jHelper { instrumentationName = "ROOT"; } LogRecordBuilder builder = - AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder(); + GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder(); Map contextData = ThreadContext.getImmutableContext(); mapper.mapLogEvent(builder, message, level, marker, throwable, contextData); builder.emit(); diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/groovy/Log4j2Test.groovy b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/groovy/Log4j2Test.groovy index 73ff8933b5..9cad5e4d28 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/groovy/Log4j2Test.groovy +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/groovy/Log4j2Test.groovy @@ -4,7 +4,7 @@ */ import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.sdk.logs.data.Severity +import io.opentelemetry.api.logs.Severity import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import org.apache.logging.log4j.LogManager @@ -50,9 +50,9 @@ class Log4j2Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("xyz: 123") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(severity) @@ -77,7 +77,7 @@ class Log4j2Test extends AgentInstrumentationSpecification { } } else { Thread.sleep(500) // sleep a bit just to make sure no log is captured - logs.size() == 0 + logRecords.size() == 0 } where: @@ -112,9 +112,9 @@ class Log4j2Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("xyz: 123") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(Severity.INFO) @@ -138,9 +138,9 @@ class Log4j2Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEmpty() assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(Severity.INFO) @@ -164,9 +164,9 @@ class Log4j2Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("val2") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(Severity.INFO) @@ -189,9 +189,9 @@ class Log4j2Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) + assertThat(logRecords).hasSize(1) }) - def log = logs.get(0) + def log = logRecords.get(0) assertThat(log.getBody().asString()).isEqualTo("a message") assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc") assertThat(log.getSeverity()).isEqualTo(Severity.INFO) @@ -215,8 +215,8 @@ class Log4j2Test extends AgentInstrumentationSpecification { await() .untilAsserted( () -> { - assertThat(logs).hasSize(1) - def log = logs.get(0) + assertThat(logRecords).hasSize(1) + def log = logRecords.get(0) OpenTelemetryAssertions.assertThat(log.getAttributes()).containsEntry("log4j.marker", markerName) }) } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/README.md b/instrumentation/log4j/log4j-appender-2.17/library/README.md index 5fa74e799d..8d67da1a27 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/README.md +++ b/instrumentation/log4j/log4j-appender-2.17/library/README.md @@ -51,19 +51,17 @@ The following demonstrates how you might configure the appender in your `log4j.x ``` -Next, associate the `OpenTelemetryAppender` configured via `log4j2.xml` with -an `SdkLogEmitterProvider` in your application: +Next, configure `GlobalLoggerProvider` with an `SdkLoggerProvider` in your application. ``` -SdkLogEmitterProvider logEmitterProvider = - SdkLogEmitterProvider.builder() +SdkLoggerProvider sdkLoggerProvider = + SdkLoggerProvider.builder() .setResource(Resource.create(...)) .addLogProcessor(...) .build(); -OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider); +GlobalLoggerProvider.set(sdkLoggerProvider); ``` In this example Log4j2 log events will be sent to both the console appender and -the `OpenTelemetryAppender`, which will drop the logs until -`OpenTelemetryAppender.setSdkLogEmitterProvider(..)` is called. Once initialized, logs will be -emitted to a `LogEmitter` obtained from the `SdkLogEmitterProvider`. +the `OpenTelemetryAppender`, which will drop the logs until `GlobalLoggerProvider.set(..)` is +called. Once initialized, logs will be emitted to a `Logger` obtained from the `SdkLoggerProvider`. diff --git a/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts b/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts index 4cc64137eb..0ea0e1b629 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts +++ b/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts @@ -3,12 +3,10 @@ plugins { } dependencies { - implementation(project(":instrumentation-appender-api-internal")) - implementation(project(":instrumentation-appender-sdk-internal")) + implementation("io.opentelemetry:opentelemetry-api-logs") library("org.apache.logging.log4j:log4j-core:2.17.0") - testImplementation(project(":instrumentation-appender-sdk-internal")) testImplementation("io.opentelemetry:opentelemetry-sdk-logs") testImplementation("io.opentelemetry:opentelemetry-sdk-testing") } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java index 8c3c702f03..4f0e0d4275 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java @@ -7,13 +7,10 @@ package io.opentelemetry.instrumentation.log4j.appender.v2_17; import static java.util.Collections.emptyList; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper; -import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider; -import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; import java.io.Serializable; import java.util.Arrays; import java.util.List; @@ -44,9 +41,6 @@ public class OpenTelemetryAppender extends AbstractAppender { static final String PLUGIN_NAME = "OpenTelemetry"; - private static final LogEmitterProviderHolder logEmitterProviderHolder = - new LogEmitterProviderHolder(); - private final LogEventMapper mapper; @PluginBuilderFactory @@ -147,7 +141,7 @@ public class OpenTelemetryAppender extends AbstractAppender { instrumentationName = "ROOT"; } LogRecordBuilder builder = - logEmitterProviderHolder.get().logEmitterBuilder(instrumentationName).build().logBuilder(); + GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder(); ReadOnlyStringMap contextData = event.getContextData(); mapper.mapLogEvent( builder, @@ -167,25 +161,6 @@ public class OpenTelemetryAppender extends AbstractAppender { builder.emit(); } - /** - * This should be called once as early as possible in your application initialization logic, often - * in a {@code static} block in your main class. It should only be called once - an attempt to - * call it a second time will result in an error. If trying to set the {@link - * SdkLogEmitterProvider} multiple times in tests, use {@link - * OpenTelemetryAppender#resetSdkLogEmitterProviderForTest()} between them. - */ - public static void setSdkLogEmitterProvider(SdkLogEmitterProvider sdkLogEmitterProvider) { - logEmitterProviderHolder.set(DelegatingLogEmitterProvider.from(sdkLogEmitterProvider)); - } - - /** - * Unsets the global {@link LogEmitterProvider}. This is only meant to be used from tests which - * need to reconfigure {@link LogEmitterProvider}. - */ - public static void resetSdkLogEmitterProviderForTest() { - logEmitterProviderHolder.resetForTest(); - } - private enum ContextDataAccessorImpl implements ContextDataAccessor { INSTANCE; diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java index 47a161bac6..4a71be5d4f 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java @@ -8,9 +8,9 @@ package io.opentelemetry.instrumentation.log4j.appender.v2_17.internal; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.Severity; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.io.PrintWriter; @@ -183,7 +183,7 @@ public final class LogEventMapper { private static void setThrowable(AttributesBuilder attributes, Throwable throwable) { // TODO (trask) extract method for recording exception into - // instrumentation-appender-api-internal + // io.opentelemetry:opentelemetry-api-logs attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); StringWriter writer = new StringWriter(); diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppenderConfigTest.java b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppenderConfigTest.java index 39b8ba949d..2ecda4cf06 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppenderConfigTest.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppenderConfigTest.java @@ -9,15 +9,16 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; -import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.Severity; -import io.opentelemetry.sdk.logs.export.InMemoryLogExporter; -import io.opentelemetry.sdk.logs.export.SimpleLogProcessor; +import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.data.LogRecordData; +import io.opentelemetry.sdk.logs.export.InMemoryLogRecordExporter; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; @@ -39,29 +40,29 @@ class OpenTelemetryAppenderConfigTest { private static final Logger logger = LogManager.getLogger("TestLogger"); - private static InMemoryLogExporter logExporter; + private static InMemoryLogRecordExporter logRecordExporter; private static Resource resource; private static InstrumentationScopeInfo instrumentationScopeInfo; @BeforeAll static void setupAll() { - logExporter = InMemoryLogExporter.create(); + logRecordExporter = InMemoryLogRecordExporter.create(); resource = Resource.getDefault(); instrumentationScopeInfo = InstrumentationScopeInfo.create("TestLogger"); - SdkLogEmitterProvider logEmitterProvider = - SdkLogEmitterProvider.builder() + SdkLoggerProvider loggerProvider = + SdkLoggerProvider.builder() .setResource(resource) - .addLogProcessor(SimpleLogProcessor.create(logExporter)) + .addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter)) .build(); - OpenTelemetryAppender.resetSdkLogEmitterProviderForTest(); - OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider); + GlobalLoggerProvider.resetForTest(); + GlobalLoggerProvider.set(loggerProvider); } @BeforeEach void setup() { - logExporter.reset(); + logRecordExporter.reset(); ThreadContext.clearAll(); } @@ -69,9 +70,9 @@ class OpenTelemetryAppenderConfigTest { void logNoSpan() { logger.info("log message 1"); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("log message 1"); @@ -86,7 +87,7 @@ class OpenTelemetryAppenderConfigTest { Span span2 = runWithSpan("span2", () -> logger.info("log message 3")); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(3); assertThat(logDataList.get(0).getSpanContext()).isEqualTo(span1.getSpanContext()); assertThat(logDataList.get(1).getSpanContext()).isEqualTo(SpanContext.getInvalid()); @@ -108,9 +109,9 @@ class OpenTelemetryAppenderConfigTest { Instant start = Instant.now(); logger.info("log message 1", new IllegalStateException("Error!")); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("log message 1"); @@ -138,9 +139,9 @@ class OpenTelemetryAppenderConfigTest { ThreadContext.clearMap(); } - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("log message 1"); @@ -158,9 +159,9 @@ class OpenTelemetryAppenderConfigTest { message.put("key2", "val2"); logger.info(message); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEmpty(); @@ -176,9 +177,9 @@ class OpenTelemetryAppenderConfigTest { message.put("message", "val2"); logger.info(message); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("val2"); @@ -193,8 +194,8 @@ class OpenTelemetryAppenderConfigTest { logger.info(marker, "Message"); - List logDataList = logExporter.getFinishedLogItems(); - LogData logData = logDataList.get(0); + List logDataList = logRecordExporter.getFinishedLogItems(); + LogRecordData logData = logDataList.get(0); assertThat(logData.getAttributes().get(AttributeKey.stringKey("log4j.marker"))) .isEqualTo(markerName); } @@ -206,9 +207,9 @@ class OpenTelemetryAppenderConfigTest { message.put("key2", "val2"); logger.info(message); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("a message"); diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java index 859a57eb1a..4e2c430a0a 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java @@ -17,7 +17,7 @@ import static org.mockito.Mockito.verify; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; +import io.opentelemetry.api.logs.LogRecordBuilder; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; diff --git a/instrumentation/logback/logback-appender-1.0/javaagent/build.gradle.kts b/instrumentation/logback/logback-appender-1.0/javaagent/build.gradle.kts index 753bb054d8..10106082a1 100644 --- a/instrumentation/logback/logback-appender-1.0/javaagent/build.gradle.kts +++ b/instrumentation/logback/logback-appender-1.0/javaagent/build.gradle.kts @@ -42,7 +42,7 @@ dependencies { } } - compileOnly(project(":instrumentation-appender-api-internal")) + compileOnly("io.opentelemetry:opentelemetry-api-logs") compileOnly(project(":javaagent-bootstrap")) implementation(project(":instrumentation:logback:logback-appender-1.0:library")) diff --git a/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackInstrumentation.java b/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackInstrumentation.java index 245b02e02e..57bf5df94b 100644 --- a/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackInstrumentation.java +++ b/instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackInstrumentation.java @@ -13,8 +13,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import ch.qos.logback.classic.spi.ILoggingEvent; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -49,9 +49,9 @@ class LogbackInstrumentation implements TypeInstrumentation { @Advice.Local("otelCallDepth") CallDepth callDepth) { // need to track call depth across all loggers in order to avoid double capture when one // logging framework delegates to another - callDepth = CallDepth.forClass(LogEmitterProvider.class); + callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { - mapper().emit(AgentLogEmitterProvider.get(), event); + mapper().emit(GlobalLoggerProvider.get(), event); } } diff --git a/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java b/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java index fc2c995aba..66b64d3fd0 100644 --- a/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java +++ b/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java @@ -10,12 +10,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.asser import static org.awaitility.Awaitility.await; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.Severity; +import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.stream.Stream; import org.junit.jupiter.api.Test; @@ -134,9 +134,9 @@ class LogbackTest extends AgentInstrumentationSpecification { } if (expectedSeverity != null) { - await().untilAsserted(() -> assertThat(testing.logs().size()).isEqualTo(1)); + await().untilAsserted(() -> assertThat(testing.logRecords().size()).isEqualTo(1)); - LogData log = testing.logs().get(0); + LogRecordData log = testing.logRecords().get(0); assertThat(log) .hasBody("xyz: 123") // TODO (trask) why is version "" instead of null? @@ -182,7 +182,7 @@ class LogbackTest extends AgentInstrumentationSpecification { } else { Thread.sleep(500); // sleep a bit just to make sure no log is captured - assertThat(testing.logs()).isEmpty(); + assertThat(testing.logRecords()).isEmpty(); } } @@ -196,9 +196,9 @@ class LogbackTest extends AgentInstrumentationSpecification { MDC.clear(); } - await().untilAsserted(() -> assertThat(testing.logs().size()).isEqualTo(1)); + await().untilAsserted(() -> assertThat(testing.logRecords().size()).isEqualTo(1)); - LogData log = getLogs().get(0); + LogRecordData log = getLogRecords().get(0); assertThat(log) .hasBody("xyz: 123") // TODO (trask) why is version "" instead of null? @@ -229,9 +229,9 @@ class LogbackTest extends AgentInstrumentationSpecification { abcLogger.info(marker, "Message"); - await().untilAsserted(() -> assertThat(testing.logs().size()).isEqualTo(1)); + await().untilAsserted(() -> assertThat(testing.logRecords().size()).isEqualTo(1)); - LogData log = getLogs().get(0); + LogRecordData log = getLogRecords().get(0); assertThat(log) .hasAttributesSatisfying( diff --git a/instrumentation/logback/logback-appender-1.0/library/README.md b/instrumentation/logback/logback-appender-1.0/library/README.md index 97cf3362c9..329887e427 100644 --- a/instrumentation/logback/logback-appender-1.0/library/README.md +++ b/instrumentation/logback/logback-appender-1.0/library/README.md @@ -54,19 +54,17 @@ The following demonstrates how you might configure the appender in your `logback ``` -Next, associate the `OpenTelemetryAppender` configured via `logback.xml` with -an `SdkLogEmitterProvider` in your application: +Next, configure `GlobalLoggerProvider` with an `SdkLoggerProvider` in your application. ``` -SdkLogEmitterProvider logEmitterProvider = - SdkLogEmitterProvider.builder() +SdkLoggerProvider sdkLoggerProvider = + SdkLoggerProvider.builder() .setResource(Resource.create(...)) .addLogProcessor(...) .build(); -OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider); +GlobalLoggerProvider.set(sdkLoggerProvider); ``` In this example Logback log events will be sent to both the console appender and -the `OpenTelemetryAppender`, which will drop the logs until -`OpenTelemetryAppender.setSdkLogEmitterProvider(..)` is called. Once initialized, logs will be -emitted to a `LogEmitter` obtained from the `SdkLogEmitterProvider`. +the `OpenTelemetryAppender`, which will drop the logs until `GlobalLoggerProvider.set(..)` is +called. Once initialized, logs will be emitted to a `Logger` obtained from the `SdkLoggerProvider`. diff --git a/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts b/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts index 14e6a5f24f..f8ac0480e4 100644 --- a/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts +++ b/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts @@ -3,8 +3,7 @@ plugins { } dependencies { - implementation(project(":instrumentation-appender-api-internal")) - implementation(project(":instrumentation-appender-sdk-internal")) + implementation("io.opentelemetry:opentelemetry-api-logs") // pin the version strictly to avoid overriding by dependencyManagement versions compileOnly("ch.qos.logback:logback-classic") { diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java index 1e9a2107be..12c6d191cd 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java @@ -9,11 +9,8 @@ import static java.util.Collections.emptyList; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.UnsynchronizedAppenderBase; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder; +import io.opentelemetry.api.logs.GlobalLoggerProvider; import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper; -import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider; -import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -21,9 +18,6 @@ import org.slf4j.MDC; public class OpenTelemetryAppender extends UnsynchronizedAppenderBase { - private static final LogEmitterProviderHolder logEmitterProviderHolder = - new LogEmitterProviderHolder(); - private volatile boolean captureExperimentalAttributes = false; private volatile boolean captureCodeAttributes = false; private volatile boolean captureMarkerAttribute = false; @@ -46,18 +40,7 @@ public class OpenTelemetryAppender extends UnsynchronizedAppenderBase filterBlanksAndNulls(String[] values) { return Arrays.stream(values) diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java index ab2a50be7a..4030d95c51 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java @@ -11,10 +11,10 @@ import ch.qos.logback.classic.spi.ThrowableProxy; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.LoggerProvider; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder; -import io.opentelemetry.instrumentation.api.appender.internal.Severity; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.io.PrintWriter; @@ -53,13 +53,13 @@ public final class LoggingEventMapper { captureMdcAttributes.size() == 1 && captureMdcAttributes.get(0).equals("*"); } - public void emit(LogEmitterProvider logEmitterProvider, ILoggingEvent event) { + public void emit(LoggerProvider loggerProvider, ILoggingEvent event) { String instrumentationName = event.getLoggerName(); if (instrumentationName == null || instrumentationName.isEmpty()) { instrumentationName = "ROOT"; } LogRecordBuilder builder = - logEmitterProvider.logEmitterBuilder(instrumentationName).build().logBuilder(); + loggerProvider.loggerBuilder(instrumentationName).build().logRecordBuilder(); mapLoggingEvent(builder, event); builder.emit(); } @@ -169,7 +169,7 @@ public final class LoggingEventMapper { private static void setThrowable(AttributesBuilder attributes, Throwable throwable) { // TODO (trask) extract method for recording exception into - // instrumentation-appender-api-internal + // io.opentelemetry:opentelemetry-api-logs attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); StringWriter writer = new StringWriter(); diff --git a/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppenderConfigTest.java b/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppenderConfigTest.java index 0c7c83bce3..73fcfeee7a 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppenderConfigTest.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppenderConfigTest.java @@ -8,15 +8,16 @@ package io.opentelemetry.instrumentation.logback.appender.v1_0; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; -import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.Severity; -import io.opentelemetry.sdk.logs.export.InMemoryLogExporter; -import io.opentelemetry.sdk.logs.export.SimpleLogProcessor; +import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.data.LogRecordData; +import io.opentelemetry.sdk.logs.export.InMemoryLogRecordExporter; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; @@ -37,38 +38,38 @@ class OpenTelemetryAppenderConfigTest { private static final Logger logger = LoggerFactory.getLogger("TestLogger"); - private static InMemoryLogExporter logExporter; + private static InMemoryLogRecordExporter logRecordExporter; private static Resource resource; private static InstrumentationScopeInfo instrumentationScopeInfo; @BeforeAll static void setupAll() { - logExporter = InMemoryLogExporter.create(); + logRecordExporter = InMemoryLogRecordExporter.create(); resource = Resource.getDefault(); instrumentationScopeInfo = InstrumentationScopeInfo.create("TestLogger"); - SdkLogEmitterProvider logEmitterProvider = - SdkLogEmitterProvider.builder() + SdkLoggerProvider loggerProvider = + SdkLoggerProvider.builder() .setResource(resource) - .addLogProcessor(SimpleLogProcessor.create(logExporter)) + .addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter)) .build(); - OpenTelemetryAppender.resetSdkLogEmitterProviderForTest(); - OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider); + GlobalLoggerProvider.resetForTest(); + GlobalLoggerProvider.set(loggerProvider); } @BeforeEach void setup() { - logExporter.reset(); + logRecordExporter.reset(); } @Test void logNoSpan() { logger.info("log message 1"); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("log message 1"); @@ -83,7 +84,7 @@ class OpenTelemetryAppenderConfigTest { Span span2 = runWithSpan("span2", () -> logger.info("log message 3")); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(3); assertThat(logDataList.get(0).getSpanContext()).isEqualTo(span1.getSpanContext()); assertThat(logDataList.get(1).getSpanContext()).isEqualTo(SpanContext.getInvalid()); @@ -107,9 +108,9 @@ class OpenTelemetryAppenderConfigTest { Marker marker = MarkerFactory.getMarker(markerName); logger.info(marker, "log message 1", new IllegalStateException("Error!")); - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("log message 1"); @@ -155,9 +156,9 @@ class OpenTelemetryAppenderConfigTest { MDC.clear(); } - List logDataList = logExporter.getFinishedLogItems(); + List logDataList = logRecordExporter.getFinishedLogItems(); assertThat(logDataList).hasSize(1); - LogData logData = logDataList.get(0); + LogRecordData logData = logDataList.get(0); assertThat(logData.getResource()).isEqualTo(resource); assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo); assertThat(logData.getBody().asString()).isEqualTo("log message 1"); diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/build.gradle.kts b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/build.gradle.kts new file mode 100644 index 0000000000..3ce92db5b1 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +dependencies { + // this instrumentation needs to be able to reference both the OpenTelemetry API + // that is shaded in the bootstrap class loader (for sending telemetry to the agent), + // and the OpenTelemetry API that the user brings (in order to capture that telemetry) + // + // since (all) instrumentation already uses OpenTelemetry API for sending telemetry to the agent, + // this instrumentation uses a "temporarily shaded" OpenTelemetry API to represent the + // OpenTelemetry API that the user brings + // + // then later, after the OpenTelemetry API in the bootstrap class loader is shaded, + // the "temporarily shaded" OpenTelemetry API is unshaded, so that it will apply to the + // OpenTelemetry API that the user brings + // + // so in the code "application.io.opentelemetry.*" refers to the (unshaded) OpenTelemetry API that + // the application brings (as those references will be translated during the build to remove the + // "application." prefix) + // + // and in the code "io.opentelemetry.*" refers to the (shaded) OpenTelemetry API that is used by + // the agent (as those references will later be shaded) + compileOnly("io.opentelemetry:opentelemetry-api-logs") + compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "shadow")) + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")) + + testImplementation("io.opentelemetry:opentelemetry-sdk-logs") +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryApiLogsInstrumentationModule.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryApiLogsInstrumentationModule.java new file mode 100644 index 0000000000..d7553b977e --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryApiLogsInstrumentationModule.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.Collections; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class OpenTelemetryApiLogsInstrumentationModule extends InstrumentationModule { + public OpenTelemetryApiLogsInstrumentationModule() { + super("opentelemetry-api-logs"); + } + + @Override + public List typeInstrumentations() { + return Collections.singletonList(new OpenTelemetryLogsInstrumentation()); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryLogsInstrumentation.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryLogsInstrumentation.java new file mode 100644 index 0000000000..baac74a958 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/OpenTelemetryLogsInstrumentation.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs; + +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isStatic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge.ApplicationLoggerProvider; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +// Our convention for accessing agent package +@SuppressWarnings("UnnecessarilyFullyQualified") +public class OpenTelemetryLogsInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("application.io.opentelemetry.api.logs.GlobalLoggerProvider"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod().and(isStatic()).and(named("get")).and(takesArguments(0)), + OpenTelemetryLogsInstrumentation.class.getName() + "$GetGlobalLogsAdvice"); + } + + @SuppressWarnings("unused") + public static class GetGlobalLogsAdvice { + + @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) + public static Object onEnter() { + return null; + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void methodExit( + @Advice.Return(readOnly = false) + application.io.opentelemetry.api.logs.LoggerProvider loggerProvider) { + loggerProvider = ApplicationLoggerProvider.INSTANCE; + } + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogRecordBuilder.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogRecordBuilder.java new file mode 100644 index 0000000000..7d9e0d35cc --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogRecordBuilder.java @@ -0,0 +1,84 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge; + +import application.io.opentelemetry.api.common.AttributeKey; +import application.io.opentelemetry.api.logs.EventBuilder; +import application.io.opentelemetry.api.logs.LogRecordBuilder; +import application.io.opentelemetry.api.logs.Severity; +import application.io.opentelemetry.context.Context; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.Bridging; +import java.time.Instant; +import java.util.concurrent.TimeUnit; + +class ApplicationLogRecordBuilder implements EventBuilder { + + private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder; + + ApplicationLogRecordBuilder(io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) { + this.agentLogRecordBuilder = agentLogRecordBuilder; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setEpoch(long l, TimeUnit timeUnit) { + agentLogRecordBuilder.setEpoch(l, timeUnit); + return this; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setEpoch(Instant instant) { + agentLogRecordBuilder.setEpoch(instant); + return this; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setContext(Context context) { + agentLogRecordBuilder.setContext(AgentContextStorage.getAgentContext(context)); + return this; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setSeverity(Severity severity) { + agentLogRecordBuilder.setSeverity(LogBridging.toAgent(severity)); + return this; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setSeverityText(String s) { + agentLogRecordBuilder.setSeverityText(s); + return this; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setBody(String s) { + agentLogRecordBuilder.setBody(s); + return this; + } + + @Override + @CanIgnoreReturnValue + public LogRecordBuilder setAttribute(AttributeKey attributeKey, T t) { + @SuppressWarnings("unchecked") + io.opentelemetry.api.common.AttributeKey agentKey = Bridging.toAgent(attributeKey); + if (agentKey != null) { + agentLogRecordBuilder.setAttribute(agentKey, t); + } + return this; + } + + @Override + public void emit() { + agentLogRecordBuilder.emit(); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogger.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogger.java new file mode 100644 index 0000000000..4ac8066b0e --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLogger.java @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge; + +import application.io.opentelemetry.api.logs.EventBuilder; +import application.io.opentelemetry.api.logs.LogRecordBuilder; +import application.io.opentelemetry.api.logs.Logger; + +class ApplicationLogger implements Logger { + + private final io.opentelemetry.api.logs.Logger agentLogger; + + ApplicationLogger(io.opentelemetry.api.logs.Logger agentLogger) { + this.agentLogger = agentLogger; + } + + @Override + public EventBuilder eventBuilder(String eventName) { + return new ApplicationLogRecordBuilder(agentLogger.eventBuilder(eventName)); + } + + @Override + public LogRecordBuilder logRecordBuilder() { + return new ApplicationLogRecordBuilder(agentLogger.logRecordBuilder()); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerBuilder.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerBuilder.java new file mode 100644 index 0000000000..ac37063f70 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerBuilder.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge; + +import application.io.opentelemetry.api.logs.Logger; +import application.io.opentelemetry.api.logs.LoggerBuilder; +import com.google.errorprone.annotations.CanIgnoreReturnValue; + +final class ApplicationLoggerBuilder implements LoggerBuilder { + + private final io.opentelemetry.api.logs.LoggerBuilder agentBuilder; + + ApplicationLoggerBuilder(io.opentelemetry.api.logs.LoggerBuilder agentBuilder) { + this.agentBuilder = agentBuilder; + } + + @Override + @CanIgnoreReturnValue + public LoggerBuilder setEventDomain(String eventDomain) { + agentBuilder.setEventDomain(eventDomain); + return this; + } + + @Override + @CanIgnoreReturnValue + public LoggerBuilder setSchemaUrl(String schemaUrl) { + agentBuilder.setSchemaUrl(schemaUrl); + return this; + } + + @Override + @CanIgnoreReturnValue + public LoggerBuilder setInstrumentationVersion(String version) { + agentBuilder.setInstrumentationVersion(version); + return this; + } + + @Override + public Logger build() { + return new ApplicationLogger(agentBuilder.build()); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerProvider.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerProvider.java new file mode 100644 index 0000000000..d5a822c3b7 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/ApplicationLoggerProvider.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge; + +import application.io.opentelemetry.api.logs.LoggerBuilder; +import application.io.opentelemetry.api.logs.LoggerProvider; + +// Our convention for accessing agent packages. +@SuppressWarnings("UnnecessarilyFullyQualified") +public class ApplicationLoggerProvider implements LoggerProvider { + + public static final LoggerProvider INSTANCE = new ApplicationLoggerProvider(); + + private final io.opentelemetry.api.logs.LoggerProvider agentLoggerProvider; + + public ApplicationLoggerProvider() { + this.agentLoggerProvider = io.opentelemetry.api.logs.GlobalLoggerProvider.get(); + } + + @Override + public LoggerBuilder loggerBuilder(String instrumentationName) { + return new ApplicationLoggerBuilder(agentLoggerProvider.loggerBuilder(instrumentationName)); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/LogBridging.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/LogBridging.java new file mode 100644 index 0000000000..a6459dddd9 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/bridge/LogBridging.java @@ -0,0 +1,47 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge; + +import application.io.opentelemetry.api.logs.Severity; +import java.util.EnumMap; + +/** + * This class translates between the (unshaded) OpenTelemetry API that the application brings and + * the (shaded) OpenTelemetry API that is used by the agent. + * + *

"application.io.opentelemetry.*" refers to the (unshaded) OpenTelemetry API that the + * application brings (as those references will be translated during the build to remove the + * "application." prefix). + * + *

"io.opentelemetry.*" refers to the (shaded) OpenTelemetry API that is used by the agent (as + * those references will later be shaded). + * + *

Also see comments in this module's gradle file. + */ +// Our convention for accessing agent package +@SuppressWarnings("UnnecessarilyFullyQualified") +public class LogBridging { + + private static final EnumMap severityMap; + + static { + severityMap = new EnumMap<>(Severity.class); + for (Severity severity : Severity.values()) { + try { + severityMap.put(severity, io.opentelemetry.api.logs.Severity.valueOf(severity.name())); + } catch (IllegalArgumentException e) { + // No mapping exists for this severity, ignore + } + } + } + + public static io.opentelemetry.api.logs.Severity toAgent(Severity applicationSeverity) { + return severityMap.getOrDefault( + applicationSeverity, io.opentelemetry.api.logs.Severity.UNDEFINED_SEVERITY_NUMBER); + } + + private LogBridging() {} +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/LoggerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/LoggerTest.java new file mode 100644 index 0000000000..7f70555bb6 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-logs-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/logs/LoggerTest.java @@ -0,0 +1,89 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.logs.GlobalLoggerProvider; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.sdk.trace.IdGenerator; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.extension.RegisterExtension; + +class LoggerTest { + + @RegisterExtension + static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); + + private String instrumentationName; + private Logger logger; + + @BeforeEach + void setupLogger(TestInfo test) { + instrumentationName = "test-" + test.getDisplayName(); + logger = + GlobalLoggerProvider.get() + .loggerBuilder(instrumentationName) + .setInstrumentationVersion("1.2.3") + .setSchemaUrl("http://schema.org") + .build(); + } + + @Test + void logRecordBuilder() { + SpanContext spanContext = + SpanContext.create( + IdGenerator.random().generateTraceId(), + IdGenerator.random().generateSpanId(), + TraceFlags.getDefault(), + TraceState.getDefault()); + + logger + .logRecordBuilder() + .setEpoch(1, TimeUnit.SECONDS) + .setEpoch(Instant.now()) + .setContext(Context.current().with(Span.wrap(spanContext))) + .setSeverity(Severity.DEBUG) + .setSeverityText("debug") + .setBody("body") + .setAttribute(AttributeKey.stringKey("key"), "value") + .setAllAttributes(Attributes.builder().put("key", "value").build()) + .emit(); + + await() + .untilAsserted( + () -> + assertThat(testing.logRecords()) + .satisfiesExactly( + logRecordData -> { + assertThat(logRecordData.getInstrumentationScopeInfo().getName()) + .isEqualTo(instrumentationName); + assertThat(logRecordData.getInstrumentationScopeInfo().getVersion()) + .isEqualTo("1.2.3"); + assertThat(logRecordData.getEpochNanos()).isGreaterThan(0); + assertThat(logRecordData.getSpanContext()).isEqualTo(spanContext); + assertThat(logRecordData.getSeverity()).isEqualTo(Severity.DEBUG); + assertThat(logRecordData.getSeverityText()).isEqualTo("debug"); + assertThat(logRecordData.getBody().asString()).isEqualTo("body"); + assertThat(logRecordData.getAttributes()) + .isEqualTo(Attributes.builder().put("key", "value").build()); + })); + } +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index abd7dcc320..03effd41bd 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -32,13 +32,16 @@ dependencies { compileOnly("io.opentelemetry:opentelemetry-extension-annotations") compileOnly("io.opentelemetry:opentelemetry-extension-trace-propagators") compileOnly("io.opentelemetry:opentelemetry-extension-aws") - compileOnly("io.opentelemetry:opentelemetry-sdk-extension-resources") compileOnly("io.opentelemetry:opentelemetry-exporter-logging") compileOnly("io.opentelemetry:opentelemetry-exporter-jaeger") compileOnly("io.opentelemetry:opentelemetry-exporter-otlp") compileOnly("io.opentelemetry:opentelemetry-exporter-zipkin") compileOnly(project(":instrumentation-annotations")) + compileOnly(project(":instrumentation:resources:library")) + annotationProcessor("com.google.auto.service:auto-service") + compileOnly("com.google.auto.service:auto-service-annotations") + testImplementation("org.springframework.kafka:spring-kafka:2.9.0") testImplementation("org.springframework.boot:spring-boot-starter-actuator:$springBootVersion") testImplementation("org.springframework.boot:spring-boot-starter-aop:$springBootVersion") @@ -52,7 +55,7 @@ dependencies { testImplementation(project(":testing-common")) testImplementation("io.opentelemetry:opentelemetry-sdk") testImplementation("io.opentelemetry:opentelemetry-sdk-testing") - testImplementation("io.opentelemetry:opentelemetry-sdk-extension-resources") + testImplementation(project(":instrumentation:resources:library")) testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") testImplementation("io.opentelemetry:opentelemetry-extension-annotations") testImplementation("io.opentelemetry:opentelemetry-extension-trace-propagators") diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/OtelResourceAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/OtelResourceAutoConfiguration.java index aa5bf5b63f..722677db68 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/OtelResourceAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/OtelResourceAutoConfiguration.java @@ -5,18 +5,18 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.resources; +import io.opentelemetry.instrumentation.resources.ContainerResource; +import io.opentelemetry.instrumentation.resources.ContainerResourceProvider; +import io.opentelemetry.instrumentation.resources.HostResource; +import io.opentelemetry.instrumentation.resources.HostResourceProvider; +import io.opentelemetry.instrumentation.resources.OsResource; +import io.opentelemetry.instrumentation.resources.OsResourceProvider; +import io.opentelemetry.instrumentation.resources.ProcessResource; +import io.opentelemetry.instrumentation.resources.ProcessResourceProvider; +import io.opentelemetry.instrumentation.resources.ProcessRuntimeResource; +import io.opentelemetry.instrumentation.resources.ProcessRuntimeResourceProvider; import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration; import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider; -import io.opentelemetry.sdk.extension.resources.ContainerResource; -import io.opentelemetry.sdk.extension.resources.ContainerResourceProvider; -import io.opentelemetry.sdk.extension.resources.HostResource; -import io.opentelemetry.sdk.extension.resources.HostResourceProvider; -import io.opentelemetry.sdk.extension.resources.OsResource; -import io.opentelemetry.sdk.extension.resources.OsResourceProvider; -import io.opentelemetry.sdk.extension.resources.ProcessResource; -import io.opentelemetry.sdk.extension.resources.ProcessResourceProvider; -import io.opentelemetry.sdk.extension.resources.ProcessRuntimeResource; -import io.opentelemetry.sdk.extension.resources.ProcessRuntimeResourceProvider; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/javaagent-bootstrap/build.gradle.kts b/javaagent-bootstrap/build.gradle.kts index f693c545f4..8cff55f24e 100644 --- a/javaagent-bootstrap/build.gradle.kts +++ b/javaagent-bootstrap/build.gradle.kts @@ -7,7 +7,6 @@ group = "io.opentelemetry.javaagent" dependencies { implementation(project(":instrumentation-api")) - implementation(project(":instrumentation-appender-api-internal")) testImplementation(project(":testing-common")) } diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentLogEmitterProvider.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentLogEmitterProvider.java deleted file mode 100644 index 55820d769b..0000000000 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentLogEmitterProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap; - -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder; - -public final class AgentLogEmitterProvider { - - private static final LogEmitterProviderHolder delegate = new LogEmitterProviderHolder(); - - /** Returns the registered global {@link LogEmitterProvider}. */ - public static LogEmitterProvider get() { - return delegate.get(); - } - - /** - * Sets the {@link LogEmitterProvider} that should be used by the agent. Future calls to {@link - * #get()} will return the provided {@link LogEmitterProvider} instance. It should only be called - * once - an attempt to call it a second time will result in an error. If trying to set the - * instance {@link LogEmitterProvider} multiple times in tests, use {@link - * LogEmitterProviderHolder#resetForTest()} between them. - */ - public static void set(LogEmitterProvider logEmitterProvider) { - delegate.set(logEmitterProvider); - } - - /** - * Unsets the {@link LogEmitterProvider}. This is only meant to be used from tests which need to - * reconfigure {@link LogEmitterProvider}. - */ - public static void resetForTest() { - delegate.resetForTest(); - } - - private AgentLogEmitterProvider() {} -} diff --git a/javaagent-tooling/build.gradle.kts b/javaagent-tooling/build.gradle.kts index 0c2fc7afa7..43817420b7 100644 --- a/javaagent-tooling/build.gradle.kts +++ b/javaagent-tooling/build.gradle.kts @@ -14,11 +14,11 @@ dependencies { implementation(project(":javaagent-tooling:javaagent-tooling-java9")) implementation(project(":instrumentation-api")) implementation(project(":instrumentation-annotations-support")) - implementation(project(":instrumentation-appender-api-internal")) - implementation(project(":instrumentation-appender-sdk-internal")) + implementation(project(":instrumentation:resources:library")) implementation(project(":muzzle")) implementation("io.opentelemetry:opentelemetry-api") + implementation("io.opentelemetry:opentelemetry-api-logs") implementation("io.opentelemetry:opentelemetry-sdk") implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") implementation("io.opentelemetry:opentelemetry-sdk-metrics") @@ -26,7 +26,6 @@ dependencies { implementation("io.opentelemetry:opentelemetry-extension-kotlin") implementation("io.opentelemetry:opentelemetry-extension-aws") implementation("io.opentelemetry:opentelemetry-extension-trace-propagators") - implementation("io.opentelemetry:opentelemetry-sdk-extension-resources") // the incubator's ViewConfigCustomizer is used to support loading yaml-based metric views implementation("io.opentelemetry:opentelemetry-sdk-extension-incubator") diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java index 195c30411c..1c3eaf64b2 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstaller.java @@ -5,16 +5,12 @@ package io.opentelemetry.javaagent.tooling; -import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider; -import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider; import io.opentelemetry.javaagent.bootstrap.AgentInitializer; -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider; import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import io.opentelemetry.sdk.common.CompletableResultCode; -import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; import java.util.Arrays; public final class OpenTelemetryInstaller { @@ -42,16 +38,11 @@ public final class OpenTelemetryInstaller { (timeout, unit) -> { CompletableResultCode traceResult = sdk.getSdkTracerProvider().forceFlush(); CompletableResultCode metricsResult = sdk.getSdkMeterProvider().forceFlush(); - CompletableResultCode.ofAll(Arrays.asList(traceResult, metricsResult)) + CompletableResultCode logsResult = sdk.getSdkLoggerProvider().forceFlush(); + CompletableResultCode.ofAll(Arrays.asList(traceResult, metricsResult, logsResult)) .join(timeout, unit); }); - SdkLogEmitterProvider sdkLogEmitterProvider = - autoConfiguredSdk.getOpenTelemetrySdk().getSdkLogEmitterProvider(); - LogEmitterProvider logEmitterProvider = - DelegatingLogEmitterProvider.from(sdkLogEmitterProvider); - AgentLogEmitterProvider.set(logEmitterProvider); - return autoConfiguredSdk; } diff --git a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.groovy b/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.groovy index 1dadfd9380..b63d9ceb7e 100755 --- a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.groovy +++ b/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.groovy @@ -7,19 +7,19 @@ package io.opentelemetry.javaagent.tooling import io.opentelemetry.api.GlobalOpenTelemetry import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider +import io.opentelemetry.api.logs.GlobalLoggerProvider import spock.lang.Specification class OpenTelemetryInstallerTest extends Specification { void setup() { GlobalOpenTelemetry.resetForTest() - AgentLogEmitterProvider.resetForTest() + GlobalLoggerProvider.resetForTest() } void cleanup() { GlobalOpenTelemetry.resetForTest() - AgentLogEmitterProvider.resetForTest() + GlobalLoggerProvider.resetForTest() } def "should initialize GlobalOpenTelemetry"() { diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoaderTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoaderTest.java index a46b30d489..acfc2cae99 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoaderTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileLoaderTest.java @@ -10,6 +10,7 @@ import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.logs.GlobalLoggerProvider; import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; @@ -31,6 +32,7 @@ class ConfigurationFileLoaderTest { @AfterAll static void cleanUp() { GlobalOpenTelemetry.resetForTest(); + GlobalLoggerProvider.resetForTest(); } // regression for https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/6696 diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index 795303daad..900b7a9cbb 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -34,6 +34,7 @@ val javaagentLibs by configurations.creating { listOf(baseJavaagentLibs, javaagentLibs).forEach { it.run { exclude("io.opentelemetry", "opentelemetry-api") + exclude("io.opentelemetry", "opentelemetry-api-logs") exclude("io.opentelemetry", "opentelemetry-semconv") } } @@ -44,9 +45,10 @@ val licenseReportDependencies by configurations.creating { dependencies { bootstrapLibs(project(":instrumentation-api")) + // opentelemetry-api is an api dependency of :instrumentation-api, but opentelemetry-api-logs is not + bootstrapLibs("io.opentelemetry:opentelemetry-api-logs") bootstrapLibs(project(":instrumentation-api-semconv")) bootstrapLibs(project(":instrumentation-annotations-support")) - bootstrapLibs(project(":instrumentation-appender-api-internal")) bootstrapLibs(project(":javaagent-bootstrap")) // extension-api contains both bootstrap packages and agent packages @@ -296,7 +298,6 @@ fun ShadowJar.excludeBootstrapClasses() { exclude(project(":instrumentation-api")) exclude(project(":instrumentation-api-semconv")) exclude(project(":instrumentation-annotations-support")) - exclude(project(":instrumentation-appender-api-internal")) exclude(project(":javaagent-bootstrap")) } diff --git a/licenses/licenses.md b/licenses/licenses.md index b4dd0b1059..57faf575b7 100644 --- a/licenses/licenses.md +++ b/licenses/licenses.md @@ -1,7 +1,7 @@ #javaagent ##Dependency License Report -_2022-10-11 10:41:57 PDT_ +_2022-10-11 13:01:17 PDT_ ## Apache License, Version 2.0 **1** **Group:** `com.blogspot.mydailyjava` **Name:** `weak-lock-free` **Version:** `0.18` @@ -37,103 +37,103 @@ _2022-10-11 10:41:57 PDT_ > - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**7** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.18.0` +**7** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**8** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.18.0` +**8** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-logs` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**9** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.18.0` +**9** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.19.0` +> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) +> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) + +**10** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**10** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-jaeger` **Version:** `1.18.0` +**11** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-jaeger` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**11** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.18.0` +**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.18.0` +**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.18.0` +**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.18.0` +**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-logs` **Version:** `1.18.0-alpha` +**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-logs` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.18.0-alpha` +**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.18.0` +**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-aws` **Version:** `1.18.0` +**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-aws` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.18.0` +**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.18.0` +**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.18.0` +**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.18.0` +**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.18.0-alpha` +**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.18.0` +**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.18.0-alpha` +**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.18.0` +**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-resources` **Version:** `1.18.0` +**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.18.0-alpha` +**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.18.0` +**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.19.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.18.0` -> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) -> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) - -**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-semconv` **Version:** `1.18.0-alpha` +**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-semconv` **Version:** `1.19.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) diff --git a/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts b/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts index 303b2a1e8b..4845bbf4cd 100644 --- a/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts +++ b/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts @@ -28,6 +28,7 @@ val v1_10 by configurations.creating { dependencies { latestDeps("io.opentelemetry:opentelemetry-api") + latestDeps("io.opentelemetry:opentelemetry-api-logs") listOf("opentelemetry-api", "opentelemetry-context").forEach { v1_10Deps("io.opentelemetry:$it") { diff --git a/settings.gradle.kts b/settings.gradle.kts index 185d046943..484b1b120a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -111,8 +111,6 @@ include(":bom") include(":bom-alpha") include(":instrumentation-api") include(":instrumentation-api-semconv") -include(":instrumentation-appender-api-internal") -include(":instrumentation-appender-sdk-internal") include(":instrumentation-annotations") include(":instrumentation-annotations-support") include(":instrumentation-annotations-support-testing") @@ -363,6 +361,7 @@ include(":instrumentation:okhttp:okhttp-3.0:testing") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.10:javaagent") +include(":instrumentation:opentelemetry-api:opentelemetry-api-logs-1.19:javaagent") include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent") include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:javaagent") diff --git a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/InstrumentationSpecification.groovy b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/InstrumentationSpecification.groovy index b0b8d5c7df..6bc478c6a4 100644 --- a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/InstrumentationSpecification.groovy +++ b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/InstrumentationSpecification.groovy @@ -15,7 +15,7 @@ import io.opentelemetry.instrumentation.testing.InstrumentationTestRunner import io.opentelemetry.instrumentation.testing.util.ContextStorageCloser import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier -import io.opentelemetry.sdk.logs.data.LogData +import io.opentelemetry.sdk.logs.data.LogRecordData import io.opentelemetry.sdk.metrics.data.MetricData import io.opentelemetry.sdk.trace.data.SpanData import org.junit.Rule @@ -72,8 +72,8 @@ abstract class InstrumentationSpecification extends Specification { } /** Return a list of all captured logs. */ - List getLogs() { - testRunner().getExportedLogs() + List getLogRecords() { + testRunner().getExportedLogRecords() } /** diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/AgentTestRunner.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/AgentTestRunner.java index 59f83b9c59..dab38d0a8d 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/AgentTestRunner.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/AgentTestRunner.java @@ -12,7 +12,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.test.utils.LoggerUtils; import io.opentelemetry.javaagent.testing.common.AgentTestingExporterAccess; import io.opentelemetry.javaagent.testing.common.TestAgentListenerAccess; -import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.trace.data.SpanData; import java.util.List; @@ -84,8 +84,8 @@ public final class AgentTestRunner extends InstrumentationTestRunner { } @Override - public List getExportedLogs() { - return AgentTestingExporterAccess.getExportedLogs(); + public List getExportedLogRecords() { + return AgentTestingExporterAccess.getExportedLogRecords(); } @Override diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/InstrumentationTestRunner.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/InstrumentationTestRunner.java index 064e57d834..8938f571cf 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/InstrumentationTestRunner.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/InstrumentationTestRunner.java @@ -11,7 +11,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil; import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable; import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier; -import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.testing.assertj.TracesAssert; @@ -53,7 +53,7 @@ public abstract class InstrumentationTestRunner { public abstract List getExportedMetrics(); - public abstract List getExportedLogs(); + public abstract List getExportedLogRecords(); public abstract boolean forceFlushCalled(); diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java index 7b88a12348..e22444cb99 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java @@ -13,7 +13,7 @@ import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.common.CompletableResultCode; -import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.MetricData; @@ -122,7 +122,7 @@ public final class LibraryTestRunner extends InstrumentationTestRunner { } @Override - public List getExportedLogs() { + public List getExportedLogRecords() { // no logs support yet return Collections.emptyList(); } diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java index 22572836c9..082934274a 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java @@ -16,7 +16,7 @@ import io.opentelemetry.instrumentation.testing.util.ContextStorageCloser; import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable; import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.SpanData; @@ -76,8 +76,8 @@ public abstract class InstrumentationExtension } /** Return a list of all captured logs. */ - public List logs() { - return testRunner.getExportedLogs(); + public List logRecords() { + return testRunner.getExportedLogRecords(); } /** diff --git a/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java b/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java index e97567718b..71ead85af9 100644 --- a/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java +++ b/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java @@ -14,6 +14,7 @@ import static java.util.stream.Collectors.toList; import com.google.protobuf.InvalidProtocolBufferException; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; @@ -44,8 +45,7 @@ import io.opentelemetry.proto.trace.v1.ScopeSpans; import io.opentelemetry.proto.trace.v1.Span; import io.opentelemetry.proto.trace.v1.Status; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.Severity; +import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.DoublePointData; import io.opentelemetry.sdk.metrics.data.HistogramPointData; @@ -63,7 +63,7 @@ import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryPointData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableValueAtQuantile; -import io.opentelemetry.sdk.testing.logs.TestLogData; +import io.opentelemetry.sdk.testing.logs.TestLogRecordData; import io.opentelemetry.sdk.testing.trace.TestSpanData; import io.opentelemetry.sdk.trace.data.EventData; import io.opentelemetry.sdk.trace.data.LinkData; @@ -276,7 +276,7 @@ public final class AgentTestingExporterAccess { } @SuppressWarnings("unchecked") - public static List getExportedLogs() { + public static List getExportedLogRecords() { List exportRequests; try { exportRequests = (List) getLogExportRequests.invokeExact(); @@ -296,7 +296,7 @@ public final class AgentTestingExporterAccess { }) .flatMap(request -> request.getResourceLogsList().stream()) .collect(toList()); - List logs = new ArrayList<>(); + List logs = new ArrayList<>(); for (ResourceLogs resourceLogs : allResourceLogs) { Resource resource = resourceLogs.getResource(); for (ScopeLogs ilLogs : resourceLogs.getScopeLogsList()) { @@ -391,11 +391,11 @@ public final class AgentTestingExporterAccess { } } - private static LogData createLogData( + private static LogRecordData createLogData( LogRecord logRecord, io.opentelemetry.sdk.resources.Resource resource, InstrumentationScopeInfo instrumentationScopeInfo) { - return TestLogData.builder() + return TestLogRecordData.builder() .setResource(resource) .setInstrumentationScopeInfo(instrumentationScopeInfo) .setEpoch(logRecord.getTimeUnixNano(), TimeUnit.NANOSECONDS) diff --git a/testing/agent-exporter/build.gradle.kts b/testing/agent-exporter/build.gradle.kts index f4067f9991..063a7d3a01 100644 --- a/testing/agent-exporter/build.gradle.kts +++ b/testing/agent-exporter/build.gradle.kts @@ -16,9 +16,6 @@ dependencies { compileOnly(project(":javaagent-bootstrap")) compileOnly(project(":javaagent-tooling")) - compileOnly(project(":instrumentation-appender-api-internal")) - compileOnly(project(":instrumentation-appender-sdk-internal")) - implementation("io.opentelemetry:opentelemetry-exporter-otlp-common") compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") } diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingCustomizer.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingCustomizer.java index 357803f63d..3c4d7aef69 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingCustomizer.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingCustomizer.java @@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.testing.exporter; import com.google.auto.service.AutoService; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; -import io.opentelemetry.sdk.logs.export.SimpleLogProcessor; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; import io.opentelemetry.sdk.metrics.export.MetricReader; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; @@ -40,9 +40,9 @@ public class AgentTestingCustomizer implements AutoConfigurationCustomizerProvid autoConfigurationCustomizer.addMeterProviderCustomizer( (meterProvider, config) -> meterProvider.registerMetricReader(metricReader)); - autoConfigurationCustomizer.addLogEmitterProviderCustomizer( + autoConfigurationCustomizer.addLoggerProviderCustomizer( (logProvider, config) -> - logProvider.addLogProcessor( - SimpleLogProcessor.create(AgentTestingExporterFactory.logExporter))); + logProvider.addLogRecordProcessor( + SimpleLogRecordProcessor.create(AgentTestingExporterFactory.logExporter))); } } diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingExporterFactory.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingExporterFactory.java index fd7900eadd..e9d88c3faf 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingExporterFactory.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingExporterFactory.java @@ -12,7 +12,7 @@ public final class AgentTestingExporterFactory { static final OtlpInMemorySpanExporter spanExporter = new OtlpInMemorySpanExporter(); static final OtlpInMemoryMetricExporter metricExporter = new OtlpInMemoryMetricExporter(); - static final OtlpInMemoryLogExporter logExporter = new OtlpInMemoryLogExporter(); + static final OtlpInMemoryLogRecordExporter logExporter = new OtlpInMemoryLogRecordExporter(); public static List getSpanExportRequests() { return spanExporter.getCollectedExportRequests(); diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/OtlpInMemoryLogExporter.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/OtlpInMemoryLogRecordExporter.java similarity index 71% rename from testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/OtlpInMemoryLogExporter.java rename to testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/OtlpInMemoryLogRecordExporter.java index 29f753df11..0875fbfee9 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/OtlpInMemoryLogExporter.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/OtlpInMemoryLogRecordExporter.java @@ -9,8 +9,8 @@ import static java.util.logging.Level.INFO; import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler; import io.opentelemetry.sdk.common.CompletableResultCode; -import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.export.LogExporter; +import io.opentelemetry.sdk.logs.data.LogRecordData; +import io.opentelemetry.sdk.logs.export.LogRecordExporter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UncheckedIOException; @@ -21,9 +21,10 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.logging.Logger; -class OtlpInMemoryLogExporter implements LogExporter { +class OtlpInMemoryLogRecordExporter implements LogRecordExporter { - private static final Logger logger = Logger.getLogger(OtlpInMemoryLogExporter.class.getName()); + private static final Logger logger = + Logger.getLogger(OtlpInMemoryLogRecordExporter.class.getName()); private final Queue collectedRequests = new ConcurrentLinkedQueue<>(); @@ -36,13 +37,13 @@ class OtlpInMemoryLogExporter implements LogExporter { } @Override - public CompletableResultCode export(Collection logs) { - for (LogData log : logs) { - logger.log(INFO, "Exporting log {0}", log); + public CompletableResultCode export(Collection logRecords) { + for (LogRecordData logRecord : logRecords) { + logger.log(INFO, "Exporting log {0}", logRecord); } ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { - LogsRequestMarshaler.create(logs).writeBinaryTo(bos); + LogsRequestMarshaler.create(logRecords).writeBinaryTo(bos); } catch (IOException e) { throw new UncheckedIOException(e); }