Skip to content

Commit 05d1cf2

Browse files
committed
POC for changing the way hub is stored; otel-bootstrap module
1 parent 12600f5 commit 05d1cf2

File tree

20 files changed

+870
-43
lines changed

20 files changed

+870
-43
lines changed

sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ val upstreamAgent = configurations.create("upstreamAgent") {
5353

5454
dependencies {
5555
bootstrapLibs(projects.sentry)
56+
bootstrapLibs(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap)
5657
javaagentLibs(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization)
5758
upstreamAgent(Config.Libs.OpenTelemetry.otelJavaAgent)
5859
}

sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dependencies {
2424
exclude(group = "io.opentelemetry")
2525
exclude(group = "io.opentelemetry.javaagent")
2626
}
27+
implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap)
2728

2829
compileOnly(Config.Libs.OpenTelemetry.otelSdk)
2930
compileOnly(Config.Libs.OpenTelemetry.otelExtensionAutoconfigureSpi)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
public final class io/sentry/opentelemetry/OtelContextScopeStorage : io/sentry/ScopeStorage {
2+
public fun <init> ()V
3+
public fun close ()V
4+
public fun get ()Lio/sentry/IHub;
5+
public fun set (Lio/sentry/IHub;)Lio/sentry/SentryStorageToken;
6+
}
7+
8+
public final class io/sentry/opentelemetry/SentryContextStorage : io/opentelemetry/context/ContextStorage {
9+
public static final field HUB_KEY Lio/opentelemetry/context/ContextKey;
10+
public fun <init> (Lio/opentelemetry/context/ContextStorage;)V
11+
public fun attach (Lio/opentelemetry/context/Context;)Lio/opentelemetry/context/Scope;
12+
public fun current ()Lio/opentelemetry/context/Context;
13+
}
14+
15+
public final class io/sentry/opentelemetry/SentryContextWrapper : io/opentelemetry/context/Context {
16+
public fun get (Lio/opentelemetry/context/ContextKey;)Ljava/lang/Object;
17+
public fun toString ()Ljava/lang/String;
18+
public fun with (Lio/opentelemetry/context/ContextKey;Ljava/lang/Object;)Lio/opentelemetry/context/Context;
19+
public static fun wrap (Lio/opentelemetry/context/Context;)Lio/sentry/opentelemetry/SentryContextWrapper;
20+
}
21+
22+
public final class io/sentry/opentelemetry/SentryOtelKeys {
23+
public static final field SENTRY_BAGGAGE_KEY Lio/opentelemetry/context/ContextKey;
24+
public static final field SENTRY_HUB_KEY Lio/opentelemetry/context/ContextKey;
25+
public static final field SENTRY_SCOPES_KEY Lio/opentelemetry/context/ContextKey;
26+
public static final field SENTRY_TRACE_KEY Lio/opentelemetry/context/ContextKey;
27+
public fun <init> ()V
28+
}
29+
30+
public final class io/sentry/opentelemetry/SentryWeakSpanStorage {
31+
public fun getHub (Lio/opentelemetry/api/trace/SpanContext;)Lio/sentry/IHub;
32+
public static fun getInstance ()Lio/sentry/opentelemetry/SentryWeakSpanStorage;
33+
public fun getScopes (Lio/opentelemetry/api/trace/SpanContext;)Lio/sentry/Scopes;
34+
public fun storeHub (Lio/opentelemetry/api/trace/SpanContext;Lio/sentry/IHub;)V
35+
public fun storeScopes (Lio/opentelemetry/api/trace/SpanContext;Lio/sentry/Scopes;)V
36+
}
37+
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import net.ltgt.gradle.errorprone.errorprone
2+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
3+
4+
plugins {
5+
`java-library`
6+
kotlin("jvm")
7+
jacoco
8+
id(Config.QualityPlugins.errorProne)
9+
id(Config.QualityPlugins.gradleVersions)
10+
}
11+
12+
configure<JavaPluginExtension> {
13+
sourceCompatibility = JavaVersion.VERSION_1_8
14+
targetCompatibility = JavaVersion.VERSION_1_8
15+
}
16+
17+
tasks.withType<KotlinCompile>().configureEach {
18+
kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString()
19+
}
20+
21+
dependencies {
22+
compileOnly(projects.sentry)
23+
24+
compileOnly(Config.Libs.OpenTelemetry.otelSdk)
25+
26+
compileOnly(Config.CompileOnly.nopen)
27+
errorprone(Config.CompileOnly.nopenChecker)
28+
errorprone(Config.CompileOnly.errorprone)
29+
compileOnly(Config.CompileOnly.jetbrainsAnnotations)
30+
errorprone(Config.CompileOnly.errorProneNullAway)
31+
32+
// tests
33+
testImplementation(projects.sentryTestSupport)
34+
testImplementation(kotlin(Config.kotlinStdLib))
35+
testImplementation(Config.TestLibs.kotlinTestJunit)
36+
testImplementation(Config.TestLibs.mockitoKotlin)
37+
testImplementation(Config.TestLibs.awaitility)
38+
39+
testImplementation(Config.Libs.OpenTelemetry.otelSdk)
40+
testImplementation(Config.Libs.OpenTelemetry.otelSemconv)
41+
}
42+
43+
configure<SourceSetContainer> {
44+
test {
45+
java.srcDir("src/test/java")
46+
}
47+
}
48+
49+
jacoco {
50+
toolVersion = Config.QualityPlugins.Jacoco.version
51+
}
52+
53+
tasks.jacocoTestReport {
54+
reports {
55+
xml.required.set(true)
56+
html.required.set(false)
57+
}
58+
}
59+
60+
tasks {
61+
jacocoTestCoverageVerification {
62+
violationRules {
63+
rule { limit { minimum = Config.QualityPlugins.Jacoco.minimumCoverage } }
64+
}
65+
}
66+
check {
67+
dependsOn(jacocoTestCoverageVerification)
68+
dependsOn(jacocoTestReport)
69+
}
70+
}
71+
72+
tasks.withType<JavaCompile>().configureEach {
73+
options.errorprone {
74+
check("NullAway", net.ltgt.gradle.errorprone.CheckSeverity.ERROR)
75+
option("NullAway:AnnotatedPackages", "io.sentry")
76+
}
77+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.sentry.opentelemetry;
2+
3+
import static io.sentry.opentelemetry.SentryOtelKeys.SENTRY_HUB_KEY;
4+
5+
import io.opentelemetry.context.Context;
6+
import io.opentelemetry.context.Scope;
7+
import io.sentry.IHub;
8+
import io.sentry.ScopeStorage;
9+
import io.sentry.SentryStorageToken;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
@SuppressWarnings("MustBeClosedChecker")
14+
public final class OtelContextScopeStorage implements ScopeStorage {
15+
16+
@Override
17+
public SentryStorageToken set(@Nullable IHub hub) {
18+
// TODO use scopes key
19+
Scope otelScope = Context.current().with(SENTRY_HUB_KEY, hub).makeCurrent();
20+
return new OtelContextScopeStorageToken(otelScope);
21+
}
22+
23+
@Override
24+
public @Nullable IHub get() {
25+
return Context.current().get(SENTRY_HUB_KEY);
26+
}
27+
28+
@Override
29+
public void close() {
30+
// TODO can we do something here?
31+
}
32+
33+
static final class OtelContextScopeStorageToken implements SentryStorageToken {
34+
35+
private final @NotNull Scope otelScope;
36+
37+
OtelContextScopeStorageToken(final @NotNull Scope otelScope) {
38+
this.otelScope = otelScope;
39+
}
40+
41+
@Override
42+
public void close() {
43+
otelScope.close();
44+
}
45+
}
46+
}

sentry/src/main/java/io/sentry/opentelemetry/SentryOtelKeys.java renamed to sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryOtelKeys.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.opentelemetry.context.ContextKey;
44
import io.sentry.Baggage;
5+
import io.sentry.IHub;
56
import io.sentry.Scopes;
67
import io.sentry.SentryTraceHeader;
78
import org.jetbrains.annotations.ApiStatus;
@@ -16,4 +17,5 @@ public final class SentryOtelKeys {
1617
ContextKey.named("sentry.baggage");
1718
public static final @NotNull ContextKey<Scopes> SENTRY_SCOPES_KEY =
1819
ContextKey.named("sentry.scopes");
20+
public static final @NotNull ContextKey<IHub> SENTRY_HUB_KEY = ContextKey.named("sentry.hub");
1921
}

0 commit comments

Comments
 (0)