Skip to content

Commit ca3fbac

Browse files
steveraolaurit
andauthored
Fix wrong dubbo trace caused by using rpcContext.isProviderSide() (#12930)
Co-authored-by: Lauri Tulmin <[email protected]> Co-authored-by: Lauri Tulmin <[email protected]>
1 parent e12ae97 commit ca3fbac

File tree

10 files changed

+175
-37
lines changed

10 files changed

+175
-37
lines changed

instrumentation/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentationModule.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
4444
public void injectClasses(ClassInjector injector) {
4545
injector
4646
.proxyBuilder(
47-
"io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7.OpenTelemetryFilter")
47+
"io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7.OpenTelemetryClientFilter")
48+
.inject(InjectionMode.CLASS_ONLY);
49+
injector
50+
.proxyBuilder(
51+
"io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7.OpenTelemetryServerFilter")
4852
.inject(InjectionMode.CLASS_ONLY);
4953
}
5054

Original file line numberDiff line numberDiff line change
@@ -10,30 +10,23 @@
1010
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter;
1111
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
1212
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
13-
import org.apache.dubbo.common.extension.Activate;
1413
import org.apache.dubbo.rpc.Filter;
15-
import org.apache.dubbo.rpc.Invocation;
16-
import org.apache.dubbo.rpc.Invoker;
17-
import org.apache.dubbo.rpc.Result;
1814

