Skip to content

Commit da8a59e

Browse files
refactors aerospike module
1 parent 7d2f3a5 commit da8a59e

21 files changed

+425
-987
lines changed

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ muzzle {
1212
}
1313

1414
dependencies {
15-
library("com.aerospike:aerospike-client:7.0.0")
16-
implementation("io.opentelemetry:opentelemetry-extension-incubator")
15+
implementation("com.aerospike:aerospike-client:7.0.0")
16+
implementation("io.opentelemetry:opentelemetry-api-incubator")
1717

1818
compileOnly("com.google.auto.value:auto-value-annotations")
1919
annotationProcessor("com.google.auto.value:auto-value")

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AerospikeClientAttributeExtractor.java

+10-12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import io.opentelemetry.api.common.AttributesBuilder;
1111
import io.opentelemetry.context.Context;
1212
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
13+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeRequest;
14+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeSemanticAttributes;
1315
import javax.annotation.Nullable;
1416

1517
final class AerospikeClientAttributeExtractor
@@ -18,10 +20,7 @@ final class AerospikeClientAttributeExtractor
1820
@Override
1921
public void onStart(
2022
AttributesBuilder attributes, Context parentContext, AerospikeRequest aerospikeRequest) {
21-
attributes.put(
22-
AerospikeSemanticAttributes.AEROSPIKE_NAMESPACE, aerospikeRequest.getNamespace());
2323
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_SET_NAME, aerospikeRequest.getSet());
24-
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_USER_KEY, aerospikeRequest.getUserKey());
2524
}
2625

2726
@Override
@@ -31,22 +30,21 @@ public void onEnd(
3130
AerospikeRequest aerospikeRequest,
3231
@Nullable Void unused,
3332
@Nullable Throwable error) {
34-
attributes.put(
35-
AerospikeSemanticAttributes.AEROSPIKE_STATUS, aerospikeRequest.getStatus().name());
33+
if (aerospikeRequest.getNode() != null) {
34+
String nodeName = aerospikeRequest.getNode().getName();
35+
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_NODE_NAME, nodeName);
36+
}
37+
3638
if (error != null) {
3739
if (error instanceof AerospikeException) {
3840
AerospikeException aerospikeException = (AerospikeException) error;
3941
attributes.put(
40-
AerospikeSemanticAttributes.AEROSPIKE_ERROR_CODE, aerospikeException.getResultCode());
42+
AerospikeSemanticAttributes.AEROSPIKE_STATUS, aerospikeException.getResultCode());
4143
} else {
42-
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_ERROR_CODE, ResultCode.CLIENT_ERROR);
44+
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_STATUS, ResultCode.CLIENT_ERROR);
4345
}
4446
} else {
45-
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_ERROR_CODE, ResultCode.OK);
46-
if (aerospikeRequest.getSize() != null) {
47-
attributes.put(
48-
AerospikeSemanticAttributes.AEROSPIKE_TRANSFER_SIZE, aerospikeRequest.getSize());
49-
}
47+
attributes.put(AerospikeSemanticAttributes.AEROSPIKE_STATUS, ResultCode.OK);
5048
}
5149
}
5250
}

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AerospikeClientInstrumentationModule.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,14 @@ public AerospikeClientInstrumentationModule() {
2323

2424
@Override
2525
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
26-
return hasClassesNamed("com.aerospike.client.AerospikeClient")
27-
.and(hasClassesNamed("com.aerospike.client.metrics.MetricsPolicy"));
26+
return hasClassesNamed("com.aerospike.client.IAerospikeClient");
2827
}
2928

3029
@Override
3130
public List<TypeInstrumentation> typeInstrumentations() {
3231
return asList(
32+
new IAerospikeClientInstrumentation(),
3333
new SyncCommandInstrumentation(),
34-
new SocketInstrumentation(),
35-
new AsyncCommandInstrumentation(),
36-
new AsyncHandlerInstrumentation(),
37-
new AsyncScanAllCommandInstrumentation());
34+
new AsyncCommandInstrumentation());
3835
}
3936
}

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AerospikeDbAttributesGetter.java

+14-13
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,39 @@
66
package io.opentelemetry.javaagent.instrumentation.aerospike.v7_0;
77

88
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter;
9+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeRequest;
10+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeSemanticAttributes;
911
import javax.annotation.Nullable;
1012

