Browse Source

Run tests with dubbo3 (#6247)

* Run tests with dubbo3

* remove muzzle limit

* fill peer name on dubbo 3
Lauri Tulmin 2 years ago
parent
commit
ae2a908256

+ 1 - 1
docs/supported-libraries.md

@@ -26,7 +26,7 @@ These are the supported libraries and frameworks:
 | [Apache CXF JAX-RS](https://cxf.apache.org/)                                                                                      | 3.2+                           |
 | [Apache CXF JAX-RS Client](https://cxf.apache.org/)                                                                               | 3.0+                           |
 | [Apache CXF JAX-WS](https://cxf.apache.org/)                                                                                      | 3.0+                           |
-| [Apache Dubbo](https://github.com/apache/dubbo/)                                                                                  | 2.7+ (not including 3.x yet)   |
+| [Apache Dubbo](https://github.com/apache/dubbo/)                                                                                  | 2.7+                           |
 | [Apache HttpAsyncClient](https://hc.apache.org/index.html)                                                                        | 4.1+                           |
 | [Apache HttpClient](https://hc.apache.org/index.html)                                                                             | 2.0+                           |
 | [Apache Kafka Producer/Consumer API](https://kafka.apache.org/documentation/#producerapi)                                         | 0.11+                          |

+ 1 - 3
instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts

@@ -6,7 +6,7 @@ muzzle {
   pass {
     group.set("org.apache.dubbo")
     module.set("dubbo")
-    versions.set("[2.7.0,3.0.0)")
+    versions.set("[2.7.0,)")
   }
 }
 
@@ -18,8 +18,6 @@ dependencies {
   testImplementation(project(":instrumentation:apache-dubbo-2.7:testing"))
 
   testLibrary("org.apache.dubbo:dubbo-config-api:2.7.0")
-  latestDepTestLibrary("org.apache.dubbo:dubbo:2.+") // documented limitation
-  latestDepTestLibrary("org.apache.dubbo:dubbo-config-api:2.+") // documented limitation
 }
 
 tasks.withType<Test>().configureEach {

+ 0 - 2
instrumentation/apache-dubbo-2.7/library-autoconfigure/build.gradle.kts

@@ -11,8 +11,6 @@ dependencies {
   testImplementation(project(":instrumentation:apache-dubbo-2.7:testing"))
 
   testLibrary("org.apache.dubbo:dubbo-config-api:2.7.0")
-  latestDepTestLibrary("org.apache.dubbo:dubbo:2.+") // documented limitation
-  latestDepTestLibrary("org.apache.dubbo:dubbo-config-api:2.+") // documented limitation
 }
 
 tasks.withType<Test>().configureEach {

+ 12 - 1
instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRequest.java

@@ -6,6 +6,9 @@
 package io.opentelemetry.instrumentation.apachedubbo.v2_7;
 
 import com.google.auto.value.AutoValue;
+import java.net.InetSocketAddress;
+import javax.annotation.Nullable;
+import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcInvocation;
 
@@ -13,10 +16,18 @@ import org.apache.dubbo.rpc.RpcInvocation;
 public abstract class DubboRequest {
 
   static DubboRequest create(RpcInvocation invocation, RpcContext context) {
-    return new AutoValue_DubboRequest(invocation, context);
+    // In dubbo 3 RpcContext delegates to a ThreadLocal context. We copy the url and remote address
+    // here to ensure we can access them from the thread that ends the span.
+    return new AutoValue_DubboRequest(
+        invocation, context, context.getUrl(), context.getRemoteAddress());
   }
 
   abstract RpcInvocation invocation();
 
   public abstract RpcContext context();
+
+  public abstract URL url();
+
+  @Nullable
+  public abstract InetSocketAddress remoteAddress();
 }

+ 8 - 1
instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/internal/DubboNetClientAttributesGetter.java

@@ -9,6 +9,7 @@ import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboRequest;
 import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesGetter;
 import java.net.InetSocketAddress;
 import javax.annotation.Nullable;
+import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.Result;
 
 /**
@@ -21,7 +22,13 @@ public final class DubboNetClientAttributesGetter
   @Override
   @Nullable
   public InetSocketAddress getAddress(DubboRequest request, @Nullable Result response) {
-    return request.context().getRemoteAddress();
+    InetSocketAddress address = request.remoteAddress();
+    // dubbo 3 doesn't set remote address for client calls
+    if (address == null) {
+      URL url = request.url();
+      address = InetSocketAddress.createUnresolved(url.getHost(), url.getPort());
+    }
+    return address;
   }
 
   @Override

+ 1 - 1
instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/internal/DubboNetServerAttributesGetter.java

@@ -20,7 +20,7 @@ public final class DubboNetServerAttributesGetter
   @Override
   @Nullable
   public InetSocketAddress getAddress(DubboRequest request) {
-    return request.context().getRemoteAddress();
+    return request.remoteAddress();
   }
 
   @Override

+ 6 - 7
instrumentation/apache-dubbo-2.7/testing/src/main/groovy/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.groovy

@@ -18,7 +18,6 @@ import org.apache.dubbo.config.ReferenceConfig
 import org.apache.dubbo.config.RegistryConfig
 import org.apache.dubbo.config.ServiceConfig
 import org.apache.dubbo.config.bootstrap.DubboBootstrap
-import org.apache.dubbo.config.utils.ReferenceConfigCache
 import org.apache.dubbo.rpc.service.GenericService
 import spock.lang.Shared
 import spock.lang.Unroll
@@ -59,7 +58,7 @@ abstract class AbstractDubboTest extends InstrumentationSpecification {
     def port = PortUtils.findOpenPort()
     protocolConfig.setPort(port)
 
-    DubboBootstrap bootstrap = DubboBootstrap.getInstance()
+    DubboBootstrap bootstrap = DubboBootstrap.newInstance()
     bootstrap.application(new ApplicationConfig("dubbo-test-provider"))
       .service(configureServer())
       .protocol(protocolConfig)
@@ -69,14 +68,14 @@ abstract class AbstractDubboTest extends InstrumentationSpecification {
     consumerProtocolConfig.setRegister(false)
 
     def reference = configureClient(port)
-    DubboBootstrap consumerBootstrap = DubboBootstrap.getInstance()
+    DubboBootstrap consumerBootstrap = DubboBootstrap.newInstance()
     consumerBootstrap.application(new ApplicationConfig("dubbo-demo-api-consumer"))
       .reference(reference)
       .protocol(consumerProtocolConfig)
       .start()
 
     when:
-    GenericService genericService = ReferenceConfigCache.getCache().get(reference) as GenericService
+    GenericService genericService = reference.get()
     def o = new Object[1]
     o[0] = "hello"
     def response = runWithSpan("parent") {
@@ -130,7 +129,7 @@ abstract class AbstractDubboTest extends InstrumentationSpecification {
     def port = PortUtils.findOpenPort()
     protocolConfig.setPort(port)
 
-    DubboBootstrap bootstrap = DubboBootstrap.getInstance()
+    DubboBootstrap bootstrap = DubboBootstrap.newInstance()
     bootstrap.application(new ApplicationConfig("dubbo-test-async-provider"))
       .service(configureServer())
       .protocol(protocolConfig)
@@ -140,14 +139,14 @@ abstract class AbstractDubboTest extends InstrumentationSpecification {
     consumerProtocolConfig.setRegister(false)
 
     def reference = configureClient(port)
-    DubboBootstrap consumerBootstrap = DubboBootstrap.getInstance()
+    DubboBootstrap consumerBootstrap = DubboBootstrap.newInstance()
     consumerBootstrap.application(new ApplicationConfig("dubbo-demo-async-api-consumer"))
       .reference(reference)
       .protocol(consumerProtocolConfig)
       .start()
 
     when:
-    GenericService genericService = ReferenceConfigCache.getCache().get(reference) as GenericService
+    GenericService genericService = reference.get()
     def o = new Object[1]
     o[0] = "hello"
     def responseAsync = runWithSpan("parent") {