Browse Source

Split out RpcAttributesGetter (#5548)

* Split out RpcAttributesGetter

* code review comments

* go back to RpcAttributesGetter
Mateusz Rzeszutek 3 years ago
parent
commit
1ee60aa6e6
28 changed files with 285 additions and 193 deletions
  1. 2 2
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java
  2. 0 64
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcAttributesExtractor.java
  3. 27 0
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcAttributesGetter.java
  4. 42 0
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcClientAttributesExtractor.java
  5. 39 0
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcCommonAttributesExtractor.java
  6. 28 0
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcServerAttributesExtractor.java
  7. 6 6
      instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcSpanNameExtractor.java
  8. 2 2
      instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java
  9. 16 6
      instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcAttributesExtractorTest.java
  10. 8 8
      instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcSpanNameExtractorTest.java
  11. 7 6
      instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesGetter.java
  12. 16 19
      instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTracingBuilder.java
  13. 4 4
      instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java
  14. 6 6
      instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkRpcAttributesGetter.java
  15. 1 5
      instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkSpanNameExtractor.java
  16. 3 2
      instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkInstrumenterFactory.java
  17. 6 7
      instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRpcAttributesGetter.java
  18. 7 6
      instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java
  19. 12 7
      instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTracingBuilder.java
  20. 7 5
      instrumentation/gwt-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtRpcAttributesGetter.java
  21. 4 4
      instrumentation/gwt-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtSingletons.java
  22. 6 5
      instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientAttributesGetter.java
  23. 4 3
      instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientSingletons.java
  24. 6 5
      instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/server/RmiServerAttributesGetter.java
  25. 4 3
      instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/server/RmiServerSingletons.java
  26. 10 8
      instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/SpringRmiSingletons.java
  27. 6 5
      instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/client/ClientAttributesGetter.java
  28. 6 5
      instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/server/ServerAttributesGetter.java

+ 2 - 2
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java

@@ -19,7 +19,7 @@ import io.opentelemetry.instrumentation.api.config.Config;
 import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor;
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.internal.SpanKey;
 import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
 import java.util.ArrayList;
@@ -171,7 +171,7 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
    *
    * <ul>
    *   <li>CLIENT nested spans are suppressed depending on their type: {@linkplain
-   *       HttpClientAttributesExtractor HTTP}, {@linkplain RpcAttributesExtractor RPC} or
+   *       HttpClientAttributesExtractor HTTP}, {@linkplain RpcClientAttributesExtractor RPC} or
    *       {@linkplain DbClientAttributesExtractor database} clients. If a span with the same type
    *       is present in the parent context object, new span of the same type will not be started.
    * </ul>

+ 0 - 64
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcAttributesExtractor.java

@@ -1,64 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.instrumentation.api.instrumenter.rpc;
-
-import io.opentelemetry.api.common.AttributesBuilder;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.instrumentation.api.annotations.UnstableApi;
-import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
-import io.opentelemetry.instrumentation.api.internal.SpanKey;
-import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
-import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
-import javax.annotation.Nullable;
-
-/**
- * Extractor of <a
- * href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md">RPC
- * attributes</a>. Instrumentations of RPC libraries should extend this class, defining {@link
- * REQUEST} with the actual request type of the instrumented library. If an attribute is not
- * available in this library, it is appropriate to return {@code null} from the protected attribute
- * methods, but implement as many as possible for best compliance with the OpenTelemetry
- * specification.
- */
-public abstract class RpcAttributesExtractor<REQUEST, RESPONSE>
-    implements AttributesExtractor<REQUEST, RESPONSE>, SpanKeyProvider {
-
-  @Override
-  public final void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) {
-    set(attributes, SemanticAttributes.RPC_SYSTEM, system(request));
-    set(attributes, SemanticAttributes.RPC_SERVICE, service(request));
-    set(attributes, SemanticAttributes.RPC_METHOD, method(request));
-  }
-
-  @Override
-  public final void onEnd(
-      AttributesBuilder attributes,
-      Context context,
-      REQUEST request,
-      @Nullable RESPONSE response,
-      @Nullable Throwable error) {
-    // No response attributes
-  }
-
-  @Nullable
-  protected abstract String system(REQUEST request);
-
-  @Nullable
-  protected abstract String service(REQUEST request);
-
-  @Nullable
-  protected abstract String method(REQUEST request);
-
-  /**
-   * This method is internal and is hence not for public use. Its API is unstable and can change at
-   * any time.
-   */
-  @UnstableApi
-  @Override
-  public SpanKey internalGetSpanKey() {
-    return SpanKey.RPC_CLIENT;
-  }
-}

+ 27 - 0
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcAttributesGetter.java

