Skip to content

Commit 8c385c5

Browse files
authored
Merge branch 'main' into feat/reduce-scope-forking-for-reactor
2 parents 0792d93 + 8285e52 commit 8c385c5

File tree

50 files changed

+3068
-85
lines changed

Some content is hidden

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

50 files changed

+3068
-85
lines changed

.craft.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ targets:
4141
maven:io.sentry:sentry-android-fragment:
4242
maven:io.sentry:sentry-bom:
4343
maven:io.sentry:sentry-openfeign:
44+
#maven:io.sentry:sentry-openfeature:
4445
maven:io.sentry:sentry-opentelemetry-agent:
4546
maven:io.sentry:sentry-opentelemetry-agentcustomization:
4647
maven:io.sentry:sentry-opentelemetry-agentless:

.github/ISSUE_TEMPLATE/bug_report_android.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ body:
1616
- sentry-apollo
1717
- sentry-apollo-3
1818
- sentry-compose
19+
- sentry-launchdarkly-android
1920
- sentry-okhttp
2021
- other
2122
validations:

.github/ISSUE_TEMPLATE/bug_report_java.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ body:
3535
- sentry-graphql-22
3636
- sentry-quartz
3737
- sentry-openfeign
38+
- sentry-openfeature
39+
- sentry-launchdarkly-server
3840
- sentry-apache-http-client-5
3941
- sentry-okhttp
4042
- sentry-reactor

.github/workflows/spring-boot-4-matrix.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
strategy:
2020
fail-fast: false
2121
matrix:
22-
springboot-version: [ '4.0.0-M1', '4.0.0-M2', '4.0.0-M3' ]
22+
springboot-version: [ '4.0.0' ]
2323

2424
name: Spring Boot ${{ matrix.springboot-version }}
2525
env:

CHANGELOG.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,35 @@
11
# Changelog
22

