Skip to content

Commit 72e3a8e

Browse files
committed
Add support for Nacos Client (#9961)
1 parent 0c32f85 commit 72e3a8e

File tree

22 files changed

+1179
-0
lines changed

22 files changed

+1179
-0
lines changed

docs/supported-libraries.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ These are the supported libraries and frameworks:
101101
| [Micrometer](https://micrometer.io/) | 1.5+ | [opentelemetry-micrometer-1.5](../instrumentation/micrometer/micrometer-1.5/library) | none |
102102
| [MongoDB Driver](https://mongodb.github.io/mongo-java-driver/) | 3.1+ | [opentelemetry-mongo-3.1](../instrumentation/mongo/mongo-3.1/library) | [Database Client Spans] |
103103
| [MyBatis](https://mybatis.org/mybatis-3/) | 3.2+ | N/A | none |
104+
| [Nacos](https://nacos.io/) | 2.0.3+ | N/A | none |
104105
| [Netty HTTP codec [5]](https://github.com/netty/netty) | 3.8+ | [opentelemetry-netty-4.1](../instrumentation/netty/netty-4.1/library) | [HTTP Client Spans], [HTTP Client Metrics], [HTTP Server Spans], [HTTP Server Metrics] |
105106
| [OkHttp](https://github.com/square/okhttp/) | 2.2+ | [opentelemetry-okhttp-3.0](../instrumentation/okhttp/okhttp-3.0/library) | [HTTP Client Spans], [HTTP Client Metrics] |
106107
| [Oracle UCP](https://docs.oracle.com/database/121/JJUCP/) | 11.2+ | [opentelemetry-oracle-ucp-11.2](../instrumentation/oracle-ucp-11.2/library) | [Database Pool Metrics] |
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## Enhancement Methods
2+
- `com.alibaba.nacos.common.remote.client.grpc.GrpcConnection#request`
3+
- `com.alibaba.nacos.common.remote.client.RpcClient#handleServerRequest`
4+
5+
## Span Info Details
6+
<table border="1">
7+
<thead>
8+
<tr>
9+
<th>Request Child Class</th>
10+
<th>SpanName</th>
11+
<th>Additional Tags</th>
12+
</tr>
13+
</thead>
14+
<tbody>
15+
<tr>
16+
<td>InstanceRequest</td>
17+
<td>Nacos/{$(lnstanceRequest.getType()}</td>
18+
<td rowspan="5">nacos.namespace nacos.group nacos.service.name</td>
19+
</tr>
20+
<tr>
21+
<td>ServiceQueryRequest</td>
22+
<td>Nacos/queryService</td>
23+
</tr>
24+
<tr>
25+
<td>SubscribeServiceRequest</td>
26+
<td>Nacos/subscribeService,Nacos/unsubscribeService</td>
27+
</tr>
28+
<tr>
29+
<td>ServicelistRequest</td>
30+
<td>Nacos/getServicelist</td>
31+
</tr>
32+
<tr>
33+
<td>ConfigQueryRequest</td>
34+
<td>Nacos/queryConfig</td>
35+
</tr>
36+
<tr>
37+
<td>ConfigPublishRequest</td>
38+
<td>Nacos/publishConfig</td>
39+
<td rowspan="3">nacos.data.id nacos.group nacos.tenant</td>
40+
</tr>
41+
<tr>
42+
<td>ConfigRemoveRequest</td>
43+
<td>Nacos/removeConfig</td>
44+
</tr>
45+
<tr>
46+
<td>ConfigChangeNotifyRequest</td>
47+
<td>Nacos/notifyConfigChange</td>
48+
</tr>
49+
<tr>
50+
<td>NotifySubscriberRequest</td>
51+
<td>Nacos/notifySubscribeChange</td>
52+
<td>nacos.group nacos.service.name</td>
53+
</tr>
54+
</tbody>
55+
</table>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
plugins {
2+
id("otel.javaagent-instrumentation")
3+
}
4+
5+
muzzle {
6+
pass {
7+
group.set("com.alibaba.nacos")
8+
module.set("nacos-client")
9+
versions.set("[2.0.3,)")
10+
assertInverse.set(true)
11+
}
12+
}
13+
14+
dependencies {
15+
implementation("com.alibaba.nacos:nacos-client:2.0.3")
16+
testImplementation("javax.annotation:javax.annotation-api:1.3.2")
17+
}
18+
19+
20+
tasks.withType<Test>().configureEach {
21+
jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
22+
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.opentelemetry.javaagent.instrumentation.nacos.client.v2_0_3;
2+
3+
import io.opentelemetry.api.common.AttributeKey;
4+
5+
public class NacosClientConstants {
6+
private NacosClientConstants() {
7+
}
8+
9+
public static final String NACOS_PREFIX = "Nacos/";
10+
11+
public static final String SERVER_CHECK = "serverCheck";
12+
13+
public static final String QUERY_SERVICE = "queryService";
14+
15+
public static final String SUBSCRIBE_SERVICE = "subscribeService";
16+
17+
public static final String UNSUBSCRIBE_SERVICE = "unsubscribeService";
18+
19+
public static final String QUERY_CONFIG = "queryConfig";
20+
21+
public static final String PUBLISH_CONFIG = "publishConfig";
22+
23+
public static final String REMOVE_CONFIG = "removeConfig";
24+
25+
public static final String GET_SERVICE_LIST = "getServiceList";
26+
27+
public static final String NOTIFY_SUBSCRIBE_CHANGE = "notifySubscribeChange";
28+
29+
public static final String NOTIFY_CONFIG_CHANGE = "notifyConfigChange";
30+
31+
public static final AttributeKey<String> NACOS_NAME_SPACE_ATTR = AttributeKey.stringKey(
32+
"nacos.namespace");
33+
34+
public static final AttributeKey<String> NACOS_GROUP_NAME_ATTR = AttributeKey.stringKey("nacos.group.name");
35+
36+
public static final AttributeKey<String> NACOS_SERVICE_NAME_ATTR = AttributeKey.stringKey(
37+
"nacos.service.name");
38+
39+
public static final AttributeKey<String> NACOS_DATA_ID_ATTR = AttributeKey.stringKey(
40+
"nacos.data.id");
41+
42+
public static final AttributeKey<String> NACOS_GROUP_ATTR = AttributeKey.stringKey("nacos.group");
43+
44+
public static final AttributeKey<String> NACOS_TENANT_ATTR = AttributeKey.stringKey(
45+
"nacos.tenant");
46+
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package io.opentelemetry.javaagent.instrumentation.nacos.client.v2_0_3;
2+
3+
import com.alibaba.nacos.api.config.remote.request.ConfigChangeNotifyRequest;
4+
import com.alibaba.nacos.api.config.remote.request.ConfigPublishRequest;
5+
import com.alibaba.nacos.api.config.remote.request.ConfigQueryRequest;
6+
import com.alibaba.nacos.api.config.remote.request.ConfigRemoveRequest;
7+
import com.alibaba.nacos.api.naming.remote.request.InstanceRequest;
8+
import com.alibaba.nacos.api.naming.remote.request.NotifySubscriberRequest;
9+
import com.alibaba.nacos.api.naming.remote.request.ServiceListRequest;
10+
import com.alibaba.nacos.api.naming.remote.request.ServiceQueryRequest;
11+
import com.alibaba.nacos.api.naming.remote.request.SubscribeServiceRequest;
12+
import com.alibaba.nacos.api.remote.request.Request;
13+
import java.util.HashMap;
14+
import java.util.Map;
15+
import javax.annotation.Nonnull;
16+
17+
public class NacosClientHelper {
18+
private static final NacosClientRequestOperator UNKNOWN_OPERATOR = new NacosClientRequestOperator(
19+
request -> request.getClass().getSimpleName(), null);
20+
private static final Map<Class<? extends Request>, NacosClientRequestOperator> KNOWN_OPERATOR_MAP = new HashMap<>();
21+
22+
private NacosClientHelper() {}
23+
24+
static {
25+
KNOWN_OPERATOR_MAP.put(InstanceRequest.class, new NacosClientRequestOperator(
26+
request -> ((InstanceRequest) request).getType(),
27+
(attributesBuilder, request) -> {
28+
InstanceRequest instanceRequest = (InstanceRequest) request;
29+
attributesBuilder.put(NacosClientConstants.NACOS_NAME_SPACE_ATTR,
30+
instanceRequest.getNamespace());
31+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_NAME_ATTR,
32+
instanceRequest.getGroupName());
33+
attributesBuilder.put(NacosClientConstants.NACOS_SERVICE_NAME_ATTR,
34+
instanceRequest.getServiceName());
35+
})
36+
);
37+
38+
KNOWN_OPERATOR_MAP.put(ServiceQueryRequest.class, new NacosClientRequestOperator(
39+
request -> NacosClientConstants.QUERY_SERVICE,
40+
(attributesBuilder, request) -> {
41+
ServiceQueryRequest serviceQueryRequest = (ServiceQueryRequest) request;
42+
attributesBuilder.put(NacosClientConstants.NACOS_NAME_SPACE_ATTR,
43+
serviceQueryRequest.getNamespace());
44+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_NAME_ATTR,
45+
serviceQueryRequest.getGroupName());
46+
attributesBuilder.put(NacosClientConstants.NACOS_SERVICE_NAME_ATTR,
47+
serviceQueryRequest.getServiceName());
48+
})
49+
);
50+
51+
KNOWN_OPERATOR_MAP.put(SubscribeServiceRequest.class, new NacosClientRequestOperator(
52+
request -> ((SubscribeServiceRequest) request).isSubscribe()
53+
? NacosClientConstants.SUBSCRIBE_SERVICE
54+
: NacosClientConstants.UNSUBSCRIBE_SERVICE,
55+
(attributesBuilder, request) -> {
56+
SubscribeServiceRequest subscribeServiceRequest = (SubscribeServiceRequest) request;
57+
attributesBuilder.put(NacosClientConstants.NACOS_NAME_SPACE_ATTR,
58+
subscribeServiceRequest.getNamespace());
59+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_NAME_ATTR,
60+
subscribeServiceRequest.getGroupName());
61+
attributesBuilder.put(NacosClientConstants.NACOS_SERVICE_NAME_ATTR,
62+
subscribeServiceRequest.getServiceName());
63+
})
64+
);
65+
66+
KNOWN_OPERATOR_MAP.put(ServiceListRequest.class, new NacosClientRequestOperator(
67+
request -> NacosClientConstants.GET_SERVICE_LIST,
68+
(attributesBuilder, request) -> {
69+
ServiceListRequest serviceListRequest = (ServiceListRequest) request;
70+
attributesBuilder.put(NacosClientConstants.NACOS_NAME_SPACE_ATTR,
71+
serviceListRequest.getNamespace());
72+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_NAME_ATTR,
73+
serviceListRequest.getGroupName());
74+
attributesBuilder.put(NacosClientConstants.NACOS_SERVICE_NAME_ATTR,
75+
serviceListRequest.getServiceName());
76+
})
77+
);
78+
79+
KNOWN_OPERATOR_MAP.put(ConfigQueryRequest.class, new NacosClientRequestOperator(
80+
request -> NacosClientConstants.QUERY_CONFIG,
81+
(attributesBuilder, request) -> {
82+
ConfigQueryRequest configQueryRequest = (ConfigQueryRequest) request;
83+
attributesBuilder.put(NacosClientConstants.NACOS_DATA_ID_ATTR,
84+
configQueryRequest.getDataId());
85+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_ATTR,
86+
configQueryRequest.getGroup());
87+
attributesBuilder.put(NacosClientConstants.NACOS_TENANT_ATTR,
88+
configQueryRequest.getTenant());
89+
})
90+
);
91+
92+
KNOWN_OPERATOR_MAP.put(ConfigPublishRequest.class, new NacosClientRequestOperator(
93+
request -> NacosClientConstants.PUBLISH_CONFIG,
94+
(attributesBuilder, request) -> {
95+
ConfigPublishRequest configPublishRequest = (ConfigPublishRequest) request;
96+
attributesBuilder.put(NacosClientConstants.NACOS_DATA_ID_ATTR,
97+
configPublishRequest.getDataId());
98+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_ATTR,
99+
configPublishRequest.getGroup());
100+
attributesBuilder.put(NacosClientConstants.NACOS_TENANT_ATTR,
101+
configPublishRequest.getTenant());
102+
})
103+
);
104+
105+
KNOWN_OPERATOR_MAP.put(ConfigRemoveRequest.class, new NacosClientRequestOperator(
106+
request -> NacosClientConstants.REMOVE_CONFIG,
107+
(attributesBuilder, request) -> {
108+
ConfigRemoveRequest configRemoveRequest = (ConfigRemoveRequest) request;
109+
attributesBuilder.put(NacosClientConstants.NACOS_DATA_ID_ATTR,
110+
configRemoveRequest.getDataId());
111+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_ATTR,
112+
configRemoveRequest.getGroup());
113+
attributesBuilder.put(NacosClientConstants.NACOS_TENANT_ATTR,
114+
configRemoveRequest.getTenant());
115+
})
116+
);
117+
118+
KNOWN_OPERATOR_MAP.put(NotifySubscriberRequest.class, new NacosClientRequestOperator(
119+
request -> NacosClientConstants.NOTIFY_SUBSCRIBE_CHANGE,
120+
(attributesBuilder, request) -> {
121+
NotifySubscriberRequest notifySubscriberRequest = (NotifySubscriberRequest) request;
122+
attributesBuilder.put(NacosClientConstants.NACOS_NAME_SPACE_ATTR,
123+
notifySubscriberRequest.getNamespace());
124+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_NAME_ATTR,
125+
notifySubscriberRequest.getGroupName());
126+
attributesBuilder.put(NacosClientConstants.NACOS_SERVICE_NAME_ATTR,
127+
notifySubscriberRequest.getServiceName());
128+
})
129+
);
130+
131+
KNOWN_OPERATOR_MAP.put(ConfigChangeNotifyRequest.class, new NacosClientRequestOperator(
132+
request -> NacosClientConstants.NOTIFY_CONFIG_CHANGE,
133+
(attributesBuilder, request) -> {
134+
ConfigChangeNotifyRequest configChangeNotifyRequest = (ConfigChangeNotifyRequest) request;
135+
attributesBuilder.put(NacosClientConstants.NACOS_DATA_ID_ATTR,
136+
configChangeNotifyRequest.getDataId());
137+
attributesBuilder.put(NacosClientConstants.NACOS_GROUP_ATTR,
138+
configChangeNotifyRequest.getGroup());
139+
attributesBuilder.put(NacosClientConstants.NACOS_TENANT_ATTR,
140+
configChangeNotifyRequest.getTenant());
141+
})
142+
);
143+
}
144+
145+
@Nonnull
146+
public static NacosClientRequestOperator getOperator(@Nonnull Request request) {
147+
NacosClientRequestOperator nacosClientRequestOperator = KNOWN_OPERATOR_MAP.get(
148+
request.getClass());
149+
if (nacosClientRequestOperator != null) {
150+
return nacosClientRequestOperator;
151+
}
152+
return UNKNOWN_OPERATOR;
153+
}
154+
155+
156+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.opentelemetry.javaagent.instrumentation.nacos.client.v2_0_3;
2+
3+
import com.google.auto.service.AutoService;
4+
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
5+
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
6+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
7+
import io.opentelemetry.javaagent.instrumentation.nacos.client.v2_0_3.instrumentations.GrpcConnectionInstrumentation;
8+
import io.opentelemetry.javaagent.instrumentation.nacos.client.v2_0_3.instrumentations.RpcClientInstrumentation;
9+
import java.util.Arrays;
10+
import java.util.List;
11+
12+
@AutoService(InstrumentationModule.class)
13+
public class NacosClientInstrumentationModule extends InstrumentationModule implements
14+
ExperimentalInstrumentationModule {
15+
public NacosClientInstrumentationModule() {
16+
super("nacos-client", "nacos-client-2.0.3");
17+
}
18+
19+
@Override
20+
public List<TypeInstrumentation> typeInstrumentations() {
21+
return Arrays.asList(
22+
new GrpcConnectionInstrumentation(),
23+
new RpcClientInstrumentation()
24+
);
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.opentelemetry.javaagent.instrumentation.nacos.client.v2_0_3;
2+
3+
import com.alibaba.nacos.api.remote.request.Request;
4+
import io.opentelemetry.api.common.Attributes;
5+
import javax.annotation.Nonnull;
6+
7+
public final class NacosClientRequest {
8+
private final String methodName;
9+
private final Class<?> declaringClass;
10+
private final String spanName;
11+
private final Attributes attributes;
12+
13+
public NacosClientRequest(String methodName, Class<?> declaringClass, String spanName,
14+
Attributes attributes) {
15+
this.methodName = methodName;
16+
this.declaringClass = declaringClass;
17+
this.spanName = spanName;
18+
this.attributes = attributes;
19+
}
20+
21+
@Nonnull
22+
public static NacosClientRequest createRequest(@Nonnull String methodName,
23+
@Nonnull Class<?> declaringClass, @Nonnull Request request) {
24+
NacosClientRequestOperator operator = NacosClientHelper.getOperator(request);
25+
String spanName = operator.getName(request);
26+
Attributes attributes = operator.getAttributes(request);
27+
return new NacosClientRequest(methodName, declaringClass, spanName, attributes);
28+
}
29+
30+
public String getMethodName() {
31+
return methodName;
32+
}
33+
34+
public Class<?> getDeclaringClass() {
35+
return declaringClass;
36+
}
37+
38+
public String getSpanName() {
39+
return spanName;
40+
}
41+
42+
public Attributes getAttributes() {
43+
return attributes;
44+
}
45+
46+
}

0 commit comments

Comments
 (0)