diff --git a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java index a7a00e187f..6301c9ff8d 100644 --- a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java +++ b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java @@ -8,23 +8,31 @@ package io.opentelemetry.sdk.extension.zpages; import com.sun.net.httpserver.HttpServer; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.trace.SdkTracerManagement; +import io.opentelemetry.sdk.trace.SpanProcessor; import java.io.IOException; import java.net.InetSocketAddress; import java.util.Arrays; -import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** * A collection of HTML pages to display stats and trace data and allow library configuration - * control. + * control. To use, add {@linkplain ZPageServer#getSpanProcessor() the z-pages span processor} to a + * {@link io.opentelemetry.sdk.trace.SdkTracerProviderBuilder}. Currently all tracers can only be + * made visible to a singleton {@link ZPageServer}. * *

Example usage with private {@link HttpServer} * *

{@code
  * public class Main {
  *   public static void main(String[] args) throws Exception {
+ *     OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
+ *         .setTracerProvider(SdkTracerProvider.builder()
+ *             .addSpanProcessor(ZPageServer.getSpanProcessor())
+ *             .build();
+ *         .build();
+ *
  *     ZPageServer.startHttpServerAndRegisterAllPages(8000);
  *     ... // do work
  *   }
@@ -36,6 +44,12 @@ import javax.annotation.concurrent.ThreadSafe;
  * 
{@code
  * public class Main {
  *   public static void main(String[] args) throws Exception {
+ *     OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
+ *         .setTracerProvider(SdkTracerProvider.builder()
+ *             .addSpanProcessor(ZPageServer.getSpanProcessor())
+ *             .build();
+ *         .build();
+ *
  *     HttpServer server = HttpServer.create(new InetSocketAddress(8000), 10);
  *     ZPageServer.registerAllPagesToHttpServer(server);
  *     server.start();
@@ -68,17 +82,16 @@ public final class ZPageServer {
       new IndexZPageHandler(Arrays.asList(tracezZPageHandler, traceConfigzZPageHandler));
 
   private static final Object mutex = new Object();
-  private static final AtomicBoolean isTracezSpanProcesserAdded = new AtomicBoolean(false);
 
   @GuardedBy("mutex")
   @Nullable
   private static HttpServer server;
 
-  /** Function that adds the {@link TracezSpanProcessor} to the {@link SdkTracerManagement}. */
-  private static void addTracezSpanProcessor() {
-    if (isTracezSpanProcesserAdded.compareAndSet(/* expectedValue=*/ false, /* newValue=*/ true)) {
-      TRACER_SDK_MANAGEMENT.addSpanProcessor(tracezSpanProcessor);
-    }
+  /**
+   * Returns a {@link SpanProcessor} which will allow processing of spans by {@link ZPageServer}.
+   */
+  public static SpanProcessor getSpanProcessor() {
+    return tracezSpanProcessor;
   }
 
   /**
@@ -107,7 +120,6 @@ public final class ZPageServer {
    * @param server the {@link HttpServer} for the page to register to.
    */
   static void registerTracezZPageHandler(HttpServer server) {
-    addTracezSpanProcessor();
     server.createContext(tracezZPageHandler.getUrlPath(), new ZPageHttpHandler(tracezZPageHandler));
   }
 
@@ -181,15 +193,5 @@ public final class ZPageServer {
             });
   }
 
-  /**
-   * Returns the boolean indicating if TracezSpanProcessor is added. For testing purpose only.
-   *
-   * @return the boolean indicating if TracezSpanProcessor is added.
-   */
-  // Visible for testing
-  static boolean getIsTracezSpanProcesserAdded() {
-    return isTracezSpanProcesserAdded.get();
-  }
-
   private ZPageServer() {}
 }
diff --git a/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java b/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java
index 00953d9b7c..1bbfbe9edc 100644
--- a/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java
+++ b/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java
@@ -7,27 +7,12 @@ package io.opentelemetry.sdk.extension.zpages;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import com.sun.net.httpserver.HttpServer;
-import java.io.IOException;
-import java.net.InetSocketAddress;
 import org.junit.jupiter.api.Test;
 
-/** Unit tests for {@link ZPageServer}. */
-public final class ZPageServerTest {
+class ZPageServerTest {
+
   @Test
-  void tracezSpanProcessorOnlyAddedOnce() throws IOException {
-    // tracezSpanProcessor is not added yet
-    assertThat(ZPageServer.getIsTracezSpanProcesserAdded()).isFalse();
-    HttpServer server = null;
-    try {
-      server = HttpServer.create(new InetSocketAddress(0), 5);
-      ZPageServer.registerAllPagesToHttpServer(server);
-      // tracezSpanProcessor is added
-      assertThat(ZPageServer.getIsTracezSpanProcesserAdded()).isTrue();
-    } finally {
-      if (server != null) {
-        server.stop(0);
-      }
-    }
+  void spanProcessor() {
+    assertThat(ZPageServer.getSpanProcessor()).isInstanceOf(TracezSpanProcessor.class);
   }
 }