@@ -0,0 +1,27 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.api.instrumenter.rpc;
+
+import javax.annotation.Nullable;
+
+/**
+ * An interface for getting RPC attributes.
+ *
+ * <p>Instrumentation authors will create implementations of this interface for their specific
+ * library/framework. It will be used by the {@link RpcClientAttributesExtractor} or {@link
+ * RpcServerAttributesExtractor} to obtain the various RPC attributes in a type-generic way.
+ */
+public interface RpcAttributesGetter<REQUEST> {
+
+  @Nullable
+  String system(REQUEST request);
+
+  @Nullable
+  String service(REQUEST request);
+
+  @Nullable
+  String method(REQUEST request);
+}

+ 42 - 0
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcClientAttributesExtractor.java

@@ -0,0 +1,42 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.api.instrumenter.rpc;
+
+import io.opentelemetry.instrumentation.api.annotations.UnstableApi;
+import io.opentelemetry.instrumentation.api.internal.SpanKey;
+import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
+
+/**
+ * Extractor of <a
+ * href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md">RPC
+ * client attributes</a>.
+ *
+ * <p>This class delegates to a type-specific {@link RpcAttributesGetter} for individual attribute
+ * extraction from request/response objects.
+ */
+public final class RpcClientAttributesExtractor<REQUEST, RESPONSE>
+    extends RpcCommonAttributesExtractor<REQUEST, RESPONSE> implements SpanKeyProvider {
+
+  /** Creates the RPC client attributes extractor. */
+  public static <REQUEST, RESPONSE> RpcClientAttributesExtractor<REQUEST, RESPONSE> create(
+      RpcAttributesGetter<REQUEST> getter) {
+    return new RpcClientAttributesExtractor<>(getter);
+  }
+
+  private RpcClientAttributesExtractor(RpcAttributesGetter<REQUEST> getter) {
+    super(getter);
+  }
+
+  /**
+   * This method is internal and is hence not for public use. Its API is unstable and can change at
+   * any time.
+   */
+  @UnstableApi
+  @Override
+  public SpanKey internalGetSpanKey() {
+    return SpanKey.RPC_CLIENT;
+  }
+}

+ 39 - 0
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcCommonAttributesExtractor.java

@@ -0,0 +1,39 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.api.instrumenter.rpc;
+
+import io.opentelemetry.api.common.AttributesBuilder;
+import io.opentelemetry.context.Context;
+import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
+import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
+import javax.annotation.Nullable;
+
+abstract class RpcCommonAttributesExtractor<REQUEST, RESPONSE>
+    implements AttributesExtractor<REQUEST, RESPONSE> {
+
+  private final RpcAttributesGetter<REQUEST> getter;
+
+  RpcCommonAttributesExtractor(RpcAttributesGetter<REQUEST> getter) {
+    this.getter = getter;
+  }
+
+  @Override
+  public final void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) {
+    set(attributes, SemanticAttributes.RPC_SYSTEM, getter.system(request));
+    set(attributes, SemanticAttributes.RPC_SERVICE, getter.service(request));
+    set(attributes, SemanticAttributes.RPC_METHOD, getter.method(request));
+  }
+
+  @Override
+  public final void onEnd(
+      AttributesBuilder attributes,
+      Context context,
+      REQUEST request,
+      @Nullable RESPONSE response,
+      @Nullable Throwable error) {
+    // No response attributes
+  }
+}

+ 28 - 0
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcServerAttributesExtractor.java

@@ -0,0 +1,28 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.api.instrumenter.rpc;
+
+/**
+ * Extractor of <a
+ * href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md">RPC
+ * server attributes</a>.
+ *
+ * <p>This class delegates to a type-specific {@link RpcAttributesGetter} for individual attribute
+ * extraction from request/response objects.
+ */
+public final class RpcServerAttributesExtractor<REQUEST, RESPONSE>
+    extends RpcCommonAttributesExtractor<REQUEST, RESPONSE> {
+
+  /** Creates the RPC server attributes extractor. */
+  public static <REQUEST, RESPONSE> RpcServerAttributesExtractor<REQUEST, RESPONSE> create(
+      RpcAttributesGetter<REQUEST> getter) {
+    return new RpcServerAttributesExtractor<>(getter);
+  }
+
+  private RpcServerAttributesExtractor(RpcAttributesGetter<REQUEST> getter) {
+    super(getter);
+  }
+}

+ 6 - 6
instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcSpanNameExtractor.java

@@ -15,20 +15,20 @@ public final class RpcSpanNameExtractor<REQUEST> implements SpanNameExtractor<RE
    * conventions: {@code <rpc.service>/<rpc.method>}.
    */
   public static <REQUEST> SpanNameExtractor<REQUEST> create(
-      RpcAttributesExtractor<REQUEST, ?> attributesExtractor) {
+      RpcAttributesGetter<REQUEST> attributesExtractor) {
     return new RpcSpanNameExtractor<>(attributesExtractor);
   }
 