3-
## Unreleased
3+
## 8.27.1
4+
5+
### Fixes
6+
7+
- Do not log if `sentry.properties` in rundir has not been found ([#4929](https://github.com/getsentry/sentry-java/pull/4929))
8+
9+
## 8.27.0
10+
11+
### Features
12+
13+
- Implement OpenFeature Integration that tracks Feature Flag evaluations ([#4910](https://github.com/getsentry/sentry-java/pull/4910))
14+
- To make use of it, add the `sentry-openfeature` dependency and register the the hook using: `openFeatureApiInstance.addHooks(new SentryOpenFeatureHook());`
15+
- Implement LaunchDarkly Integrations that track Feature Flag evaluations ([#4917](https://github.com/getsentry/sentry-java/pull/4917))
16+
- For Android, please add `sentry-launchdarkly-android` as a dependency and register the `SentryLaunchDarklyAndroidHook`
17+
- For Server / JVM, please add `sentry-launchdarkly-server` as a dependency and register the `SentryLaunchDarklyServerHook`
18+
- Detect oversized events and reduce their size ([#4903](https://github.com/getsentry/sentry-java/pull/4903))
19+
- You can opt into this new behaviour by setting `enableEventSizeLimiting` to `true` (`sentry.enable-event-size-limiting=true` for Spring Boot `application.properties`)
20+
- You may optionally register an `onOversizedEvent` callback to implement custom logic that is executed in case an oversized event is detected
21+
- This is executed first and if event size was reduced sufficiently, no further truncation is performed
22+
- In case we detect an oversized event, we first drop breadcrumbs and if that isn't sufficient we also drop stack frames in order to get an events size down
23+
24+
### Improvements
25+
26+
- Do not send manual log origin ([#4897](https://github.com/getsentry/sentry-java/pull/4897))
27+
28+
### Dependencies
29+
30+
- Bump Spring Boot 4 to GA ([#4923](https://github.com/getsentry/sentry-java/pull/4923))
31+
32+
## 8.26.0
433

534
### Features
635

README.md

Lines changed: 49 additions & 46 deletions
Large diffs are not rendered by default.

buildSrc/src/main/java/Config.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ object Config {
7777
val SENTRY_GRAPHQL22_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.graphql22"
7878
val SENTRY_QUARTZ_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.quartz"
7979
val SENTRY_JDBC_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.jdbc"
80+
val SENTRY_OPENFEATURE_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.openfeature"
81+
val SENTRY_LAUNCHDARKLY_SERVER_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.launchdarkly-server"
82+
val SENTRY_LAUNCHDARKLY_ANDROID_SDK_NAME = "$SENTRY_ANDROID_SDK_NAME.launchdarkly"
8083
val SENTRY_SERVLET_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.servlet"
8184
val SENTRY_SERVLET_JAKARTA_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.servlet.jakarta"
8285
val SENTRY_COMPOSE_HELPER_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.compose.helper"

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
1111
android.useAndroidX=true
1212

1313
# Release information
14-
versionName=8.25.0
14+
versionName=8.27.1
1515

1616
# Override the SDK name on native crashes on Android
1717
sentryAndroidSdkName=sentry.native.android

gradle/libs.versions.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ androidxLifecycle = "2.2.0"
44
androidxNavigation = "2.4.2"
55
androidxTestCore = "1.7.0"
66
androidxCompose = "1.6.3"
7+
asyncProfiler = "4.2"
78
composeCompiler = "1.5.14"
89
coroutines = "1.6.1"
910
espresso = "3.7.0"
@@ -31,14 +32,15 @@ retrofit = "2.9.0"
3132
slf4j = "1.7.30"
3233
springboot2 = "2.7.18"
3334
springboot3 = "3.5.0"
34-
springboot4 = "4.0.0-RC2"
35+
springboot4 = "4.0.0"
3536
# Android
3637
targetSdk = "34"
3738
compileSdk = "34"
3839
minSdk = "21"
3940
spotless = "7.0.4"
4041
gummyBears = "0.12.0"
4142
camerax = "1.3.0"
43+
openfeature = "1.18.2"
4244

4345
[plugins]
4446
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
@@ -93,6 +95,8 @@ androidx-navigation-compose = { module = "androidx.navigation:navigation-compose
9395
androidx-sqlite = { module = "androidx.sqlite:sqlite", version = "2.5.2" }
9496
androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version = "1.2.1" }
9597
androidx-browser = { module = "androidx.browser:browser", version = "1.8.0" }
98+
async-profiler = { module = "tools.profiler:async-profiler", version.ref = "asyncProfiler" }
99+
async-profiler-jfr-converter = { module = "tools.profiler:jfr-converter", version.ref = "asyncProfiler" }
96100
coil-compose = { module = "io.coil-kt:coil-compose", version = "2.6.0" }
97101
commons-compress = {module = "org.apache.commons:commons-compress", version = "1.25.0"}
98102
context-propagation = { module = "io.micrometer:context-propagation", version = "1.1.0" }
@@ -113,6 +117,8 @@ kotlinx-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core",
113117
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
114118
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktorClient" }
115119
ktor-client-java = { module = "io.ktor:ktor-client-java", version.ref = "ktorClient" }
120+
launchdarkly-android = { module = "com.launchdarkly:launchdarkly-android-client-sdk", version = "5.9.2" }
121+
launchdarkly-server = { module = "com.launchdarkly:launchdarkly-java-server-sdk", version = "7.10.2" }
116122
log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j2" }
117123
log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j2" }
118124
leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version = "2.14" }
@@ -121,6 +127,7 @@ nopen-annotations = { module = "com.jakewharton.nopen:nopen-annotations", versio
121127
nopen-checker = { module = "com.jakewharton.nopen:nopen-checker", version.ref = "nopen" }
122128
nullaway = { module = "com.uber.nullaway:nullaway", version = "0.9.5" }
123129
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
130+
openfeature = { module = "dev.openfeature:sdk", version.ref = "openfeature" }
124131
otel = { module = "io.opentelemetry:opentelemetry-sdk", version.ref = "otel" }
125132
otel-extension-autoconfigure = { module = "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure", version.ref = "otel" }
126133
otel-extension-autoconfigure-spi = { module = "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi", version.ref = "otel" }

sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import io.sentry.SentryFeedbackOptions;
1111
import io.sentry.SentryIntegrationPackageStorage;
1212
import io.sentry.SentryLevel;
13+
import io.sentry.SentryReplayOptions;
1314
import io.sentry.protocol.SdkVersion;
1415
import io.sentry.util.Objects;
16+
import java.util.ArrayList;
1517
import java.util.Arrays;
1618
import java.util.Collections;
1719
import java.util.List;
@@ -114,6 +116,21 @@ final class ManifestMetadataReader {
114116
static final String REPLAYS_DEBUG = "io.sentry.session-replay.debug";
115117
static final String REPLAYS_SCREENSHOT_STRATEGY = "io.sentry.session-replay.screenshot-strategy";
116118

119+
static final String REPLAYS_NETWORK_DETAIL_ALLOW_URLS =
120+
"io.sentry.session-replay.network-detail-allow-urls";
121+
122+
static final String REPLAYS_NETWORK_DETAIL_DENY_URLS =
123+
"io.sentry.session-replay.network-detail-deny-urls";
124+
125+
static final String REPLAYS_NETWORK_CAPTURE_BODIES =
126+
"io.sentry.session-replay.network-capture-bodies";
127+
128+
static final String REPLAYS_NETWORK_REQUEST_HEADERS =
129+
"io.sentry.session-replay.network-request-headers";
130+
131+
static final String REPLAYS_NETWORK_RESPONSE_HEADERS =
132+
"io.sentry.session-replay.network-response-headers";
133+
117134
static final String FORCE_INIT = "io.sentry.force-init";
118135

119136
static final String MAX_BREADCRUMBS = "io.sentry.max-breadcrumbs";
@@ -488,6 +505,91 @@ static void applyMetadata(
488505
options.getSessionReplay().setScreenshotStrategy(ScreenshotStrategyType.PIXEL_COPY);
489506
}
490507
}
508+
509+
// Network Details Configuration
510+
if (options.getSessionReplay().getNetworkDetailAllowUrls().length == 0) {
511+
final @Nullable List<String> allowUrls =
512+
readList(metadata, logger, REPLAYS_NETWORK_DETAIL_ALLOW_URLS);
513+
if (allowUrls != null && !allowUrls.isEmpty()) {
514+
final List<String> filteredUrls = new ArrayList<>();
515+
for (String url : allowUrls) {
516+
final String trimmedUrl = url.trim();
517+
if (!trimmedUrl.isEmpty()) {
518+
filteredUrls.add(trimmedUrl);
519+
}
520+
}
521+
if (!filteredUrls.isEmpty()) {
522+
options
523+
.getSessionReplay()
524+
.setNetworkDetailAllowUrls(filteredUrls.toArray(new String[0]));
525+
}
526+
}
527+
}
528+
529+
if (options.getSessionReplay().getNetworkDetailDenyUrls().length == 0) {
530+
final @Nullable List<String> denyUrls =
531+
readList(metadata, logger, REPLAYS_NETWORK_DETAIL_DENY_URLS);
532+
if (denyUrls != null && !denyUrls.isEmpty()) {
533+
final List<String> filteredUrls = new ArrayList<>();
534+
for (String url : denyUrls) {
535+
final String trimmedUrl = url.trim();
536+
if (!trimmedUrl.isEmpty()) {
537+
filteredUrls.add(trimmedUrl);
538+
}
539+
}
540+
if (!filteredUrls.isEmpty()) {
541+
options
542+
.getSessionReplay()
543+
.setNetworkDetailDenyUrls(filteredUrls.toArray(new String[0]));
544+
}
545+
}
546+
}
547+
548+
options
549+
.getSessionReplay()
550+
.setNetworkCaptureBodies(
551+
readBool(
552+
metadata,
553+
logger,
554+
REPLAYS_NETWORK_CAPTURE_BODIES,
555+
options.getSessionReplay().isNetworkCaptureBodies() /* defaultValue */));
556+
557+
if (options.getSessionReplay().getNetworkRequestHeaders().length
558+
== SentryReplayOptions.getNetworkDetailsDefaultHeaders().size()) { // Only has defaults
559+
final @Nullable List<String> requestHeaders =
560+
readList(metadata, logger, REPLAYS_NETWORK_REQUEST_HEADERS);
561+
if (requestHeaders != null) {
562+
final List<String> filteredHeaders = new ArrayList<>();
563+
for (String header : requestHeaders) {
564+
final String trimmedHeader = header.trim();
565+
if (!trimmedHeader.isEmpty()) {
566+
filteredHeaders.add(trimmedHeader);
567+
}
568+
}
569+
if (!filteredHeaders.isEmpty()) {
570+
options.getSessionReplay().setNetworkRequestHeaders(filteredHeaders);
571+
}
572+
}
573+
}
574+
575+
if (options.getSessionReplay().getNetworkResponseHeaders().length
576+
== SentryReplayOptions.getNetworkDetailsDefaultHeaders().size()) { // Only has defaults
577+
final @Nullable List<String> responseHeaders =
578+
readList(metadata, logger, REPLAYS_NETWORK_RESPONSE_HEADERS);
579+
if (responseHeaders != null && !responseHeaders.isEmpty()) {
580+
final List<String> filteredHeaders = new ArrayList<>();
581+
for (String header : responseHeaders) {
582+
final String trimmedHeader = header.trim();
583+
if (!trimmedHeader.isEmpty()) {
584+
filteredHeaders.add(trimmedHeader);
585+
}
586+
}
587+
if (!filteredHeaders.isEmpty()) {
588+
options.getSessionReplay().setNetworkResponseHeaders(filteredHeaders);
589+
}
590+
}
591+
}
592+
491593
options.setIgnoredErrors(readList(metadata, logger, IGNORED_ERRORS));
492594

493595
final @Nullable List<String> includes = readList(metadata, logger, IN_APP_INCLUDES);

0 commit comments

Comments
 (0)