Skip to content

Commit 24304f6

Browse files
committed
Merge branch '8.x.x' into feat/potel-unit-testing
# Conflicts: # sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api
2 parents 0ffa4b1 + f028e77 commit 24304f6

113 files changed

Lines changed: 2860 additions & 492 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/system-tests-backend.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,18 @@ jobs:
2121
matrix:
2222
sample: [ "sentry-samples-spring-boot-jakarta" ]
2323
agent: [ "0" ]
24+
agent-auto-init: [ "true" ]
2425
include:
2526
- sample: "sentry-samples-spring-boot"
2627
- sample: "sentry-samples-spring-boot-webflux-jakarta"
2728
- sample: "sentry-samples-spring-boot-webflux"
29+
- sample: "sentry-samples-spring-boot-jakarta-opentelemetry-noagent"
2830
- sample: "sentry-samples-spring-boot-jakarta-opentelemetry"
2931
agent: "1"
32+
agent-auto-init: "true"
33+
- sample: "sentry-samples-spring-boot-jakarta-opentelemetry"
34+
agent: "1"
35+
agent-auto-init: "false"
3036
steps:
3137
- uses: actions/checkout@v4
3238
with:
@@ -86,18 +92,13 @@ jobs:
8692
8793
- name: Start server and run integration test for sentry-cli commands
8894
run: |
89-
test/system-test-sentry-server-start.sh \
90-
> sentry-mock-server.txt 2>&1 & \
91-
test/system-test-spring-server-start.sh "${{ matrix.sample }}" "${{ matrix.agent }}" \
92-
> spring-server.txt 2>&1 & \
93-
test/wait-for-spring.sh && \
94-
./gradlew :sentry-samples:${{ matrix.sample }}:systemTest
95+
test/system-test-run.sh "${{ matrix.sample }}" "${{ matrix.agent }}" "${{ matrix.agent-auto-init }}"
9596
9697
- name: Upload test results
9798
if: always()
9899
uses: actions/upload-artifact@v4
99100
with:
100-
name: test-results-${{ matrix.sample }}-system-test
101+
name: test-results-${{ matrix.sample }}-${{ matrix.agent }}-${{ matrix.agent-auto-init }}-system-test
101102
path: |
102103
**/build/reports/*
103104
sentry-mock-server.txt

CHANGELOG.md

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,25 @@
99
- `Session.getSessionId()` now returns a `String` instead of a `UUID`.
1010
- The Android minSdk level for all Android modules is now 21 ([#3852](https://github.com/getsentry/sentry-java/pull/3852))
1111
- The minSdk level for sentry-android-ndk changed from 19 to 21 ([#3851](https://github.com/getsentry/sentry-java/pull/3851))
12-
13-
### Features
14-
12+
- All status codes below 400 are now mapped to `SpanStatus.OK` ([#3869](https://github.com/getsentry/sentry-java/pull/3869))
13+
14+
### Features
15+
16+
- Spring Boot now automatically detects if OpenTelemetry is available and makes use of it ([#3846](https://github.com/getsentry/sentry-java/pull/3846))
17+
- This is only enabled if there is no OpenTelemetry agent available
18+
- We prefer to use the OpenTelemetry agent as it offers more auto instrumentation
19+
- In some cases the OpenTelemetry agent cannot be used, please see https://opentelemetry.io/docs/zero-code/java/spring-boot-starter/ for more details on when to prefer the Agent and when the Spring Boot starter makes more sense.
20+
- In this mode the SDK makes use of the `OpenTelemetry` bean that is created by `opentelemetry-spring-boot-starter` instead of `GlobalOpenTelemetry`
21+
- Spring Boot now automatically detects our OpenTelemetry agent if its auto init is disabled ([#3848](https://github.com/getsentry/sentry-java/pull/3848))
22+
- This means Spring Boot config mechanisms can now be combined with our OpenTelemetry agent
23+
- The `sentry-opentelemetry-extra` module has been removed again, most classes have been moved to `sentry-opentelemetry-bootstrap` which is loaded into the bootstrap classloader (i.e. `null`) when our Java agent is used. The rest has been moved into `sentry-opentelemetry-agentcustomization` and is loaded into the agent classloader when our Java agent is used.
24+
- The `sentry-opentelemetry-bootstrap` and `sentry-opentelemetry-agentcustomization` modules can be used without the agent as well, in which case all classes are loaded into the application classloader. Check out our `sentry-samples-spring-boot-jakarta-opentelemetry-noagent` sample.
25+
- In this mode the SDK makes use of `GlobalOpenTelemetry`
26+
- Automatically set span factory based on presence of OpenTelemetry ([#3858](https://github.com/getsentry/sentry-java/pull/3858))
27+
- `SentrySpanFactoryHolder` has been removed as it is no longer required.
28+
- Add a sample for showcasing Sentry with OpenTelemetry for Spring Boot 3 with our Java agent (`sentry-samples-spring-boot-jakarta-opentelemetry`) ([#3856](https://github.com/getsentry/sentry-java/pull/3828))
29+
- Add a sample for showcasing Sentry with OpenTelemetry for Spring Boot 3 without our Java agent (`sentry-samples-spring-boot-jakarta-opentelemetry-noagent`) ([#3856](https://github.com/getsentry/sentry-java/pull/3856))
30+
- Add a sample for showcasing Sentry with OpenTelemetry (`sentry-samples-console-opentelemetry-noagent`) ([#3856](https://github.com/getsentry/sentry-java/pull/3862))
1531
- Add `globalHubMode` to options ([#3805](https://github.com/getsentry/sentry-java/pull/3805))
1632
- `globalHubMode` used to only be a param on `Sentry.init`. To make it easier to be used in e.g. Desktop environments, we now additionally added it as an option on SentryOptions that can also be set via `sentry.properties`.
1733
- If both the param on `Sentry.init` and the option are set, the option will win. By default the option is set to `null` meaning whatever is passed to `Sentry.init` takes effect.
@@ -25,9 +41,15 @@
2541

2642
### Fixes
2743

44+
- The Sentry OpenTelemetry Java agent now makes sure Sentry `Scopes` storage is initialized even if the agents auto init is disabled ([#3848](https://github.com/getsentry/sentry-java/pull/3848))
45+
- This is required for all integrations to work together with our OpenTelemetry Java agent if its auto init has been disabled and the SDKs init should be used instead.
46+
- Do not ignore certain span origins for OpenTelemetry without agent ([#3856](https://github.com/getsentry/sentry-java/pull/3856))
47+
- Fix `startChild` for span that is not in current OpenTelemetry `Context` ([#3862](https://github.com/getsentry/sentry-java/pull/3862))
48+
- Starting a child span from a transaction that wasn't in the current `Context` lead to multiple transactions being created (one for the transaction and another per span created).
2849
- Add `auto.graphql.graphql22` to ignored span origins when using OpenTelemetry ([#3828](https://github.com/getsentry/sentry-java/pull/3828))
2950
- The Spring Boot 3 WebFlux sample now uses our GraphQL v22 integration ([#3828](https://github.com/getsentry/sentry-java/pull/3828))
3051
- Accept manifest integer values when requiring floating values ([#3823](https://github.com/getsentry/sentry-java/pull/3823))
52+
- All status codes below 400 are now mapped to `SpanStatus.OK` ([#3869](https://github.com/getsentry/sentry-java/pull/3869))
3153

3254

3355
### Dependencies

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ apiValidation {
5151
listOf(
5252
"sentry-samples-android",
5353
"sentry-samples-console",
54+
"sentry-samples-console-opentelemetry-noagent",
5455
"sentry-samples-jul",
5556
"sentry-samples-log4j2",
5657
"sentry-samples-logback",
@@ -61,6 +62,7 @@ apiValidation {
6162
"sentry-samples-spring-boot",
6263
"sentry-samples-spring-boot-jakarta",
6364
"sentry-samples-spring-boot-jakarta-opentelemetry",
65+
"sentry-samples-spring-boot-jakarta-opentelemetry-noagent",
6466
"sentry-samples-spring-boot-webflux",
6567
"sentry-samples-spring-boot-webflux-jakarta",
6668
"sentry-uitest-android",

buildSrc/src/main/java/Config.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ object Config {
9494
val springBoot3StarterSecurity = "org.springframework.boot:spring-boot-starter-security:$springBoot3Version"
9595
val springBoot3StarterJdbc = "org.springframework.boot:spring-boot-starter-jdbc:$springBoot3Version"
9696
val springBoot3StarterActuator = "org.springframework.boot:spring-boot-starter-actuator:$springBoot3Version"
97+
val springBoot3StarterOpenTelemetry = "io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter:${OpenTelemetry.otelInstrumentationVersion}"
9798

9899
val springWeb = "org.springframework:spring-webmvc"
99100
val springWebflux = "org.springframework:spring-webflux"
@@ -157,17 +158,18 @@ object Config {
157158
object OpenTelemetry {
158159
val otelVersion = "1.41.0"
159160
val otelAlphaVersion = "$otelVersion-alpha"
160-
val otelJavaagentVersion = "2.7.0"
161-
val otelJavaagentAlphaVersion = "$otelJavaagentVersion-alpha"
161+
val otelInstrumentationVersion = "2.7.0"
162+
val otelInstrumentationAlphaVersion = "$otelInstrumentationVersion-alpha"
162163
val otelSemanticConvetionsVersion = "1.25.0-alpha" // check https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/dependencyManagement/build.gradle.kts#L49 for release version above to find a compatible version
163164

164165
val otelSdk = "io.opentelemetry:opentelemetry-sdk:$otelVersion"
165166
val otelSemconv = "io.opentelemetry.semconv:opentelemetry-semconv:$otelSemanticConvetionsVersion"
166167
val otelSemconvIncubating = "io.opentelemetry.semconv:opentelemetry-semconv-incubating:$otelSemanticConvetionsVersion"
167-
val otelJavaAgent = "io.opentelemetry.javaagent:opentelemetry-javaagent:$otelJavaagentVersion"
168-
val otelJavaAgentExtensionApi = "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:$otelJavaagentAlphaVersion"
169-
val otelJavaAgentTooling = "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:$otelJavaagentAlphaVersion"
168+
val otelJavaAgent = "io.opentelemetry.javaagent:opentelemetry-javaagent:$otelInstrumentationVersion"
169+
val otelJavaAgentExtensionApi = "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:$otelInstrumentationAlphaVersion"
170+
val otelJavaAgentTooling = "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:$otelInstrumentationAlphaVersion"
170171
val otelExtensionAutoconfigureSpi = "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:$otelVersion"
172+
val otelExtensionAutoconfigure = "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:$otelVersion"
171173
}
172174
}
173175

sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,8 @@ class SentryAndroidTest {
394394
}
395395
}
396396

397-
@Test
398-
@Config(sdk = [30])
397+
// @Test
398+
// @Config(sdk = [30])
399399
fun `AnrV2 events get enriched with previously persisted scope and options data, the new data gets persisted after that`() {
400400
val cacheDir = tmpDir.newFolder().absolutePath
401401
fixture.addAppExitInfo(timestamp = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))

sentry-opentelemetry/README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,21 @@ application. Please see the module [README](sentry-opentelemetry-agent/README.md
2222
This contains customizations to the OpenTelemetry Java Agent such as registering the
2323
`SentrySpanProcessor` and `SentryPropagator` as well as providing default properties that
2424
enable the `sentry` propagator and disable exporters so our agent doesn't trigger lots of log
25-
warnings due to OTLP server not being there.
25+
warnings due to OTLP server not being there. This can also be used without the agent.
26+
27+
### `sentry-opentelemetry-bootstrap`
28+
29+
Classes that are loaded into the bootstrap classloader
30+
(represented as `null` when invoking X.class.classLoader)
31+
These are shared between the agent and the application and include things like storage,
32+
utils, factory, tokens etc.
33+
34+
If you want to use Sentry with OpenTelemetry without the agent,
35+
you also need this module as a dependency.
2636

2737
### `sentry-opentelemetry-core`
2838

2939
Contains `SentrySpanProcessor` and `SentryPropagator` which are used by our Java Agent but can also
30-
be used when manually instrumenting using OpenTelemetry.
40+
be used when manually instrumenting using OpenTelemetry. If you want to use OpenTelemetry without
41+
the agent but still want some configuration convenience, you should rather use the
42+
`sentry-opentelemetry-agentcustomization` module.

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ val upstreamAgent = configurations.create("upstreamAgent") {
5454
dependencies {
5555
bootstrapLibs(projects.sentry)
5656
bootstrapLibs(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap)
57-
bootstrapLibs(projects.sentryOpentelemetry.sentryOpentelemetryExtra)
5857
javaagentLibs(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization)
5958
upstreamAgent(Config.Libs.OpenTelemetry.otelJavaAgent)
6059
}
@@ -152,15 +151,19 @@ tasks {
152151
attributes.put("Can-Redefine-Classes", "true")
153152
attributes.put("Can-Retransform-Classes", "true")
154153
attributes.put("Implementation-Vendor", "Sentry")
155-
attributes.put("Implementation-Version", "sentry-${project.version}-otel-${Config.Libs.OpenTelemetry.otelJavaagentVersion}")
154+
attributes.put("Implementation-Version", "sentry-${project.version}-otel-${Config.Libs.OpenTelemetry.otelInstrumentationVersion}")
156155
attributes.put("Sentry-Version-Name", project.version)
157156
attributes.put("Sentry-Opentelemetry-SDK-Name", Config.Sentry.SENTRY_OPENTELEMETRY_AGENT_SDK_NAME)
158157
attributes.put("Sentry-Opentelemetry-Version-Name", Config.Libs.OpenTelemetry.otelVersion)
159-
attributes.put("Sentry-Opentelemetry-Javaagent-Version-Name", Config.Libs.OpenTelemetry.otelJavaagentVersion)
158+
attributes.put("Sentry-Opentelemetry-Javaagent-Version-Name", Config.Libs.OpenTelemetry.otelInstrumentationVersion)
160159
}
161160
}
162161

163162
assemble {
164163
dependsOn(shadowJar)
165164
}
166165
}
166+
167+
tasks.named("distZip").configure {
168+
this.dependsOn("jar")
169+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.sentry.opentelemetry.agent;
2+
3+
/**
4+
* Marker class used to check if the Sentry Java Agent is active. If so, this class should be on the
5+
* classpath.
6+
*/
7+
public final class AgentMarker {}

sentry-opentelemetry/sentry-opentelemetry-agentcustomization/api/sentry-opentelemetry-agentcustomization.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
public final class io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider : io/opentelemetry/sdk/autoconfigure/spi/AutoConfigurationCustomizerProvider {
2+
public static field skipInit Z
23
public fun <init> ()V
34
public fun customize (Lio/opentelemetry/sdk/autoconfigure/spi/AutoConfigurationCustomizer;)V
45
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ dependencies {
2525
exclude(group = "io.opentelemetry.javaagent")
2626
}
2727
compileOnly(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap)
28-
implementation(projects.sentryOpentelemetry.sentryOpentelemetryExtra)
2928

3029
compileOnly(Config.Libs.OpenTelemetry.otelSdk)
3130
compileOnly(Config.Libs.OpenTelemetry.otelExtensionAutoconfigureSpi)

0 commit comments

Comments
 (0)