-  private final RpcAttributesExtractor<REQUEST, ?> attributesExtractor;
+  private final RpcAttributesGetter<REQUEST> getter;
 
-  private RpcSpanNameExtractor(RpcAttributesExtractor<REQUEST, ?> attributesExtractor) {
-    this.attributesExtractor = attributesExtractor;
+  private RpcSpanNameExtractor(RpcAttributesGetter<REQUEST> getter) {
+    this.getter = getter;
   }
 
   @Override
   public String extract(REQUEST request) {
-    String service = attributesExtractor.service(request);
-    String method = attributesExtractor.method(request);
+    String service = getter.service(request);
+    String method = getter.method(request);
     if (service == null || method == null) {
       return "RPC request";
     }

+ 2 - 2
instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java

@@ -31,7 +31,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessageOperat
 import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter;
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.internal.SpanKey;
 import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
 import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
@@ -176,7 +176,7 @@ class InstrumenterTest {
   @Mock
   MessagingAttributesExtractor<Map<String, String>, Map<String, String>> mockMessagingAttributes;
 
-  @Mock RpcAttributesExtractor<Map<String, String>, Map<String, String>> mockRpcAttributes;
+  @Mock RpcClientAttributesExtractor<Map<String, String>, Map<String, String>> mockRpcAttributes;
   @Mock NetServerAttributesExtractor<Map<String, String>, Map<String, String>> mockNetAttributes;
 
   @Test

+ 16 - 6
instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcAttributesExtractorTest.java

@@ -11,6 +11,7 @@ import static org.assertj.core.api.Assertions.entry;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import io.opentelemetry.context.Context;
+import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import java.util.HashMap;
 import java.util.Map;
@@ -18,33 +19,42 @@ import org.junit.jupiter.api.Test;
 
 class RpcAttributesExtractorTest {
 
-  static class TestExtractor extends RpcAttributesExtractor<Map<String, String>, Void> {
+  enum TestGetter implements RpcAttributesGetter<Map<String, String>> {
+    INSTANCE;
 
     @Override
-    protected String system(Map<String, String> request) {
+    public String system(Map<String, String> request) {
       return "test";
     }
 
     @Override
-    protected String service(Map<String, String> request) {
+    public String service(Map<String, String> request) {
       return request.get("service");
     }
 
     @Override
-    protected String method(Map<String, String> request) {
+    public String method(Map<String, String> request) {
       return request.get("method");
     }
   }
 
   @Test
-  void normal() {
+  void server() {
+    testExtractor(RpcServerAttributesExtractor.create(TestGetter.INSTANCE));
+  }
+
+  @Test
+  void client() {
+    testExtractor(RpcClientAttributesExtractor.create(TestGetter.INSTANCE));
+  }
+
+  private static void testExtractor(AttributesExtractor<Map<String, String>, Void> extractor) {
     Map<String, String> request = new HashMap<>();
     request.put("service", "my.Service");
     request.put("method", "Method");
 
     Context context = Context.root();
 
-    TestExtractor extractor = new TestExtractor();
     AttributesBuilder attributes = Attributes.builder();
     extractor.onStart(attributes, context, request);
     assertThat(attributes.build())

+ 8 - 8
instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/rpc/RpcSpanNameExtractorTest.java

@@ -17,16 +17,16 @@ import org.mockito.junit.jupiter.MockitoExtension;
 @ExtendWith(MockitoExtension.class)
 class RpcSpanNameExtractorTest {
 
-  @Mock RpcAttributesExtractor<RpcRequest, Void> attributesExtractor;
+  @Mock RpcAttributesGetter<RpcRequest> getter;
 
   @Test
   void normal() {
     RpcRequest request = new RpcRequest();
 
-    when(attributesExtractor.service(request)).thenReturn("my.Service");
-    when(attributesExtractor.method(request)).thenReturn("Method");
+    when(getter.service(request)).thenReturn("my.Service");
+    when(getter.method(request)).thenReturn("Method");
 
-    SpanNameExtractor<RpcRequest> extractor = RpcSpanNameExtractor.create(attributesExtractor);
+    SpanNameExtractor<RpcRequest> extractor = RpcSpanNameExtractor.create(getter);
     assertThat(extractor.extract(request)).isEqualTo("my.Service/Method");
   }
 
@@ -34,9 +34,9 @@ class RpcSpanNameExtractorTest {
   void serviceNull() {
     RpcRequest request = new RpcRequest();
 
-    when(attributesExtractor.method(request)).thenReturn("Method");
+    when(getter.method(request)).thenReturn("Method");
 
-    SpanNameExtractor<RpcRequest> extractor = RpcSpanNameExtractor.create(attributesExtractor);
+    SpanNameExtractor<RpcRequest> extractor = RpcSpanNameExtractor.create(getter);
     assertThat(extractor.extract(request)).isEqualTo("RPC request");
   }
 
@@ -44,9 +44,9 @@ class RpcSpanNameExtractorTest {
   void methodNull() {
     RpcRequest request = new RpcRequest();
 
-    when(attributesExtractor.service(request)).thenReturn("my.Service");
+    when(getter.service(request)).thenReturn("my.Service");
 
-    SpanNameExtractor<RpcRequest> extractor = RpcSpanNameExtractor.create(attributesExtractor);
+    SpanNameExtractor<RpcRequest> extractor = RpcSpanNameExtractor.create(getter);
     assertThat(extractor.extract(request)).isEqualTo("RPC request");
   }
 

+ 7 - 6
instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesExtractor.java → instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesGetter.java

@@ -5,22 +5,23 @@
 
 package io.opentelemetry.instrumentation.apachedubbo.v2_7;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
-import org.apache.dubbo.rpc.Result;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
+
+enum DubboRpcAttributesGetter implements RpcAttributesGetter<DubboRequest> {
+  INSTANCE;
 
-final class DubboRpcAttributesExtractor extends RpcAttributesExtractor<DubboRequest, Result> {
   @Override
-  protected String system(DubboRequest request) {
+  public String system(DubboRequest request) {
     return "dubbo";
   }
 
   @Override
-  protected String service(DubboRequest request) {
+  public String service(DubboRequest request) {
     return request.invocation().getInvoker().getInterface().getName();
   }
 
   @Override
-  protected String method(DubboRequest request) {
+  public String method(DubboRequest request) {
     return request.invocation().getMethodName();
   }
 }

+ 16 - 19
instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTracingBuilder.java

@@ -15,11 +15,12 @@ import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesEx
 import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcServerAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcSpanNameExtractor;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Stream;
 import javax.annotation.Nullable;
 import org.apache.dubbo.rpc.Result;
 
@@ -54,29 +55,25 @@ public final class DubboTracingBuilder {
 
   /** Returns a new {@link DubboTracing} with the settings of this {@link DubboTracingBuilder}. */
   public DubboTracing build() {
-    DubboRpcAttributesExtractor rpcAttributesExtractor = new DubboRpcAttributesExtractor();
+    DubboRpcAttributesGetter rpcAttributesGetter = DubboRpcAttributesGetter.INSTANCE;
     SpanNameExtractor<DubboRequest> spanNameExtractor =
-        RpcSpanNameExtractor.create(rpcAttributesExtractor);
-
+        RpcSpanNameExtractor.create(rpcAttributesGetter);
     DubboNetClientAttributesGetter netClientAttributesGetter = new DubboNetClientAttributesGetter();
-    NetClientAttributesExtractor<DubboRequest, Result> netClientAttributesExtractor =
-        NetClientAttributesExtractor.create(netClientAttributesGetter);
 
     InstrumenterBuilder<DubboRequest, Result> serverInstrumenterBuilder =
-        Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor);
-    InstrumenterBuilder<DubboRequest, Result> clientInstrumenterBuilder =
-        Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor);
+        Instrumenter.<DubboRequest, Result>builder(
+                openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
+            .addAttributesExtractors(RpcServerAttributesExtractor.create(rpcAttributesGetter))
+            .addAttributesExtractor(
+                NetServerAttributesExtractor.create(new DubboNetServerAttributesGetter()))
+            .addAttributesExtractors(attributesExtractors);
 
-    Stream.of(serverInstrumenterBuilder, clientInstrumenterBuilder)
-        .forEach(
-            instrumenter ->
-                instrumenter
-                    .addAttributesExtractors(rpcAttributesExtractor)
-                    .addAttributesExtractors(attributesExtractors));
-
-    serverInstrumenterBuilder.addAttributesExtractor(
-        NetServerAttributesExtractor.create(new DubboNetServerAttributesGetter()));
-    clientInstrumenterBuilder.addAttributesExtractor(netClientAttributesExtractor);
+    InstrumenterBuilder<DubboRequest, Result> clientInstrumenterBuilder =
+        Instrumenter.<DubboRequest, Result>builder(
+                openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
+            .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
+            .addAttributesExtractor(NetClientAttributesExtractor.create(netClientAttributesGetter))
+            .addAttributesExtractors(attributesExtractors);
 
     if (peerService != null) {
       clientInstrumenterBuilder.addAttributesExtractor(

+ 4 - 4
instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java

@@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
 import java.util.Arrays;
 import java.util.List;
 
@@ -21,8 +22,8 @@ final class AwsSdkInstrumenterFactory {
 
   private static final AttributesExtractor<Request<?>, Response<?>> httpAttributesExtractor =
       HttpClientAttributesExtractor.create(new AwsSdkHttpAttributesGetter());
-  private static final AwsSdkRpcAttributesExtractor rpcAttributesExtractor =
-      new AwsSdkRpcAttributesExtractor();
+  private static final AttributesExtractor<Request<?>, Response<?>> rpcAttributesExtractor =
+      RpcClientAttributesExtractor.create(AwsSdkRpcAttributesGetter.INSTANCE);
   private static final AttributesExtractor<Request<?>, Response<?>> netAttributesExtractor =
       NetClientAttributesExtractor.create(new AwsSdkNetAttributesGetter());
   private static final AwsSdkExperimentalAttributesExtractor experimentalAttributesExtractor =
@@ -39,8 +40,7 @@ final class AwsSdkInstrumenterFactory {
               rpcAttributesExtractor,
               netAttributesExtractor,
               experimentalAttributesExtractor);
-  private static final AwsSdkSpanNameExtractor spanName =
-      new AwsSdkSpanNameExtractor(rpcAttributesExtractor);
+  private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor();
 
   static Instrumenter<Request<?>, Response<?>> requestInstrumenter(
       OpenTelemetry openTelemetry, boolean captureExperimentalSpanAttributes) {

+ 6 - 6
instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkRpcAttributesExtractor.java → instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkRpcAttributesGetter.java

@@ -6,10 +6,10 @@
 package io.opentelemetry.instrumentation.awssdk.v1_11;
 
 import com.amazonaws.Request;
-import com.amazonaws.Response;
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 
-final class AwsSdkRpcAttributesExtractor extends RpcAttributesExtractor<Request<?>, Response<?>> {
+enum AwsSdkRpcAttributesGetter implements RpcAttributesGetter<Request<?>> {
+  INSTANCE;
 
   private static final ClassValue<String> OPERATION_NAME =
       new ClassValue<String>() {
@@ -28,17 +28,17 @@ final class AwsSdkRpcAttributesExtractor extends RpcAttributesExtractor<Request<
       };
 
   @Override
-  protected String system(Request<?> request) {
+  public String system(Request<?> request) {
     return "aws-api";
   }
 
   @Override
-  protected String service(Request<?> request) {
+  public String service(Request<?> request) {
     return request.getServiceName();
   }
 
   @Override
-  protected String method(Request<?> request) {
+  public String method(Request<?> request) {
     return OPERATION_NAME.get(request.getOriginalRequest().getClass());
   }
 }

+ 1 - 5
instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkSpanNameExtractor.java

@@ -11,13 +11,9 @@ import java.util.concurrent.ConcurrentHashMap;
 
 class AwsSdkSpanNameExtractor implements SpanNameExtractor<Request<?>> {
 
-  private final AwsSdkRpcAttributesExtractor rpcAttributes;
+  private static final AwsSdkRpcAttributesGetter rpcAttributes = AwsSdkRpcAttributesGetter.INSTANCE;
   private final NamesCache namesCache = new NamesCache();
 
-  AwsSdkSpanNameExtractor(AwsSdkRpcAttributesExtractor rpcAttributes) {
-    this.rpcAttributes = rpcAttributes;
-  }
-
   @Override
   public String extract(Request<?> request) {
     return qualifiedOperation(

+ 3 - 2
instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkInstrumenterFactory.java

@@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
 import java.util.Arrays;
 import java.util.List;
 import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
@@ -23,8 +24,8 @@ final class AwsSdkInstrumenterFactory {
   static final AwsSdkHttpAttributesGetter httpAttributesGetter = new AwsSdkHttpAttributesGetter();
   static final AttributesExtractor<ExecutionAttributes, SdkHttpResponse> httpAttributesExtractor =
       HttpClientAttributesExtractor.create(httpAttributesGetter);
-  static final AwsSdkRpcAttributesExtractor rpcAttributesExtractor =
-      new AwsSdkRpcAttributesExtractor();
+  static final AttributesExtractor<ExecutionAttributes, SdkHttpResponse> rpcAttributesExtractor =
+      RpcClientAttributesExtractor.create(AwsSdkRpcAttributesGetter.INSTANCE);
   private static final AwsSdkNetAttributesGetter netAttributesGetter =
       new AwsSdkNetAttributesGetter();
   private static final NetClientAttributesExtractor<ExecutionAttributes, SdkHttpResponse>

+ 6 - 7
instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRpcAttributesExtractor.java → instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRpcAttributesGetter.java

@@ -5,26 +5,25 @@
 
 package io.opentelemetry.instrumentation.awssdk.v2_2;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
 import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
-import software.amazon.awssdk.http.SdkHttpResponse;
 
-final class AwsSdkRpcAttributesExtractor
-    extends RpcAttributesExtractor<ExecutionAttributes, SdkHttpResponse> {
+enum AwsSdkRpcAttributesGetter implements RpcAttributesGetter<ExecutionAttributes> {
+  INSTANCE;
 
   @Override
-  protected String system(ExecutionAttributes request) {
+  public String system(ExecutionAttributes request) {
     return "aws-api";
   }
 
   @Override
-  protected String service(ExecutionAttributes request) {
+  public String service(ExecutionAttributes request) {
     return request.getAttribute(SdkExecutionAttribute.SERVICE_NAME);
   }
 
   @Override
-  protected String method(ExecutionAttributes request) {
+  public String method(ExecutionAttributes request) {
     return request.getAttribute(SdkExecutionAttribute.OPERATION_NAME);
   }
 }

+ 7 - 6
instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesExtractor.java → instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java

@@ -5,19 +5,20 @@
 
 package io.opentelemetry.instrumentation.grpc.v1_6;
 
-import io.grpc.Status;
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import javax.annotation.Nullable;
 
-final class GrpcRpcAttributesExtractor extends RpcAttributesExtractor<GrpcRequest, Status> {
+enum GrpcRpcAttributesGetter implements RpcAttributesGetter<GrpcRequest> {
+  INSTANCE;
+
   @Override
-  protected String system(GrpcRequest request) {
+  public String system(GrpcRequest request) {
     return "grpc";
   }
 
   @Override
   @Nullable
-  protected String service(GrpcRequest request) {
+  public String service(GrpcRequest request) {
     String fullMethodName = request.getMethod().getFullMethodName();
     int slashIndex = fullMethodName.lastIndexOf('/');
     if (slashIndex == -1) {
@@ -28,7 +29,7 @@ final class GrpcRpcAttributesExtractor extends RpcAttributesExtractor<GrpcReques
 
   @Override
   @Nullable
-  protected String method(GrpcRequest request) {
+  public String method(GrpcRequest request) {
     String fullMethodName = request.getMethod().getFullMethodName();
     int slashIndex = fullMethodName.lastIndexOf('/');
     if (slashIndex == -1) {

+ 12 - 7
instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTracingBuilder.java

@@ -15,6 +15,8 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcServerAttributesExtractor;
 import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcNetClientAttributesGetter;
 import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcNetServerAttributesGetter;
 import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
@@ -116,16 +118,19 @@ public final class GrpcTracingBuilder {
             instrumenter ->
                 instrumenter
                     .setSpanStatusExtractor(new GrpcSpanStatusExtractor())
-                    .addAttributesExtractors(
-                        new GrpcRpcAttributesExtractor(), new GrpcAttributesExtractor())
+                    .addAttributesExtractor(new GrpcAttributesExtractor())
                     .addAttributesExtractors(additionalExtractors));
 
     GrpcNetClientAttributesGetter netClientAttributesGetter = new GrpcNetClientAttributesGetter();
-
-    clientInstrumenterBuilder.addAttributesExtractor(
-        NetClientAttributesExtractor.create(netClientAttributesGetter));
-    serverInstrumenterBuilder.addAttributesExtractor(
-        NetServerAttributesExtractor.create(new GrpcNetServerAttributesGetter()));
+    GrpcRpcAttributesGetter rpcAttributesGetter = GrpcRpcAttributesGetter.INSTANCE;
+
+    clientInstrumenterBuilder
+        .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
+        .addAttributesExtractor(NetClientAttributesExtractor.create(netClientAttributesGetter));
+    serverInstrumenterBuilder
+        .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter))
+        .addAttributesExtractor(
+            NetServerAttributesExtractor.create(new GrpcNetServerAttributesGetter()));
 
     if (peerService != null) {
       clientInstrumenterBuilder.addAttributesExtractor(

+ 7 - 5
instrumentation/gwt-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtRpcAttributesExtractor.java → instrumentation/gwt-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtRpcAttributesGetter.java

@@ -5,22 +5,24 @@
 
 package io.opentelemetry.javaagent.instrumentation.gwt;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import java.lang.reflect.Method;
 
-final class GwtRpcAttributesExtractor extends RpcAttributesExtractor<Method, Void> {
+enum GwtRpcAttributesGetter implements RpcAttributesGetter<Method> {
+  INSTANCE;
+
   @Override
-  protected String system(Method method) {
+  public String system(Method method) {
     return "gwt";
   }
 
   @Override
-  protected String service(Method method) {
+  public String service(Method method) {
     return method.getDeclaringClass().getName();
   }
 
   @Override
-  protected String method(Method method) {
+  public String method(Method method) {
     return method.getName();
   }
 }

+ 4 - 4
instrumentation/gwt-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtSingletons.java

@@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.gwt;
 import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.context.ContextKey;
 import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcServerAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcSpanNameExtractor;
 import java.lang.reflect.Method;
 
@@ -22,13 +22,13 @@ public final class GwtSingletons {
   private static final Instrumenter<Method, Void> INSTRUMENTER;
 
   static {
-    RpcAttributesExtractor<Method, Void> rpcAttributes = new GwtRpcAttributesExtractor();
+    GwtRpcAttributesGetter rpcAttributesGetter = GwtRpcAttributesGetter.INSTANCE;
     INSTRUMENTER =
         Instrumenter.<Method, Void>builder(
                 GlobalOpenTelemetry.get(),
                 INSTRUMENTATION_NAME,
-                RpcSpanNameExtractor.create(rpcAttributes))
-            .addAttributesExtractor(rpcAttributes)
+                RpcSpanNameExtractor.create(rpcAttributesGetter))
+            .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter))
             // TODO(anuraaga): This should be a server span, but we currently have no way to merge
             // with the HTTP instrumentation's server span.
             .newInstrumenter();

+ 6 - 5
instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientAttributesExtractor.java → instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientAttributesGetter.java

@@ -5,23 +5,24 @@
 
 package io.opentelemetry.javaagent.instrumentation.rmi.client;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import java.lang.reflect.Method;
 
-final class RmiClientAttributesExtractor extends RpcAttributesExtractor<Method, Void> {
+enum RmiClientAttributesGetter implements RpcAttributesGetter<Method> {
+  INSTANCE;
 
   @Override
-  protected String system(Method method) {
+  public String system(Method method) {
     return "java_rmi";
   }
 
   @Override
-  protected String service(Method method) {
+  public String service(Method method) {
     return method.getDeclaringClass().getName();
   }
 
   @Override
-  protected String method(Method method) {
+  public String method(Method method) {
     return method.getName();
   }
 }

+ 4 - 3
instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientSingletons.java

@@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.rmi.client;
 import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcSpanNameExtractor;
 import java.lang.reflect.Method;
 
@@ -16,14 +17,14 @@ public final class RmiClientSingletons {
   private static final Instrumenter<Method, Void> INSTRUMENTER;
 
   static {
-    RmiClientAttributesExtractor attributesExtractor = new RmiClientAttributesExtractor();
+    RmiClientAttributesGetter rpcAttributesGetter = RmiClientAttributesGetter.INSTANCE;
 
     INSTRUMENTER =
         Instrumenter.<Method, Void>builder(
                 GlobalOpenTelemetry.get(),
                 "io.opentelemetry.rmi",
-                RpcSpanNameExtractor.create(attributesExtractor))
-            .addAttributesExtractor(attributesExtractor)
+                RpcSpanNameExtractor.create(rpcAttributesGetter))
+            .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
             .newInstrumenter(SpanKindExtractor.alwaysClient());
   }
 

+ 6 - 5
instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/server/RmiServerAttributesExtractor.java → instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/server/RmiServerAttributesGetter.java

@@ -5,23 +5,24 @@
 
 package io.opentelemetry.javaagent.instrumentation.rmi.server;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import io.opentelemetry.instrumentation.api.util.ClassAndMethod;
 
-final class RmiServerAttributesExtractor extends RpcAttributesExtractor<ClassAndMethod, Void> {
+enum RmiServerAttributesGetter implements RpcAttributesGetter<ClassAndMethod> {
+  INSTANCE;
 
   @Override
-  protected String system(ClassAndMethod classAndMethod) {
+  public String system(ClassAndMethod classAndMethod) {
     return "java_rmi";
   }
 
   @Override
-  protected String service(ClassAndMethod classAndMethod) {
+  public String service(ClassAndMethod classAndMethod) {
     return classAndMethod.declaringClass().getName();
   }
 
   @Override
-  protected String method(ClassAndMethod classAndMethod) {
+  public String method(ClassAndMethod classAndMethod) {
     return classAndMethod.methodName();
   }
 }

+ 4 - 3
instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/server/RmiServerSingletons.java

@@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.rmi.server;
 import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcServerAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcSpanNameExtractor;
 import io.opentelemetry.instrumentation.api.util.ClassAndMethod;
 
@@ -16,14 +17,14 @@ public final class RmiServerSingletons {
   private static final Instrumenter<ClassAndMethod, Void> INSTRUMENTER;
 
   static {
-    RmiServerAttributesExtractor attributesExtractor = new RmiServerAttributesExtractor();
+    RmiServerAttributesGetter rpcAttributesGetter = RmiServerAttributesGetter.INSTANCE;
 
     INSTRUMENTER =
         Instrumenter.<ClassAndMethod, Void>builder(
                 GlobalOpenTelemetry.get(),
                 "io.opentelemetry.rmi",
-                RpcSpanNameExtractor.create(attributesExtractor))
-            .addAttributesExtractor(attributesExtractor)
+                RpcSpanNameExtractor.create(rpcAttributesGetter))
+            .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter))
             .newInstrumenter(SpanKindExtractor.alwaysServer());
   }
 

+ 10 - 8
instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/SpringRmiSingletons.java

@@ -8,10 +8,12 @@ package io.opentelemetry.javaagent.instrumentation.springrmi;
 import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
 import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcClientAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcServerAttributesExtractor;
 import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcSpanNameExtractor;
 import io.opentelemetry.instrumentation.api.util.ClassAndMethod;
-import io.opentelemetry.javaagent.instrumentation.springrmi.client.ClientAttributesExtractor;
-import io.opentelemetry.javaagent.instrumentation.springrmi.server.ServerAttributesExtractor;
+import io.opentelemetry.javaagent.instrumentation.springrmi.client.ClientAttributesGetter;
+import io.opentelemetry.javaagent.instrumentation.springrmi.server.ServerAttributesGetter;
 import java.lang.reflect.Method;
 
 public final class SpringRmiSingletons {
@@ -22,24 +24,24 @@ public final class SpringRmiSingletons {
       buildServerInstrumenter();
 
   private static Instrumenter<Method, Void> buildClientInstrumenter() {
-    ClientAttributesExtractor attributesExtractor = new ClientAttributesExtractor();
+    ClientAttributesGetter rpcAttributesGetter = ClientAttributesGetter.INSTANCE;
 
     return Instrumenter.<Method, Void>builder(
             GlobalOpenTelemetry.get(),
             INSTRUMENTATION_NAME,
-            RpcSpanNameExtractor.create(attributesExtractor))
-        .addAttributesExtractor(attributesExtractor)
+            RpcSpanNameExtractor.create(rpcAttributesGetter))
+        .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
         .newInstrumenter(SpanKindExtractor.alwaysClient());
   }
 
   private static Instrumenter<ClassAndMethod, Void> buildServerInstrumenter() {
-    ServerAttributesExtractor attributesExtractor = new ServerAttributesExtractor();
+    ServerAttributesGetter rpcAttributesGetter = ServerAttributesGetter.INSTANCE;
 
     return Instrumenter.<ClassAndMethod, Void>builder(
             GlobalOpenTelemetry.get(),
             INSTRUMENTATION_NAME,
-            RpcSpanNameExtractor.create(attributesExtractor))
-        .addAttributesExtractor(attributesExtractor)
+            RpcSpanNameExtractor.create(rpcAttributesGetter))
+        .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter))
         .newInstrumenter(SpanKindExtractor.alwaysServer());
   }
 

+ 6 - 5
instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/client/ClientAttributesExtractor.java → instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/client/ClientAttributesGetter.java

@@ -5,23 +5,24 @@
 
 package io.opentelemetry.javaagent.instrumentation.springrmi.client;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import java.lang.reflect.Method;
 
-public final class ClientAttributesExtractor extends RpcAttributesExtractor<Method, Void> {
+public enum ClientAttributesGetter implements RpcAttributesGetter<Method> {
+  INSTANCE;
 
   @Override
-  protected String system(Method method) {
+  public String system(Method method) {
     return "spring_rmi";
   }
 
   @Override
-  protected String service(Method method) {
+  public String service(Method method) {
     return method.getDeclaringClass().getName();
   }
 
   @Override
-  protected String method(Method method) {
+  public String method(Method method) {
     return method.getName();
   }
 }

+ 6 - 5
instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/server/ServerAttributesExtractor.java → instrumentation/spring/spring-rmi-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springrmi/server/ServerAttributesGetter.java

@@ -5,23 +5,24 @@
 
 package io.opentelemetry.javaagent.instrumentation.springrmi.server;
 
-import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
+import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesGetter;
 import io.opentelemetry.instrumentation.api.util.ClassAndMethod;
 
-public final class ServerAttributesExtractor extends RpcAttributesExtractor<ClassAndMethod, Void> {
+public enum ServerAttributesGetter implements RpcAttributesGetter<ClassAndMethod> {
+  INSTANCE;
 
   @Override
-  protected String system(ClassAndMethod classAndMethod) {
+  public String system(ClassAndMethod classAndMethod) {
     return "spring_rmi";
   }
 
   @Override
-  protected String service(ClassAndMethod classAndMethod) {
+  public String service(ClassAndMethod classAndMethod) {
     return classAndMethod.declaringClass().getName();
   }
 
   @Override
-  protected String method(ClassAndMethod classAndMethod) {
+  public String method(ClassAndMethod classAndMethod) {
     return classAndMethod.methodName();
   }
 }