Skip to content

Commit 2af8b0d

Browse files
authored
support span attributes for extended observability Closes #69 (#70)
1 parent 9950442 commit 2af8b0d

File tree

4 files changed

+101
-1
lines changed

4 files changed

+101
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.digma.otel.javaagent.extension.instrumentation.extendedobservability;
2+
3+
import com.digma.otel.javaagent.extension.version.DigmaExtensionVersion;
4+
import com.google.auto.service.AutoService;
5+
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
6+
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
7+
import net.bytebuddy.matcher.ElementMatcher;
8+
9+
import java.util.Collections;
10+
import java.util.List;
11+
12+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
13+
14+
15+
@AutoService(InstrumentationModule.class)
16+
public class DigmaExtendedObservabilityInstrumentationModule extends InstrumentationModule {
17+
18+
public static final String DIGMA_MARKER_ANNOTATION_NAME = "org.digma.instrumentation.ExtendedObservability";
19+
20+
public DigmaExtendedObservabilityInstrumentationModule() {
21+
super("digma-extended","digma-extended-"+ DigmaExtensionVersion.VERSION);
22+
}
23+
24+
@Override
25+
public int order() {
26+
return 10000;
27+
}
28+
29+
@Override
30+
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
31+
return hasClassesNamed(DIGMA_MARKER_ANNOTATION_NAME);
32+
}
33+
34+
@Override
35+
public List<TypeInstrumentation> typeInstrumentations() {
36+
return Collections.singletonList(new ExtendedObservabilityTypeInstrumentation());
37+
}
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.digma.otel.javaagent.extension.instrumentation.extendedobservability;
2+
3+
import com.digma.otel.javaagent.extension.instrumentation.common.DigmaTypeInstrumentation;
4+
import io.opentelemetry.api.trace.Span;
5+
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
6+
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
7+
import net.bytebuddy.asm.Advice;
8+
import net.bytebuddy.description.type.TypeDescription;
9+
import net.bytebuddy.matcher.ElementMatcher;
10+
import net.bytebuddy.matcher.ElementMatchers;
11+
12+
import static com.digma.otel.javaagent.extension.instrumentation.extendedobservability.DigmaExtendedObservabilityInstrumentationModule.DIGMA_MARKER_ANNOTATION_NAME;
13+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
14+
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
15+
import static net.bytebuddy.matcher.ElementMatchers.named;
16+
17+
public class ExtendedObservabilityTypeInstrumentation extends DigmaTypeInstrumentation {
18+
19+
@Override
20+
public ElementMatcher<ClassLoader> classLoaderOptimization() {
21+
return hasClassesNamed(DIGMA_MARKER_ANNOTATION_NAME);
22+
}
23+
24+
@Override
25+
public ElementMatcher<TypeDescription> digmaTypeMatcher() {
26+
return ElementMatchers.declaresMethod(isAnnotatedWith(named(DIGMA_MARKER_ANNOTATION_NAME)));
27+
}
28+
29+
30+
@Override
31+
public void transform(TypeTransformer transformer) {
32+
transformer.applyAdviceToMethod(isAnnotatedWith(named(DIGMA_MARKER_ANNOTATION_NAME)),
33+
ExtendedObservabilityTypeInstrumentation.class.getName() + "$MethodAdvice");
34+
}
35+
36+
37+
38+
public static class MethodAdvice {
39+
40+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
41+
public static void stopSpan(
42+
@Advice.Origin("#t") Class<?> declaringClass) {
43+
44+
Span currentSpan = Java8BytecodeBridge.currentSpan();
45+
if (currentSpan != null) {
46+
String packageName = "";
47+
if (declaringClass != null){
48+
packageName = declaringClass.getPackage().getName();
49+
}
50+
currentSpan.setAttribute("digma.instrumentation.extended.package",packageName);
51+
currentSpan.setAttribute("digma.instrumentation.extended.enabled","true");
52+
}
53+
}
54+
55+
56+
57+
}
58+
59+
60+
}

agent-extension/src/main/java/com/digma/otel/javaagent/extension/instrumentation/methods/MethodsInPackageTypeInstrumentation.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public ElementMatcher<TypeDescription> digmaTypeMatcher() {
4242
.and(not(typeFilterByAnnotation()))
4343
.and(not(isSynthetic()))
4444
.and(not(isEnum()))
45+
.and(not(isRecord()))
4546
.and(not(extendsClass(named("io.grpc.ServerBuilder"))))
4647
.and(not(jaxrsTypes()))
4748
.and(not(kafkaTypes()))

version.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// keep the name theVersion and the val definition since script update_version.sh maintains it
2-
val theVersion = "0.8.12"
2+
val theVersion = "0.8.13"
33

44
allprojects {
55
group = "io.github.digma-ai"

0 commit comments

Comments
 (0)