19-
@Activate(group = {"consumer", "provider"})
20-
public class OpenTelemetryFilter implements Filter {
15+
public final class DubboSingletons {
16+
public static final Filter CLIENT_FILTER;
17+
public static final Filter SERVER_FILTER;
2118

22-
private final Filter delegate;
23-
24-
public OpenTelemetryFilter() {
25-
delegate =
19+
static {
20+
DubboTelemetry telemetry =
2621
DubboTelemetry.builder(GlobalOpenTelemetry.get())
2722
.addAttributesExtractor(
2823
PeerServiceAttributesExtractor.create(
2924
new DubboClientNetworkAttributesGetter(),
3025
AgentCommonConfig.get().getPeerServiceResolver()))
31-
.build()
32-
.newFilter();
26+
.build();
27+
CLIENT_FILTER = telemetry.newClientFilter();
28+
SERVER_FILTER = telemetry.newServerFilter();
3329
}
3430

35-
@Override
36-
public Result invoke(Invoker<?> invoker, Invocation invocation) {
37-
return delegate.invoke(invoker, invocation);
38-
}
31+
private DubboSingletons() {}
3932
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7;
7+
8+
import org.apache.dubbo.common.extension.Activate;
9+
import org.apache.dubbo.rpc.Filter;
10+
import org.apache.dubbo.rpc.Invocation;
11+
import org.apache.dubbo.rpc.Invoker;
12+
import org.apache.dubbo.rpc.Result;
13+
14+
@Activate(group = {"consumer"})
15+
public final class OpenTelemetryClientFilter implements Filter {
16+
17+
private final Filter delegate;
18+
19+
public OpenTelemetryClientFilter() {
20+
delegate = DubboSingletons.CLIENT_FILTER;
21+
}
22+
23+
@Override
24+
public Result invoke(Invoker<?> invoker, Invocation invocation) {
25+
return delegate.invoke(invoker, invocation);
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7;
7+
8+
import org.apache.dubbo.common.extension.Activate;
9+
import org.apache.dubbo.rpc.Filter;
10+
import org.apache.dubbo.rpc.Invocation;
11+
import org.apache.dubbo.rpc.Invoker;
12+
import org.apache.dubbo.rpc.Result;
13+
14+
@Activate(group = {"provider"})
15+
public final class OpenTelemetryServerFilter implements Filter {
16+
17+
private final Filter delegate;
18+
19+
public OpenTelemetryServerFilter() {
20+
delegate = DubboSingletons.SERVER_FILTER;
21+
}
22+
23+
@Override
24+
public Result invoke(Invoker<?> invoker, Invocation invocation) {
25+
return delegate.invoke(invoker, invocation);
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7.OpenTelemetryFilter
1+
io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7.OpenTelemetryClientFilter
2+
io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7.OpenTelemetryServerFilter

instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetry.java

+20-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
/** Entrypoint for instrumenting Apache Dubbo servers and clients. */
1414
public final class DubboTelemetry {
1515

16+
private final Instrumenter<DubboRequest, Result> serverInstrumenter;
17+
private final Instrumenter<DubboRequest, Result> clientInstrumenter;
18+
1619
/** Returns a new {@link DubboTelemetry} configured with the given {@link OpenTelemetry}. */
1720
public static DubboTelemetry create(OpenTelemetry openTelemetry) {
1821
return builder(openTelemetry).build();
@@ -25,18 +28,30 @@ public static DubboTelemetryBuilder builder(OpenTelemetry openTelemetry) {
2528
return new DubboTelemetryBuilder(openTelemetry);
2629
}
2730

28-
private final Instrumenter<DubboRequest, Result> serverInstrumenter;
29-
private final Instrumenter<DubboRequest, Result> clientInstrumenter;
30-
3131
DubboTelemetry(
3232
Instrumenter<DubboRequest, Result> serverInstrumenter,
3333
Instrumenter<DubboRequest, Result> clientInstrumenter) {
3434
this.serverInstrumenter = serverInstrumenter;
3535
this.clientInstrumenter = clientInstrumenter;
3636
}
3737

38-
/** Returns a new Dubbo {@link Filter} that traces Dubbo RPC invocations. */
38+
/**
39+
* Returns a new Dubbo {@link Filter} that traces Dubbo RPC invocations.
40+
*
41+
* @deprecated Use {@link #newClientFilter} and {@link #newServerFilter} instead.
42+
*/
43+
@Deprecated
3944
public Filter newFilter() {
40-
return new TracingFilter(serverInstrumenter, clientInstrumenter);
45+
return TracingFilter.newFilter(serverInstrumenter, clientInstrumenter);
46+
}
47+
48+
/** Returns a new Dubbo client {@link Filter} that traces Dubbo RPC invocations. */
49+
public Filter newClientFilter() {
50+
return TracingFilter.newClientFilter(clientInstrumenter);
51+
}
52+
53+
/** Returns a new Dubbo server {@link Filter} that traces Dubbo RPC invocations. */
54+
public Filter newServerFilter() {
55+
return TracingFilter.newServerFilter(serverInstrumenter);
4156
}
4257
}
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
import org.apache.dubbo.rpc.Invoker;
1313
import org.apache.dubbo.rpc.Result;
1414

15-
@Activate(group = {"consumer", "provider"})
16-
public final class OpenTelemetryFilter implements Filter {
15+
@Activate(group = {"consumer"})
16+
public final class OpenTelemetryClientFilter implements Filter {
1717

1818
private final Filter delegate;
1919

20-
public OpenTelemetryFilter() {
21-
delegate = DubboTelemetry.create(GlobalOpenTelemetry.get()).newFilter();
20+
public OpenTelemetryClientFilter() {
21+
delegate = DubboTelemetry.create(GlobalOpenTelemetry.get()).newClientFilter();
2222
}
2323

2424
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.apachedubbo.v2_7;
7+
8+
import io.opentelemetry.api.GlobalOpenTelemetry;
9+
import org.apache.dubbo.common.extension.Activate;
10+
import org.apache.dubbo.rpc.Filter;
11+
import org.apache.dubbo.rpc.Invocation;
12+
import org.apache.dubbo.rpc.Invoker;
13+
import org.apache.dubbo.rpc.Result;
14+
15+
@Activate(group = {"provider"})
16+
public final class OpenTelemetryServerFilter implements Filter {
17+
18+
private final Filter delegate;
19+
20+
public OpenTelemetryServerFilter() {
21+
delegate = DubboTelemetry.create(GlobalOpenTelemetry.get()).newServerFilter();
22+
}
23+
24+
@Override
25+
public Result invoke(Invoker<?> invoker, Invocation invocation) {
26+
return delegate.invoke(invoker, invocation);
27+
}
28+
}

instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/TracingFilter.java

+51-9
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,52 @@
1818

1919
final class TracingFilter implements Filter {
2020

21-
private final Instrumenter<DubboRequest, Result> serverInstrumenter;
22-
private final Instrumenter<DubboRequest, Result> clientInstrumenter;
21+
private final InstrumenterSupplier instrumenterSupplier;
2322

24-
TracingFilter(
23+
private TracingFilter(InstrumenterSupplier instrumenterSupplier) {
24+
this.instrumenterSupplier = instrumenterSupplier;
25+
}
26+
27+
static TracingFilter newClientFilter(Instrumenter<DubboRequest, Result> clientInstrumenter) {
28+
return newFilter(clientInstrumenter, true);
29+
}
30+
31+
static TracingFilter newServerFilter(Instrumenter<DubboRequest, Result> serverInstrumenter) {
32+
return newFilter(serverInstrumenter, false);
33+
}
34+
35+
private static TracingFilter newFilter(
36+
Instrumenter<DubboRequest, Result> instrumenter, boolean isClientSide) {
37+
return new TracingFilter(
38+
new InstrumenterSupplier() {
39+
40+
@Override
41+
public Instrumenter<DubboRequest, Result> get(RpcContext rpcContext) {
42+
return instrumenter;
43+
}
44+
45+
@Override
46+
public boolean isClientSide(RpcContext rpcContext) {
47+
return isClientSide;
48+
}
49+
});
50+
}
51+
52+
static TracingFilter newFilter(
2553
Instrumenter<DubboRequest, Result> serverInstrumenter,
2654
Instrumenter<DubboRequest, Result> clientInstrumenter) {
27-
this.serverInstrumenter = serverInstrumenter;
28-
this.clientInstrumenter = clientInstrumenter;
55+
return new TracingFilter(
56+
new InstrumenterSupplier() {
57+
@Override
58+
public Instrumenter<DubboRequest, Result> get(RpcContext rpcContext) {
59+
return rpcContext.isConsumerSide() ? clientInstrumenter : serverInstrumenter;
60+
}
61+
62+
@Override
63+
public boolean isClientSide(RpcContext rpcContext) {
64+
return rpcContext.isConsumerSide();
65+
}
66+
});
2967
}
3068

3169
@Override
@@ -40,9 +78,7 @@ public Result invoke(Invoker<?> invoker, Invocation invocation) {
4078
return invoker.invoke(invocation);
4179
}
4280

43-
boolean isServer = rpcContext.isProviderSide();
44-
Instrumenter<DubboRequest, Result> instrumenter =
45-
isServer ? serverInstrumenter : clientInstrumenter;
81+
Instrumenter<DubboRequest, Result> instrumenter = instrumenterSupplier.get(rpcContext);
4682
Context parentContext = Context.current();
4783
DubboRequest request = DubboRequest.create((RpcInvocation) invocation, rpcContext);
4884

@@ -55,7 +91,7 @@ public Result invoke(Invoker<?> invoker, Invocation invocation) {
5591
boolean isSynchronous = true;
5692
try (Scope ignored = context.makeCurrent()) {
5793
result = invoker.invoke(invocation);
58-
if (!isServer) {
94+
if (instrumenterSupplier.isClientSide(rpcContext)) {
5995
CompletableFuture<Object> future = rpcContext.getCompletableFuture();
6096
if (future != null) {
6197
isSynchronous = false;
@@ -72,4 +108,10 @@ public Result invoke(Invoker<?> invoker, Invocation invocation) {
72108
}
73109
return result;
74110
}
111+
112+
private interface InstrumenterSupplier {
113+
Instrumenter<DubboRequest, Result> get(RpcContext rpcContext);
114+
115+
boolean isClientSide(RpcContext rpcContext);
116+
}
75117
}
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
io.opentelemetry.instrumentation.apachedubbo.v2_7.OpenTelemetryFilter
1+
io.opentelemetry.instrumentation.apachedubbo.v2_7.OpenTelemetryClientFilter
2+
io.opentelemetry.instrumentation.apachedubbo.v2_7.OpenTelemetryServerFilter

0 commit comments

Comments
 (0)