Prechádzať zdrojové kódy

Move appender api to internal (#5080)

* rename artifacts and packages

* Library users shouldn't need to use internal

* Update docs

* Rename in order to simplify HelperClassPredicate

* Spotless

* Move AgentLogEmitterProvider to javaagent-instrumentation-api
Trask Stalnaker 3 rokov pred
rodič
commit
f7da97bd9d
51 zmenil súbory, kde vykonal 254 pridanie a 191 odobranie
  1. 1 1
      conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-instrumentation.gradle.kts
  2. 1 1
      conventions/src/main/kotlin/otel.java-conventions.gradle.kts
  3. 0 53
      instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/GlobalLogEmitterProvider.java
  4. 0 0
      instrumentation-appender-api-internal/build.gradle.kts
  5. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogBuilder.java
  6. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitter.java
  7. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterBuilder.java
  8. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProvider.java
  9. 50 0
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolder.java
  10. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogBuilder.java
  11. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitter.java
  12. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterBuilder.java
  13. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterProvider.java
  14. 1 1
      instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/Severity.java
  15. 17 15
      instrumentation-appender-api-internal/src/test/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolderTest.java
  16. 1 1
      instrumentation-appender-sdk-internal/build.gradle.kts
  17. 3 3
      instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogBuilder.java
  18. 3 3
      instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitter.java
  19. 3 3
      instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterBuilder.java
  20. 3 3
      instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterProvider.java
  21. 1 1
      instrumentation/java-util-logging/javaagent/build.gradle.kts
  22. 6 5
      instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java
  23. 1 1
      instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingInstrumentation.java
  24. 1 1
      instrumentation/log4j/log4j-appender-1.2/javaagent/build.gradle.kts
  25. 1 1
      instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jAppenderInstrumentation.java
  26. 6 5
      instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jHelper.java
  27. 1 1
      instrumentation/log4j/log4j-appender-2.16/javaagent/build.gradle.kts
  28. 1 1
      instrumentation/log4j/log4j-appender-2.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_16/Log4jAppenderInstrumentation.java
  29. 3 3
      instrumentation/log4j/log4j-appender-2.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_16/Log4jHelper.java
  30. 7 16
      instrumentation/log4j/log4j-appender-2.16/library/README.md
  31. 3 2
      instrumentation/log4j/log4j-appender-2.16/library/build.gradle.kts
  32. 29 3
      instrumentation/log4j/log4j-appender-2.16/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/OpenTelemetryAppender.java
  33. 4 3
      instrumentation/log4j/log4j-appender-2.16/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/internal/LogEventMapper.java
  34. 2 4
      instrumentation/log4j/log4j-appender-2.16/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/OpenTelemetryAppenderConfigTest.java
  35. 1 1
      instrumentation/log4j/log4j-appender-2.16/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/internal/LogEventMapperTest.java
  36. 0 1
      instrumentation/log4j/log4j-context-data/log4j-context-data-2.16/library-autoconfigure/README.md
  37. 1 1
      instrumentation/logback/logback-appender-1.0/javaagent/build.gradle.kts
  38. 3 2
      instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackInstrumentation.java
  39. 11 19
      instrumentation/logback/logback-appender-1.0/library/README.md
  40. 2 2
      instrumentation/logback/logback-appender-1.0/library/build.gradle.kts
  41. 27 1
      instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java
  42. 7 9
      instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java
  43. 2 4
      instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppenderConfigTest.java
  44. 0 1
      instrumentation/logback/logback-mdc-1.0/library/README.md
  45. 2 0
      javaagent-instrumentation-api/build.gradle.kts
  46. 30 0
      javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/appender/internal/AgentLogEmitterProvider.java
  47. 2 2
      javaagent-tooling/build.gradle.kts
  48. 2 2
      javaagent/build.gradle.kts
  49. 2 2
      settings.gradle.kts
  50. 2 2
      testing/agent-exporter/build.gradle.kts
  51. 3 3
      testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingLogsCustomizer.java

+ 1 - 1
conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-instrumentation.gradle.kts

@@ -7,7 +7,7 @@ plugins {
 dependencies {
 dependencies {
   add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")
   add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")
   add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-annotation-support")
   add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-annotation-support")
-  add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-appender")
+  add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal")
   add("muzzleBootstrap", "io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api")
   add("muzzleBootstrap", "io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api")
   add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
   add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
   add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")
   add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")

+ 1 - 1
conventions/src/main/kotlin/otel.java-conventions.gradle.kts

@@ -326,7 +326,7 @@ configurations.configureEach {
     dependencySubstitution {
     dependencySubstitution {
       substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")).using(project(":instrumentation-api"))
       substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")).using(project(":instrumentation-api"))
       substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-annotation-support")).using(project(":instrumentation-api-annotation-support"))
       substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-annotation-support")).using(project(":instrumentation-api-annotation-support"))
-      substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-appender")).using(project(":instrumentation-api-appender"))
+      substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal")).using(project(":instrumentation-appender-api-internal"))
       substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api")).using(project(":javaagent-instrumentation-api"))
       substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api")).using(project(":javaagent-instrumentation-api"))
       substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap")).using(project(":javaagent-bootstrap"))
       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-extension-api")).using(project(":javaagent-extension-api"))

+ 0 - 53
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/GlobalLogEmitterProvider.java

@@ -1,53 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.instrumentation.api.appender;
-
-import java.util.concurrent.atomic.AtomicReference;
-import javax.annotation.Nullable;
-
-public final class GlobalLogEmitterProvider {
-
-  private static final AtomicReference<LogEmitterProvider> globalLogEmitterProvider =
-      new AtomicReference<>(NoopLogEmitterProvider.INSTANCE);
-
-  @Nullable private static volatile Throwable setGlobalCaller;
-
-  /** Returns the registered global {@link LogEmitterProvider}. */
-  public static LogEmitterProvider get() {
-    return globalLogEmitterProvider.get();
-  }
-
-  /**
-   * Sets the {@link LogEmitterProvider} that should be the global 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 global {@link LogEmitterProvider} multiple times
-   * in tests, use {@link GlobalLogEmitterProvider#resetForTest()} between them.
-   */
-  public static void set(LogEmitterProvider logEmitterProvider) {
-    boolean changed =
-        globalLogEmitterProvider.compareAndSet(NoopLogEmitterProvider.INSTANCE, logEmitterProvider);
-    if (!changed && (logEmitterProvider != NoopLogEmitterProvider.INSTANCE)) {
-      throw new IllegalStateException(
-          "GlobalLogEmitterProvider.set has already been called. GlobalLogEmitterProvider.set "
-              + "must be called only once before any calls to GlobalLogEmitterProvider.get. "
-              + "Previous invocation set to cause of this exception.",
-          setGlobalCaller);
-    }
-    setGlobalCaller = new Throwable();
-  }
-
-  /**
-   * Unsets the global {@link LogEmitterProvider}. This is only meant to be used from tests which
-   * need to reconfigure {@link LogEmitterProvider}.
-   */
-  public static void resetForTest() {
-    globalLogEmitterProvider.set(NoopLogEmitterProvider.INSTANCE);
-  }
-
-  private GlobalLogEmitterProvider() {}
-}

+ 0 - 0
instrumentation-api-appender/build.gradle.kts → instrumentation-appender-api-internal/build.gradle.kts


+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/LogBuilder.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogBuilder.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/LogEmitter.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitter.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 import javax.annotation.concurrent.ThreadSafe;
 import javax.annotation.concurrent.ThreadSafe;
 
 

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/LogEmitterBuilder.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterBuilder.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 /** Builder class for creating {@link LogEmitter} instances. */
 /** Builder class for creating {@link LogEmitter} instances. */
 public interface LogEmitterBuilder {
 public interface LogEmitterBuilder {

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/LogEmitterProvider.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProvider.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 public interface LogEmitterProvider {
 public interface LogEmitterProvider {
 
 

+ 50 - 0
instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolder.java

@@ -0,0 +1,50 @@
+/*
+ * 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;
+
+public final class LogEmitterProviderHolder {
+
+  private final AtomicReference<LogEmitterProvider> 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);
+  }
+}

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/NoopLogBuilder.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogBuilder.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/NoopLogEmitter.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitter.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 final class NoopLogEmitter implements LogEmitter {
 final class NoopLogEmitter implements LogEmitter {
 
 

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/NoopLogEmitterBuilder.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterBuilder.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 final class NoopLogEmitterBuilder implements LogEmitterBuilder {
 final class NoopLogEmitterBuilder implements LogEmitterBuilder {
 
 

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/NoopLogEmitterProvider.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/NoopLogEmitterProvider.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 final class NoopLogEmitterProvider implements LogEmitterProvider {
 final class NoopLogEmitterProvider implements LogEmitterProvider {
 
 

+ 1 - 1
instrumentation-api-appender/src/main/java/io/opentelemetry/instrumentation/api/appender/Severity.java → instrumentation-appender-api-internal/src/main/java/io/opentelemetry/instrumentation/api/appender/internal/Severity.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 public enum Severity {
 public enum Severity {
   UNDEFINED_SEVERITY_NUMBER(0),
   UNDEFINED_SEVERITY_NUMBER(0),

+ 17 - 15
instrumentation-api-appender/src/test/java/io/opentelemetry/instrumentation/api/appender/GlobalLogEmitterProviderTest.java → instrumentation-appender-api-internal/src/test/java/io/opentelemetry/instrumentation/api/appender/internal/LogEmitterProviderHolderTest.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.api.appender;
+package io.opentelemetry.instrumentation.api.appender.internal;
 
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -14,51 +14,53 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
 
 
-class GlobalLogEmitterProviderTest {
+class LogEmitterProviderHolderTest {
+
+  private static final LogEmitterProviderHolder holder = new LogEmitterProviderHolder();
 
 
   @BeforeAll
   @BeforeAll
   static void beforeClass() {
   static void beforeClass() {
-    GlobalLogEmitterProvider.resetForTest();
+    holder.resetForTest();
   }
   }
 
 
   @AfterEach
   @AfterEach
   void after() {
   void after() {
-    GlobalLogEmitterProvider.resetForTest();
+    holder.resetForTest();
   }
   }
 
 
   @Test
   @Test
   void testGlobalBeforeSet() {
   void testGlobalBeforeSet() {
-    assertThat(GlobalLogEmitterProvider.get()).isSameAs(NoopLogEmitterProvider.INSTANCE);
+    assertThat(holder.get()).isSameAs(NoopLogEmitterProvider.INSTANCE);
   }
   }
 
 
   @Test
   @Test
   void setThenSet() {
   void setThenSet() {
     setLogEmitterProvider();
     setLogEmitterProvider();
-    assertThatThrownBy(() -> GlobalLogEmitterProvider.set(mock(LogEmitterProvider.class)))
+    assertThatThrownBy(() -> holder.set(mock(LogEmitterProvider.class)))
         .isInstanceOf(IllegalStateException.class)
         .isInstanceOf(IllegalStateException.class)
-        .hasMessageContaining("GlobalLogEmitterProvider.set has already been called")
+        .hasMessageContaining("LogEmitterProviderHolder.set has already been called")
         .hasStackTraceContaining("setLogEmitterProvider");
         .hasStackTraceContaining("setLogEmitterProvider");
   }
   }
 
 
   @Test
   @Test
   void getThenSet() {
   void getThenSet() {
-    LogEmitterProvider existingProvider = GlobalLogEmitterProvider.get();
+    LogEmitterProvider existingProvider = holder.get();
     assertSame(existingProvider, NoopLogEmitterProvider.INSTANCE);
     assertSame(existingProvider, NoopLogEmitterProvider.INSTANCE);
     LogEmitterProvider newProvider = mock(LogEmitterProvider.class);
     LogEmitterProvider newProvider = mock(LogEmitterProvider.class);
-    GlobalLogEmitterProvider.set(newProvider);
-    assertSame(newProvider, GlobalLogEmitterProvider.get());
+    holder.set(newProvider);
+    assertSame(newProvider, holder.get());
   }
   }
 
 
   @Test
   @Test
   void okToSetNoopMultipleTimes() {
   void okToSetNoopMultipleTimes() {
-    GlobalLogEmitterProvider.set(NoopLogEmitterProvider.INSTANCE);
-    GlobalLogEmitterProvider.set(NoopLogEmitterProvider.INSTANCE);
-    GlobalLogEmitterProvider.set(NoopLogEmitterProvider.INSTANCE);
-    GlobalLogEmitterProvider.set(NoopLogEmitterProvider.INSTANCE);
+    holder.set(NoopLogEmitterProvider.INSTANCE);
+    holder.set(NoopLogEmitterProvider.INSTANCE);
+    holder.set(NoopLogEmitterProvider.INSTANCE);
+    holder.set(NoopLogEmitterProvider.INSTANCE);
     // pass
     // pass
   }
   }
 
 
   private static void setLogEmitterProvider() {
   private static void setLogEmitterProvider() {
-    GlobalLogEmitterProvider.set(mock(LogEmitterProvider.class));
+    holder.set(mock(LogEmitterProvider.class));
   }
   }
 }
 }

+ 1 - 1
instrumentation-sdk-appender/build.gradle.kts → instrumentation-appender-sdk-internal/build.gradle.kts

@@ -9,7 +9,7 @@ plugins {
 group = "io.opentelemetry.instrumentation"
 group = "io.opentelemetry.instrumentation"
 
 
 dependencies {
 dependencies {
-  api(project(":instrumentation-api-appender"))
+  api(project(":instrumentation-appender-api-internal"))
 
 
   api("io.opentelemetry:opentelemetry-sdk-logs")
   api("io.opentelemetry:opentelemetry-sdk-logs")
 }
 }

+ 3 - 3
instrumentation-sdk-appender/src/main/java/io/opentelemetry/instrumentation/sdk/appender/DelegatingLogBuilder.java → instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogBuilder.java

@@ -3,12 +3,12 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.sdk.appender;
+package io.opentelemetry.instrumentation.sdk.appender.internal;
 
 
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
-import io.opentelemetry.instrumentation.api.appender.Severity;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.Severity;
 import java.time.Instant;
 import java.time.Instant;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 

+ 3 - 3
instrumentation-sdk-appender/src/main/java/io/opentelemetry/instrumentation/sdk/appender/DelegatingLogEmitter.java → instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitter.java

@@ -3,10 +3,10 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.sdk.appender;
+package io.opentelemetry.instrumentation.sdk.appender.internal;
 
 
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
-import io.opentelemetry.instrumentation.api.appender.LogEmitter;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitter;
 
 
 final class DelegatingLogEmitter implements LogEmitter {
 final class DelegatingLogEmitter implements LogEmitter {
 
 

+ 3 - 3
instrumentation-sdk-appender/src/main/java/io/opentelemetry/instrumentation/sdk/appender/DelegatingLogEmitterBuilder.java → instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterBuilder.java

@@ -3,10 +3,10 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.sdk.appender;
+package io.opentelemetry.instrumentation.sdk.appender.internal;
 
 
-import io.opentelemetry.instrumentation.api.appender.LogEmitter;
-import io.opentelemetry.instrumentation.api.appender.LogEmitterBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitter;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterBuilder;
 
 
 final class DelegatingLogEmitterBuilder implements LogEmitterBuilder {
 final class DelegatingLogEmitterBuilder implements LogEmitterBuilder {
 
 

+ 3 - 3
instrumentation-sdk-appender/src/main/java/io/opentelemetry/instrumentation/sdk/appender/DelegatingLogEmitterProvider.java → instrumentation-appender-sdk-internal/src/main/java/io/opentelemetry/instrumentation/sdk/appender/internal/DelegatingLogEmitterProvider.java

@@ -3,10 +3,10 @@
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  */
  */
 
 
-package io.opentelemetry.instrumentation.sdk.appender;
+package io.opentelemetry.instrumentation.sdk.appender.internal;
 
 
-import io.opentelemetry.instrumentation.api.appender.LogEmitterBuilder;
-import io.opentelemetry.instrumentation.api.appender.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 
 
 public final class DelegatingLogEmitterProvider implements LogEmitterProvider {
 public final class DelegatingLogEmitterProvider implements LogEmitterProvider {

+ 1 - 1
instrumentation/java-util-logging/javaagent/build.gradle.kts

@@ -5,7 +5,7 @@ plugins {
 dependencies {
 dependencies {
   compileOnly(project(":instrumentation:java-util-logging:shaded-stub-for-instrumenting"))
   compileOnly(project(":instrumentation:java-util-logging:shaded-stub-for-instrumenting"))
 
 
-  compileOnly(project(":instrumentation-api-appender"))
+  compileOnly(project(":instrumentation-appender-api-internal"))
 
 
   testImplementation("org.awaitility:awaitility")
   testImplementation("org.awaitility:awaitility")
 }
 }

+ 6 - 5
instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java

@@ -9,9 +9,9 @@ import application.java.util.logging.Logger;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
-import io.opentelemetry.instrumentation.api.appender.Severity;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.Severity;
+import io.opentelemetry.javaagent.instrumentation.api.appender.internal.AgentLogEmitterProvider;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import java.io.PrintWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.StringWriter;
@@ -32,7 +32,7 @@ public final class JavaUtilLoggingHelper {
     }
     }
 
 
     LogBuilder builder =
     LogBuilder builder =
-        GlobalLogEmitterProvider.get()
+        AgentLogEmitterProvider.get()
             .logEmitterBuilder(logRecord.getLoggerName())
             .logEmitterBuilder(logRecord.getLoggerName())
             .build()
             .build()
             .logBuilder();
             .logBuilder();
@@ -73,7 +73,8 @@ public final class JavaUtilLoggingHelper {
     if (throwable != null) {
     if (throwable != null) {
       AttributesBuilder attributes = Attributes.builder();
       AttributesBuilder attributes = Attributes.builder();
 
 
-      // TODO (trask) extract method for recording exception into instrumentation-api-appender
+      // TODO (trask) extract method for recording exception into
+      // instrumentation-appender-api-internal
       attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
       attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
       attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
       attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
       StringWriter writer = new StringWriter();
       StringWriter writer = new StringWriter();

+ 1 - 1
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 static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 
 
 import application.java.util.logging.Logger;
 import application.java.util.logging.Logger;
-import io.opentelemetry.instrumentation.api.appender.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;

+ 1 - 1
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
   // 1.2 introduces MDC and there's no version earlier than 1.2.4 available
   library("log4j:log4j:1.2.4")
   library("log4j:log4j:1.2.4")
 
 
-  compileOnly(project(":instrumentation-api-appender"))
+  compileOnly(project(":instrumentation-appender-api-internal"))
 
 
   testImplementation("org.awaitility:awaitility")
   testImplementation("org.awaitility:awaitility")
 }
 }

+ 1 - 1
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.takesArgument;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 
 
-import io.opentelemetry.instrumentation.api.appender.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;

+ 6 - 5
instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/Log4jHelper.java

@@ -8,9 +8,9 @@ package io.opentelemetry.javaagent.instrumentation.log4j.appender.v1_2;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
-import io.opentelemetry.instrumentation.api.appender.Severity;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.Severity;
+import io.opentelemetry.javaagent.instrumentation.api.appender.internal.AgentLogEmitterProvider;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import java.io.PrintWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.StringWriter;
@@ -25,7 +25,7 @@ public final class Log4jHelper {
   // TODO (trask) capture MDC
   // TODO (trask) capture MDC
   public static void capture(Category logger, Priority level, Object message, Throwable throwable) {
   public static void capture(Category logger, Priority level, Object message, Throwable throwable) {
     LogBuilder builder =
     LogBuilder builder =
-        GlobalLogEmitterProvider.get().logEmitterBuilder(logger.getName()).build().logBuilder();
+        AgentLogEmitterProvider.get().logEmitterBuilder(logger.getName()).build().logBuilder();
 
 
     // message
     // message
     if (message != null) {
     if (message != null) {
@@ -42,7 +42,8 @@ public final class Log4jHelper {
     if (throwable != null) {
     if (throwable != null) {
       AttributesBuilder attributes = Attributes.builder();
       AttributesBuilder attributes = Attributes.builder();
 
 
-      // TODO (trask) extract method for recording exception into instrumentation-api-appender
+      // TODO (trask) extract method for recording exception into
+      // instrumentation-appender-api-internal
       attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
       attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
       attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
       attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
       StringWriter writer = new StringWriter();
       StringWriter writer = new StringWriter();

+ 1 - 1
instrumentation/log4j/log4j-appender-2.16/javaagent/build.gradle.kts

@@ -14,7 +14,7 @@ muzzle {
 dependencies {
 dependencies {
   library("org.apache.logging.log4j:log4j-core:2.16.0")
   library("org.apache.logging.log4j:log4j-core:2.16.0")
 
 
-  compileOnly(project(":instrumentation-api-appender"))
+  compileOnly(project(":instrumentation-appender-api-internal"))
 
 
   implementation(project(":instrumentation:log4j:log4j-appender-2.16:library"))
   implementation(project(":instrumentation:log4j:log4j-appender-2.16:library"))
 
 

+ 1 - 1
instrumentation/log4j/log4j-appender-2.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_16/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.takesArgument;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 
 
-import io.opentelemetry.instrumentation.api.appender.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;

+ 3 - 3
instrumentation/log4j/log4j-appender-2.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_16/Log4jHelper.java

@@ -5,10 +5,10 @@
 
 
 package io.opentelemetry.javaagent.instrumentation.log4j.appender.v2_16;
 package io.opentelemetry.javaagent.instrumentation.log4j.appender.v2_16;
 
 
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.ContextDataAccessor;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.ContextDataAccessor;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.LogEventMapper;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.LogEventMapper;
+import io.opentelemetry.javaagent.instrumentation.api.appender.internal.AgentLogEmitterProvider;
 import java.util.Map;
 import java.util.Map;
 import java.util.function.BiConsumer;
 import java.util.function.BiConsumer;
 import javax.annotation.Nullable;
 import javax.annotation.Nullable;
@@ -25,7 +25,7 @@ public final class Log4jHelper {
   public static void capture(Logger logger, Level level, Message message, Throwable throwable) {
   public static void capture(Logger logger, Level level, Message message, Throwable throwable) {
 
 
     LogBuilder builder =
     LogBuilder builder =
-        GlobalLogEmitterProvider.get().logEmitterBuilder(logger.getName()).build().logBuilder();
+        AgentLogEmitterProvider.get().logEmitterBuilder(logger.getName()).build().logBuilder();
     Map<String, String> contextData = ThreadContext.getImmutableContext();
     Map<String, String> contextData = ThreadContext.getImmutableContext();
     mapper.mapLogEvent(builder, message, level, throwable, null, contextData);
     mapper.mapLogEvent(builder, message, level, throwable, null, contextData);
     builder.emit();
     builder.emit();

+ 7 - 16
instrumentation/log4j/log4j-appender-2.16/library/README.md

@@ -1,8 +1,8 @@
 # Log4j2 Appender
 # Log4j2 Appender
 
 
 This module provides a Log4j2 [appender](https://logging.apache.org/log4j/2.x/manual/appenders.html)
 This module provides a Log4j2 [appender](https://logging.apache.org/log4j/2.x/manual/appenders.html)
-which forwards Log4j2 log events to
-the [OpenTelemetry Log SDK](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk/logs).
+which forwards Log4j2 log events to the
+[OpenTelemetry Log SDK](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk/logs).
 
 
 To use it, add the following modules to your application's classpath.
 To use it, add the following modules to your application's classpath.
 
 
@@ -18,13 +18,6 @@ stable [release](https://search.maven.org/search?q=g:io.opentelemetry.instrument
     <groupId>io.opentelemetry.instrumentation</groupId>
     <groupId>io.opentelemetry.instrumentation</groupId>
     <artifactId>opentelemetry-log4j-2.16</artifactId>
     <artifactId>opentelemetry-log4j-2.16</artifactId>
     <version>OPENTELEMETRY_VERSION</version>
     <version>OPENTELEMETRY_VERSION</version>
-    <scope>runtime</scope>
-  </dependency>
-  <dependency>
-    <!-- The SDK appender is required to configure the appender with the OpenTelemetry Log SDK -->
-    <groupId>io.opentelemetry.instrumentation</groupId>
-    <artifactId>opentelemetry-instrumentation-sdk-appender</artifactId>
-    <version>OPENTELEMETRY_VERSION</version>
   </dependency>
   </dependency>
 </dependencies>
 </dependencies>
 ```
 ```
@@ -34,8 +27,6 @@ stable [release](https://search.maven.org/search?q=g:io.opentelemetry.instrument
 ```kotlin
 ```kotlin
 dependencies {
 dependencies {
   runtimeOnly("io.opentelemetry.instrumentation:opentelemetry-log4j-2.16:OPENTELEMETRY_VERSION")
   runtimeOnly("io.opentelemetry.instrumentation:opentelemetry-log4j-2.16:OPENTELEMETRY_VERSION")
-  // The SDK appender is required to configure the appender with the OpenTelemetry Log SDK
-  implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-sdk-appender:OPENTELEMETRY_VERSION")
 }
 }
 ```
 ```
 
 
@@ -61,7 +52,7 @@ The following demonstrates how you might configure the appender in your `log4j.x
 ```
 ```
 
 
 Next, associate the `OpenTelemetryAppender` configured via `log4j2.xml` with
 Next, associate the `OpenTelemetryAppender` configured via `log4j2.xml` with
-a `SdkLogEmitterProvider` in your application:
+an `SdkLogEmitterProvider` in your application:
 
 
 ```
 ```
 SdkLogEmitterProvider logEmitterProvider =
 SdkLogEmitterProvider logEmitterProvider =
@@ -69,10 +60,10 @@ SdkLogEmitterProvider logEmitterProvider =
     .setResource(Resource.create(...))
     .setResource(Resource.create(...))
     .addLogProcessor(...)
     .addLogProcessor(...)
     .build();
     .build();
-GlobalLogEmitterProvider.set(DelegatingLogEmitterProvider.from(logEmitterProvider));
+OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
 ```
 ```
 
 
 In this example Log4j2 log events will be sent to both the console appender and
 In this example Log4j2 log events will be sent to both the console appender and
-the `OpenTelemetryAppender`, which will drop the logs until `GlobalLogEmitterProvider.set(..)` is
-called. Once initialized, logs will be emitted to a `LogEmitter` obtained from
-the `SdkLogEmitterProvider`.
+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`.

+ 3 - 2
instrumentation/log4j/log4j-appender-2.16/library/build.gradle.kts

@@ -3,11 +3,12 @@ plugins {
 }
 }
 
 
 dependencies {
 dependencies {
-  api(project(":instrumentation-api-appender"))
+  implementation(project(":instrumentation-appender-api-internal"))
+  implementation(project(":instrumentation-appender-sdk-internal"))
 
 
   library("org.apache.logging.log4j:log4j-core:2.16.0")
   library("org.apache.logging.log4j:log4j-core:2.16.0")
 
 
-  testImplementation(project(":instrumentation-sdk-appender"))
+  testImplementation(project(":instrumentation-appender-sdk-internal"))
   testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
   testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
   testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
   testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
 
 

+ 29 - 3
instrumentation/log4j/log4j-appender-2.16/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/OpenTelemetryAppender.java

@@ -5,10 +5,13 @@
 
 
 package io.opentelemetry.instrumentation.log4j.appender.v2_16;
 package io.opentelemetry.instrumentation.log4j.appender.v2_16;
 
 
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.ContextDataAccessor;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.ContextDataAccessor;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.LogEventMapper;
 import io.opentelemetry.instrumentation.log4j.appender.v2_16.internal.LogEventMapper;
+import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
+import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.function.BiConsumer;
 import java.util.function.BiConsumer;
 import javax.annotation.Nullable;
 import javax.annotation.Nullable;
@@ -31,6 +34,9 @@ public class OpenTelemetryAppender extends AbstractAppender {
 
 
   static final String PLUGIN_NAME = "OpenTelemetry";
   static final String PLUGIN_NAME = "OpenTelemetry";
 
 
+  private static final LogEmitterProviderHolder logEmitterProviderHolder =
+      new LogEmitterProviderHolder();
+
   private static final LogEventMapper<ReadOnlyStringMap> mapper =
   private static final LogEventMapper<ReadOnlyStringMap> mapper =
       new LogEventMapper<>(ContextDataAccessorImpl.INSTANCE);
       new LogEventMapper<>(ContextDataAccessorImpl.INSTANCE);
 
 
@@ -61,7 +67,8 @@ public class OpenTelemetryAppender extends AbstractAppender {
   @Override
   @Override
   public void append(LogEvent event) {
   public void append(LogEvent event) {
     LogBuilder builder =
     LogBuilder builder =
-        GlobalLogEmitterProvider.get()
+        logEmitterProviderHolder
+            .get()
             .logEmitterBuilder(event.getLoggerName())
             .logEmitterBuilder(event.getLoggerName())
             .build()
             .build()
             .logBuilder();
             .logBuilder();
@@ -76,6 +83,25 @@ public class OpenTelemetryAppender extends AbstractAppender {
     builder.emit();
     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<ReadOnlyStringMap> {
   private enum ContextDataAccessorImpl implements ContextDataAccessor<ReadOnlyStringMap> {
     INSTANCE;
     INSTANCE;
 
 

+ 4 - 3
instrumentation/log4j/log4j-appender-2.16/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/internal/LogEventMapper.java

@@ -11,8 +11,8 @@ import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
-import io.opentelemetry.instrumentation.api.appender.Severity;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.Severity;
 import io.opentelemetry.instrumentation.api.cache.Cache;
 import io.opentelemetry.instrumentation.api.cache.Cache;
 import io.opentelemetry.instrumentation.api.config.Config;
 import io.opentelemetry.instrumentation.api.config.Config;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
@@ -182,7 +182,8 @@ public final class LogEventMapper<T> {
   }
   }
 
 
   private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
   private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
-    // TODO (trask) extract method for recording exception into instrumentation-api-appender
+    // TODO (trask) extract method for recording exception into
+    // instrumentation-appender-api-internal
     attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
     attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
     attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
     attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
     StringWriter writer = new StringWriter();
     StringWriter writer = new StringWriter();

+ 2 - 4
instrumentation/log4j/log4j-appender-2.16/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/OpenTelemetryAppenderConfigTest.java

@@ -12,8 +12,6 @@ import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.api.trace.SpanContext;
 import io.opentelemetry.api.trace.SpanContext;
 import io.opentelemetry.context.Scope;
 import io.opentelemetry.context.Scope;
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.sdk.appender.DelegatingLogEmitterProvider;
 import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
 import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.data.LogData;
 import io.opentelemetry.sdk.logs.data.LogData;
@@ -55,8 +53,8 @@ class OpenTelemetryAppenderConfigTest {
             .addLogProcessor(SimpleLogProcessor.create(logExporter))
             .addLogProcessor(SimpleLogProcessor.create(logExporter))
             .build();
             .build();
 
 
-    GlobalLogEmitterProvider.resetForTest();
-    GlobalLogEmitterProvider.set(DelegatingLogEmitterProvider.from(logEmitterProvider));
+    OpenTelemetryAppender.resetSdkLogEmitterProviderForTest();
+    OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
   }
   }
 
 
   @BeforeEach
   @BeforeEach

+ 1 - 1
instrumentation/log4j/log4j-appender-2.16/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_16/internal/LogEventMapperTest.java

@@ -17,7 +17,7 @@ import static org.mockito.Mockito.verify;
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.api.common.AttributesBuilder;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.function.BiConsumer;
 import java.util.function.BiConsumer;

+ 0 - 1
instrumentation/log4j/log4j-context-data/log4j-context-data-2.16/library-autoconfigure/README.md

@@ -17,7 +17,6 @@ stable [release](https://search.maven.org/search?q=g:io.opentelemetry.instrument
     <groupId>io.opentelemetry.instrumentation</groupId>
     <groupId>io.opentelemetry.instrumentation</groupId>
     <artifactId>opentelemetry-log4j-2.16-autoconfigure</artifactId>
     <artifactId>opentelemetry-log4j-2.16-autoconfigure</artifactId>
     <version>OPENTELEMETRY_VERSION</version>
     <version>OPENTELEMETRY_VERSION</version>
-    <scope>runtime</scope>
   </dependency>
   </dependency>
 </dependencies>
 </dependencies>
 ```
 ```

+ 1 - 1
instrumentation/logback/logback-appender-1.0/javaagent/build.gradle.kts

@@ -17,7 +17,7 @@ muzzle {
 dependencies {
 dependencies {
   library("ch.qos.logback:logback-classic:0.9.16")
   library("ch.qos.logback:logback-classic:0.9.16")
 
 
-  compileOnly(project(":instrumentation-api-appender"))
+  compileOnly(project(":instrumentation-appender-api-internal"))
 
 
   implementation(project(":instrumentation:logback:logback-appender-1.0:library"))
   implementation(project(":instrumentation:logback:logback-appender-1.0:library"))
 
 

+ 3 - 2
instrumentation/logback/logback-appender-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/appender/v1_0/LogbackInstrumentation.java

@@ -12,11 +12,12 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.classic.spi.ILoggingEvent;
-import io.opentelemetry.instrumentation.api.appender.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
 import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
 import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;
 import io.opentelemetry.javaagent.instrumentation.api.CallDepth;
+import io.opentelemetry.javaagent.instrumentation.api.appender.internal.AgentLogEmitterProvider;
 import net.bytebuddy.asm.Advice;
 import net.bytebuddy.asm.Advice;
 import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.matcher.ElementMatcher;
 import net.bytebuddy.matcher.ElementMatcher;
@@ -50,7 +51,7 @@ class LogbackInstrumentation implements TypeInstrumentation {
       // logging framework delegates to another
       // logging framework delegates to another
       callDepth = CallDepth.forClass(LogEmitterProvider.class);
       callDepth = CallDepth.forClass(LogEmitterProvider.class);
       if (callDepth.getAndIncrement() == 0) {
       if (callDepth.getAndIncrement() == 0) {
-        LoggingEventMapper.INSTANCE.capture(event);
+        LoggingEventMapper.INSTANCE.emit(AgentLogEmitterProvider.get(), event);
       }
       }
     }
     }
 
 

+ 11 - 19
instrumentation/logback/logback-appender-1.0/library/README.md

@@ -1,8 +1,8 @@
 # Logback Appender
 # Logback Appender
 
 
 This module provides a Logback [appender](https://logback.qos.ch/manual/appenders.html) which
 This module provides a Logback [appender](https://logback.qos.ch/manual/appenders.html) which
-forwards Logback log events to
-the [OpenTelemetry Log SDK](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk/logs)
+forwards Logback log events to the
+[OpenTelemetry Log SDK](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk/logs).
 
 
 To use it, add the following modules to your application's classpath.
 To use it, add the following modules to your application's classpath.
 
 
@@ -17,13 +17,6 @@ stable [release](https://search.maven.org/search?q=g:io.opentelemetry.instrument
     <groupId>io.opentelemetry.instrumentation</groupId>
     <groupId>io.opentelemetry.instrumentation</groupId>
     <artifactId>opentelemetry-logback-appender-1.0</artifactId>
     <artifactId>opentelemetry-logback-appender-1.0</artifactId>
     <version>OPENTELEMETRY_VERSION</version>
     <version>OPENTELEMETRY_VERSION</version>
-    <scope>runtime</scope>
-  </dependency>
-  <dependency>
-    <!-- The SDK appender is required to configure the appender with the OpenTelemetry Log SDK -->
-    <groupId>io.opentelemetry.instrumentation</groupId>
-    <artifactId>opentelemetry-instrumentation-sdk-appender</artifactId>
-    <version>OPENTELEMETRY_VERSION</version>
   </dependency>
   </dependency>
 </dependencies>
 </dependencies>
 ```
 ```
@@ -33,8 +26,6 @@ stable [release](https://search.maven.org/search?q=g:io.opentelemetry.instrument
 ```kotlin
 ```kotlin
 dependencies {
 dependencies {
   runtimeOnly("io.opentelemetry.instrumentation:opentelemetry-logback-appender-1.0:OPENTELEMETRY_VERSION")
   runtimeOnly("io.opentelemetry.instrumentation:opentelemetry-logback-appender-1.0:OPENTELEMETRY_VERSION")
-  // The SDK appender is required to configure the appender with the OpenTelemetry Log SDK
-  implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-sdk-appender:OPENTELEMETRY_VERSION")
 }
 }
 ```
 ```
 
 
@@ -51,19 +42,20 @@ The following demonstrates how you might configure the appender in your `logback
       </pattern>
       </pattern>
     </encoder>
     </encoder>
   </appender>
   </appender>
-  <appender name="OpenTelemetry" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
+  <appender name="OpenTelemetry"
+            class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
   </appender>
   </appender>
 
 
   <root level="INFO">
   <root level="INFO">
     <appender-ref ref="console"/>
     <appender-ref ref="console"/>
-    <appender-ref ref="OpenTelemetry" />
+    <appender-ref ref="OpenTelemetry"/>
   </root>
   </root>
 
 
 </configuration>
 </configuration>
 ```
 ```
 
 
-Next, associate the `OpenTelemetry` configured via `logback.xml` with a `SdkLogEmitterProvider` in
-your application:
+Next, associate the `OpenTelemetryAppender` configured via `logback.xml` with
+an `SdkLogEmitterProvider` in your application:
 
 
 ```
 ```
 SdkLogEmitterProvider logEmitterProvider =
 SdkLogEmitterProvider logEmitterProvider =
@@ -71,10 +63,10 @@ SdkLogEmitterProvider logEmitterProvider =
     .setResource(Resource.create(...))
     .setResource(Resource.create(...))
     .addLogProcessor(...)
     .addLogProcessor(...)
     .build();
     .build();
-GlobalLogEmitterProvider.set(DelegatingLogEmitterProvider.from(logEmitterProvider));
+OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
 ```
 ```
 
 
 In this example Logback log events will be sent to both the console appender and
 In this example Logback log events will be sent to both the console appender and
-the `OpenTelemetryAppender`, which will drop the logs until `GlobalLogEmitterProvider.set(..)` is
-called. Once initialized, logs will be emitted to a `LogEmitter` obtained from
-the `SdkLogEmitterProvider`.
+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`.

+ 2 - 2
instrumentation/logback/logback-appender-1.0/library/build.gradle.kts

@@ -3,13 +3,13 @@ plugins {
 }
 }
 
 
 dependencies {
 dependencies {
-  api(project(":instrumentation-api-appender"))
+  implementation(project(":instrumentation-appender-api-internal"))
+  implementation(project(":instrumentation-appender-sdk-internal"))
 
 
   library("ch.qos.logback:logback-classic:0.9.16")
   library("ch.qos.logback:logback-classic:0.9.16")
 
 
   latestDepTestLibrary("ch.qos.logback:logback-classic:1.2.+")
   latestDepTestLibrary("ch.qos.logback:logback-classic:1.2.+")
 
 
-  testImplementation(project(":instrumentation-sdk-appender"))
   testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
   testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
   testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
   testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
 
 

+ 27 - 1
instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java

@@ -7,14 +7,40 @@ package io.opentelemetry.instrumentation.logback.appender.v1_0;
 
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.AppenderBase;
 import ch.qos.logback.core.AppenderBase;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder;
 import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
 import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
+import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
+import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 
 
 public class OpenTelemetryAppender extends AppenderBase<ILoggingEvent> {
 public class OpenTelemetryAppender extends AppenderBase<ILoggingEvent> {
 
 
+  private static final LogEmitterProviderHolder logEmitterProviderHolder =
+      new LogEmitterProviderHolder();
+
   public OpenTelemetryAppender() {}
   public OpenTelemetryAppender() {}
 
 
   @Override
   @Override
   protected void append(ILoggingEvent event) {
   protected void append(ILoggingEvent event) {
-    LoggingEventMapper.INSTANCE.capture(event);
+    LoggingEventMapper.INSTANCE.emit(logEmitterProviderHolder.get(), event);
+  }
+
+  /**
+   * 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();
   }
   }
 }
 }

+ 7 - 9
instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java

@@ -14,9 +14,9 @@ import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.Context;
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.api.appender.LogBuilder;
-import io.opentelemetry.instrumentation.api.appender.Severity;
+import io.opentelemetry.instrumentation.api.appender.internal.LogBuilder;
+import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
+import io.opentelemetry.instrumentation.api.appender.internal.Severity;
 import io.opentelemetry.instrumentation.api.cache.Cache;
 import io.opentelemetry.instrumentation.api.cache.Cache;
 import io.opentelemetry.instrumentation.api.config.Config;
 import io.opentelemetry.instrumentation.api.config.Config;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
@@ -52,12 +52,9 @@ public final class LoggingEventMapper {
         captureMdcAttributes.size() == 1 && captureMdcAttributes.get(0).equals("*");
         captureMdcAttributes.size() == 1 && captureMdcAttributes.get(0).equals("*");
   }
   }
 
 
-  public void capture(ILoggingEvent event) {
+  public void emit(LogEmitterProvider logEmitterProvider, ILoggingEvent event) {
     LogBuilder builder =
     LogBuilder builder =
-        GlobalLogEmitterProvider.get()
-            .logEmitterBuilder(event.getLoggerName())
-            .build()
-            .logBuilder();
+        logEmitterProvider.logEmitterBuilder(event.getLoggerName()).build().logBuilder();
     mapLoggingEvent(builder, event);
     mapLoggingEvent(builder, event);
     builder.emit();
     builder.emit();
   }
   }
@@ -134,7 +131,8 @@ public final class LoggingEventMapper {
   }
   }
 
 
   private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
   private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
-    // TODO (trask) extract method for recording exception into instrumentation-api-appender
+    // TODO (trask) extract method for recording exception into
+    // instrumentation-appender-api-internal
     attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
     attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
     attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
     attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
     StringWriter writer = new StringWriter();
     StringWriter writer = new StringWriter();

+ 2 - 4
instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppenderConfigTest.java

@@ -12,8 +12,6 @@ import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.api.trace.SpanContext;
 import io.opentelemetry.api.trace.SpanContext;
 import io.opentelemetry.context.Scope;
 import io.opentelemetry.context.Scope;
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
-import io.opentelemetry.instrumentation.sdk.appender.DelegatingLogEmitterProvider;
 import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
 import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.data.LogData;
 import io.opentelemetry.sdk.logs.data.LogData;
@@ -54,8 +52,8 @@ class OpenTelemetryAppenderConfigTest {
             .addLogProcessor(SimpleLogProcessor.create(logExporter))
             .addLogProcessor(SimpleLogProcessor.create(logExporter))
             .build();
             .build();
 
 
-    GlobalLogEmitterProvider.resetForTest();
-    GlobalLogEmitterProvider.set(DelegatingLogEmitterProvider.from(logEmitterProvider));
+    OpenTelemetryAppender.resetSdkLogEmitterProviderForTest();
+    OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
   }
   }
 
 
   @BeforeEach
   @BeforeEach

+ 0 - 1
instrumentation/logback/logback-mdc-1.0/library/README.md

@@ -15,7 +15,6 @@ To use it, add the module to your application's runtime classpath and add the ap
     <groupId>io.opentelemetry.instrumentation</groupId>
     <groupId>io.opentelemetry.instrumentation</groupId>
     <artifactId>opentelemetry-logback-1.0</artifactId>
     <artifactId>opentelemetry-logback-1.0</artifactId>
     <version>0.17.0-alpha</version>
     <version>0.17.0-alpha</version>
-    <scope>runtime</scope>
   </dependency>
   </dependency>
 </dependencies>
 </dependencies>
 ```
 ```

+ 2 - 0
javaagent-instrumentation-api/build.gradle.kts

@@ -12,6 +12,8 @@ dependencies {
 
 
   implementation("org.slf4j:slf4j-api")
   implementation("org.slf4j:slf4j-api")
 
 
+  compileOnly(project(":instrumentation-appender-api-internal"))
+
   compileOnly("com.google.auto.value:auto-value-annotations")
   compileOnly("com.google.auto.value:auto-value-annotations")
   annotationProcessor("com.google.auto.value:auto-value")
   annotationProcessor("com.google.auto.value:auto-value")
 
 

+ 30 - 0
javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/appender/internal/AgentLogEmitterProvider.java

@@ -0,0 +1,30 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.javaagent.instrumentation.api.appender.internal;
+
+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.
+   */
+  public static void set(LogEmitterProvider logEmitterProvider) {
+    delegate.set(logEmitterProvider);
+  }
+
+  private AgentLogEmitterProvider() {}
+}

+ 2 - 2
javaagent-tooling/build.gradle.kts

@@ -15,8 +15,8 @@ dependencies {
   implementation(project(":javaagent-tooling:javaagent-tooling-java9"))
   implementation(project(":javaagent-tooling:javaagent-tooling-java9"))
   implementation(project(":instrumentation-api"))
   implementation(project(":instrumentation-api"))
   implementation(project(":instrumentation-api-annotation-support"))
   implementation(project(":instrumentation-api-annotation-support"))
-  implementation(project(":instrumentation-api-appender"))
-  implementation(project(":instrumentation-sdk-appender"))
+  implementation(project(":instrumentation-appender-api-internal"))
+  implementation(project(":instrumentation-appender-sdk-internal"))
   implementation(project(":muzzle"))
   implementation(project(":muzzle"))
 
 
   implementation("io.opentelemetry:opentelemetry-api")
   implementation("io.opentelemetry:opentelemetry-api")

+ 2 - 2
javaagent/build.gradle.kts

@@ -57,7 +57,7 @@ val licenseReportDependencies by configurations.creating {
 dependencies {
 dependencies {
   bootstrapLibs(project(":instrumentation-api"))
   bootstrapLibs(project(":instrumentation-api"))
   bootstrapLibs(project(":instrumentation-api-annotation-support"))
   bootstrapLibs(project(":instrumentation-api-annotation-support"))
-  bootstrapLibs(project(":instrumentation-api-appender"))
+  bootstrapLibs(project(":instrumentation-appender-api-internal"))
   bootstrapLibs(project(":javaagent-bootstrap"))
   bootstrapLibs(project(":javaagent-bootstrap"))
   bootstrapLibs(project(":javaagent-instrumentation-api"))
   bootstrapLibs(project(":javaagent-instrumentation-api"))
   bootstrapLibs("org.slf4j:slf4j-simple")
   bootstrapLibs("org.slf4j:slf4j-simple")
@@ -293,7 +293,7 @@ fun ShadowJar.excludeBootstrapJars() {
   dependencies {
   dependencies {
     exclude(project(":instrumentation-api"))
     exclude(project(":instrumentation-api"))
     exclude(project(":instrumentation-api-annotation-support"))
     exclude(project(":instrumentation-api-annotation-support"))
-    exclude(project(":instrumentation-api-appender"))
+    exclude(project(":instrumentation-appender-api-internal"))
     exclude(project(":javaagent-bootstrap"))
     exclude(project(":javaagent-bootstrap"))
     exclude(project(":javaagent-instrumentation-api"))
     exclude(project(":javaagent-instrumentation-api"))
   }
   }

+ 2 - 2
settings.gradle.kts

@@ -97,8 +97,8 @@ include(":javaagent")
 
 
 include(":bom-alpha")
 include(":bom-alpha")
 include(":instrumentation-api")
 include(":instrumentation-api")
-include(":instrumentation-api-appender")
-include(":instrumentation-sdk-appender")
+include(":instrumentation-appender-api-internal")
+include(":instrumentation-appender-sdk-internal")
 include(":javaagent-instrumentation-api")
 include(":javaagent-instrumentation-api")
 include(":instrumentation-api-annotation-support")
 include(":instrumentation-api-annotation-support")
 
 

+ 2 - 2
testing/agent-exporter/build.gradle.kts

@@ -15,8 +15,8 @@ dependencies {
   compileOnly(project(":javaagent-instrumentation-api"))
   compileOnly(project(":javaagent-instrumentation-api"))
   compileOnly(project(":javaagent-tooling"))
   compileOnly(project(":javaagent-tooling"))
 
 
-  compileOnly(project(":instrumentation-api-appender"))
-  compileOnly(project(":instrumentation-sdk-appender"))
+  compileOnly(project(":instrumentation-appender-api-internal"))
+  compileOnly(project(":instrumentation-appender-sdk-internal"))
 
 
   implementation("io.grpc:grpc-core:1.33.1")
   implementation("io.grpc:grpc-core:1.33.1")
   implementation("io.grpc:grpc-protobuf:1.33.1")
   implementation("io.grpc:grpc-protobuf:1.33.1")

+ 3 - 3
testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/exporter/AgentTestingLogsCustomizer.java

@@ -6,10 +6,10 @@
 package io.opentelemetry.javaagent.testing.exporter;
 package io.opentelemetry.javaagent.testing.exporter;
 
 
 import com.google.auto.service.AutoService;
 import com.google.auto.service.AutoService;
-import io.opentelemetry.instrumentation.api.appender.GlobalLogEmitterProvider;
 import io.opentelemetry.instrumentation.api.config.Config;
 import io.opentelemetry.instrumentation.api.config.Config;
-import io.opentelemetry.instrumentation.sdk.appender.DelegatingLogEmitterProvider;
+import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
 import io.opentelemetry.javaagent.extension.AgentListener;
 import io.opentelemetry.javaagent.extension.AgentListener;
+import io.opentelemetry.javaagent.instrumentation.api.appender.internal.AgentLogEmitterProvider;
 import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
 import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
 import io.opentelemetry.sdk.logs.export.BatchLogProcessor;
 import io.opentelemetry.sdk.logs.export.BatchLogProcessor;
@@ -28,6 +28,6 @@ public class AgentTestingLogsCustomizer implements AgentListener {
                 BatchLogProcessor.builder(AgentTestingExporterFactory.logExporter).build())
                 BatchLogProcessor.builder(AgentTestingExporterFactory.logExporter).build())
             .build();
             .build();
 
 
-    GlobalLogEmitterProvider.set(DelegatingLogEmitterProvider.from(logEmitterProvider));
+    AgentLogEmitterProvider.set(DelegatingLogEmitterProvider.from(logEmitterProvider));
   }
   }
 }
 }