Dubbo: don't create spans for calls inside the same jvm (#7761)
Resolves
https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/7520
Invoking a dubbo service, like in
d7e2417ae7/demo-business-provider/src/main/java/cn/zewade/business/controller/BusinessController.java (L20)
,
creates a client span (and a server span on the receiving end). If the
caller and service are on the jvm this call doesn't go through remoting
and will be handled with regular java calls. Now when the initially
called service calls another service, like in
https://github.com/zewade/opentelemetry-dubbo-demo/blob/main/demo-business-provider/src/main/java/cn/zewade/business/dubbo/BusinessDubboServiceImpl.java#L25,
that second call will also attempt to create a client span. This second
client span will be suppressed which will also suppress context
propagation.
This commit is contained in:
parent
5d182557a1
commit
f887fb870d
|
@ -35,7 +35,7 @@ final class TracingFilter implements Filter {
|
||||||
}
|
}
|
||||||
|
|
||||||
RpcContext rpcContext = RpcContext.getContext();
|
RpcContext rpcContext = RpcContext.getContext();
|
||||||
if (rpcContext.getUrl() == null) {
|
if (rpcContext.getUrl() == null || "injvm".equals(rpcContext.getUrl().getProtocol())) {
|
||||||
return invoker.invoke(invocation);
|
return invoker.invoke(invocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,14 @@ abstract class AbstractDubboTraceChainTest extends InstrumentationSpecification
|
||||||
return reference
|
return reference
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReferenceConfig<HelloService> configureLocalClient(int port) {
|
||||||
|
ReferenceConfig<HelloService> reference = new ReferenceConfig<>()
|
||||||
|
reference.setInterface(HelloService)
|
||||||
|
reference.setGeneric("true")
|
||||||
|
reference.setUrl("injvm://localhost:" + port + "/?timeout=30000")
|
||||||
|
return reference
|
||||||
|
}
|
||||||
|
|
||||||
ReferenceConfig<HelloService> configureMiddleClient(int port) {
|
ReferenceConfig<HelloService> configureMiddleClient(int port) {
|
||||||
ReferenceConfig<MiddleService> reference = new ReferenceConfig<>()
|
ReferenceConfig<MiddleService> reference = new ReferenceConfig<>()
|
||||||
reference.setInterface(MiddleService)
|
reference.setInterface(MiddleService)
|
||||||
|
@ -183,4 +191,89 @@ abstract class AbstractDubboTraceChainTest extends InstrumentationSpecification
|
||||||
middleBootstrap.destroy()
|
middleBootstrap.destroy()
|
||||||
consumerBootstrap.destroy()
|
consumerBootstrap.destroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def "test ignore injvm calls"() {
|
||||||
|
setup:
|
||||||
|
def port = PortUtils.findOpenPorts(2)
|
||||||
|
def middlePort = port + 1
|
||||||
|
def protocolConfig = new ProtocolConfig()
|
||||||
|
protocolConfig.setPort(port)
|
||||||
|
|
||||||
|
def frameworkModel = newFrameworkModel()
|
||||||
|
DubboBootstrap bootstrap = newDubboBootstrap(frameworkModel)
|
||||||
|
bootstrap.application(new ApplicationConfig("dubbo-test-provider"))
|
||||||
|
.service(configureServer())
|
||||||
|
.protocol(protocolConfig)
|
||||||
|
.start()
|
||||||
|
|
||||||
|
def middleProtocolConfig = new ProtocolConfig()
|
||||||
|
middleProtocolConfig.setPort(middlePort)
|
||||||
|
|
||||||
|
def reference = configureLocalClient(port)
|
||||||
|
DubboBootstrap middleBootstrap = newDubboBootstrap(frameworkModel)
|
||||||
|
middleBootstrap.application(new ApplicationConfig("dubbo-demo-middle"))
|
||||||
|
.reference(reference)
|
||||||
|
.service(configureMiddleServer(reference))
|
||||||
|
.protocol(middleProtocolConfig)
|
||||||
|
.start()
|
||||||
|
|
||||||
|
|
||||||
|
def consumerProtocolConfig = new ProtocolConfig()
|
||||||
|
consumerProtocolConfig.setRegister(false)
|
||||||
|
|
||||||
|
def middleReference = configureMiddleClient(middlePort)
|
||||||
|
DubboBootstrap consumerBootstrap = newDubboBootstrap(frameworkModel)
|
||||||
|
consumerBootstrap.application(new ApplicationConfig("dubbo-demo-api-consumer"))
|
||||||
|
.reference(middleReference)
|
||||||
|
.protocol(consumerProtocolConfig)
|
||||||
|
.start()
|
||||||
|
|
||||||
|
when:
|
||||||
|
GenericService genericService = middleReference.get()
|
||||||
|
def response = runWithSpan("parent") {
|
||||||
|
genericService.$invoke("hello", [String.getName()] as String[], ["hello"] as Object[])
|
||||||
|
}
|
||||||
|
|
||||||
|
then:
|
||||||
|
response == "hello"
|
||||||
|
assertTraces(1) {
|
||||||
|
trace(0, 3) {
|
||||||
|
span(0) {
|
||||||
|
name "parent"
|
||||||
|
kind SpanKind.INTERNAL
|
||||||
|
hasNoParent()
|
||||||
|
}
|
||||||
|
span(1) {
|
||||||
|
name "org.apache.dubbo.rpc.service.GenericService/\$invoke"
|
||||||
|
kind CLIENT
|
||||||
|
childOf span(0)
|
||||||
|
attributes {
|
||||||
|
"$SemanticAttributes.RPC_SYSTEM" "apache_dubbo"
|
||||||
|
"$SemanticAttributes.RPC_SERVICE" "org.apache.dubbo.rpc.service.GenericService"
|
||||||
|
"$SemanticAttributes.RPC_METHOD" "\$invoke"
|
||||||
|
"$SemanticAttributes.NET_PEER_NAME" "localhost"
|
||||||
|
"$SemanticAttributes.NET_PEER_PORT" Long
|
||||||
|
}
|
||||||
|
}
|
||||||
|
span(2) {
|
||||||
|
name "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello"
|
||||||
|
kind SERVER
|
||||||
|
childOf span(1)
|
||||||
|
attributes {
|
||||||
|
"$SemanticAttributes.RPC_SYSTEM" "apache_dubbo"
|
||||||
|
"$SemanticAttributes.RPC_SERVICE" "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"
|
||||||
|
"$SemanticAttributes.RPC_METHOD" "hello"
|
||||||
|
"$SemanticAttributes.NET_SOCK_PEER_ADDR" String
|
||||||
|
"$SemanticAttributes.NET_SOCK_PEER_PORT" Long
|
||||||
|
"$SemanticAttributes.NET_SOCK_FAMILY" { it == SemanticAttributes.NetSockFamilyValues.INET6 || it == null }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
bootstrap.destroy()
|
||||||
|
middleBootstrap.destroy()
|
||||||
|
consumerBootstrap.destroy()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue