Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 4607f4a

Browse files
authoredDec 30, 2024
Rework dubbo insrumentation (#7)
1 parent 96ac186 commit 4607f4a

File tree

5 files changed

+92
-46
lines changed

5 files changed

+92
-46
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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 io.opentelemetry.api.GlobalOpenTelemetry;
9+
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboTelemetry;
10+
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter;
11+
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
12+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
13+
import org.apache.dubbo.rpc.Filter;
14+
15+
public final class DubboSingletons {
16+
public static final Filter CLIENT_FILTER;
17+
public static final Filter SERVER_FILTER;
18+
19+
static {
20+
DubboTelemetry telemetry =
21+
DubboTelemetry.builder(GlobalOpenTelemetry.get())
22+
.addAttributesExtractor(
23+
PeerServiceAttributesExtractor.create(
24+
new DubboClientNetworkAttributesGetter(),
25+
AgentCommonConfig.get().getPeerServiceResolver()))
26+
.build();
27+
CLIENT_FILTER = telemetry.newClientFilter();
28+
SERVER_FILTER = telemetry.newServerFilter();
29+
}
30+
31+
private DubboSingletons() {}
32+
}

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

+1-13
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@
55

66
package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7;
77

8-
import io.opentelemetry.api.GlobalOpenTelemetry;
9-
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboTelemetry;
10-
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter;
11-
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
12-
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
138
import org.apache.dubbo.common.extension.Activate;
149
import org.apache.dubbo.rpc.Filter;
1510
import org.apache.dubbo.rpc.Invocation;
@@ -22,14 +17,7 @@ public final class OpenTelemetryClientFilter implements Filter {
2217
private final Filter delegate;
2318

2419
public OpenTelemetryClientFilter() {
25-
delegate =
26-
DubboTelemetry.builder(GlobalOpenTelemetry.get())
27-
.addAttributesExtractor(
28-
PeerServiceAttributesExtractor.create(
29-
new DubboClientNetworkAttributesGetter(),
30-
AgentCommonConfig.get().getPeerServiceResolver()))
31-
.build()
32-
.newClientFilter();
20+
delegate = DubboSingletons.CLIENT_FILTER;
3321
}
3422

3523
@Override

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

+1-13
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@
55

66
package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7;
77

8-
import io.opentelemetry.api.GlobalOpenTelemetry;
9-
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboTelemetry;
10-
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter;
11-
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
12-
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
138
import org.apache.dubbo.common.extension.Activate;
149
import org.apache.dubbo.rpc.Filter;
1510
import org.apache.dubbo.rpc.Invocation;
@@ -22,14 +17,7 @@ public final class OpenTelemetryServerFilter implements Filter {
2217
private final Filter delegate;
2318

2419
public OpenTelemetryServerFilter() {
25-
delegate =
26-
DubboTelemetry.builder(GlobalOpenTelemetry.get())
27-
.addAttributesExtractor(
28-
PeerServiceAttributesExtractor.create(
29-
new DubboClientNetworkAttributesGetter(),
30-
AgentCommonConfig.get().getPeerServiceResolver()))
31-
.build()
32-
.newServerFilter();
20+
delegate = DubboSingletons.SERVER_FILTER;
3321
}
3422

3523
@Override

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,20 @@ public static DubboTelemetryBuilder builder(OpenTelemetry openTelemetry) {
3838
/**
3939
* Returns a new Dubbo {@link Filter} that traces Dubbo RPC invocations.
4040
*
41-
* <p>Use {@link #newClientFilter} and {@link #newServerFilter} instead.
41+
* @deprecated Use {@link #newClientFilter} and {@link #newServerFilter} instead.
4242
*/
4343
@Deprecated
4444
public Filter newFilter() {
45-
return new TracingFilter(serverInstrumenter, clientInstrumenter);
45+
return TracingFilter.newFilter(serverInstrumenter, clientInstrumenter);
4646
}
4747

4848
/** Returns a new Dubbo client {@link Filter} that traces Dubbo RPC invocations. */
4949
public Filter newClientFilter() {
50-
return new TracingFilter(clientInstrumenter, null);
50+
return TracingFilter.newClientFilter(clientInstrumenter);
5151
}
5252

5353
/** Returns a new Dubbo server {@link Filter} that traces Dubbo RPC invocations. */
5454
public Filter newServerFilter() {
55-
return new TracingFilter(null, serverInstrumenter);
55+
return TracingFilter.newServerFilter(serverInstrumenter);
5656
}
5757
}

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

+54-16
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> clientInstrumenter;
22-
private final Instrumenter<DubboRequest, Result> serverInstrumenter;
23-
24-
TracingFilter(
25-
Instrumenter<DubboRequest, Result> clientInstrumenter,
26-
Instrumenter<DubboRequest, Result> serverInstrumenter) {
27-
this.clientInstrumenter = clientInstrumenter;
28-
this.serverInstrumenter = serverInstrumenter;
21+
private final InstrumenterSupplier instrumenterSupplier;
22+
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(
53+
Instrumenter<DubboRequest, Result> serverInstrumenter,
54+
Instrumenter<DubboRequest, Result> 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,13 +78,7 @@ public Result invoke(Invoker<?> invoker, Invocation invocation) {
4078
return invoker.invoke(invocation);
4179
}
4280

43-
Instrumenter<DubboRequest, Result> instrumenter;
44-
if (clientInstrumenter != null && serverInstrumenter != null) {
45-
instrumenter = rpcContext.isProviderSide() ? serverInstrumenter : clientInstrumenter;
46-
} else {
47-
instrumenter = clientInstrumenter != null ? clientInstrumenter : serverInstrumenter;
48-
}
49-
81+
Instrumenter<DubboRequest, Result> instrumenter = instrumenterSupplier.get(rpcContext);
5082
Context parentContext = Context.current();
5183
DubboRequest request = DubboRequest.create((RpcInvocation) invocation, rpcContext);
5284

@@ -59,7 +91,7 @@ public Result invoke(Invoker<?> invoker, Invocation invocation) {
5991
boolean isSynchronous = true;
6092
try (Scope ignored = context.makeCurrent()) {
6193
result = invoker.invoke(invocation);
62-
if (instrumenter == this.clientInstrumenter) {
94+
if (instrumenterSupplier.isClientSide(rpcContext)) {
6395
CompletableFuture<Object> future = rpcContext.getCompletableFuture();
6496
if (future != null) {
6597
isSynchronous = false;
@@ -76,4 +108,10 @@ public Result invoke(Invoker<?> invoker, Invocation invocation) {
76108
}
77109
return result;
78110
}
111+
112+
private interface InstrumenterSupplier {
113+
Instrumenter<DubboRequest, Result> get(RpcContext rpcContext);
114+
115+
boolean isClientSide(RpcContext rpcContext);
116+
}
79117
}

0 commit comments

Comments
 (0)
Please sign in to comment.