1113
final class AerospikeDbAttributesGetter implements DbClientAttributesGetter<AerospikeRequest> {
1214

1315
@Override
14-
public String getSystem(AerospikeRequest request) {
16+
public String getDbSystem(AerospikeRequest request) {
1517
return AerospikeSemanticAttributes.DbSystemValues.AEROSPIKE;
1618
}
1719

1820
@Override
19-
@Nullable
20-
public String getUser(AerospikeRequest request) {
21-
return null;
21+
public String getDbOperationName(AerospikeRequest request) {
22+
return request.getOperation();
2223
}
2324

25+
@Nullable
2426
@Override
25-
public String getName(AerospikeRequest request) {
26-
return null;
27+
public String getDbNamespace(AerospikeRequest request) {
28+
return request.getNamespace();
2729
}
2830

31+
@Deprecated
32+
@Nullable
2933
@Override
30-
public String getConnectionString(AerospikeRequest request) {
34+
public String getUser(AerospikeRequest aerospikeRequest) {
3135
return null;
3236
}
3337

38+
@Deprecated
39+
@Nullable
3440
@Override
35-
public String getStatement(AerospikeRequest request) {
41+
public String getConnectionString(AerospikeRequest aerospikeRequest) {
3642
return null;
3743
}
38-
39-
@Override
40-
public String getOperation(AerospikeRequest request) {
41-
return request.getOperation();
42-
}
4344
}

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AerospikeNetworkAttributesGetter.java

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.aerospike.client.cluster.Node;
99
import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesGetter;
10+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeRequest;
1011
import java.net.InetSocketAddress;
1112
import javax.annotation.Nullable;
1213

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AersopikeSingletons.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
package io.opentelemetry.javaagent.instrumentation.aerospike.v7_0;
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
910
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor;
1011
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
1112
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1213
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1314
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
1415
import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor;
1516
import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesGetter;
16-
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
17+
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
18+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeRequest;
1719
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.metrics.AerospikeMetrics;
1820

1921
public final class AersopikeSingletons {
@@ -33,7 +35,7 @@ public final class AersopikeSingletons {
3335
DbClientSpanNameExtractor.create(aerospikeDbAttributesGetter))
3436
.addAttributesExtractor(DbClientAttributesExtractor.create(aerospikeDbAttributesGetter))
3537
.addAttributesExtractor(NetworkAttributesExtractor.create(netAttributesGetter));
36-
InstrumentationConfig instrumentationConfig = InstrumentationConfig.get();
38+
InstrumentationConfig instrumentationConfig = AgentInstrumentationConfig.get();
3739
if (instrumentationConfig.getBoolean(
3840
"otel.instrumentation.aerospike.experimental-span-attributes", false)) {
3941
builder.addAttributesExtractor(new AerospikeClientAttributeExtractor());

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AsyncCommandInstrumentation.java

+70-22
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55

66
package io.opentelemetry.javaagent.instrumentation.aerospike.v7_0;
77

8-
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
98
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
10-
import static io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.AersopikeSingletons.instrumenter;
119
import static net.bytebuddy.matcher.ElementMatchers.hasSuperClass;
1210
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
11+
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1312
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1413
import static net.bytebuddy.matcher.ElementMatchers.named;
14+
import static net.bytebuddy.matcher.ElementMatchers.takesGenericArguments;
1515

16-
import com.aerospike.client.Key;
16+
import com.aerospike.client.AerospikeException;
17+
import com.aerospike.client.cluster.Node;
1718
import com.aerospike.client.command.Command;
18-
import io.opentelemetry.context.Context;
1919
import io.opentelemetry.instrumentation.api.util.VirtualField;
2020
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2121
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
22-
import java.util.Locale;
22+
import io.opentelemetry.javaagent.instrumentation.aerospike.v7_0.internal.AerospikeRequestContext;
2323
import net.bytebuddy.asm.Advice;
2424
import net.bytebuddy.description.type.TypeDescription;
2525
import net.bytebuddy.matcher.ElementMatcher;
@@ -40,39 +40,87 @@ public ElementMatcher<TypeDescription> typeMatcher() {
4040
public void transform(TypeTransformer transformer) {
4141
transformer.applyAdviceToMethod(
4242
isConstructor().and(isPublic()), this.getClass().getName() + "$ConstructorAdvice");
43+
44+
transformer.applyAdviceToMethod(
45+
isMethod().and(named("getNode")), this.getClass().getName() + "$GetNodeAdvice");
46+
47+
transformer.applyAdviceToMethod(
48+
isMethod().and(named("onSuccess")), this.getClass().getName() + "$GetOnSuccessAdvice");
49+
50+
transformer.applyAdviceToMethod(
51+
isMethod().and(named("onFailure").and(takesGenericArguments(AerospikeException.class))),
52+
this.getClass().getName() + "$GetOnFailureAdvice");
4353
}
4454

4555
@SuppressWarnings("unused")
4656
public static class ConstructorAdvice {
57+
4758
@Advice.OnMethodExit(suppress = Throwable.class)
48-
public static void onExit(@Advice.This Command command, @Advice.AllArguments Object[] objects) {
49-
Key key = null;
50-
for (Object object : objects) {
51-
if (object instanceof Key) {
52-
key = (Key) object;
53-
break;
54-
}
59+
public static void getCommand(@Advice.This Command command) {
60+
VirtualField<Command, AerospikeRequestContext> virtualField =
61+
VirtualField.find(Command.class, AerospikeRequestContext.class);
62+
AerospikeRequestContext requestContext = virtualField.get(command);
63+
// If the AerospikeRequestContext is already there in VirtualField then we do not need
64+
// to override it when constructor of other subclasses of AsyncCommand executes as
65+
// AsyncCommand follows multilevel inheritance.
66+
if (requestContext != null) {
67+
return;
5568
}
56-
if (key == null) {
69+
requestContext = AerospikeRequestContext.current();
70+
if (requestContext == null) {
5771
return;
5872
}
73+
virtualField.set(command, requestContext);
74+
requestContext.detachContext();
75+
}
76+
}
77+
78+
@SuppressWarnings("unused")
79+
public static class GetNodeAdvice {
80+
81+
@Advice.OnMethodExit(suppress = Throwable.class)
82+
public static void getNode(@Advice.Return Node node, @Advice.This Command command) {
5983
VirtualField<Command, AerospikeRequestContext> virtualField =
6084
VirtualField.find(Command.class, AerospikeRequestContext.class);
6185
AerospikeRequestContext requestContext = virtualField.get(command);
62-
if (requestContext != null) {
86+
if (requestContext == null || requestContext.getRequest().getNode() != null) {
6387
return;
6488
}
65-
Context parentContext = currentContext();
66-
AerospikeRequest request =
67-
AerospikeRequest.create(command.getClass().getSimpleName().toUpperCase(Locale.ROOT), key);
68-
if (!instrumenter().shouldStart(parentContext, request)) {
89+
requestContext.getRequest().setNode(node);
90+
}
91+
}
92+
93+
@SuppressWarnings("unused")
94+
public static class GetOnSuccessAdvice {
95+
96+
@Advice.OnMethodExit(suppress = Throwable.class)
97+
public static void stopInstrumentation(@Advice.This Command command) {
98+
VirtualField<Command, AerospikeRequestContext> virtualField =
99+
VirtualField.find(Command.class, AerospikeRequestContext.class);
100+
AerospikeRequestContext requestContext = virtualField.get(command);
101+
if (requestContext == null) {
69102
return;
70103
}
71-
Context context = instrumenter().start(parentContext, request);
72-
AerospikeRequestContext aerospikeRequestContext =
73-
AerospikeRequestContext.attach(request, context);
104+
virtualField.set(command, null);
105+
requestContext.endSpan();
106+
}
107+
}
108+
109+
@SuppressWarnings("unused")
110+
public static class GetOnFailureAdvice {
74111

75-
virtualField.set(command, aerospikeRequestContext);
112+
@Advice.OnMethodExit(suppress = Throwable.class)
113+
public static void stopInstrumentation(
114+
@Advice.Argument(0) AerospikeException ae, @Advice.This Command command) {
115+
VirtualField<Command, AerospikeRequestContext> virtualField =
116+
VirtualField.find(Command.class, AerospikeRequestContext.class);
117+
AerospikeRequestContext requestContext = virtualField.get(command);
118+
if (requestContext == null) {
119+
return;
120+
}
121+
virtualField.set(command, null);
122+
requestContext.setThrowable(ae);
123+
requestContext.endSpan();
76124
}
77125
}
78126
}

instrumentation/aerospike-client/aerospike-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/aerospike/v7_0/AsyncHandlerInstrumentation.java

-87
This file was deleted.

0 commit comments

Comments
 (0)