diff --git a/.agents/skills b/.agents/skills
deleted file mode 120000
index 454b8427cd7..00000000000
--- a/.agents/skills
+++ /dev/null
@@ -1 +0,0 @@
-../.claude/skills
\ No newline at end of file
diff --git a/.ci/agent-build.sh b/.ci/agent-build.sh
new file mode 100755
index 00000000000..b88658dba3c
--- /dev/null
+++ b/.ci/agent-build.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -ex
+
+pushd agent
+
+DEST=libsentry_agent_linux-$TARGET.so
+
+cmake CMakeLists.txt
+make
+
+mv libsentry_agent.so $DEST
+file $DEST
+
+popd
\ No newline at end of file
diff --git a/.ci/agent-deploy.sh b/.ci/agent-deploy.sh
new file mode 100755
index 00000000000..c36507b150e
--- /dev/null
+++ b/.ci/agent-deploy.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+set -ex
+
+[[ $TRAVIS_LANGUAGE == "cpp" ]] || (echo "Not a C++ run, exiting." && exit 0;)
+
+pushd agent
+
+pip install --user requests==2.18.2
+python ../.ci/agent-upload-release.py
+
+popd
\ No newline at end of file
diff --git a/.ci/agent-install.sh b/.ci/agent-install.sh
new file mode 100755
index 00000000000..f00fd4a9363
--- /dev/null
+++ b/.ci/agent-install.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+set -ex
+
+sudo apt-get -qq update
+sudo apt-get install -y g++-multilib
diff --git a/.ci/agent-upload-release.py b/.ci/agent-upload-release.py
new file mode 100644
index 00000000000..0018b40deaf
--- /dev/null
+++ b/.ci/agent-upload-release.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import urlparse
+import requests
+
+try:
+ from requests.packages import urllib3
+ urllib3.disable_warnings()
+except ImportError:
+ pass
+
+
+AUTH_USERNAME = 'getsentry-bot'
+AUTH_TOKEN = os.environ['GITHUB_AUTH_TOKEN']
+AUTH = (AUTH_USERNAME, AUTH_TOKEN)
+TAG = os.environ.get('TRAVIS_TAG')
+TARGET = os.environ.get('TARGET')
+LIB = 'libsentry_agent_linux-%(target)s.%(ext)s'
+EXT = 'so'
+BIN_TYPE = os.environ.get('BIN_TYPE', 'release')
+REPO = 'getsentry/sentry-java'
+
+
+def log(message, *args):
+ if args:
+ message = message % args
+ print >> sys.stderr, message
+
+
+def api_request(method, path, **kwargs):
+ url = urlparse.urljoin('https://api.github.com/', path.lstrip('/'))
+ # default travis python does not have SNI
+ return requests.request(method, url, auth=AUTH, verify=False, **kwargs)
+
+
+def find_executable():
+ path = LIB % {'target': TARGET, 'ext': EXT}
+ log("Checking for executable: " + path)
+ if os.path.isfile(path):
+ return path
+
+
+def ensure_release():
+ resp = api_request('GET', 'repos/%s/releases' % REPO)
+ resp.raise_for_status()
+ for release in resp.json():
+ if release['tag_name'] == TAG:
+ log('Found already existing release %s' % release['id'])
+ return release
+ resp = api_request('POST', 'repos/%s/releases' % REPO, json={
+ 'tag_name': TAG,
+ 'name': 'sentry-java-agent %s' % TAG,
+ 'draft': True,
+ })
+ resp.raise_for_status()
+ release = resp.json()
+ log('Created new release %s' % release['id'])
+ return release
+
+
+def upload_asset(release, executable, target_name):
+ resp = api_request('GET', release['assets_url'])
+ resp.raise_for_status()
+ for asset in resp.json():
+ if asset['name'] == target_name:
+ log('Already have release asset %s. Skipping' % target_name)
+ return
+
+ upload_url = release['upload_url'].split('{')[0]
+ with open(executable, 'rb') as f:
+ log('Creating new release asset %s.' % target_name)
+ resp = api_request('POST', upload_url,
+ params={'name': target_name},
+ headers={'Content-Type': 'application/octet-stream'},
+ data=f)
+ resp.raise_for_status()
+
+
+def main():
+ if not TAG:
+ return log('No tag specified. Doing nothing.')
+ executable = find_executable()
+ if executable is None:
+ return log('Could not locate executable. Doing nothing.')
+
+ release = ensure_release()
+ upload_asset(release, executable, executable)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/.claude/settings.json b/.claude/settings.json
deleted file mode 100644
index ac6b69b1435..00000000000
--- a/.claude/settings.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "permissions": {
- "allow": [
- "Bash(find:*)",
- "Bash(ls:*)",
- "Bash(git:*)",
- "Bash(git status:*)",
- "Bash(git log:*)",
- "Bash(git diff:*)",
- "Bash(git show:*)",
- "Bash(git branch:*)",
- "Bash(git remote:*)",
- "Bash(git tag:*)",
- "Bash(git stash list:*)",
- "Bash(git rev-parse:*)",
- "Bash(gh pr view:*)",
- "Bash(gh pr list:*)",
- "Bash(gh pr checks:*)",
- "Bash(gh pr diff:*)",
- "Bash(gh issue view:*)",
- "Bash(gh issue list:*)",
- "Bash(gh run view:*)",
- "Bash(gh run list:*)",
- "Bash(gh run logs:*)",
- "Bash(gh repo view:*)",
- "WebFetch(domain:github.com)",
- "WebFetch(domain:docs.sentry.io)",
- "WebFetch(domain:develop.sentry.dev)",
- "Bash(grep:*)",
- "Bash(mv:*)"
- ],
- "deny": []
- }
-}
diff --git a/.claude/skills/.gitignore b/.claude/skills/.gitignore
deleted file mode 100644
index 2dd55eba801..00000000000
--- a/.claude/skills/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-# Ignore dotagents-managed skills (synced from agents.toml)
-*
-# Keep custom repo-specific skills
-!.gitignore
-!create-java-pr/
-!create-java-pr/**
-!test/
-!test/**
-!btrace-perfetto/
-!btrace-perfetto/**
-!check-code-attribution/
-!check-code-attribution/**
diff --git a/.claude/skills/btrace-perfetto/SKILL.md b/.claude/skills/btrace-perfetto/SKILL.md
deleted file mode 100644
index 8d9e5a6bca1..00000000000
--- a/.claude/skills/btrace-perfetto/SKILL.md
+++ /dev/null
@@ -1,303 +0,0 @@
----
-name: btrace-perfetto
-description: Capture and compare Perfetto traces using btrace 3.0 on an Android device. Use when asked to "profile", "capture trace", "perfetto trace", "btrace", "compare traces", "record perfetto", "trace touch events", "measure performance on device", or benchmark Android SDK changes between branches.
-allowed-tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, AskUserQuestion
-argument-hint: "[branch1] [branch2] [duration] [sql-query]"
----
-
-# btrace Perfetto Trace Capture
-
-Capture Perfetto traces with btrace 3.0 on a connected Android device, optionally comparing two branches. Opens results in Perfetto UI with a prefilled SQL query. After capture, query traces locally with `trace_processor` to compute comparison stats.
-
-## Prerequisites
-
-Before starting, verify:
-
-1. **Connected device**: `adb devices` shows a device (Android 8.0+, 64-bit)
-2. **btrace CLI jar**: Check if `tools/btrace/rhea-trace-shell.jar` exists. If not, download it:
- ```bash
- mkdir -p tools/btrace/traces
- curl -sL "https://repo1.maven.org/maven2/com/bytedance/btrace/rhea-trace-processor/3.0.0/rhea-trace-processor-3.0.0.jar" \
- -o tools/btrace/rhea-trace-shell.jar
- ```
-3. **Perfetto trace_processor**: Check if `/tmp/trace_processor` exists. If not, download it:
- ```bash
- # Download trace_processor (--fail ensures HTTP errors don't leave a file behind)
- curl -sSL --fail "https://get.perfetto.dev/trace_processor" -o /tmp/trace_processor
-
- # Verify magic bytes directly — file(1) output is too inconsistent across
- # versions/platforms to rely on for scripts or PIE binaries.
- magic=$(head -c 4 /tmp/trace_processor 2>/dev/null | od -An -vtx1 -N4 | tr -d ' \n')
- case "$magic" in
- 2321*) ;; # #! shebang (script)
- 7f454c46) ;; # ELF (Linux)
- cffaedfe|cefaedfe|feedfacf|feedface) ;; # Mach-O (macOS)
- cafebabe) ;; # Mach-O universal
- *)
- echo "Error: Downloaded file is not a valid script or executable (magic: ${magic:-empty})"
- rm -f /tmp/trace_processor
- exit 1
- ;;
- esac
-
- # Make executable only after verification
- chmod +x /tmp/trace_processor
- ```
-4. **Device ABI**: Run `adb shell getprop ro.product.cpu.abi` — btrace only supports arm64-v8a and armeabi-v7a (no x86/x86_64)
-
-## Step 1: Parse Arguments
-
-| Argument | Default | Description |
-|----------|---------|-------------|
-| branch1 | current branch | First branch to trace |
-| branch2 | `main` | Second branch to compare against |
-| duration | `30` | Trace duration in seconds |
-| sql-query | see below | SQL query to prefill in Perfetto UI |
-
-If no arguments are provided, ask the user what they want to trace and which branches to compare. If only one branch is given, capture only that branch (no comparison).
-
-## Step 2: Integrate btrace into Sample App
-
-The sample app is at `sentry-samples/sentry-samples-android/`.
-
-### 2a: Add btrace dependency
-
-In `sentry-samples/sentry-samples-android/build.gradle.kts`, add to the `dependencies` block:
-
-```kotlin
-implementation("com.bytedance.btrace:rhea-inhouse:3.0.0")
-```
-
-### 2b: Restrict ABI to device architecture
-
-The btrace native library (shadowhook) does not support x86/x86_64. Replace the `ndk` abiFilters line in `defaultConfig` to match the connected device:
-
-```kotlin
-ndk { abiFilters.addAll(listOf("arm64-v8a")) }
-```
-
-Adjust if the device reports a different ABI.
-
-### 2c: Initialize btrace in Application
-
-In `MyApplication.java`, add `attachBaseContext`:
-
-```java
-import android.content.Context;
-import com.bytedance.rheatrace.RheaTrace3;
-
-// Add before onCreate:
-@Override
-protected void attachBaseContext(Context base) {
- super.attachBaseContext(base);
- RheaTrace3.init(base);
-}
-```
-
-**Important**: The package is `com.bytedance.rheatrace`, not `com.bytedance.btrace`.
-
-### 2d: Add ProGuard keep rules (release builds only)
-
-Only needed when building release. In `sentry-samples/sentry-samples-android/proguard-rules.pro`, add:
-
-```
--keep class com.bytedance.rheatrace.** { *; }
--keepnames class io.sentry.** { *; }
-```
-
-The first rule prevents R8 from stripping btrace's HTTP server classes (fails with `SocketException` otherwise). The second preserves Sentry class and method names so they appear readable in the Perfetto trace instead of obfuscated single-letter names.
-
-## Step 3: Build and Install
-
-Prefer **debug builds** — they provide richer tracing instrumentation (Handler, MessageQueue, Monitor:Lock slices visible) which is essential for comparing internal SDK behavior. Use the default 1kHz btrace sampling rate for debug builds.
-
-```bash
-./gradlew :sentry-samples:sentry-samples-android:installDebug
-```
-
-**Release builds** are useful when you need to measure real-world performance without StrictMode/debuggable overhead or with R8 optimizations. Require the ProGuard keep rules from step 2d. Use `-sampleInterval 333000` (333μs / 3kHz) for finer granularity since release code runs faster.
-
-```bash
-./gradlew :sentry-samples:sentry-samples-android:installRelease
-```
-
-## Step 4: Capture Trace
-
-For each branch to trace:
-
-### 4a: Set btrace properties and launch app
-
-Clear any stale port files, set properties, and launch:
-
-```bash
-adb shell "rm -rf /storage/emulated/0/Android/data/io.sentry.samples.android/files/rhea-port"
-adb shell setprop debug.rhea3.startWhenAppLaunch 1
-adb shell setprop debug.rhea3.waitTraceTimeout 60
-adb shell am force-stop io.sentry.samples.android
-sleep 2
-adb shell am start -n io.sentry.samples.android/.MainActivity
-sleep 5
-```
-
-The app must be started AFTER `debug.rhea3.startWhenAppLaunch` is set, otherwise the trace server won't initialize. The 5s sleep after launch gives the btrace HTTP server time to start.
-
-### 4b: Play a sound to signal the user, then capture
-
-Play a sound when tracing actually starts so the user knows to begin interacting. Pipe btrace output through a loop that triggers the sound on the "start tracing" line:
-
-```bash
-java -jar tools/btrace/rhea-trace-shell.jar \
- -a io.sentry.samples.android \
- -t ${duration} \
- -waitTraceTimeout 60 \
- -o tools/btrace/traces/${branch_name}.pb \
- sched 2>&1 | while IFS= read -r line; do
- echo "$line"
- if [[ "$line" == *"start tracing"* ]]; then
- afplay -v 1.5 /System/Library/Sounds/Ping.aiff &
- fi
- done
-```
-
-For release builds with finer sampling, add `-sampleInterval 333000`.
-
-Do NOT use the `-r` flag — it fails to resolve the launcher activity because LeakCanary registers a second one. Launch the app manually in step 4a instead.
-
-### 4c: Switch branches for comparison
-
-When capturing a second branch:
-
-1. Stash the btrace integration changes:
- ```bash
- git stash push -m "btrace integration" -- \
- sentry-samples/sentry-samples-android/build.gradle.kts \
- sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java \
- sentry-samples/sentry-samples-android/proguard-rules.pro
- ```
-2. Checkout the other branch
-3. Pop the stash: `git stash pop`
-4. Rebuild and install (same variant — debug or release — as the first branch)
-5. Repeat steps 4a and 4b with a different output filename
-6. Switch back to the original branch and restore files
-
-## Step 5: Open in Perfetto UI
-
-Generate a viewer HTML and serve it locally. Use the template at `assets/viewer-template.html` as a base — copy it to `tools/btrace/traces/viewer.html` and replace the placeholder values:
-
-- `TRACE_FILES`: array of `{file, title}` objects for each captured trace
-- `SQL_QUERY`: the SQL query to prefill
-
-The SQL query is passed via the URL hash parameter: `https://ui.perfetto.dev/#!/?query=...`
-
-The trace data is sent via the postMessage API (required for local files — URL deep-linking does not work with `file://`).
-
-Start a local HTTP server and open the viewer:
-
-```bash
-cd tools/btrace/traces && python3 -m http.server 8008 &
-open http://localhost:8008/viewer.html
-```
-
-### Default SQL Query
-
-If no custom query is provided, use:
-
-```sql
-SELECT
- s.name AS slice_name,
- s.dur / 1e6 AS dur_ms,
- s.ts,
- t.name AS track_name
-FROM slice s
-JOIN thread_track t ON s.track_id = t.id
-WHERE s.name GLOB '*SentryWindowCallback.dispatch*'
-ORDER BY s.ts
-```
-
-## Step 6: Query and Compare Traces
-
-After capturing both branches, use `trace_processor` to compute comparison stats locally.
-
-### Basic stats query
-
-For each trace file, run:
-
-```bash
-/tmp/trace_processor -Q "
-WITH events AS (
- SELECT s.dur / 1e6 as dur_ms FROM slice s
- WHERE s.name GLOB '*${METHOD_GLOB}*' AND s.dur > 0
- ORDER BY s.dur
-)
-SELECT COUNT(*) as count,
- ROUND(AVG(dur_ms), 4) as avg_ms,
- ROUND((SELECT dur_ms FROM events LIMIT 1 OFFSET (SELECT COUNT(*)/2 FROM events)), 4) as median_ms,
- ROUND(MIN(dur_ms), 4) as min_ms,
- ROUND(MAX(dur_ms), 4) as max_ms
-FROM events
-" tools/btrace/traces/${trace_file}.pb
-```
-
-Replace `${METHOD_GLOB}` with the method pattern to compare (e.g. `SentryGestureDetector.onTouchEvent`, `SentryWindowCallback.dispatchTouchEvent`).
-
-### Finding child calls (debug builds)
-
-To find what happens inside a method (e.g. Handler calls, lock acquisitions):
-
-```bash
-/tmp/trace_processor -Q "
-WITH RECURSIVE descendants(id, depth) AS (
- SELECT s.id, 0 FROM slice s WHERE s.name GLOB '*${PARENT_METHOD}*'
- UNION ALL
- SELECT s.id, d.depth + 1 FROM slice s JOIN descendants d ON s.parent_id = d.id WHERE d.depth < 10
-)
-SELECT s.name, COUNT(*) as count, ROUND(AVG(s.dur / 1e6), 3) as avg_ms
-FROM slice s JOIN descendants d ON s.id = d.id
-WHERE d.depth > 0
-GROUP BY s.name ORDER BY count DESC
-LIMIT 20
-" tools/btrace/traces/${trace_file}.pb
-```
-
-### Build the comparison table
-
-Run the stats query on both trace files, then present a markdown table:
-
-```
-| Metric | Branch A | Branch B | Delta |
-|--------|----------|----------|-------|
-| Count | ... | ... | |
-| Average| ... | ... | -X% |
-| Median | ... | ... | -X% |
-| Max | ... | ... | -X% |
-```
-
-Compute delta as `(branchA - branchB) / branchB * 100`. Negative means branch A is faster.
-
-### Sampling rate reference
-
-| Rate | Interval | `-sampleInterval` | Use case |
-|------|----------|-------------------|----------|
-| 1 kHz | 1ms | `1000000` (default) | Debug builds, general profiling |
-| 3 kHz | 333μs | `333000` | Release builds, finer granularity |
-| 10 kHz | 100μs | `100000` | Maximum detail, higher overhead |
-
-Higher sampling rates capture shorter method calls but add CPU overhead which can skew results. For most comparisons, the default 1kHz is sufficient.
-
-## Cleanup
-
-After tracing is complete, remind the user that the btrace integration changes to the sample app should NOT be committed. The `tools/btrace/` directory is gitignored.
-
-## Troubleshooting
-
-| Problem | Solution |
-|---------|----------|
-| `No compatible library found [shadowhook]` | Restrict `ndk.abiFilters` to arm64-v8a only |
-| `package com.bytedance.btrace does not exist` | Use `com.bytedance.rheatrace` (not `btrace`) |
-| `ResolverActivity does not exist` with `-r` flag | Don't use `-r`; launch the app manually before capturing |
-| `wait for trace ready timeout` on download | Set `debug.rhea3.startWhenAppLaunch=1` BEFORE launching the app, and use `-waitTraceTimeout 60` |
-| Empty jar file (0 bytes) | Download from Maven Central (`repo1.maven.org`), not `oss.sonatype.org` |
-| `FileNotFoundException` on sampling download | App was already running when properties were set; force-stop and relaunch |
-| `SocketException: Unexpected end of file` in release builds | R8 stripped btrace classes; add `-keep class com.bytedance.rheatrace.** { *; }` to proguard-rules.pro |
-| Stale port from previous session | Run `adb shell "rm -rf /storage/emulated/0/Android/data/io.sentry.samples.android/files/rhea-port"` before launching |
-| Most `onTouchEvent` durations are 0ms | Increase sampling rate with `-sampleInterval 333000` (3kHz) |
diff --git a/.claude/skills/btrace-perfetto/assets/viewer-template.html b/.claude/skills/btrace-perfetto/assets/viewer-template.html
deleted file mode 100644
index 4c31a24c342..00000000000
--- a/.claude/skills/btrace-perfetto/assets/viewer-template.html
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
btrace Trace Viewer
-
-
Perfetto Trace Viewer
-
-
-
-
-
diff --git a/.claude/skills/check-code-attribution/SKILL.md b/.claude/skills/check-code-attribution/SKILL.md
deleted file mode 100644
index ee66327c260..00000000000
--- a/.claude/skills/check-code-attribution/SKILL.md
+++ /dev/null
@@ -1,244 +0,0 @@
----
-name: check-code-attribution
-description: Per-file check of vendored code attribution in the current branch diff, including license headers, THIRD_PARTY_NOTICES.md entries, and compatibility with Sentry's licensing policy
-allowed-tools: Bash Read Grep Glob
----
-
-# Check Code Attribution
-
-You are reviewing changed files for third-party code attribution compliance in **sentry-java**, an MIT-licensed repository.
-
-## Local runs
-
-When running locally (not via Warden), review every file changed on this branch vs the base branch. Apply the same path exclusions as `ignorePaths` in `warden.toml`, then run Quick triage and the checks below on each file. For git commands to list changed files and Warden CLI setup, see `validation-tests/README.md`. `/check-code-attribution` in the IDE does not require Warden credentials.
-
-When running via Warden, the changed file is already provided — skip branch-wide discovery, but follow **Warden execution** below.
-
-## Warden execution
-
-Warden analyzes one changed file per run (whole-file mode). Complete every Quick triage step — the diff alone is not sufficient.
-
-**Mandatory on every run (do not skip):**
-
-1. Read the first 50 lines of the changed file.
-2. Search `THIRD_PARTY_NOTICES.md` for the class name (filename without extension, e.g. `ANRWatchDog` for `ANRWatchDog.java`). On renames, also search for the old basename and read Scope sections (see Quick triage).
-3. When you can compare against the base branch version, inspect the header at that revision (first 50 lines).
-
-**Do not dismiss findings because:**
-
-- A `THIRD_PARTY_NOTICES.md` entry exists — file headers are still required; NOTICES does not replace them.
-- The diff only removes a header comment block — if removed `-` lines include a **required field** (see below) or vendoring language ("adapted from", etc.), attribution was stripped. Removing boilerplate alone is not stripping.
-- The header says "Adapted from …" but omits copyright holder or license name — flag missing header fields.
-- The file header has all four required fields — a missing THIRD_PARTY_NOTICES.md entry is independently required and is ⚠️ medium regardless of header completeness.
-
-For `THIRD_PARTY_NOTICES.md` runs: for every **removed** entry in the diff, confirm whether Scope files still exist with attribution headers. If they do, the entry must not be removed.
-
-## Quick triage
-
-Sentry's own files carry **no** copyright headers — any copyright/license line indicates third-party code. Every file that reaches this skill is in scope — do not skip files based on extension.
-
-If this file is `THIRD_PARTY_NOTICES.md`, go to the THIRD_PARTY_NOTICES section below.
-
-For all other files, perform these checks **before** deciding whether to proceed:
-
-1. **Read the file header** — inspect the first 50 lines. Look for vendored-code signals: `Copyright`, `Licensed under`, `SPDX-License-Identifier`, or vendoring language ("adapted from", "backported from", "based on", "copied from", "derived from", "inspired by", "ported from", "translated from", "vendored").
-2. **Check THIRD_PARTY_NOTICES.md** — search for the file name without extension (e.g. `ANRWatchDog` when reviewing `ANRWatchDog.java`). A match means this is a known vendored file. **Renames:** if the diff is a rename (`similarity index` / `rename from` in the diff, or a delete of one path and add of another with the same content), also search for the **old** basename and read **Scope** sections in matching entries — NOTICES may still reference the previous class or path name.
- > **A complete NOTICES entry does NOT end the check.** It confirms the file is vendored and that the NOTICES requirement is satisfied. The file header is a separate, additional requirement — continue to header verification regardless of NOTICES completeness.
-3. **Scan the diff** — check for vendored-code signals on both added (`+`) and **removed (`-`)** lines. Removed lines that drop a **required field** (copyright, license name, source URL, vendoring origin) ARE signals. Removed disclaimer/boilerplate lines alone are not.
-
-**A signal in ANY of these three sources means this is vendored code — proceed to the vendored source file section.**
-
-A file referenced in THIRD_PARTY_NOTICES.md is ALWAYS vendored, even if its current header has no attribution.
-
-**If none of the three sources have signals, report no findings and stop.**
-
----
-
-## If this file is `THIRD_PARTY_NOTICES.md`
-
-Validate the changed entries using the diff context:
-
-1. For each added or modified entry, verify it has all required fields: **Source URL**, **License name**, **Copyright**, **Scope** (file paths), and **full license text** in a fenced code block.
-2. For each Scope path, verify the file(s) exist.
-3. Flag new license types using the same license-tier table as for source files: weak copyleft (LGPL, MPL, EPL) → 🚨 **high**, strong copyleft (GPL) → 🚨 **high**, AGPL → 🚨 **high** (absolute ban, must be removed). Do not use low or medium for copyleft or AGPL.
-4. Flag orphaned entries whose Scope files no longer exist.
-5. For **removed** entries (lines prefixed with `-` in the diff), check whether the Scope files still exist and still have attribution headers. If they do, the entry must not be removed.
-6. Check **copyright consistency** — the Copyright field must match the copyright line inside the embedded license text. Flag mismatches.
-
----
-
-## If this is a vendored file
-
-### 1. Check attribution header
-
-Check each of the following by reading the file header — not NOTICES. Each is an independent yes/no; a "no" is ⚠️ medium regardless of NOTICES completeness:
-
-- [ ] **Vendoring origin phrase** — explicit wording such as `Adapted from …`, `Based on …`, `Vendored from …`, or a library name.
-- [ ] **Copyright line** — e.g. `Copyright (c) 2016 …`, `Copyright 2010 Square, Inc.`
-- [ ] **License name** — e.g. `Licensed under the Apache License, Version 2.0`, `The MIT License`
-- [ ] **Source URL** — e.g. `https://github.com/…`
-
-Exact wording and comment style may vary. **Do not flag** missing or changed content that is not one of these four fields.
-
-**Each field must be physically present in the file header. A complete `THIRD_PARTY_NOTICES.md` entry does not satisfy any required field — both are independently required. Check each of the four fields by reading the file header, not by reasoning from NOTICES.**
-
-**Not required in the file header** (full text belongs in `THIRD_PARTY_NOTICES.md`, not in every source file):
-
-- Full license boilerplate (MIT permission paragraph, Apache "Unless required by applicable law…" disclaimer, ASF contributor grant preamble)
-- Wording differences vs the NOTICES embedded license text (e.g. shortened Apache header vs canonical ASF phrasing)
-- Comment style (`//` vs `/* */`), line wrapping, or extra Sentry modification notes
-
-Compare the current header against the NOTICES entry **only for the four required fields** — e.g. if NOTICES says MIT by "Salomon BRYS" but the header has no copyright or license name, flag it. If both have copyright + license name but the header omits the Apache disclaimer while NOTICES still has the full text, **do not flag**.
-
-When comparing against the base branch version (local runs), use the header at that revision for additional context.
-
-Flag these issues:
-- **Header stripped** — file is in NOTICES but current header has none of the four required fields
-- **Header truncated** — one or more **required** fields were removed (e.g. copyright line or `Licensed under …` removed) while the file remains vendored
-- **Header inconsistent** — a **required** field contradicts NOTICES (wrong copyright holder/year, wrong license name) — not boilerplate or phrasing differences
-- **Diff removes required attribution** — removed `-` lines drop a required field or vendoring origin (`Adapted from`, etc.); removing disclaimer/boilerplate lines alone is **not** this
-
-**Do not report** (no finding — prefer silence):
-
-- Apache/MIT disclaimer or permission paragraphs removed but all four required fields remain
-- Header reworded to a shorter permissive-license form with the same copyright holder and license name
-- Header and NOTICES differ only in full license body text (wording or boilerplate, not missing required fields)
-
-These exceptions apply only when an entry already exists in NOTICES and only to header-vs-NOTICES wording differences. A **missing** NOTICES entry is ⚠️ medium per section 2 — never covered by these exceptions.
-
-### 2. Check THIRD_PARTY_NOTICES.md entry
-
-**Severity: always `medium`. Do not output `severity: "low"` for a missing entry even if the attribution header is complete.**
-
-`THIRD_PARTY_NOTICES.md` is a mandatory legal exhibit that Sentry ships with every SDK distribution. It must enumerate all vendored code regardless of what the source file header says. A missing entry is a distribution-level compliance failure, not a nit. A complete file header does not satisfy the NOTICES requirement — both are mandatory.
-
-From the NOTICES search in Quick triage: if no matching entry exists, output `severity: "medium"` and flag as ⚠️ Missing THIRD_PARTY_NOTICES.md entry. A valid entry needs: Source URL, License name, Copyright, Scope, full license text.
-
-### 3. Check license compatibility
-
-Classify the license per Sentry's Open Source Legal Policy (https://open.sentry.io/licensing/):
-
-| Tier | Examples | Finding |
-|-----------------|-------------------------------------------------|---------------------------------------------|
-| Permissive | MIT, BSD, Apache 2.0, ISC, CC0, Unlicense, Zlib | None — license is compatible |
-| Weak copyleft | LGPL, MPL, EPL, CDDL | 🚨 **high** — requires review |
-| Strong copyleft | GPL, QPL, Sleepycat, OSL | 🚨 **high** — requires legal review |
-| AGPL | — | 🚨 **high** — absolute ban, must be removed |
-| No license | — | 🚨 **high** — assume no permission |
-
-**Permissive licenses:** do not report a finding solely because the license is MIT/BSD/Apache/etc. Only flag missing or stripped **required** header fields, or missing/inconsistent `THIRD_PARTY_NOTICES.md` entry. Do not flag disclaimer/boilerplate-only diffs. Copyleft and unlicensed code still get 🚨 findings per the table.
-
----
-
-## If this is a deleted vendored file
-
-If the diff deletes a file and the removed lines contained attribution headers, check whether `THIRD_PARTY_NOTICES.md` still references it — the entry should be updated or removed.
-
----
-
-## Severity guide
-
-| Level | Use for |
-|------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **high** | 🚨 License violations: AGPL, copyleft, unlicensed, no-license code |
-| **medium** | ⚠️ Missing **required** header fields, stripped required fields, missing/inconsistent NOTICES entries (even when header is complete), deleted/renamed vendored files needing NOTICES update |
-| **low** | 👀 Cosmetic/style differences only (shortened license wording, comment style). **Never** use for a missing NOTICES entry or missing header field — those are always medium. |
-
-Warden relies on these severity levels when deciding whether to comment on PRs or require changes. Put the severity emoji **only on the finding title** (see Output) so reviewers can triage at a glance.
-
-## Output
-
-**No issues → empty response (say nothing).**
-
-Otherwise, report each finding ordered by severity (most severe first).
-
-### Emoji placement (required)
-
-Use the emoji from the severity guide (🚨, ⚠️, or 👀) — not the word `high`, `medium`, or `low`.
-
-| Field | Emoji? | Example |
-|-------------------|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
-| **Title** | Yes — once, at the start | `⚠️ Copyright line stripped from vendored file header` |
-| **Description** | **No** | `**io.sentry.cache.tape.FileObjectQueue** — The Copyright (C) 2010 Square, Inc. line was removed…` (see **Description subject** below) |
-| **Verification** | **No** | Evidence steps only |
-| **Suggested fix** | **No** | Fix text only |
-
-**Good (Warden PR comment):**
-
-```
-Title: ⚠️ Copyright line stripped from vendored file header
-Description: **io.sentry.cache.tape.FileObjectQueue** — The `Copyright (C) 2010 Square, Inc.` line was removed from this vendored file's header. Please restore the copyright line.
-```
-
-**Bad — emoji in the description (never do this):**
-
-```
-Title: ⚠️ Copyright line stripped from vendored file header
-Description: ⚠️ The `Copyright (C) 2010 Square, Inc.` line was removed…
-```
-
-**Bad — emoji before the class name:**
-
-```
-Title: ⚠️ Copyright line stripped from vendored file header
-Description: ⚠️ **io.sentry.cache.tape.FileObjectQueue** — The copyright line was removed…
-```
-
-### Description subject (required)
-
-Every description **must** start with `**** —` (bold subject, space, em dash, space). Pick **one** subject by file type:
-
-| File type | Subject format | Example |
-|-------------------------------------------------------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------|
-| Java / Kotlin source (`.java`, `.kt`) with a top-level type | Fully qualified class name (FQCN) | `**io.sentry.CircularFifoQueue** —` |
-| Java / Kotlin with no single clear type (multiple top-level types, unclear which changed) | FQCN of the primary type under review, or repo-relative path if none | `**sentry/src/.../Foo.kt** —` |
-| `THIRD_PARTY_NOTICES.md` | `THIRD_PARTY_NOTICES.md — ` | `**THIRD_PARTY_NOTICES.md — Square — Seismic (Apache 2.0)** —` |
-| Gradle / other scripts (e.g. `.kts`, `.gradle`) | Repo-relative path from repository root | `**build.gradle.kts** —` |
-
-- Prefer **FQCN** for `.java` / `.kt` vendored source (derive from `package` + primary public top-level class). Do not use file paths when a FQCN is clear.
-- For license-tier / policy issues, include https://open.sentry.io/licensing/ in the description body.
-
-### Warden runs
-
-For each finding, set these fields exactly:
-
-| Field | Value |
-|------------------|-------------------------------------------------------------------------------------------------------------------|
-| **severity** | `high`, `medium`, or `low` — **never** put emoji here; Warden maps severity from this field, not from the title |
-| **title** | `` — emoji allowed **only** here (imperative, no class name) |
-| **description** | `**** — ` — **plain text only**; subject per **Description subject** above |
-| **verification** | Optional evidence steps — plain text only |
-
-**Description rules (Warden):**
-
-- **Must** match `**** — …` using the table in **Description subject**.
-- **Must not** contain 🚨, ⚠️, 👀, or the words `high`, `medium`, or `low` as severity labels.
-- **Must not** repeat the title or paraphrase it with an emoji prefix.
-
-**Good (NOTICES entry removed while scope files remain):**
-
-```
-Title: ⚠️ NOTICES entry removed for vendored code still in tree
-Description: **THIRD_PARTY_NOTICES.md — Square — Seismic (Apache 2.0)** — The Seismic entry was removed but `io.sentry.android.core.SentryShakeDetector` still has an attribution header. Restore the entry or remove attribution from the scope files.
-```
-
-**Before submitting findings:** For every finding, confirm `description` does not match `[🚨⚠️👀]` and matches `^\*\*.+\*\* — `. If it contains any emoji, rewrite the description without it.
-
-### Local / IDE runs
-
-Use this numbered format — same title vs description split as above:
-
-```
-1\. ****
- **** —
-
-2\. ****
- **** —
-```
-
-Rules:
-
-- Put the severity emoji **only** on the title line (`1\. ⚠️ **…**`), never on the description line.
-- The description line uses `**** —` per **Description subject** and must not contain 🚨, ⚠️, or 👀.
-- **Escape the period** after the number (`1\.` not `1.`) so markdown does not collapse entries into a tight list.
-- Leave an empty line between each numbered finding.
diff --git a/.claude/skills/check-code-attribution/validation-tests/EXPECTED.json b/.claude/skills/check-code-attribution/validation-tests/EXPECTED.json
deleted file mode 100644
index a82637b84e2..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/EXPECTED.json
+++ /dev/null
@@ -1,53 +0,0 @@
-[
- {
- "id": "header-complete-and-notice-present",
- "file": "HeaderCompleteAndNoticePresent.java",
- "expectFinding": false,
- "notes": "Header matches catalog entry"
- },
- {
- "id": "header-complete-but-notice-missing",
- "file": "HeaderCompleteButNoticeMissing.java",
- "expectFinding": true,
- "isolated": true,
- "notes": "Full header; no catalog / root NOTICES entry. Isolated: prompt-cache priming in a concurrent batch suppresses the missing-NOTICES finding below medium."
- },
- {
- "id": "header-missing-but-notice-present",
- "file": "HeaderMissingButNoticePresent.java",
- "expectFinding": true,
- "isolated": true,
- "notes": "NOTICES entry claims file is vendored but file has no attribution header. Isolated: a complete NOTICES entry suppresses the missing-header finding in a concurrent batch."
- },
- {
- "id": "header-fully-stripped",
- "file": "HeaderFullyStripped.java",
- "expectFinding": true,
- "notes": "Header has no required attribution fields"
- },
- {
- "id": "header-partially-stripped",
- "file": "HeaderPartiallyStripped.java",
- "expectFinding": true,
- "notes": "Adapted from + URL only; no copyright or license name"
- },
- {
- "id": "header-missing-non-essential-info",
- "file": "HeaderMissingNonEssentialInfo.java",
- "expectFinding": false,
- "notes": "All four required fields present; no license boilerplate — boilerplate is not required in the header"
- },
- {
- "id": "header-vs-notice-mismatch",
- "file": "THIRD_PARTY_NOTICES.md",
- "expectFinding": true,
- "isolated": true,
- "notes": "Copyright in metadata field does not match embedded license text. Isolated: mismatch finding needs an independent assertion free of interference from other NOTICES changes."
- },
- {
- "id": "new-license-type",
- "file": "NewLicenseType.java",
- "expectFinding": true,
- "notes": "AGPL v3 license in file header — absolute ban, must be removed"
- }
-]
diff --git a/.claude/skills/check-code-attribution/validation-tests/README.md b/.claude/skills/check-code-attribution/validation-tests/README.md
deleted file mode 100644
index 99fb42a6836..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/README.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# Attribution skill validation tests
-
-Self-contained samples for validating `check-code-attribution` without touching production SDK sources.
-
-
-## Run the tests
-
-```bash
-./check-code-attribution-tests.sh
-```
-
-Requires Node.js and a Warden provider (see **Warden CLI** below).
-
-In practice, straight command line runs tend to be a bit flakier than asking Claude Code to run the tests for you.
-
-## Local development
-
-### Discovering changed files
-
-When running `/check-code-attribution` outside Warden, list files changed on the current branch vs the base branch, then apply the same exclusions as `ignorePaths` in `warden.toml`:
-
-```bash
-MB=$(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD main)
-git diff --name-only "${MB}"..HEAD
-```
-
-### Warden CLI
-
-Warden does **not** use Cursor auth. Before running Warden locally, configure a provider (same model family as `warden.toml`, or override with `-m`):
-
-```bash
-# Option A: Anthropic API key (matches CI model in warden.toml)
-export WARDEN_ANTHROPIC_API_KEY=sk-ant-... # or: export ANTHROPIC_API_KEY=sk-ant-...
-
-# Option B: Pi OAuth / API key store (~/.pi/agent/auth.json)
-npx pi # then run /login and pick Anthropic (or another provider)
-
-# Option C: Different provider for a one-off run
-export WARDEN_OPENAI_API_KEY=sk-...
-npx @sentry/warden origin/main..HEAD --skill check-code-attribution -m openai/gpt-5.5 -vv
-```
-
-```bash
-npx @sentry/warden origin/main..HEAD --skill check-code-attribution -vv
-```
-
-## Layout
-
-- `EXPECTED.json` — scenario IDs and expected outcomes (single source of truth).
-- `THIRD_PARTY_NOTICES.catalog.md` — NOTICES-style entries for validation class names.
-- `scenarios/` — `.java` files and `THIRD_PARTY_NOTICES.mismatch-snippet.md` (copyright-mismatch fixture).
-- `check-code-attribution-tests.sh` — runs Warden on a temp branch and asserts per-scenario pass/fail.
-- `assert-scenarios.mjs` — validation driver (`list-isolated`, `routing-set`, `assert` subcommands); parses Warden JSONL and checks outcomes from `EXPECTED.json`.
-
-### assert-scenarios.mjs commands
-
-```bash
-node assert-scenarios.mjs validate EXPECTED.json scenarios/ # pre-flight (no API); run automatically by the shell script
-node assert-scenarios.mjs list-isolated EXPECTED.json # idfile per isolated scenario
-node assert-scenarios.mjs list-main-java EXPECTED.json scenarios/ # .java files for the main Warden batch
-node assert-scenarios.mjs routing-set routing.json # update id → Warden JSONL path
-node assert-scenarios.mjs assert EXPECTED.json routing.json
-```
-
-Warden runs are limited to 300s. On macOS the script uses `gtimeout` (from `brew install coreutils`) when available, otherwise GNU `timeout`, otherwise `perl` with `alarm`.
-
-## Add a scenario
-
-1. Add `scenarios/.java`.
-2. Add or omit a catalog entry in `THIRD_PARTY_NOTICES.catalog.md`.
-3. Add an entry to `EXPECTED.json`.
-4. **Isolation (if needed):** If the scenario relies on a finding that could be suppressed by Anthropic prompt-cache priming when analyzed alongside many other files (e.g. a missing-NOTICES entry, or a missing header on a file that has a complete NOTICES entry), add `"isolated": true` to its `EXPECTED.json` entry. The test script creates a dedicated worktree for each isolated scenario automatically — no changes to the script itself are needed.
-
-## Validation (maintainers)
-
-Test samples live under `validation-tests/` and are excluded from normal skill runs via `.claude/**` in `warden.toml`.
-
-```bash
-.claude/skills/check-code-attribution/validation-tests/check-code-attribution-tests.sh
-```
-
-Expected outcomes are in `EXPECTED.json`. The script creates isolated git worktrees, runs Warden with `--report-on medium --json`, and asserts per-scenario pass/fail. Scenarios marked `"isolated": true` in `EXPECTED.json` each get their own worktree to avoid Anthropic prompt-cache priming that can suppress findings below medium in concurrent batches. Exit 0 = all pass.
-
-When manually reviewing a file under `scenarios/`, search `THIRD_PARTY_NOTICES.catalog.md` in addition to root `THIRD_PARTY_NOTICES.md` (Quick triage step 2 in `SKILL.md`).
-
-Non-Java fixtures required by the test script are listed in `REQUIRED_SCENARIO_FIXTURES` in `assert-scenarios.mjs`; pre-flight `validate` fails if any are missing.
diff --git a/.claude/skills/check-code-attribution/validation-tests/THIRD_PARTY_NOTICES.catalog.md b/.claude/skills/check-code-attribution/validation-tests/THIRD_PARTY_NOTICES.catalog.md
deleted file mode 100644
index 478d0b06313..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/THIRD_PARTY_NOTICES.catalog.md
+++ /dev/null
@@ -1,130 +0,0 @@
-# Test THIRD_PARTY_NOTICES catalog (not shipped)
-
-Used only when validating `check-code-attribution` against `validation-tests/scenarios/**`.
-Grep this file in addition to the repository root `THIRD_PARTY_NOTICES.md`.
-
----
-
-## Example — HeaderFullyStripped (MIT)
-
-**Source:** https://github.com/example/attribution-fixtures
-**License:** MIT License
-**Copyright:** Copyright (c) 2016 Example Author
-
-### Scope
-
-Attribution validation sample. The code resides in `io.sentry.skills.verification.HeaderFullyStripped` (`validation-tests/scenarios/HeaderFullyStripped.java`).
-
-```
-MIT License
-
-Copyright (c) 2016 Example Author
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
-
----
-
-## Example — HeaderMissingButNoticePresent (Apache 2.0)
-
-**Source:** https://github.com/example/notices-without-header
-**License:** Apache License 2.0
-**Copyright:** Copyright 2023 Example Corp.
-
-### Scope
-
-Attribution validation sample. The code resides in `io.sentry.skills.verification.HeaderMissingButNoticePresent`.
-
-```
-Copyright 2023 Example Corp.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-```
-
----
-
-## Example — HeaderMissingNonEssentialInfo (MIT)
-
-**Source:** https://github.com/example/examplelib
-**License:** MIT License
-**Copyright:** Copyright 2020 Example Corp.
-
-### Scope
-
-Attribution validation sample. The code resides in `io.sentry.skills.verification.HeaderMissingNonEssentialInfo`.
-
-```
-MIT License
-
-Copyright (c) 2020 Example Corp.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
-
----
-
-## Example — HeaderCompleteAndNoticePresent (Apache 2.0)
-
-**Source:** https://github.com/example/something
-**License:** Apache License 2.0
-**Copyright:** Copyright 2020 Example Authors
-
-### Scope
-
-Attribution validation sample. The code resides in `io.sentry.skills.verification.HeaderCompleteAndNoticePresent`.
-
-```
-Copyright 2020 Example Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-```
diff --git a/.claude/skills/check-code-attribution/validation-tests/assert-scenarios.mjs b/.claude/skills/check-code-attribution/validation-tests/assert-scenarios.mjs
deleted file mode 100755
index 3ff4cce9980..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/assert-scenarios.mjs
+++ /dev/null
@@ -1,401 +0,0 @@
-#!/usr/bin/env node
-/**
- * Validation driver for check-code-attribution scenario tests.
- *
- * Usage:
- * node assert-scenarios.mjs validate
- * node assert-scenarios.mjs list-isolated
- * node assert-scenarios.mjs list-main-java
- * node assert-scenarios.mjs routing-set
- * node assert-scenarios.mjs assert
- *
- * routing.json maps scenario id to Warden JSONL output path, e.g. { "main": "/tmp/..." }.
- * Non-isolated scenarios use the "main" entry when no dedicated id is present.
- */
-
-import fs from 'node:fs';
-import path from 'node:path';
-import { pathToFileURL } from 'node:url';
-
-const ISOLATED_FILE_JAVA = /\.java$/i;
-const ISOLATED_FILE_NOTICES = 'THIRD_PARTY_NOTICES.md';
-
-/** Non-Java fixtures under scenarios/ that check-code-attribution-tests.sh requires. */
-const REQUIRED_SCENARIO_FIXTURES = [
- 'THIRD_PARTY_NOTICES.mismatch-snippet.md',
-];
-
-export function loadExpected(expectedPath) {
- return JSON.parse(fs.readFileSync(expectedPath, 'utf8'));
-}
-
-export function listIsolated(scenarios) {
- return scenarios.filter((s) => s.isolated);
-}
-
-/** Repo-relative path normalization for Warden JSONL matching. */
-export function normalizeRepoPath(filePath) {
- if (!filePath) return filePath;
- return filePath.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+/g, '/');
-}
-
-/** True when a Warden-reported path refers to the expected scenario file. */
-export function pathMatchesWardenFile(reportedPath, wardenFile) {
- const reported = normalizeRepoPath(reportedPath);
- const expected = normalizeRepoPath(wardenFile);
- if (reported === expected) return true;
- const base = expected.split('/').pop();
- return base != null && reported.endsWith(`/${base}`);
-}
-
-export function findingCountForFile(fileMap, wardenFile) {
- const expected = normalizeRepoPath(wardenFile);
- if (fileMap[expected] != null) return fileMap[expected];
- for (const [key, count] of Object.entries(fileMap)) {
- if (pathMatchesWardenFile(key, wardenFile)) return count;
- }
- return 0;
-}
-
-export function findingsForFile(findings, wardenFile) {
- return findings.filter(
- (f) => f.location && pathMatchesWardenFile(f.location.path, wardenFile),
- );
-}
-
-export function listMainBatchJava(scenarios, scenariosDir) {
- const isolatedJava = new Set(
- listIsolated(scenarios)
- .map((s) => s.file)
- .filter((file) => ISOLATED_FILE_JAVA.test(file)),
- );
- return fs
- .readdirSync(scenariosDir)
- .filter((name) => name.endsWith('.java') && !isolatedJava.has(name))
- .sort();
-}
-
-/**
- * @returns {string[]} validation error messages (empty = ok)
- */
-export function validateExpected(scenarios, scenariosDir) {
- const errors = [];
-
- if (!Array.isArray(scenarios)) {
- return ['EXPECTED.json must be a JSON array'];
- }
-
- const ids = new Set();
- const expectedJava = new Set();
-
- for (const [index, s] of scenarios.entries()) {
- const label = `entry ${index}`;
- if (!s || typeof s !== 'object') {
- errors.push(`${label}: must be an object`);
- continue;
- }
- if (typeof s.id !== 'string' || !s.id) {
- errors.push(`${label}: missing or empty "id"`);
- } else {
- if (ids.has(s.id)) errors.push(`duplicate id "${s.id}"`);
- ids.add(s.id);
- if (s.id === 'main') {
- errors.push(`id "main" is reserved for routing.json`);
- }
- }
- if (typeof s.file !== 'string' || !s.file) {
- errors.push(`${label}: missing or empty "file"`);
- } else if (ISOLATED_FILE_JAVA.test(s.file)) {
- expectedJava.add(s.file);
- const onDisk = path.join(scenariosDir, s.file);
- if (!fs.existsSync(onDisk)) {
- errors.push(`${s.id}: scenarios/${s.file} does not exist`);
- }
- } else if (s.file !== ISOLATED_FILE_NOTICES) {
- errors.push(
- `${s.id}: unsupported file "${s.file}" (use *.java or ${ISOLATED_FILE_NOTICES})`,
- );
- }
- if (typeof s.expectFinding !== 'boolean') {
- errors.push(`${s.id ?? label}: "expectFinding" must be a boolean`);
- }
- if (s.isolated) {
- if (
- !ISOLATED_FILE_JAVA.test(s.file) &&
- s.file !== ISOLATED_FILE_NOTICES
- ) {
- errors.push(
- `${s.id}: isolated scenarios must use *.java or ${ISOLATED_FILE_NOTICES}`,
- );
- }
- }
- }
-
- let diskEntries = [];
- try {
- diskEntries = fs.readdirSync(scenariosDir);
- } catch (e) {
- errors.push(`cannot read scenarios dir ${scenariosDir}: ${e.message}`);
- return errors;
- }
-
- const diskJava = diskEntries.filter((n) => n.endsWith('.java'));
- for (const name of diskJava) {
- if (!expectedJava.has(name)) {
- errors.push(`scenarios/${name} has no matching entry in EXPECTED.json`);
- }
- }
-
- for (const name of REQUIRED_SCENARIO_FIXTURES) {
- const onDisk = path.join(scenariosDir, name);
- if (!fs.existsSync(onDisk)) {
- errors.push(`scenarios/${name} is required but missing`);
- }
- }
-
- const diskNonJava = diskEntries.filter(
- (n) => !n.endsWith('.java') && fs.statSync(path.join(scenariosDir, n)).isFile(),
- );
- for (const name of diskNonJava) {
- if (!REQUIRED_SCENARIO_FIXTURES.includes(name)) {
- errors.push(
- `scenarios/${name} is not listed in REQUIRED_SCENARIO_FIXTURES (update assert-scenarios.mjs)`,
- );
- }
- }
-
- if (listMainBatchJava(scenarios, scenariosDir).length === 0) {
- errors.push('main Warden batch needs at least one non-isolated .java scenario');
- }
-
- return errors;
-}
-
-export function parseWardenJsonl(jsonlPath) {
- /** @type {Record} */
- const fileMap = {};
- const allFindings = [];
- try {
- const raw = fs.readFileSync(jsonlPath, 'utf8').trim();
- if (!raw) return { fileMap, findings: [] };
- const records = raw
- .split('\n')
- .filter((l) => l.trim())
- .map((l) => JSON.parse(l));
- for (const record of records) {
- const file = record.chunk && record.chunk.file;
- if (!file) continue;
- const normalized = normalizeRepoPath(file);
- const recordFindings = record.findings || [];
- fileMap[normalized] = (fileMap[normalized] || 0) + recordFindings.length;
- for (const f of recordFindings) {
- allFindings.push({
- ...f,
- location: f.location || { path: normalized, startLine: 1 },
- });
- }
- }
- } catch (e) {
- console.error(
- 'ERROR: Could not parse Warden output from ' + jsonlPath + ':',
- e.message,
- );
- process.exit(2);
- }
- return { fileMap, findings: allFindings };
-}
-
-export function routingSet(routingPath, id, jsonlPath) {
- const routing = JSON.parse(fs.readFileSync(routingPath, 'utf8'));
- routing[id] = jsonlPath;
- fs.writeFileSync(routingPath, JSON.stringify(routing));
-}
-
-function wardenFileForScenario(destPkg, scenario) {
- return scenario.file === ISOLATED_FILE_NOTICES
- ? ISOLATED_FILE_NOTICES
- : `${destPkg}/${scenario.file}`;
-}
-
-function loadRouting(routingPath) {
- /** @type {Record} */
- let routing;
- try {
- routing = JSON.parse(fs.readFileSync(routingPath, 'utf8'));
- } catch (e) {
- console.error(`ERROR: Could not read routing file ${routingPath}:`, e.message);
- process.exit(2);
- }
-
- if (typeof routing.main !== 'string' || !routing.main) {
- console.error('ERROR: routing.json must include a non-empty "main" JSONL path.');
- process.exit(2);
- }
- return routing;
-}
-
-function cmdValidate(expectedPath, scenariosDir) {
- if (!expectedPath || !scenariosDir) {
- console.error(
- 'Usage: node assert-scenarios.mjs validate ',
- );
- process.exit(2);
- }
- const errors = validateExpected(loadExpected(expectedPath), scenariosDir);
- if (errors.length > 0) {
- console.error('EXPECTED.json validation failed:');
- for (const err of errors) console.error(` - ${err}`);
- process.exit(1);
- }
- console.log('EXPECTED.json OK');
-}
-
-function cmdListIsolated(expectedPath) {
- for (const s of listIsolated(loadExpected(expectedPath))) {
- process.stdout.write(`${s.id}\t${s.file}\n`);
- }
-}
-
-function cmdListMainJava(expectedPath, scenariosDir) {
- if (!expectedPath || !scenariosDir) {
- console.error(
- 'Usage: node assert-scenarios.mjs list-main-java ',
- );
- process.exit(2);
- }
- for (const name of listMainBatchJava(loadExpected(expectedPath), scenariosDir)) {
- process.stdout.write(`${name}\n`);
- }
-}
-
-function cmdRoutingSet(routingPath, id, jsonlPath) {
- if (!routingPath || !id || !jsonlPath) {
- console.error(
- 'Usage: node assert-scenarios.mjs routing-set ',
- );
- process.exit(2);
- }
- routingSet(routingPath, id, jsonlPath);
-}
-
-function cmdAssert(expectedPath, destPkg, routingPath) {
- if (!expectedPath || !destPkg || !routingPath) {
- console.error(
- 'Usage: node assert-scenarios.mjs assert ',
- );
- process.exit(2);
- }
-
- const routing = loadRouting(routingPath);
- const scenarios = loadExpected(expectedPath);
-
- /** @type {Record>} */
- const parsed = {};
- function getSource(id) {
- const jsonlPath = routing[id] ?? routing.main;
- if (!parsed[jsonlPath]) parsed[jsonlPath] = parseWardenJsonl(jsonlPath);
- return parsed[jsonlPath];
- }
-
- const GREEN = '\x1b[32m';
- const RED = '\x1b[31m';
- const RESET = '\x1b[0m';
-
- const failures = [];
- let pass = 0;
-
- for (const s of scenarios) {
- if (s.isolated && !routing[s.id]) {
- console.error(
- `ERROR: isolated scenario "${s.id}" has no routing entry (missing Warden run?)`,
- );
- process.exit(2);
- }
-
- const wardenFile = wardenFileForScenario(destPkg, s);
- const source = getSource(s.id);
- const count = findingCountForFile(source.fileMap, wardenFile);
- const passed = s.expectFinding ? count > 0 : count === 0;
-
- if (passed) {
- console.log(`${GREEN}PASS${RESET} ${s.id}`);
- pass++;
- } else {
- const reason = s.expectFinding
- ? 'expected finding (>= medium), got none'
- : `expected no finding (>= medium), got ${count}`;
- console.log(`${RED}FAIL${RESET} ${s.id} (${reason})`);
-
- failures.push({
- id: s.id,
- findings: findingsForFile(source.findings, wardenFile),
- });
- }
- }
-
- const total = scenarios.length;
- console.log('');
- console.log(`${total} scenarios: ${pass} passed, ${total - pass} failed`);
-
- if (failures.length > 0) {
- console.log('');
- console.log('Warden output');
- console.log('══════════════════════');
-
- for (const { id, findings } of failures) {
- console.log('');
- console.log(id);
- console.log('-'.repeat(id.length));
- if (findings.length === 0) {
- console.log('(Warden produced no findings for this file)');
- } else {
- for (const f of findings) {
- console.log(f.title);
- if (f.description) console.log(f.description);
- if (f.verification) console.log('\nVerification: ' + f.verification);
- console.log('');
- }
- }
- }
-
- process.exit(1);
- }
-}
-
-function usage() {
- console.error(`Usage:
- node assert-scenarios.mjs validate
- node assert-scenarios.mjs list-isolated
- node assert-scenarios.mjs list-main-java
- node assert-scenarios.mjs routing-set
- node assert-scenarios.mjs assert `);
- process.exit(2);
-}
-
-function main() {
- const [, , cmd, ...args] = process.argv;
- switch (cmd) {
- case 'validate':
- cmdValidate(args[0], args[1]);
- break;
- case 'list-isolated':
- if (!args[0]) usage();
- cmdListIsolated(args[0]);
- break;
- case 'list-main-java':
- cmdListMainJava(args[0], args[1]);
- break;
- case 'routing-set':
- cmdRoutingSet(args[0], args[1], args[2]);
- break;
- case 'assert':
- cmdAssert(args[0], args[1], args[2]);
- break;
- default:
- usage();
- }
-}
-
-if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
- main();
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/check-code-attribution-tests.sh b/.claude/skills/check-code-attribution/validation-tests/check-code-attribution-tests.sh
deleted file mode 100755
index 090acbe129b..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/check-code-attribution-tests.sh
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/usr/bin/env bash
-# check-code-attribution-tests.sh — Validate the check-code-attribution skill against synthetic scenarios.
-#
-# Usage:
-# ./check-code-attribution-tests.sh [--help]
-#
-# What it does:
-# 1. Validates EXPECTED.json and scenario fixtures (no API calls).
-# 2. Creates an isolated git worktree on a temp branch from HEAD.
-# 3. Creates a diff (non-isolated .java files, NOTICES catalog, mismatch snippet),
-# commits, and runs Warden on the main batch.
-# 4. Scenarios marked "isolated" in EXPECTED.json each get their own worktree and Warden
-# run to avoid prompt-cache priming that can suppress findings in concurrent batches.
-# 5. Asserts per-scenario pass/fail against EXPECTED.json (>= medium findings only).
-# 6. Prints Warden's actual output for each failing scenario.
-# 7. Cleans up all worktrees.
-#
-# Requires:
-# - Node.js / npx
-# - One of: WARDEN_ANTHROPIC_API_KEY, ANTHROPIC_API_KEY, or Pi OAuth config
-# (see validation-tests/README.md "Warden CLI" section for setup options)
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
-SCENARIOS_DIR="$SCRIPT_DIR/scenarios"
-CATALOG="$SCRIPT_DIR/THIRD_PARTY_NOTICES.catalog.md"
-EXPECTED_JSON="$SCRIPT_DIR/EXPECTED.json"
-VALIDATION="$SCRIPT_DIR/assert-scenarios.mjs"
-MISMATCH_SNIPPET="$SCENARIOS_DIR/THIRD_PARTY_NOTICES.mismatch-snippet.md"
-
-# Destination path inside the worktree — must not appear in warden.toml ignorePaths.
-DEST_PACKAGE_PATH="sentry/src/test/java/io/sentry/skills/verification"
-
-# Warden wall-clock limit (seconds).
-TIMEOUT_SEC=300
-
-die() { echo "ERROR: $*" >&2; exit 1; }
-
-show_usage() {
- cat <<'EOF'
-Usage: check-code-attribution-tests.sh [--help]
-
-Validates the check-code-attribution skill against all scenarios in EXPECTED.json.
-Runs Warden on a temporary branch and asserts per-scenario pass/fail (>= medium findings).
-
-Prerequisites:
- - Node.js (npx)
- - API key: WARDEN_ANTHROPIC_API_KEY or ANTHROPIC_API_KEY
- (or Pi OAuth: npx pi && /login — see README.md "Warden CLI" section)
- - Wall-clock limit: gtimeout (brew install coreutils), GNU timeout, or perl
-EOF
-}
-
-[[ "${1:-}" == "--help" || "${1:-}" == "-h" ]] && { show_usage; exit 0; }
-
-# --- prereq checks ---
-
-command -v node >/dev/null 2>&1 || die "node not found — install Node.js."
-command -v npx >/dev/null 2>&1 || die "npx not found — install Node.js."
-command -v git >/dev/null 2>&1 || die "git not found."
-
-# macOS: GNU timeout is `gtimeout` from coreutils; fall back to perl alarm.
-TIMEOUT_CMD=()
-if command -v gtimeout >/dev/null 2>&1; then
- TIMEOUT_CMD=(gtimeout "$TIMEOUT_SEC")
-elif command -v timeout >/dev/null 2>&1; then
- TIMEOUT_CMD=(timeout "$TIMEOUT_SEC")
-elif command -v perl >/dev/null 2>&1; then
- TIMEOUT_CMD=(perl -e 'alarm shift; exec @ARGV' "$TIMEOUT_SEC")
-else
- die "Need gtimeout (brew install coreutils), GNU timeout, or perl for Warden wall-clock limit"
-fi
-
-if [[ -z "${WARDEN_ANTHROPIC_API_KEY:-}" && -z "${ANTHROPIC_API_KEY:-}" ]]; then
- if [[ ! -f "$HOME/.pi/agent/auth.json" ]]; then
- die "No API key found. Set WARDEN_ANTHROPIC_API_KEY, ANTHROPIC_API_KEY, or run: npx pi && /login"
- fi
-fi
-
-node "$VALIDATION" validate "$EXPECTED_JSON" "$SCENARIOS_DIR"
-
-# --- cleanup tracking ---
-
-declare -a WORKTREES=()
-declare -a BRANCHES=()
-declare -a JSON_FILES=()
-
-cleanup() {
- for wt in "${WORKTREES[@]+"${WORKTREES[@]}"}"; do
- git -C "$REPO_ROOT" worktree remove --force "$wt" 2>/dev/null || true
- done
- for b in "${BRANCHES[@]+"${BRANCHES[@]}"}"; do
- git -C "$REPO_ROOT" branch -D "$b" 2>/dev/null || true
- done
- (( ${#JSON_FILES[@]} )) && rm -f "${JSON_FILES[@]}"
-}
-trap cleanup EXIT
-
-# --- resolve base commit ---
-# Branch from HEAD so the worktree includes the current skill definition.
-
-BASE=$(git -C "$REPO_ROOT" rev-parse HEAD || die "Cannot resolve HEAD.")
-TS=$(date +%s)
-
-# --- helpers ---
-
-# Commits paths in a validation worktree with consistent author metadata.
-# Usage: git_commit_in_worktree [path...]
-git_commit_in_worktree() {
- local worktree="$1" message="$2"
- shift 2
- if (($# > 0)); then
- git -C "$worktree" add "$@"
- fi
- git -C "$worktree" \
- -c user.email="ci@sentry.io" \
- -c user.name="Validation Test" \
- commit --quiet -m "$message"
-}
-
-# Creates a git worktree from $BASE and commits the NOTICES catalog as the Warden
-# analysis base — so only fixture changes appear in the diff Warden analyzes.
-# Prints the catalog-commit SHA to stdout.
-setup_catalog_base() {
- local worktree="$1" branch="$2"
- git -C "$REPO_ROOT" worktree add --quiet "$worktree" "$BASE" -b "$branch"
- printf '\n' >> "$worktree/THIRD_PARTY_NOTICES.md"
- sed "s|validation-tests/scenarios/|${DEST_PACKAGE_PATH}/|g" \
- "$CATALOG" >> "$worktree/THIRD_PARTY_NOTICES.md"
- git_commit_in_worktree "$worktree" "test: apply NOTICES catalog [skip ci]" \
- THIRD_PARTY_NOTICES.md
- git -C "$worktree" rev-parse HEAD
-}
-
-# Appends the mismatch snippet to THIRD_PARTY_NOTICES.md, stripping the fixture's
-# prose header so only the NOTICES entry itself lands in the file.
-append_mismatch_snippet() {
- local worktree="$1"
- printf '\n' >> "$worktree/THIRD_PARTY_NOTICES.md"
- sed '1,/^---$/d' "$MISMATCH_SNIPPET" >> "$worktree/THIRD_PARTY_NOTICES.md"
-}
-
-# Runs Warden and writes JSON output to the given file.
-run_warden() {
- local base="$1" worktree="$2" json_out="$3" label="$4"
- echo "Running Warden on ${base:0:7}..HEAD ($label)..."
- : > "$json_out"
- if ! "${TIMEOUT_CMD[@]}" npx @sentry/warden "${base}..HEAD" \
- --skill check-code-attribution \
- --fail-on off \
- --report-on medium \
- --json \
- -C "$worktree" \
- > "$json_out"; then
- if [[ ! -s "$json_out" ]]; then
- die "Warden failed for $label with no JSON output (check API key, network, and Warden logs)."
- fi
- die "Warden exited with an error for $label but left partial JSON in $json_out."
- fi
- [[ -s "$json_out" ]] || die "Warden succeeded but produced no JSON output for $label."
-}
-
-# --- main worktree: non-isolated scenarios ---
-# Isolated .java files are omitted here; they get dedicated worktrees below.
-
-echo "Creating worktrees from $(git -C "$REPO_ROOT" rev-parse --short "$BASE")..."
-echo ""
-
-MAIN_WORKTREE=$(mktemp -d)
-MAIN_BRANCH="validation-main-${TS}"
-MAIN_JSON=$(mktemp)
-ROUTING_JSON_FILE=$(mktemp)
-echo '{}' > "$ROUTING_JSON_FILE"
-WORKTREES+=("$MAIN_WORKTREE")
-BRANCHES+=("$MAIN_BRANCH")
-JSON_FILES+=("$MAIN_JSON" "$ROUTING_JSON_FILE")
-
-MAIN_BASE=$(setup_catalog_base "$MAIN_WORKTREE" "$MAIN_BRANCH")
-
-DEST_DIR="$MAIN_WORKTREE/$DEST_PACKAGE_PATH"
-mkdir -p "$DEST_DIR"
-
-shopt -s nullglob
-copied=0
-while IFS= read -r java_file; do
- cp "$SCENARIOS_DIR/$java_file" "$DEST_DIR/"
- copied=$((copied + 1))
-done < <(node "$VALIDATION" list-main-java "$EXPECTED_JSON" "$SCENARIOS_DIR")
-echo "Copied ${copied} scenario files → $DEST_PACKAGE_PATH/ (non-isolated batch)"
-append_mismatch_snippet "$MAIN_WORKTREE"
-git_commit_in_worktree "$MAIN_WORKTREE" \
- "test: add check-code-attribution validation fixtures [skip ci]" \
- "$DEST_PACKAGE_PATH" THIRD_PARTY_NOTICES.md
-
-run_warden "$MAIN_BASE" "$MAIN_WORKTREE" "$MAIN_JSON" "main"
-node "$VALIDATION" routing-set "$ROUTING_JSON_FILE" main "$MAIN_JSON"
-
-# --- isolated worktrees: one per scenario marked "isolated" in EXPECTED.json ---
-#
-# Scenarios where Anthropic prompt-cache priming can suppress findings in a concurrent
-# batch get their own worktree and Warden run. EXPECTED.json is the single source of
-# truth for which scenarios need isolation — add "isolated": true there, not here.
-# Java isolates omit the mismatch snippet; the NOTICES mismatch scenario adds it alone.
-
-while IFS=$'\t' read -r id file; do
- worktree=$(mktemp -d)
- branch="validation-isolated-${TS}-${id//[^a-zA-Z0-9]/-}"
- json=$(mktemp)
- WORKTREES+=("$worktree")
- BRANCHES+=("$branch")
- JSON_FILES+=("$json")
-
- base=$(setup_catalog_base "$worktree" "$branch")
-
- commit_paths=()
- if [[ "$file" == *.java ]]; then
- dest_dir="$worktree/$DEST_PACKAGE_PATH"
- mkdir -p "$dest_dir"
- cp "$SCENARIOS_DIR/$file" "$dest_dir/"
- commit_paths=("$DEST_PACKAGE_PATH")
- elif [[ "$file" == "THIRD_PARTY_NOTICES.md" ]]; then
- append_mismatch_snippet "$worktree"
- commit_paths=(THIRD_PARTY_NOTICES.md)
- else
- die "Unsupported isolated scenario file: $file (id: $id)"
- fi
-
- git_commit_in_worktree "$worktree" "test: isolated fixture for $id [skip ci]" \
- "${commit_paths[@]}"
-
- echo ""
- run_warden "$base" "$worktree" "$json" "$id"
- node "$VALIDATION" routing-set "$ROUTING_JSON_FILE" "$id" "$json"
-
-done < <(node "$VALIDATION" list-isolated "$EXPECTED_JSON")
-
-echo ""
-echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
-
-# --- assert per-scenario ---
-#
-# ROUTING_JSON_FILE maps scenario id → Warden JSONL path; non-isolated scenarios use "main".
-
-node "$VALIDATION" assert "$EXPECTED_JSON" "$DEST_PACKAGE_PATH" "$ROUTING_JSON_FILE"
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderCompleteAndNoticePresent.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderCompleteAndNoticePresent.java
deleted file mode 100644
index 63727be1d5c..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderCompleteAndNoticePresent.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Adapted from https://github.com/example/something
- *
- * Copyright 2020 Example Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.sentry.skills.verification;
-
-public final class HeaderCompleteAndNoticePresent {
-
- public int sum(int a, int b) {
- return a + b;
- }
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderCompleteButNoticeMissing.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderCompleteButNoticeMissing.java
deleted file mode 100644
index 081d1848300..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderCompleteButNoticeMissing.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Adapted from https://github.com/example
- *
- * Copyright 2024 Example Authors
- *
- * Licensed under the MIT License
- *
- * https://github.com/example/something
- */
-package io.sentry.skills.verification;
-
-public final class HeaderCompleteButNoticeMissing {
-
- public boolean ok() {
- return true;
- }
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderFullyStripped.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderFullyStripped.java
deleted file mode 100644
index 6973848c61e..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderFullyStripped.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Attribution stripped — fixture for check-code-attribution validation only. */
-package io.sentry.skills.verification;
-
-public final class HeaderFullyStripped {
-
- public void run() {}
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderMissingButNoticePresent.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderMissingButNoticePresent.java
deleted file mode 100644
index 5c4953ea3ad..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderMissingButNoticePresent.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package io.sentry.skills.verification;
-
-public final class HeaderMissingButNoticePresent {
-
- public int compute(int x) {
- return x * 2;
- }
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderMissingNonEssentialInfo.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderMissingNonEssentialInfo.java
deleted file mode 100644
index c524a2593a4..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderMissingNonEssentialInfo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Adapted from ExampleLib.
-// Copyright 2020 Example Corp.
-// Licensed under the MIT License.
-// https://github.com/example/examplelib
-package io.sentry.skills.verification;
-
-public final class HeaderMissingNonEssentialInfo {
-
- public int compute(int x) {
- return x + 1;
- }
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderPartiallyStripped.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderPartiallyStripped.java
deleted file mode 100644
index 0389934d94a..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/HeaderPartiallyStripped.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Adapted from Example RateLimiter.
-// https://github.com/example
-package io.sentry.skills.verification;
-
-public final class HeaderPartiallyStripped {
-
- public synchronized boolean tryAcquire() {
- return true;
- }
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/NewLicenseType.java b/.claude/skills/check-code-attribution/validation-tests/scenarios/NewLicenseType.java
deleted file mode 100644
index e148f5a1a4f..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/NewLicenseType.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Adapted from ExampleLib.
-// Copyright 2020 Example Corp.
-// Licensed under the GNU Affero General Public License v3.0.
-// https://github.com/example/agpl-lib
-package io.sentry.skills.verification;
-
-public final class NewLicenseType {
-
- public void run() {}
-}
diff --git a/.claude/skills/check-code-attribution/validation-tests/scenarios/THIRD_PARTY_NOTICES.mismatch-snippet.md b/.claude/skills/check-code-attribution/validation-tests/scenarios/THIRD_PARTY_NOTICES.mismatch-snippet.md
deleted file mode 100644
index 5a9b87285df..00000000000
--- a/.claude/skills/check-code-attribution/validation-tests/scenarios/THIRD_PARTY_NOTICES.mismatch-snippet.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Snippet fixture — MismatchLib entry for the isolated mismatch worktree.
-# header-vs-notice-mismatch: copyright in metadata field does not match embedded license text.
-
----
-
-## Example — MismatchLib (MIT)
-
-**Source:** https://github.com/example/mismatch
-**License:** MIT License
-**Copyright:** Copyright (c) 2020 Wrong Holder
-
-### Scope
-
-Validation sample only. The code resides in `io.sentry.skills.verification.MismatchLib`.
-
-```
-MIT License
-
-Copyright (c) 2016 Correct Holder
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-```
diff --git a/.claude/skills/create-java-pr/SKILL.md b/.claude/skills/create-java-pr/SKILL.md
deleted file mode 100644
index 6d5bb34edb3..00000000000
--- a/.claude/skills/create-java-pr/SKILL.md
+++ /dev/null
@@ -1,184 +0,0 @@
----
-name: create-java-pr
-description: Create a pull request in sentry-java. Use when asked to "create pr", "prepare pr", "prep pr", "open pr", "ready for pr", "prepare for review", "finalize changes". Handles branch creation, code formatting, API dump, committing, pushing, PR creation, changelog, and stacked PRs.
----
-
-# Create Pull Request (sentry-java)
-
-Prepare local changes and create a pull request for the sentry-java repo.
-
-**Required reading:** Before proceeding, read `.cursor/rules/pr.mdc` for the full PR and stacked PR workflow details. That file is the source of truth for PR conventions, stack comment format, branch naming, and merge strategy.
-
-## Step 0: Determine PR Type
-
-Ask the user (or infer from context) whether this is:
-
-- **Standalone PR** — a regular PR targeting `main`. Follow Steps 1–6 as written.
-- **First PR of a new stack** — ask for a topic name (e.g. "Global Attributes"). Create a collection branch from `main`, then branch the first PR off it. The first PR targets the collection branch.
-- **Next PR in an existing stack** — identify the previous stack branch and topic. This PR targets the previous stack branch.
-
-If the user mentions "stack", "stacked PR", or provides a topic name with a number (e.g. `[Topic 2]`), treat it as a stacked PR. See `.cursor/rules/pr.mdc` § "Stacked PRs" for full details.
-
-## Step 1: Ensure Feature Branch
-
-```bash
-git branch --show-current
-```
-
-If on `main` or `master`, create and switch to a new branch:
-
-```bash
-git checkout -b /
-```
-
-Derive the branch name from the changes being made. Use `feat/`, `fix/`, `ref/`, etc. matching the commit type conventions.
-
-**For stacked PRs:** For the first PR in a new stack, first create and push the collection branch (see `.cursor/rules/pr.mdc` § "Creating the Collection Branch"), then branch the PR off it. For subsequent PRs, branch off the previous stack branch. Use the naming conventions from `.cursor/rules/pr.mdc` § "Branch Naming".
-
-**CRITICAL: Never merge, fast-forward, or push commits into the collection branch.** It stays at its initial position until the user merges stack PRs through GitHub. Updating it will auto-merge and destroy the entire PR stack.
-
-## Step 2: Format Code and Regenerate API Files
-
-```bash
-./gradlew spotlessApply apiDump
-```
-
-This is **required** before every PR in this repo. It formats all Java/Kotlin code via Spotless and regenerates the `.api` binary compatibility files.
-
-If the command fails, diagnose and fix the issue before continuing.
-
-## Step 3: Commit Changes
-
-Check for uncommitted changes:
-
-```bash
-git status --porcelain
-```
-
-If there are uncommitted changes, invoke the `sentry-skills:commit` skill to stage and commit them following Sentry conventions.
-
-**Important:** When staging, ignore changes that are only relevant for local testing and should not be part of the PR. Common examples:
-
-| Ignore Pattern | Reason |
-|---|---|
-| Hardcoded booleans flipped for testing | Local debug toggles |
-| Sample app config changes (`sentry-samples/`) | Local testing configuration |
-| `.env` or credentials files | Secrets |
-
-Restore these files before committing:
-
-```bash
-git checkout --
-```
-
-## Step 4: Push the Branch
-
-```bash
-git push -u origin HEAD
-```
-
-If the push fails due to diverged history, ask the user how to proceed rather than force-pushing.
-
-## Step 5: Create PR
-
-Invoke the `sentry-skills:create-pr` skill to create a draft PR. When providing the PR body, use the repo's PR template structure from `.github/pull_request_template.md`:
-
-```
-## :scroll: Description
-
-
-## :bulb: Motivation and Context
-
-
-## :green_heart: How did you test it?
-
-
-## :pencil: Checklist
-- [ ] I added GH Issue ID _&_ Linear ID
-- [ ] I added tests to verify the changes.
-- [ ] No new PII added or SDK only sends newly added PII if `sendDefaultPII` is enabled.
-- [ ] I updated the docs if needed.
-- [ ] I updated the wizard if needed.
-- [ ] Review from the native team if needed.
-- [ ] No breaking change or entry added to the changelog.
-- [ ] No breaking change for hybrid SDKs or communicated to hybrid SDKs.
-
-## :crystal_ball: Next steps
-```
-
-Fill in each section based on the changes being PR'd. Check any checklist items that apply.
-
-**For stacked PRs:**
-
-- Pass `--base ` so the PR targets the previous branch (first PR in a stack targets the collection branch).
-- Use the stacked PR title format: `(): [] ` (see `.cursor/rules/pr.mdc` § "PR Title Naming").
-- Include the stack list at the top of the PR body, before the `## :scroll: Description` section (see `.cursor/rules/pr.mdc` § "Stack List in PR Description" for the format).
-- Add a merge method reminder at the very end of the PR body (see `.cursor/rules/pr.mdc` § "Stack List in PR Description" for the exact text). This only applies to stack PRs, not the collection branch PR.
-
-Then continue to Step 5.5 (stacked PRs only) or Step 6.
-
-## Step 5.5: Update Stack List on All PRs (stacked PRs only)
-
-Skip this step for standalone PRs.
-
-After creating the PR, update the PR description on **every other PR in the stack — including the collection branch PR** — so all PRs have the same up-to-date stack list. Follow the format and commands in `.cursor/rules/pr.mdc` § "Stack List in PR Description".
-
-**Important:** When updating PR bodies, never use shell redirects (`>`, `>>`) or pipes (`|`) or compound commands (`&&`). These create compound shell expressions that won't match permission patterns. Instead:
-- Use `gh pr view --json body --jq '.body'` to get the body (output returned directly)
-- Use the `Write` tool to save it to a temp file
-- Use the `Edit` tool to modify the temp file
-- Use `gh pr edit --body-file /tmp/pr-body.md` to update
-
-## Step 6: Update Changelog
-
-First, determine whether a changelog entry is needed. **Skip this step** (and go straight to "No changelog needed" below) if the changes are not user-facing, for example:
-
-- Test-only changes (new tests, test refactors, test fixtures)
-- CI/CD or build configuration changes
-- Documentation-only changes
-- Code comments or formatting-only changes
-- Internal refactors with no behavior change visible to SDK users
-- Sample app changes
-
-If unsure, ask the user.
-
-### If changelog is needed
-
-Add an entry to `CHANGELOG.md` under the `## Unreleased` section.
-
-#### Determine the subsection
-
-| Change Type | Subsection |
-|---|---|
-| New feature | `### Features` |
-| Bug fix | `### Fixes` |
-| Refactoring, internal cleanup | `### Internal` |
-| Dependency update | `### Dependencies` |
-
-Create the subsection under `## Unreleased` if it does not already exist.
-
-#### Entry format
-
-```markdown
-- ([#](https://github.com/getsentry/sentry-java/pull/))
-```
-
-Use the PR number returned by `sentry-skills:create-pr`. Match the style of existing entries — sentence case, ending with the PR link, no trailing period.
-
-#### Commit and push
-
-Stage `CHANGELOG.md`, commit with message `changelog`, and push:
-
-```bash
-git add CHANGELOG.md
-git commit -m "changelog"
-git push
-```
-
-### No changelog needed
-
-If no changelog entry is needed, add `#skip-changelog` to the PR description to disable the changelog CI check:
-
-1. Get the current body: `gh pr view --json body --jq '.body'`
-2. Use the `Write` tool to save the output to `/tmp/pr-body.md`, appending `\n#skip-changelog\n` at the end
-3. Update: `gh pr edit --body-file /tmp/pr-body.md`
diff --git a/.claude/skills/test/SKILL.md b/.claude/skills/test/SKILL.md
deleted file mode 100644
index bdef12364f3..00000000000
--- a/.claude/skills/test/SKILL.md
+++ /dev/null
@@ -1,85 +0,0 @@
----
-name: test
-description: Run tests for a specific SDK module. Use when asked to "run tests", "test module", "run unit tests", "run system tests", "run e2e tests", or test a specific class. Auto-detects unit vs system tests. Supports interactive mode.
-allowed-tools: Bash, Read, Glob, AskUserQuestion
-argument-hint: [interactive] [test-class-filter]
----
-
-# Run Tests
-
-Run tests for a specific module. Auto-detects whether to run unit tests or system tests.
-
-## Step 0: Check for Interactive Mode
-
-If `$ARGUMENTS` starts with `interactive` (e.g., `/test interactive sentry ScopesTest`), enable interactive mode. Strip the `interactive` keyword from the arguments before proceeding.
-
-In interactive mode, use AskUserQuestion at decision points as described in the steps below.
-
-## Step 1: Parse the Argument
-
-The argument can be either:
-- A **file path** (e.g., `@sentry/src/test/java/io/sentry/ScopesTest.kt`)
-- A **module name** (e.g., `sentry-android-core`, `sentry-samples-spring-boot-4`)
-- A **module name + test filter** (e.g., `sentry ScopesTest`)
-
-Extract the module name and optional test class filter from the argument.
-
-**Interactive mode:** If the test filter is ambiguous (e.g., matches multiple test classes across modules), use AskUserQuestion to let the user pick which test class(es) to run.
-
-## Step 2: Detect Test Type
-
-| Signal | Test Type |
-|--------|-----------|
-| Path contains `sentry-samples/` | System test |
-| Module name starts with `sentry-samples-` | System test |
-| Everything else | Unit test |
-
-## Step 3a: Run Unit Tests
-
-Determine the Gradle test task:
-
-| Module Pattern | Test Task |
-|---------------|-----------|
-| `sentry-android-*` | `testDebugUnitTest` |
-| `sentry-compose*` | `testDebugUnitTest` |
-| `*-android` | `testDebugUnitTest` |
-| Everything else | `test` |
-
-**Interactive mode:** Before running, read the test class file and use AskUserQuestion to ask:
-- "Run all tests in this class, or a specific method?" — list the test method names as options.
-
-If the user picks a specific method, use `--tests="*ClassName.methodName"` as the filter.
-
-With a test class filter:
-```bash
-./gradlew '::' --tests="**" --info
-```
-
-Without a filter:
-```bash
-./gradlew '::' --info
-```
-
-## Step 3b: Run System Tests
-
-System tests require the Python-based test runner which manages a mock Sentry server and sample app lifecycle.
-
-1. Ensure the Python venv exists:
-```bash
-test -d .venv || make setupPython
-```
-
-2. Extract the sample module name. For file paths like `sentry-samples//src/...`, the sample module is the directory name (e.g., `sentry-samples-spring`).
-
-3. Run the system test:
-```bash
-.venv/bin/python test/system-test-runner.py test --module
-```
-
-This starts the mock Sentry server, starts the sample app (Spring Boot/Tomcat/CLI), runs tests via `./gradlew :sentry-samples::systemTest`, and cleans up afterwards.
-
-## Step 4: Report Results
-
-Summarize the test outcome:
-- Total tests run, passed, failed, skipped
-- For failures: show the failing test name and the assertion/error message
diff --git a/.craft.yml b/.craft.yml
deleted file mode 100644
index cc4636cd32d..00000000000
--- a/.craft.yml
+++ /dev/null
@@ -1,75 +0,0 @@
-minVersion: 0.29.3
-changelogPolicy: auto
-targets:
- - name: maven
- includeNames: /^sentry.*$/
- gradleCliPath: ./gradlew
- mavenCliPath: scripts/mvnw
- mavenSettingsPath: scripts/settings.xml
- mavenRepoId: ossrh-staging-api
- mavenRepoUrl: https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/
- android:
- distDirRegex: /^(sentry-android-|.*-android).*$/
- fileReplaceeRegex: /\d+\.\d+\.\d+(-\w+(\.\d+)?)?(-SNAPSHOT)?/
- fileReplacerStr: release.aar
- - name: github
- excludeNames: /^libsentry.*\.so$/
- - name: registry
- sdks:
- maven:io.sentry:sentry:
- maven:io.sentry:sentry-spring:
- maven:io.sentry:sentry-spring-jakarta:
- maven:io.sentry:sentry-spring-7:
- maven:io.sentry:sentry-spring-boot:
- maven:io.sentry:sentry-spring-boot-jakarta:
- maven:io.sentry:sentry-spring-boot-starter:
- maven:io.sentry:sentry-spring-boot-starter-jakarta:
- maven:io.sentry:sentry-spring-boot-4:
- maven:io.sentry:sentry-spring-boot-4-starter:
- maven:io.sentry:sentry-servlet:
- maven:io.sentry:sentry-servlet-jakarta:
- maven:io.sentry:sentry-logback:
- maven:io.sentry:sentry-log4j2:
- maven:io.sentry:sentry-jul:
- maven:io.sentry:sentry-apache-http-client-5:
- maven:io.sentry:sentry-android:
- maven:io.sentry:sentry-android-core:
- maven:io.sentry:sentry-android-distribution:
- maven:io.sentry:sentry-android-ndk:
- maven:io.sentry:sentry-android-timber:
- maven:io.sentry:sentry-kotlin-extensions:
- maven:io.sentry:sentry-android-fragment:
- maven:io.sentry:sentry-bom:
- maven:io.sentry:sentry-openfeign:
- maven:io.sentry:sentry-openfeature:
- maven:io.sentry:sentry-launchdarkly-android:
- maven:io.sentry:sentry-launchdarkly-server:
- maven:io.sentry:sentry-opentelemetry-agent:
- maven:io.sentry:sentry-opentelemetry-agentcustomization:
- maven:io.sentry:sentry-opentelemetry-agentless:
- maven:io.sentry:sentry-opentelemetry-agentless-spring:
- maven:io.sentry:sentry-opentelemetry-bootstrap:
- maven:io.sentry:sentry-opentelemetry-core:
- maven:io.sentry:sentry-opentelemetry-otlp:
- maven:io.sentry:sentry-opentelemetry-otlp-spring:
- maven:io.sentry:sentry-kafka:
- maven:io.sentry:sentry-apollo:
- maven:io.sentry:sentry-jdbc:
- maven:io.sentry:sentry-jcache:
- maven:io.sentry:sentry-graphql:
- maven:io.sentry:sentry-graphql-22:
- maven:io.sentry:sentry-graphql-core:
- maven:io.sentry:sentry-quartz:
- maven:io.sentry:sentry-okhttp:
- maven:io.sentry:sentry-android-navigation:
- maven:io.sentry:sentry-compose:
- maven:io.sentry:sentry-compose-android:
- maven:io.sentry:sentry-compose-desktop:
- maven:io.sentry:sentry-apollo-3:
- maven:io.sentry:sentry-android-sqlite:
- maven:io.sentry:sentry-android-replay:
- maven:io.sentry:sentry-apollo-4:
- maven:io.sentry:sentry-reactor:
- maven:io.sentry:sentry-ktor-client:
- maven:io.sentry:sentry-async-profiler:
- maven:io.sentry:sentry-spotlight:
diff --git a/.cursor/rules/api.mdc b/.cursor/rules/api.mdc
deleted file mode 100644
index c5a793d9240..00000000000
--- a/.cursor/rules/api.mdc
+++ /dev/null
@@ -1,89 +0,0 @@
----
-alwaysApply: false
-description: Public API surface, binary compatibility, and common classes to modify
----
-# Java SDK Public API
-
-## API Compatibility
-
-Public API is tracked via `.api` files generated by the [Binary Compatibility Validator](https://github.com/Kotlin/binary-compatibility-validator) Gradle plugin. Each module has its own file at `/api/.api`.
-
-- **Never edit `.api` files manually.** Run `./gradlew apiDump` to regenerate them.
-- `./gradlew check` validates current code against `.api` files and fails on unintended changes.
-- `@ApiStatus.Internal` marks classes/methods as internal — they still appear in `.api` files but are not part of the public contract.
-- `@ApiStatus.Experimental` marks API that may change in future versions.
-
-## Key Public API Classes
-
-### Entry Point
-
-`Sentry` (`sentry` module) is the static entry point. Most public API methods on `Sentry` delegate to `getCurrentScopes()`. When adding a new method to `Sentry`, it typically calls through to `IScopes`.
-
-### Interfaces
-
-| Interface | Description |
-|-----------|-------------|
-| `IScope` | Single scope — holds data (tags, extras, breadcrumbs, attributes, user, contexts, etc.) |
-| `IScopes` | Multi-scope container — manages global, isolation, and current scope; delegates capture calls to `SentryClient` |
-| `ISpan` | Performance span — timing, tags, data, measurements |
-| `ITransaction` | Top-level transaction — extends `ISpan` |
-
-### Configuration
-
-`SentryOptions` is the base configuration class. Platform-specific subclasses:
-- `SentryAndroidOptions` — Android-specific options
-- Integration modules may add their own (e.g. `SentrySpringProperties`)
-
-New features must be **opt-in by default** — add a getter/setter pair to the appropriate options class.
-
-### Internal Classes (Not Public API)
-
-| Class | Description |
-|-------|-------------|
-| `SentryClient` | Sends events/envelopes to Sentry — receives captured data from `Scopes` |
-| `SentryEnvelope` / `SentryEnvelopeItem` | Low-level envelope serialization |
-| `Scope` | Concrete implementation of `IScope` |
-| `Scopes` | Concrete implementation of `IScopes` |
-
-## Adding New Public API
-
-When adding a new method that users can call (e.g. a new scope operation), these classes typically need changes:
-
-### Interfaces and Static API
-1. `IScope` — add the method signature
-2. `IScopes` — add the method signature (usually delegates to a scope)
-3. `Sentry` — add static method that calls `getCurrentScopes()`
-
-### Implementations
-4. `Scope` — actual implementation with data storage
-5. `Scopes` — delegates to the appropriate scope (global, isolation, or current based on `defaultScopeType`)
-6. `CombinedScopeView` — defines how the three scope types combine for reads (merge, first-wins, or specific scope)
-
-### No-Op and Adapter Classes
-7. `NoOpScope` — no-op stub for `IScope`
-8. `NoOpScopes` — no-op stub for `IScopes`
-9. `ScopesAdapter` — delegates to `Sentry` static API
-10. `HubAdapter` — deprecated bridge from old `IHub` API
-11. `HubScopesWrapper` — wraps `IScopes` as `IHub`
-
-### Serialization (if the data is sent to Sentry)
-12. Add serialization/deserialization in the relevant data class or create a new one implementing `JsonSerializable` and `JsonDeserializer`
-
-### Tests
-13. Write tests for all implementations, especially `Scope`, `Scopes`, `SentryTest`, and any new data classes
-14. No-op classes typically don't need separate tests unless they have non-trivial logic
-
-## Protocol / Data Model Classes
-
-Classes in the `io.sentry.protocol` package represent the Sentry event protocol. They implement `JsonSerializable` for serialization and have a companion `Deserializer` class implementing `JsonDeserializer`. When adding new fields to protocol classes, update both serialization and deserialization.
-
-## Namespaced APIs
-
-Newer features are namespaced under `Sentry.()` rather than added directly to `Sentry`. Each namespaced API has an interface, implementation, and no-op. Examples:
-
-- `Sentry.logger()` → `ILoggerApi` / `LoggerApi` / `NoOpLoggerApi` (structured logging, `io.sentry.logger` package)
-- `Sentry.metrics()` → `IMetricsApi` / `MetricsApi` / `NoOpMetricsApi` (metrics)
-
-Options for namespaced features are similarly nested under `SentryOptions`, e.g. `SentryOptions.getMetrics()`, `SentryOptions.getLogs()`.
-
-These APIs may share infrastructure like the type system (`SentryAttributeType.inferFrom()`) — changes to shared components (e.g. attribute types) may require updates across multiple namespaced APIs.
diff --git a/.cursor/rules/coding.mdc b/.cursor/rules/coding.mdc
deleted file mode 100644
index e7af7273f15..00000000000
--- a/.cursor/rules/coding.mdc
+++ /dev/null
@@ -1,53 +0,0 @@
----
-alwaysApply: true
-description: Cursor Coding Rules
----
-
-# Contributing Rules for Agents
-
-## Overview
-
-sentry-java is the Java and Android SDK for Sentry. This repository contains the source code and examples for SDK usage.
-
-## Tech Stack
-
-- **Language**: Java and Kotlin
-- **Build Framework**: Gradle
-
-## Key Commands
-
-```bash
-# Format code and regenerate .api files
-./gradlew spotlessApply apiDump
-
-# Run all tests and linter
-./gradlew check
-
-# Run unit tests for a specific file
-./gradle '::testDebugUnitTest' --tests="**" --info
-```
-
-## Contributing Guidelines
-
-1. Follow existing code style and language
-2. Do not modify the API files (e.g. sentry.api) manually, instead run `./gradlew apiDump` to regenerate them
-3. Write comprehensive tests
-4. New features should always be opt-in by default, extend `SentryOptions` or similar Option classes with getters and setters to enable/disable a new feature
-5. Consider backwards compatibility
-
-## Coding rules
-
-1. First think through the problem, read the codebase for relevant files, and propose a plan
-2. Before you begin working, check in with me and I will verify the plan
-3. Then, begin working on the todo items, marking them as complete as you go
-4. Please do not describe every step of the way and just give me a high level explanation of what changes you made
-5. Make every task and code change you do as simple as possible. We want to avoid making any massive or complex changes. Every change should impact as little code as possible. Everything is about simplicity.
-6. Once you're done, format the code and regenerate the .api files using the following command `./gradlew spotlessApply apiDump`
-7. As a last step, git stage the relevant files and propose (but not execute) a single git commit command (e.g. `git commit -m ""`)
-
-
-## Useful Resources
-
-- Main SDK documentation: https://develop.sentry.dev/sdk/overview/
-- Internal contributing guide: https://docs.sentry.io/internal/contributing/
-- Git commit messages conventions: https://develop.sentry.dev/engineering-practices/commit-messages/
diff --git a/.cursor/rules/continuous_profiling_jvm.mdc b/.cursor/rules/continuous_profiling_jvm.mdc
deleted file mode 100644
index d9a911de25e..00000000000
--- a/.cursor/rules/continuous_profiling_jvm.mdc
+++ /dev/null
@@ -1,174 +0,0 @@
----
-alwaysApply: false
-description: JVM Continuous Profiling (sentry-async-profiler)
----
-# JVM Continuous Profiling
-
-Use this rule when working on JVM continuous profiling in `sentry-async-profiler` and the related core profiling abstractions in `sentry`.
-
-This area is suitable for LLM work, but do not rely on this rule alone for behavior changes. Always read the implementation and nearby tests first, especially for sampling, lifecycle, rate limiting, and file cleanup behavior.
-
-## Module Structure
-
-- **`sentry-async-profiler`**: standalone module containing the async-profiler integration
- - Uses Java `ServiceLoader` discovery
- - No direct dependency from core `sentry` module
- - Enabled by adding the module as a dependency
-
-- **`sentry` core abstractions**:
- - `IContinuousProfiler`: profiler lifecycle interface
- - `ProfileChunk`: profile chunk payload sent to Sentry
- - `IProfileConverter`: converts JVM JFR files into `SentryProfile`
- - `ProfileLifecycle`: controls MANUAL vs TRACE lifecycle
- - `ProfilingServiceLoader`: loads profiler and converter implementations via `ServiceLoader`
-
-## Key Classes
-
-### `JavaContinuousProfiler` (`sentry-async-profiler`)
-- Wraps the native async-profiler library
-- Writes JFR files to `profilingTracesDirPath`
-- Rotates chunks periodically via `MAX_CHUNK_DURATION_MILLIS` (currently 10s)
-- Implements `RateLimiter.IRateLimitObserver`
-- Maintains `rootSpanCounter` for TRACE lifecycle
-- Keeps a session-level `profilerId` across chunks until the profiling session ends
-- `getChunkId()` currently returns `SentryId.EMPTY_ID`, but emitted `ProfileChunk`s get a fresh chunk id when built in `stop(...)`
-
-### `ProfileChunk`
-- Carries `profilerId`, `chunkId`, timestamp, platform, measurements, and a JFR file reference
-- Built via `ProfileChunk.Builder`
-- For JVM, the JFR file is converted later during envelope item creation, not inside `JavaContinuousProfiler`
-
-### `ProfileLifecycle`
-- `MANUAL`: explicit `Sentry.startProfiler()` / `Sentry.stopProfiler()`
-- `TRACE`: profiler lifecycle follows active sampled root spans
-
-## Configuration
-
-Continuous profiling is **not** controlled by `profilesSampleRate`.
-
-Key options:
-- **`profileSessionSampleRate`**: session-level sample rate for continuous profiling
-- **`profileLifecycle`**: `ProfileLifecycle.MANUAL` (default) or `ProfileLifecycle.TRACE`
-- **`cacheDirPath`**: base SDK cache directory; profiling traces are written under the derived `profilingTracesDirPath`
-- **`profilingTracesHz`**: sampling frequency in Hz (default: 101)
-
-Continuous profiling is enabled when:
-- `profilesSampleRate == null`
-- `profilesSampler == null`
-- `profileSessionSampleRate != null && profileSessionSampleRate > 0`
-
-Example:
-
-```java
-options.setProfileSessionSampleRate(1.0);
-options.setCacheDirPath("/tmp/sentry-cache");
-options.setProfileLifecycle(ProfileLifecycle.MANUAL);
-options.setProfilingTracesHz(101);
-```
-
-## How It Works
-
-### Initialization
-- `InitUtil.initializeProfiler(...)` resolves or creates the profiling traces directory
-- `ProfilingServiceLoader.loadContinuousProfiler(...)` uses `ServiceLoader` to find `JavaContinuousProfilerProvider`
-- `AsyncProfilerContinuousProfilerProvider` instantiates `JavaContinuousProfiler`
-- `ProfilingServiceLoader.loadProfileConverter()` separately loads the `JavaProfileConverterProvider`
-
-### Profiling Flow
-
-**Start**
-- Sampling decision is made via `TracesSampler.sampleSessionProfile(...)`
-- Sampling is session-based and cached until `reevaluateSampling()`
-- Scopes and rate limiter are initialized lazily via `initScopes()`
-- Rate limits for `All` or `ProfileChunk` abort startup
-- JFR filename is generated under `profilingTracesDirPath`
-- async-profiler is started with a command like:
- - `start,jfr,event=wall,nobatch,interval=,file=`
-- Automatic chunk stop is scheduled after `MAX_CHUNK_DURATION_MILLIS`
-
-**Chunk Rotation**
-- `stop(true)` stops async-profiler and validates the JFR file
-- A `ProfileChunk.Builder` is created with:
- - current `profilerId`
- - a fresh `chunkId`
- - trace file
- - chunk timestamp
- - platform `java`
-- Builder is buffered in `payloadBuilders`
-- Chunks are sent if scopes are available
-- Profiling is restarted for the next chunk
-
-**Stop**
-- `MANUAL`: stop immediately, do not restart, reset `profilerId`
-- `TRACE`: decrement `rootSpanCounter`; stop only when it reaches 0
-- `close(...)` also forces shutdown and resets TRACE state
-
-### Sending and Conversion
-- `JavaContinuousProfiler` buffers `ProfileChunk.Builder` instances
-- `sendChunks(...)` builds `ProfileChunk` objects and calls `scopes.captureProfileChunk(...)`
-- `SentryClient.captureProfileChunk(...)` creates an envelope item
-- JVM JFR-to-`SentryProfile` conversion happens in `SentryEnvelopeItem.fromProfileChunk(...)` using the loaded `IProfileConverter`
-- Trace files are deleted in the envelope item path after serialization attempts
-
-## TRACE Mode Lifecycle
-- `rootSpanCounter` increments when sampled root spans start
-- `rootSpanCounter` decrements when root spans finish
-- Profiler runs while `rootSpanCounter > 0`
-- Multiple concurrent sampled transactions can share the same profiling session
-- Be careful when changing lifecycle logic: this area is lock-protected and concurrency-sensitive
-
-## Rate Limiting and Buffering
-
-### Rate Limiting
-- Registers as a `RateLimiter.IRateLimitObserver`
-- If rate limited for `ProfileChunk` or `All`:
- - profiler stops immediately
- - it does not auto-restart when the limit expires
-- Startup also checks rate limiting before profiling begins
-
-### Buffering / pre-init behavior
-- JFR files are written to `profilingTracesDirPath` and marked `deleteOnExit()` when a chunk is accepted
-- If scopes are not yet available, `ProfileChunk.Builder`s remain buffered in memory in `payloadBuilders`
-- This commonly matters for profiling that starts before SDK scopes are ready
-- This is not a dedicated durable offline queue owned by the profiler itself; conversion and final send happen later in the normal client/envelope path
-
-## Extending
-
-To add or replace JVM profiler implementations:
-- implement `IContinuousProfiler`
-- implement `JavaContinuousProfilerProvider`
-- register provider in:
- - `META-INF/services/io.sentry.profiling.JavaContinuousProfilerProvider`
-
-To add or replace JVM profile conversion:
-- implement `IProfileConverter`
-- implement `JavaProfileConverterProvider`
-- register provider in:
- - `META-INF/services/io.sentry.profiling.JavaProfileConverterProvider`
-
-## Code Locations
-
-Primary implementation:
-- `sentry/src/main/java/io/sentry/IContinuousProfiler.java`
-- `sentry/src/main/java/io/sentry/ProfileChunk.java`
-- `sentry/src/main/java/io/sentry/profiling/ProfilingServiceLoader.java`
-- `sentry/src/main/java/io/sentry/util/InitUtil.java`
-- `sentry/src/main/java/io/sentry/SentryEnvelopeItem.java`
-- `sentry-async-profiler/src/main/java/io/sentry/asyncprofiler/profiling/JavaContinuousProfiler.java`
-- `sentry-async-profiler/src/main/java/io/sentry/asyncprofiler/provider/AsyncProfilerContinuousProfilerProvider.java`
-- `sentry-async-profiler/src/main/java/io/sentry/asyncprofiler/provider/AsyncProfilerProfileConverterProvider.java`
-- `sentry-async-profiler/src/main/java/io/sentry/asyncprofiler/convert/JfrAsyncProfilerToSentryProfileConverter.java`
-
-Tests to read first:
-- `sentry-async-profiler/src/test/java/io/sentry/asyncprofiler/profiling/JavaContinuousProfilerTest.kt`
-- `sentry-async-profiler/src/test/java/io/sentry/asyncprofiler/JavaContinuousProfilingServiceLoaderTest.kt`
-- `sentry-async-profiler/src/test/java/io/sentry/asyncprofiler/convert/JfrAsyncProfilerToSentryProfileConverterTest.kt`
-
-## LLM Guidance
-
-This rule is good enough for orientation, but for actual code changes always verify:
-- the sampling path in `TracesSampler`
-- continuous profiling enablement in `SentryOptions`
-- lifecycle entry points in `Scopes` and `SentryTracer`
-- conversion and file deletion behavior in `SentryEnvelopeItem`
-- existing tests before changing concurrency or lifecycle semantics
diff --git a/.cursor/rules/deduplication.mdc b/.cursor/rules/deduplication.mdc
deleted file mode 100644
index b48516dae44..00000000000
--- a/.cursor/rules/deduplication.mdc
+++ /dev/null
@@ -1,13 +0,0 @@
----
-alwaysApply: false
-description: Java SDK Event deduplication
----
-
-# Java SDK Event deduplication
-
-To avoid sending the same error multiple times, there is deduplication logic in place in the SDK.
-Duplicate captures can happen due to multiple integrations capturing the exception as well as additional manual calls to `Sentry.captureException`.
-
-Deduplication is performed in `DuplicateEventDetectionEventProcessor` which returns `null` when it detects a duplicate event causing it to be dropped.
-
-The `enableDeduplication` option can be used to opt out of deduplication. It is enabled by default.
diff --git a/.cursor/rules/e2e_tests.mdc b/.cursor/rules/e2e_tests.mdc
deleted file mode 100644
index 17e088774b5..00000000000
--- a/.cursor/rules/e2e_tests.mdc
+++ /dev/null
@@ -1,28 +0,0 @@
----
-alwaysApply: false
-description: Java SDK End to End Tests
----
-
-# Java SDK End to End Tests (System Tests)
-
-The samples in the `sentry-samples` directory are used to run end to end tests against them.
-
-There is a python script (`system-test-runner.py`) that can be used to run one (using `--module SAMPLE_NAME`) or all (using `--all`) system tests.
-
-The script has an interactive mode (`-i`) which allows selection of test setups to execute, whether to run the tests or just prepare infrastructure for testing from IDE.
-
-The tests run a mock Sentry server via `system-test-sentry-server.py`. Any system under test will then have a DSN set that reflects this local mock server like `http://502f25099c204a2fbf4cb16edc5975d1@localhost:8000/0`.
-By using this local DSN, the system under test sends events to the local mock server.
-The tests can then use `TestHelper` to assert envelopes that were received by the mock server.
-`TestHelper` uses HTTP requests to retrieve the JSON payload of the received events and deserialize them back to objects for easier assertion.
-Tests can then assert events, transactions, logs etc. similar to how they would appear in `beforeSend` and similar callbacks.
-
-`TestHelper` has a lot of helper methods for asserting, e.g. by span name, log body etc.
-
-The end to end tests either expect the system under test to either be running on a server or call `java -jar` to execute a CLI system under test.
-
-For Spring Boot, we spin up the Spring Boot server. The tests then send requests to that server and assert what is sent to Sentry.
-
-End to end tests are also executed on CI using a matrix build, as defined in `.github/workflows/system-tests-backend.yml`.
-
-Some of the samples are tested in multiple ways, e.g. with OpenTelemetry Agent auto init turned on and off.
diff --git a/.cursor/rules/feature_flags.mdc b/.cursor/rules/feature_flags.mdc
deleted file mode 100644
index f2a78bc71cf..00000000000
--- a/.cursor/rules/feature_flags.mdc
+++ /dev/null
@@ -1,44 +0,0 @@
----
-alwaysApply: false
-description: Feature Flags
----
-# Java SDK Feature Flags
-
-There is a scope based and a span based API for tracking feature flag evaluations.
-
-## Scope Based API
-
-The `addFeatureFlag` method can be used to track feature flag evaluations. It exists on `Sentry` static API as well as `IScopes` and `IScope`.
-
-When using static API, `IScopes` or COMBINED scope type, Sentry will also invoke `addFeatureFlag` on the current span. This does not happen, when directly invoking `addFeatureFlag` on `IScope` (except for COMBINED scope type).
-
-The `maxFeatureFlags` option controls how many flags are tracked per scope and also how many are sent to Sentry as part of events.
-Scope based feature flags can also be disabled by setting the value to 0. Defaults to 100 feature flag evaluations.
-
-Order of feature flag evaluations is important as we only keep track of the last {maxFeatureFlag} items.
-
-When a feature flag evaluation with the same name is added, the previous one is removed and the new one is stored so that it'll be dropped last.
-Refer to `FeatureFlagBuffer` fore more details. `FeatureFlagBuffer` has been optimized for storing scope based feature flag evaluations, especially clone performance.
-
-When sending out an error event, feature flag buffers from all three scope types (global, isolation and current scope) are merged, choosing the newest {maxFeatureFlag} entries across all scope types. Feature flags are sent as part of the `flags` context.
-
-## Span Based API
-
-It's also possible to use the `addFeatureFlag` method on `ISpan` (and by extension `ITransaction`). Feature flag evaluations tracked this way
-will not be added to the scope and thus won't be added to error events.
-
-Each span has its own `SpanFeatureFlagBuffer`. When starting a child span, feature flag evaluations are NOT copied from the parent. Each span starts out with an empty buffer and has its own limit.
-`SpanFeatureFlagBuffer` has been optimized for storing feature flag evaluations on spans.
-
-Spans have a hard coded limit of 10 feature flag evaluations. When full, new entries are rejected. Updates to existing entries are still allowed even if full.
-
-## Integrations
-
-We offer integrations that automatically track feature flag evaluations.
-
-Android:
-- LaunchDarkly (`SentryLaunchDarklyAndroidHook`)
-
-JVM (non Android):
-- LaunchDarkly (`SentryLaunchDarklyServerHook`)
-- OpenFeature (`SentryOpenFeatureHook`)
diff --git a/.cursor/rules/metrics.mdc b/.cursor/rules/metrics.mdc
deleted file mode 100644
index 93c82ecb467..00000000000
--- a/.cursor/rules/metrics.mdc
+++ /dev/null
@@ -1,26 +0,0 @@
----
-alwaysApply: false
-description: Metrics API
----
-# Java SDK Metrics API
-
-Metrics are enabled by default.
-
-API has been namespaced under `Sentry.metrics()` and `IScopes.metrics()` using the `IMetricsApi` interface and `MetricsApi` implementation.
-
-Options are namespaced under `SentryOptions.getMetrics()`.
-
-Three different APIs exist:
-- `count`: Counters are one of the more basic types of metrics and can be used to count certain event occurrences.
-- `distribution`: Distributions help you get the most insights from your data by allowing you to obtain aggregations such as p90, min, max, and avg.
-- `gauge`: Gauges let you obtain aggregates like min, max, avg, sum, and count. They can be represented in a more space-efficient way than distributions, but they can't be used to get percentiles. If percentiles aren't important to you, we recommend using gauges.
-
-Refer to `SentryMetricsEvent` for details about available fields.
-
-`MetricsBatchProcessor` handles batching (`MAX_BATCH_SIZE`), automatic sending of metrics after a timeout (`FLUSH_AFTER_MS`) and rejecting if `MAX_QUEUE_SIZE` has been hit.
-
-The flow is `IMetricsApi` -> `IMetricsBatchProcessor` -> `SentryClient.captureBatchedMetricsEvents` -> `ITransport`.
-
-Each `SentryMetricsEvent` goes through `SentryOptions.metrics.beforeSend` (if configured) and can be modified or dropped.
-
-For sending, a batch of `SentryMetricsEvent` objects is sent inside a `SentryMetricsEvents` object.
diff --git a/.cursor/rules/new_module.mdc b/.cursor/rules/new_module.mdc
deleted file mode 100644
index 5bf2c70c2f7..00000000000
--- a/.cursor/rules/new_module.mdc
+++ /dev/null
@@ -1,88 +0,0 @@
----
-description: Module Addition Rules for sentry-java
-alwaysApply: false
----
-# Module Addition Rules for sentry-java
-
-## Overview
-
-This document outlines the complete process for adding a new module to the sentry-java repository. Follow these steps in order to ensure proper integration and release management.
-
-## Step-by-Step Process
-
-### 1. Create the Module Structure
-
-1. Create the new module, conforming to the existing naming conventions and build scripts
-
-2. Add the module to the include list in `settings.gradle.kts`
-
-If adding a `sentry-samples` module, also add it to the `ignoredProjects` list in the root `build.gradle.kts`:
-
-```kotlin
-ignoredProjects.addAll(
- listOf(
- // ... existing projects ...
- "sentry-samples-{module-name}"
- )
-)
-```
-
-3. If adding a JVM sample, add E2E (system) tests, following the structure we have in the existing JVM examples.
- The test should then be added to `test/system-test-runner.py` and `.github/workflows/system-tests-backend.yml`.
-
-### 2. Create Module Documentation
-
-Create a `README.md` in the module directory with the following structure:
-
-```markdown
-# sentry-{module-name}
-
-This module provides an integration for [Technology/Framework Name].
-
-Please consult the documentation on how to install and use this integration in the Sentry Docs for [Android](https://docs.sentry.io/platforms/android/integrations/{module-name}/) or [Java](https://docs.sentry.io/platforms/java/tracing/instrumentation/{module-name}/).
-```
-
-The following tasks are required only when adding a module that isn't a sample.
-
-### 3. Update Main README.md
-
-Add the new module to the packages table in the main `README.md` with a placeholder link to the badge:
-
-```markdown
-| sentry-{module-name} | [](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-{module-name}) | |
-```
-
-Note that the badge will only work after the module is released to Maven Central.
-
-### 4. Add Documentation to docs.sentry.io
-
-Add the necessary documentation to [docs.sentry.io](https://docs.sentry.io):
-- For Java modules: Add to Java platform docs, usually in integrations section
-- For Android modules: Add to Android platform docs, usually in integrations section
-- Include installation instructions, configuration options, and usage examples
-
-### 5. Post release tasks
-
-Remind the user to perform the following tasks after the module is merged and released:
-
-1. Add the SDK to the Sentry release registry, following the instructions in the [sentry-release-registry README](https://github.com/getsentry/sentry-release-registry#adding-new-sdks)
-
-2. Add the module to `.craft.yml` in the `sdks` section:
- ```yaml
- sdks:
- # ... existing modules ...
- maven:io.sentry:sentry-{module-name}:
- ```
-
-## Module Naming Conventions
-
-- Use kebab-case for module names: `sentry-{module-name}`
-- Follow existing patterns: `sentry-okhttp`, `sentry-apollo-4`, `sentry-spring-boot`
-- For version-specific modules, include the version: `sentry-apollo-3`, `sentry-apollo-4`
-
-## Important Notes
-
-1. **API Files**: Do not modify `.api` files manually. Run `./gradlew apiDump` to regenerate them
-2. **Backwards Compatibility**: Ensure new features are opt-in by default
-3. **Testing**: Write comprehensive tests for all new functionality
-4. **Documentation**: Always include proper documentation and examples
diff --git a/.cursor/rules/offline.mdc b/.cursor/rules/offline.mdc
deleted file mode 100644
index 14e9419b4de..00000000000
--- a/.cursor/rules/offline.mdc
+++ /dev/null
@@ -1,87 +0,0 @@
----
-alwaysApply: false
-description: Java SDK Offline behaviour
----
-# Java SDK Offline behaviour
-
-By default offline caching is enabled for Android but disabled for JVM.
-It can be enabled by setting SentryOptions.cacheDirPath.
-
-For Android, AndroidEnvelopeCache is used. For JVM, if cache path has been configured, EnvelopeCache will be used.
-
-Any error, event, transaction, profile, replay etc. is turned into an envelope and then sent into ITransport.send.
-The default implementation is AsyncHttpTransport.
-
-If an envelope is dropped due to rate limit and has previously been cached (Cached hint) it will be discarded from the IEnvelopeCache.
-
-AsyncHttpTransport.send will enqueue an AsyncHttpTransport.EnvelopeSender task onto an executor.
-
-Any envelope that doesn't have the Cached hint will be stored in IEnvelopeCache by the EventSender task. Previously cached envelopes (Cached hint) will have a noop cache passed to AsyncHttpTransport.EnvelopeSender and thus not cache again. It is also possible cache is disabled in general.
-
-An envelope being sent directly from SDK API like Sentry.captureException will not have the Retryable hint.
-
-In case the SDK is offline, it'll mark the envelope to be retried if it has the Retryable hint.
-If the envelope is not retryable and hasn't been sent to offline cache, it's recorded as lost in a client report.
-
-In case the envelope can't be sent due to an error or network connection problems it'll be marked for retry if it has the Retryable hint.
-If it's not retryable and hasn't been cached, it's recorded as lost in a client report.
-
-In case the envelope is sent successfully, it'll be discarded from cache.
-
-The SDK has multiple mechanisms to deal with envelopes on disk.
-- OutboxSender: Sends events coming from other SDKs like NDK that wrote them to disk.
-- io.sentry.EnvelopeSender: This is the offline cache.
-
-Both of these are set up through an integration (SendCachedEnvelopeIntegration) which is configured to use SendFireAndForgetOutboxSender or SendFireAndForgetEnvelopeSender.
-
-io.sentry.EnvelopeSender is able to pick up files in the cache directory and send them.
-It will trigger sending envelopes in cache dir on init and when the connection status changes (e.g. the SDK comes back online, meaning it has Internet connection again).
-
-## When Envelope Files Are Removed From Cache
-
-Envelope files are removed from the cache directory in the following scenarios:
-
-### 1. Successful Send to Sentry Server
-When `AsyncHttpTransport` successfully sends an envelope to the Sentry server, it calls `envelopeCache.discard(envelope)` to remove the cached file. This happens in `AsyncHttpTransport.EnvelopeSender.flush()` when `result.isSuccess()` is true.
-
-### 2. Rate Limited Previously Cached Envelopes
-If an envelope is dropped due to rate limiting **and** has previously been cached (indicated by the `Cached` hint), it gets discarded immediately via `envelopeCache.discard(envelope)` in `AsyncHttpTransport.send()`.
-In this case the discarded envelope is recorded as lost in client reports.
-
-### 3. Offline Cache Processing (EnvelopeSender)
-When the SDK processes cached envelope files from disk (via `EnvelopeSender`), files are deleted after processing **unless** they are marked for retry. In `EnvelopeSender.processFile()`, the file is deleted with `safeDelete(file)` if `!retryable.isRetry()`.
-
-### 4. Session File Management
-Session-related files (session.json, previous_session.json) are removed during session lifecycle events like session start/end and abnormal exits.
-
-### 5. Cache rotation
-If the number of files in the cache directory has reached the configured limit (SentryOptions.maxCacheItems), the oldest file will be deleted to make room.
-This happens in `CacheStrategy.rotateCacheIfNeeded`. The deleted envelope will be recorded as lost in client reports.
-
-## Retry Mechanism
-
-**Important**: The SDK does NOT implement a traditional "max retry count" mechanism. Instead:
-
-### Infinite Retry Approach
-- **Retryable envelopes**: Stay in cache indefinitely and are retried when conditions improve (network connectivity restored, rate limits expire, etc.)
-- **Non-retryable envelopes**: If they fail to send, they're immediately recorded as lost (not cached for retry)
-
-### When Envelopes Are Permanently Lost (Not Due to Retry Limits)
-
-1. **Queue Overflow**: When the transport executor queue is full - recorded as `DiscardReason.QUEUE_OVERFLOW`
-
-2. **Network Errors (Non-Retryable)**: When an envelope isn't marked as retryable and fails due to network issues - recorded as `DiscardReason.NETWORK_ERROR`
-
-3. **Rate Limiting**: When envelope items are dropped due to active rate limits - recorded as `DiscardReason.RATELIMIT_BACKOFF`
-
-4. **Cache Overflow**: When the cache directory has reached maxCacheItems, old files are deleted - recorded as `DiscardReason.CACHE_OVERFLOW`
-
-### Cache Processing Triggers
-Cached envelopes are processed when:
-- Network connectivity is restored (via connection status observer)
-- SDK initialization occurs
-- Rate limits expire
-- Manual flush operations
-
-### File Deletion Implementation
-The actual file deletion is handled by `EnvelopeCache.discard()` which calls `envelopeFile.delete()` and logs errors if deletion fails.
diff --git a/.cursor/rules/opentelemetry.mdc b/.cursor/rules/opentelemetry.mdc
deleted file mode 100644
index 4e773233f04..00000000000
--- a/.cursor/rules/opentelemetry.mdc
+++ /dev/null
@@ -1,97 +0,0 @@
----
-alwaysApply: false
-description: Java SDK OpenTelemetry Integration
----
-# Java SDK OpenTelemetry Integration
-
-## Overview
-
-The Sentry Java SDK provides comprehensive OpenTelemetry integration through multiple modules:
-
-- `sentry-opentelemetry-core`: Core OpenTelemetry integration functionality
-- `sentry-opentelemetry-agent`: Java Agent-based integration for automatic instrumentation
-- `sentry-opentelemetry-agentless`: Manual instrumentation without Java agent
-- `sentry-opentelemetry-agentless-spring`: Spring-specific agentless integration
-- `sentry-opentelemetry-bootstrap`: Classes that go into the bootstrap classloader when the agent is used. For agentless they are simply used in the applications classloader.
-- `sentry-opentelemetry-agentcustomization`: Classes that help wire up Sentry in OpenTelemetry. These land in the agent classloader when the agent is used. For agentless they are simply used in the application classloader.
-- `sentry-opentelemetry-otlp`: Classes for using OpenTelemetry to send spans to Sentry using the OTLP endpoint and have Sentry use OpenTelemetry trace and span id.
-- `sentry-opentelemetry-otlp-spring`: Spring Boot convenience module that includes `sentry-opentelemetry-otlp` and the OpenTelemetry Spring Boot starter as transitive dependencies.
-
-## Advantages over using Sentry without OpenTelemetry
-
-- Support for more libraries and frameworks
- - See https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation for a list of supported libraries and frameworks
-- More automated Performance instrumentation (spans) created
- - Using `sentry-opentelemetry-agent` offers most support
- - Using `sentry-opentelemetry-agentless-spring` for Spring Boot also has a lot of supported libraries, altough fewer than the agent does
- - Note that `sentry-opentelemetry-agentless` will not have any OpenTelemetry auto instrumentation
-- Sentry also relies on OpenTelemetry `Context` propagation to propagate Sentry `Scopes`, ensuring e.g. that execution flow for a request shares data and does not leak data into other requests.
-- OpenTelemetry also offers better support for distributed tracing since more libraries are supported for attaching tracing information to outgoing requests and picking up incoming tracing information.
-
-## Key Components
-
-### Agent vs Agentless
-
-**Java Agent-based integration**:
-- Automatic instrumentation via Java agent
-- Can be added to any JAR when starting, no extra dependencies or code changes required. Just add the agent when running the application, e.g. `SENTRY_PROPERTIES_FILE=sentry.properties JAVA_TOOL_OPTIONS="-javaagent:sentry-opentelemetry-agent.jar" java -jar your-application.jar`.
-- Uses OpenTelemetry Java agent with Sentry extensions
-- Uses bytecode manipulation
-
-**Agentless-Spring integration**:
-- Automatic instrumentation setup via Spring Boot
-- Dependency needs to be added to the project.
-
-**Agentless integration**:
-- Manual instrumentation setup
-- Dependency needs to be added to the project.
-
-**Manual Integration**:
-While it's possible to manually wire up all the required classes to make Sentry and OpenTelemetry work together, we do not recommend this.
-It is instead preferrable to use `SentryAutoConfigurationCustomizerProvider` so the Sentry SDK has a place to manage required classes and update it when changes are needed.
-This way customers receive the updated config automatically as oppposed to having to update manually, wire in new classes, remove old ones etc.
-
-### Integration Architecture
-
-Sentry will try to locate certain classes that come with the Sentry OpenTelemetry integration to:
-- Determine whether any Sentry OpenTelemetry integration is present
-- Determine which mode to use and in turn which Sentry auto instrumentation to suppress
-
-Reflection is used to search for `io.sentry.opentelemetry.OtelContextScopesStorage` and use it instead of `DefaultScopesStorage` when a Sentry OpenTelemetry integration is present at runtime. `IScopesStorage` is used to store Sentry `Scopes` instances. `DefaultScopesStorage` will use a thread local variable to store the current threads' `Scopes` whereas `OtelContextScopesStorage` makes use of OpenTelemetry SDKs `Context`. Sentry OpenTelemetry integrations configure OpenTelemetry to use `SentryOtelThreadLocalStorage` to customize restoring of the previous `Context`.
-
-OpenTelemetry SDK makes use of `io.opentelemetry.context.Scope` in `try-with-resources` statements that call `close` when a code block is finished. Without customization, it would refuse to restore the previous `Context` onto the `ThreadLocal` if the current state of the `ThreadLocal` isn't the same as the one this scope was created for. Sentry changes this behaviour in `SentryScopeImpl` to restore the previous `Context` onto the `ThreadLocal` even if an inner `io.opentelemetry.context.Scope` wasn't properly cleaned up. Our thinking here is to prefer returning to a clean state as opposed to propagating the problem. The unclean state could happen, if `io.opentelemetry.context.Scope` isn't closed, e.g. when forgetting to put it in a `try-with-resources` statement and not calling `close` (e.g. not putting it in a `finally` block in that case).
-
-`SentryContextStorageProvider` looks for any other `ContextStorageProvider` and forwards to that to not override any customized `ContextStorage`. If no other provider is found, `SentryOtelThreadLocalStorage` is used.
-
-`SpanFactoryFactory` is used to configure Sentry to use `io.sentry.opentelemetry.OtelSpanFactory` if the class is present at runtime. Reflection is used to search for it. If the class is not available, we fall back to `DefaultSpanFactory`.
-
-`DefaultSpanFactory` creates a `SentryTracer` instance when creating a transaction and spans are then created directly on the transaction via `startChild`.
-`OtelSpanFactory` instead creates an OpenTelemetry span and wraps it using `OtelTransactionSpanForwarder` to simulate a transaction. The `startChild` invocations on `OtelTransactionSpanForwarder` go through `OtelSpanFactory` again to create the child span.
-
-## Configuration
-
-We use `SentryAutoConfigurationCustomizerProvider` to configure OpenTelemetry for use with Sentry and register required classes, hooks etc.
-
-## Span Processing
-
-Both Sentry and OpenTelemetry API can be used to create spans. When using Sentry API, `OtelSpanFactory` is used to indirectly create a OpenTelemetry span.
-Regardless of API used, when an OpenTelemetry span is created, it goes through `SentrySampler` for sampling and `OtelSentrySpanProcessor` for `Scopes` forking and ensuring the trace is continued.
-When Sentry API is used, sampling is performed in `Scopes.createTransaction` before forwarding the call to `OtelSpanFactory`. The sampling decision and other sampling details are forwarded to `SentrySampler` and `OtelSentrySpanProcessor`.
-
-When a span is finished, regardless of whether Sentry or OpenTelemetry API is used, it goes through `OtelSentrySpanProcessor` to set the end date and then through `BatchSpanProcessor` which will batch spans and then forward them to `SentrySpanExporter`.
-
-`SentrySpanExporter` collects spans, then structures them to create a transaction for the local root span and attaches child spans to form a span tree.
-Some OpenTelemetry attributes are transformed into their corresponding Sentry data structure or format.
-
-After creating the transaction with child spans `SentrySpanExporter` uses Sentry API to send the transaction to Sentry. This API call however forces the use of `DefaultSpanFactory` in order to create the required Sentry classes for sending and also to not create an infinite loop where any span created will cause a new span to be created recursively.
-
-## Troubleshooting
-
-To debug forking of `Scopes`, we added a reference to `parent` `Scopes` and a `creator` String to store the reason why `Scopes` were created or forked.
-
-# OTLP
-When using `sentry-opentelemetry-otlp`, Sentry only loads trace ID and span ID from OpenTelemetry `Context` (via `OpenTelemetryOtlpEventProcessor`). Sentry does not rely on OpenTelemetry `Context` for scope storage and propagation, instead relying on its `DefaultScopesStorage`.
-It is common to keep Performance in Sentry SDK disabled since that part is taken over by OpenTelemetry.
-The `sentry-opentelemetry-otlp` module is not connected to the other `sentry-opentelemetry-*` modules but instead intended only when the goal is to run OpenTelemetry for creating spans and Sentry for other products like errors, logs, metrics etc.
-The `sentry-opentelemetry-otlp-spring` module wraps `sentry-opentelemetry-otlp` and includes the OpenTelemetry Spring Boot starter for easier setup in Spring Boot applications.
-The OTLP module does not easily work with the OpenTelemetry agent as it would require customizing the agent.JAR in order to get the propagator loaded.
diff --git a/.cursor/rules/options.mdc b/.cursor/rules/options.mdc
deleted file mode 100644
index 2d239da7813..00000000000
--- a/.cursor/rules/options.mdc
+++ /dev/null
@@ -1,115 +0,0 @@
----
-alwaysApply: false
-description: Adding and modifying SDK options
----
-# Adding Options to the SDK
-
-New features must be **opt-in by default**. Options control whether a feature is enabled and how it behaves.
-
-## Namespaced Options
-
-Newer features use namespaced option classes nested inside `SentryOptions`, e.g.:
-- `SentryOptions.getLogs()` → `SentryOptions.Logs`
-- `SentryOptions.getMetrics()` → `SentryOptions.Metrics`
-
-Each namespaced options class is a `public static final class` inside `SentryOptions` with its own fields, getters/setters, and callbacks (e.g. `BeforeSendLogCallback`, `BeforeSendMetricCallback`).
-
-A typical namespaced options class contains:
-- `enabled` boolean (default `false` for opt-in)
-- `sampleRate` double (if the feature supports sampling)
-- `beforeSend` callback interface (nested inside the options class)
-
-To add a new namespaced options class:
-1. Create the `public static final class` inside `SentryOptions` with fields, getters/setters, and any callback interfaces
-2. Add a private field on `SentryOptions` initialized with `new SentryOptions.MyFeature()`
-3. Add getter/setter on `SentryOptions` annotated with `@ApiStatus.Experimental`
-
-## Direct (Non-Namespaced) Options
-
-Options that apply globally across the SDK (e.g. `dsn`, `environment`, `release`, `sampleRate`, `maxBreadcrumbs`) live as direct fields on `SentryOptions` with getter/setter pairs. Use this pattern for options that aren't tied to a specific feature namespace.
-
-## Configuration Layers
-
-Options can be set through multiple layers. When adding a new option, consider which layers apply:
-
-### 1. SentryOptions (always required)
-
-The core options class. Add the field (or nested class) with getter/setter here.
-
-**File:** `sentry/src/main/java/io/sentry/SentryOptions.java`
-
-**Tests:** `sentry/src/test/java/io/sentry/SentryOptionsTest.kt`
-- Test the default value
-- Test merge behavior (see layer 2)
-
-### 2. ExternalOptions (sentry.properties / environment variables)
-
-Allows setting options via `sentry.properties` file or system properties. Fields use nullable wrapper types (`@Nullable Boolean`, `@Nullable Double`) since unset means "don't override the default."
-
-**File:** `sentry/src/main/java/io/sentry/ExternalOptions.java`
-- Add `@Nullable` fields with getter/setter for each externally configurable option (e.g. `enableMetrics`, `logsSampleRate`)
-- Wire them in the static `from(PropertiesProvider)` method:
- - Boolean: `propertiesProvider.getBooleanProperty("metrics.enabled")`
- - Double: `propertiesProvider.getDoubleProperty("logs.sample-rate")`
-
-**File:** `sentry/src/main/java/io/sentry/SentryOptions.java` — `merge()` method
-- Add null-check blocks to apply each external option onto the namespaced options class:
- ```java
- if (options.isEnableMetrics() != null) {
- getMetrics().setEnabled(options.isEnableMetrics());
- }
- if (options.getLogsSampleRate() != null) {
- getLogs().setSampleRate(options.getLogsSampleRate());
- }
- ```
-
-**Tests:**
-- `sentry/src/test/java/io/sentry/ExternalOptionsTest.kt` — test true/false/null for booleans, valid values and null for doubles
-- `sentry/src/test/java/io/sentry/SentryOptionsTest.kt` — test merge applies values and test merge preserves defaults when unset
-
-### 3. Android Manifest Metadata (Android only)
-
-Allows setting options via `AndroidManifest.xml` `` tags.
-
-**File:** `sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java`
-- Add a `static final String` constant for the key (e.g. `"io.sentry.metrics.enabled"`)
-- Read it in `applyMetadata()` using `readBool(metadata, logger, CONSTANT, defaultValue)`
-- Apply to the namespaced options, e.g. `options.getMetrics().setEnabled(...)`
-
-**Tests:** `sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt`
-- Test default value preserved when not in manifest
-- Test explicit true
-- Test explicit false
-
-### 4. Spring Boot Properties (Spring Boot only)
-
-`SentryProperties` extends `SentryOptions`, so namespaced options (nested classes) are automatically available as Spring Boot properties without extra code. For example, `SentryOptions.Logs` is automatically mapped to `sentry.logs.enabled` in `application.properties`.
-
-No additional code is needed for namespaced options — Spring Boot auto-configuration handles this via property binding on the `SentryOptions` class hierarchy.
-
-**Tests:** `sentry-spring-boot*/src/test/kotlin/.../SentryAutoConfigurationTest.kt`
-- Add the property (e.g. `"sentry.logs.enabled=true"`) to the existing `resolves all properties` test
-- Assert the value is set on the resolved `SentryProperties` bean
-- There are three Spring Boot modules with separate test files: `sentry-spring-boot`, `sentry-spring-boot-jakarta`, `sentry-spring-boot-4`
-
-### 5. Reading Options at Runtime
-
-Features check their options at usage time. For namespaced features the check typically happens in the feature's API class (e.g. `LoggerApi`, `MetricsApi`):
-- Check `options.getLogs().isEnabled()` early and return if disabled
-- Apply sampling via `options.getLogs().getSampleRate()` if applicable
-- Apply `beforeSend` callback in `SentryClient` before sending
-
-When a feature has its own capture path (e.g. `captureLog`), the relevant classes are:
-- `ISentryClient` — add the capture method signature
-- `SentryClient` — implement capture, including `beforeSend` callback execution
-- `NoOpSentryClient` — add no-op stub
-
-## Checklist for Adding a New Namespaced Option
-
-1. `SentryOptions.java` — nested options class + getter/setter on `SentryOptions`
-2. `ExternalOptions.java` — `@Nullable` fields + wiring in `from()`
-3. `SentryOptions.java` `merge()` — apply external options to namespaced class
-4. `ManifestMetadataReader.java` — Android manifest support (if Android-relevant)
-5. `SentryAutoConfigurationTest.kt` — Spring Boot property binding tests (all three Spring Boot modules)
-6. Tests for all of the above (`SentryOptionsTest`, `ExternalOptionsTest`, `ManifestMetadataReaderTest`)
-7. Run `./gradlew apiDump` — the nested class and its methods appear in `sentry.api`
diff --git a/.cursor/rules/overview_dev.mdc b/.cursor/rules/overview_dev.mdc
deleted file mode 100644
index b837be34add..00000000000
--- a/.cursor/rules/overview_dev.mdc
+++ /dev/null
@@ -1,133 +0,0 @@
----
-alwaysApply: true
-description: Sentry Java SDK - Development Rules Overview
----
-
-# Sentry Java SDK Development Rules
-
-## Always Applied Rules
-
-These rules are automatically included in every conversation:
-- **coding.mdc**: General contributing guidelines, build commands, and workflow rules
-
-## Domain-Specific Rules (Fetch Only When Needed)
-
-Use the `fetch_rules` tool to include these rules when working on specific areas:
-
-### Core SDK Functionality
-- **`api`**: Use when working with:
- - Adding or modifying public API surface
- - Binary compatibility, `.api` files, `apiDump`
- - Understanding which classes to modify for new API (interfaces, implementations, no-ops, adapters)
- - `IScope`, `IScopes`, `Sentry` static API
- - Attributes, logging API, protocol classes
-
-- **`options`**: Use when working with:
- - Adding or modifying SDK options (`SentryOptions`, namespaced options)
- - External options (`ExternalOptions`, `sentry.properties`, environment variables)
- - Android manifest metadata (`ManifestMetadataReader`)
- - Spring Boot properties (`SentryProperties`)
-
-- **`scopes`**: Use when working with:
- - Hub/Scope management, forking, or lifecycle
- - `Sentry.getCurrentScopes()`, `pushScope()`, `withScope()`
- - `ScopeType` (GLOBAL, ISOLATION, CURRENT)
- - Thread-local storage, scope bleeding issues
- - Migration from Hub API (v7 → v8)
-
-- **`deduplication`**: Use when working with:
- - Duplicate event detection/prevention
- - `DuplicateEventDetectionEventProcessor`
- - `enableDeduplication` option
-
-- **`offline`**: Use when working with:
- - Caching, envelope storage/retrieval
- - Network failure handling, retry logic
- - `AsyncHttpTransport`, `EnvelopeCache`
- - Rate limiting, cache rotation
- - Android vs JVM caching differences
-
-- **`feature_flags`**: Use when working with:
- - Feature flag tracking and evaluation
- - `addFeatureFlag()`, `getFeatureFlags()` methods
- - `FeatureFlagBuffer`, `SpanFeatureFlagBuffer`, `FeatureFlag` protocol
- - `maxFeatureFlags` option and buffer management
- - Feature flag merging across scope types
- - Scope-based vs span-based feature flag APIs
- - Scope-based API: `Sentry`, `IScopes`, `IScope` APIs
- - Span-based API: `ISpan`, `ITransaction` APIs
- - Integrations: LaunchDarkly (Android/JVM), OpenFeature (JVM)
-
-- **`metrics`**: Use when working with:
- - Metrics API (`Sentry.metrics()`, `IScopes.metrics()`)
- - `IMetricsApi`, `MetricsApi` implementation
- - Metrics types: `count`, `distribution`, `gauge`
- - `MetricsBatchProcessor`, batching and queue management
- - `SentryMetricsEvent`, `SentryMetricsEvents`
- - `SentryOptions.getMetrics()`, `beforeSend` callback
-
-- **`queues`**: Use when working with:
- - Sentry Queues product data or messaging span conventions
- - Queue tracing spans/transactions (`queue.publish`, `queue.process`)
- - `enableQueueTracing` option and `sentry.enable-queue-tracing`
- - Kafka instrumentation (`sentry-kafka`, `SentryKafkaProducer`, `SentryKafkaConsumerTracing`)
- - Spring Kafka queue auto-instrumentation and `SentryKafkaRecordInterceptor`
- - Messaging span data (`messaging.system`, `messaging.destination.name`, receive latency, retry count)
- - `sentry-task-enqueued-time` header and distributed trace propagation through queues
-
-- **`continuous_profiling_jvm`**: Use when working with:
- - JVM continuous profiling (`sentry-async-profiler` module)
- - `IContinuousProfiler`, `JavaContinuousProfiler`
- - `ProfileChunk`, chunk rotation, JFR file handling
- - `ProfileLifecycle` (MANUAL vs TRACE modes)
- - async-profiler integration, ServiceLoader discovery
- - Rate limiting, offline caching, scopes integration
-
-- **Android profiling**: There is currently no dedicated rule for this area yet.
- - Inspect the relevant `sentry-android-core` profiling code directly
- - Fetch other related rules as needed (for example `options`, `offline`, or `api`)
-
-### Integration & Infrastructure
-- **`opentelemetry`**: Use when working with:
- - OpenTelemetry modules (`sentry-opentelemetry-*`)
- - Agent vs agentless configurations
- - Span processing, sampling, context propagation
- - `OtelSpanFactory`, `SentrySpanExporter`
- - Tracing, distributed tracing
-
-- **`new_module`**: Use when adding a new integration or sample module
-
-### Workflow
-- **`pr`**: Use when working with:
- - Creating pull requests
- - Stacked PRs, PR naming, stack comments
- - PR changelog entries
- - Merging or syncing stacked branches
-
-### Testing
-- **`e2e_tests`**: Use when working with:
- - System tests, sample applications
- - `system-test-runner.py`, mock Sentry server
- - End-to-end test infrastructure
- - CI system test workflows
-
-## Usage Guidelines
-
-1. **Start minimal**: Only include `coding.mdc` (auto-applied) for general tasks
-2. **Fetch on-demand**: Use `fetch_rules ["rule_name"]` when you identify specific domain work
-3. **Multiple rules**: Fetch multiple rules if task spans domains (e.g., `["scopes", "opentelemetry"]` for tracing scope issues)
-4. **Context clues**: Look for these keywords in requests to determine relevant rules:
- - Public API/apiDump/.api files/binary compatibility/new method → `api`
- - Options/SentryOptions/ExternalOptions/ManifestMetadataReader/sentry.properties → `options`
- - Scope/Hub/forking → `scopes`
- - Duplicate/dedup → `deduplication`
- - OpenTelemetry/tracing/spans → `opentelemetry`
- - new module/integration/sample → `new_module`
- - Cache/offline/network → `offline`
- - System test/e2e/sample → `e2e_tests`
- - Feature flag/addFeatureFlag/flag evaluation → `feature_flags`
- - Metrics/count/distribution/gauge → `metrics`
- - Queues/queue tracing/Kafka/Spring Kafka/queue.publish/queue.process/enableQueueTracing/messaging spans → `queues`
- - PR/pull request/stacked PR/stack → `pr`
- - JVM continuous profiling/async-profiler/JFR/ProfileChunk → `continuous_profiling_jvm`
- - Android continuous profiling/AndroidProfiler/frame metrics/method tracing → no dedicated rule yet; inspect the code directly
diff --git a/.cursor/rules/pr.mdc b/.cursor/rules/pr.mdc
deleted file mode 100644
index e15c0a0a563..00000000000
--- a/.cursor/rules/pr.mdc
+++ /dev/null
@@ -1,262 +0,0 @@
----
-alwaysApply: false
-description: Pull request creation, stacked PRs, and PR workflow
----
-
-# Pull Request Rules
-
-## Creating a Pull Request
-
-### Step 1: Ensure Feature Branch
-
-If on `main`, create and switch to a new branch:
-
-```bash
-git checkout -b /
-```
-
-Branch names use `feat/`, `fix/`, `ref/`, etc. matching the commit type.
-
-### Step 2: Format Code and Regenerate API Files
-
-```bash
-./gradlew spotlessApply apiDump
-```
-
-This is **required** before every PR. Fix any failures before continuing.
-
-### Step 3: Commit Changes
-
-Use `git status --porcelain` to review changes. Ignore files only relevant for local testing (hardcoded debug toggles, sample app config, `.env` files). Restore those with `git checkout -- `.
-
-Follow [Sentry commit message conventions](https://develop.sentry.dev/engineering-practices/commit-messages/):
-
-```
-():
-```
-
-Allowed types: `feat`, `fix`, `ref`, `chore`, `docs`, `test`, `perf`, `build`, `ci`, `style`, `meta`, `license`
-
-- Use imperative present tense ("add" not "added")
-- Capitalize subject, no trailing period
-- Keep under 100 characters
-
-### Step 4: Push
-
-```bash
-git push -u origin HEAD
-```
-
-If push fails due to diverged history, ask the user — do not force-push.
-
-### Step 5: Create PR
-
-Create a draft PR using the repo's PR template:
-
-```markdown
-## :scroll: Description
-
-
-## :bulb: Motivation and Context
-
-
-## :green_heart: How did you test it?
-
-
-## :pencil: Checklist
-- [ ] I added GH Issue ID _&_ Linear ID
-- [ ] I added tests to verify the changes.
-- [ ] No new PII added or SDK only sends newly added PII if `sendDefaultPII` is enabled.
-- [ ] I updated the docs if needed.
-- [ ] I updated the wizard if needed.
-- [ ] Review from the native team if needed.
-- [ ] No breaking change or entry added to the changelog.
-- [ ] No breaking change for hybrid SDKs or communicated to hybrid SDKs.
-
-## :crystal_ball: Next steps
-```
-
-### Step 6: Update Changelog
-
-Add an entry to `CHANGELOG.md` under `## Unreleased` in the appropriate subsection:
-
-| Change Type | Subsection |
-|---|---|
-| New feature | `### Features` |
-| Bug fix | `### Fixes` |
-| Refactoring, internal cleanup | `### Internal` |
-| Dependency update | `### Dependencies` |
-
-Entry format:
-
-```markdown
-- ([#](https://github.com/getsentry/sentry-java/pull/))
-```
-
-Commit changelog separately:
-
-```bash
-git add CHANGELOG.md && git commit -m "changelog" && git push
-```
-
-### PR Title Format
-
-Follow the commit message format:
-
-```
-():
-```
-
-Examples:
-- `feat(core): Add structured logging support`
-- `fix(android): Prevent crash on API 21 when registering receiver`
-
----
-
-## Stacked PRs
-
-Stacked PRs split a large feature into small, easy-to-review PRs where each builds on the previous one. This follows the same concept as the [Graphite](https://graphite.dev/) stacking workflow.
-
-### Structure
-
-```
-main ← collection-branch ← stack-pr-1 ← stack-pr-2 ← stack-pr-3 ← ...
-```
-
-- A **collection branch** is created from `main` and targets `main`. It serves as the base for the entire stack.
-- The first PR in the stack targets the collection branch (not `main`).
-- Each subsequent PR targets the previous stack PR's branch as its base.
-- Each PR contains only incremental changes on top of the previous one.
-
-The collection branch exists so that individual stack PRs can be **merge-committed** (not squashed). PRs targeting `main` use squash merging, but that causes repeated merge conflicts when syncing the stack. Merge commits on non-`main` branches avoid this. The collection branch itself is squash-merged into `main` at the end.
-
-### Branch Naming
-
-Prefer a shared prefix for the feature, with descriptive suffixes per PR. The collection branch uses the shared prefix. The type prefix (`feat/`, `fix/`, etc.) may vary depending on the nature of each PR's changes:
-
-```
-feat/scope-attributes # collection branch → targets main
-feat/scope-attributes-api # PR 1 → targets collection branch
-feat/scope-attributes-logger # PR 2 → targets PR 1
-fix/attribute-type-detection # PR 3 (fix, different name — that's fine) → targets PR 2
-```
-
-### PR Title Naming
-
-Include the topic name and a sequential number in brackets:
-
-```
-(): []
-```
-
-Examples:
-- `feat(core): [Global Attributes 1] Add scope-level attributes API`
-- `feat(core): [Global Attributes 2] Wire scope attributes into LoggerApi and MetricsApi`
-- `feat(samples): [Global Attributes 3] Showcase scope attributes in Spring Boot 4 sample`
-
-### Finding All PRs in a Stack
-
-Do **not** rely on branch name patterns — later PRs in a stack may use different prefixes or naming. Instead:
-
-1. Find the PR for the current branch:
- ```bash
- gh pr list --head "$(git branch --show-current)" --json number,title,baseRefName --jq '.[0]'
- ```
-2. Read the PR description — the stack list is at the top of the body.
-3. If there is no stack list yet, walk the chain in both directions:
- ```bash
- # Find the PR whose head branch is the current PR's base (go up)
- gh pr list --head --json number,title,baseRefName
-
- # Find PRs whose base branch is the current PR's head (go down)
- gh pr list --base --json number,title,headRefName
- ```
- Repeat until you reach the collection branch going up and find no more PRs going down.
-
-### Creating the Collection Branch
-
-Before the first stacked PR, create the collection branch with an empty commit (so GitHub allows opening a PR) and create the collection PR:
-
-```bash
-git checkout main
-git checkout -b feat/
-git commit --allow-empty -m "collection: "
-git push -u origin HEAD
-gh pr create --base main --draft --title "(): " --body "Collection PR for the stack. Squash-merge this once all stack PRs are merged."
-```
-
-**CRITICAL: Do NOT manually update the collection branch.** Never merge, fast-forward, or push stack branch commits into the collection branch. The collection branch stays at its initial position (the empty commit on `main`) until the user merges individual stack PRs into it one by one through GitHub. If you fast-forward the collection branch to include stack commits, GitHub will auto-merge and delete all stack PR branches, destroying the entire stack.
-
-### Creating a New Stacked PR
-
-1. Start from the tip of the previous stack branch (or the collection branch for the first PR).
-2. Create a new branch, make changes, format, commit, and push.
-3. Create the PR with `--base ` (the collection branch for the first PR):
- ```bash
- gh pr create --base feat/previous-branch --draft --title "(): [] " --body "..."
- ```
-4. Add the stack list to the top of the new PR's description and update it on all existing PRs in the stack (see below).
-
-### Stack List in PR Description
-
-Every PR in the stack — **including the collection branch PR** — must have a stack list **at the top of its description** (before the `## :scroll: Description` section). When a new PR is added, update the description on **all** PRs in the stack and on the collection branch PR.
-
-Format:
-
-```markdown
-## PR Stack ()
-
-- #5118
-- #5120
-- #5121
-
----
-```
-
-No status column — GitHub already shows that. The `---` separates the stack list from the rest of the PR description.
-
-**Merge method reminder:** On stack PRs (not the collection branch PR), add the following line at the very end of the PR description:
-
-```markdown
-> ⚠️ **Merge this PR using a merge commit** (not squash). Only the collection branch is squash-merged into main.
-```
-
-This does not apply to standalone PRs or the collection branch PR.
-
-To update the PR description, use `--body-file` to avoid shell quoting issues with special characters in the body.
-
-**Important:** Do not use shell redirects (`>`, `>>`, `|`) or compound commands (`&&`, `||`). These create compound shell expressions that won't match permission patterns. Instead, use the `Write` and `Edit` tools for file manipulation:
-
-1. Read the current body with `gh pr view --json body --jq '.body'` (the output is returned directly — use the `Write` tool to save it to `/tmp/pr-body.md`)
-2. Use the `Edit` tool to prepend or replace the stack list section in `/tmp/pr-body.md`
-3. Update the description: `gh pr edit --body-file /tmp/pr-body.md`
-
-### Merging Stacked PRs (done by the user, not the agent)
-
-Individual stack PRs are merged in order from bottom to top (PR 1 first, then PR 2, etc.) using **merge commits** (not squash). After each merge, the next PR's base automatically becomes the merged branch's target. GitHub handles rebasing onto the new base.
-
-Once all stack PRs are merged into the collection branch, the collection PR is **squash-merged** into `main`. This gives `main` a clean single commit for the entire feature.
-
-**Do not merge PRs.** Only the user merges PRs.
-
-### Syncing the Stack
-
-When a base PR changes (e.g. after addressing review feedback on PR 1), merge the changes forward through the stack **between adjacent stack PR branches only**:
-
-```bash
-# On the branch for PR 2
-git checkout feat/scope-attributes-logger
-git merge feat/scope-attributes-api
-git push
-
-# On the branch for PR 3
-git checkout feat/scope-attributes-sample
-git merge feat/scope-attributes-logger
-git push
-```
-
-**Never merge into the collection branch.** Syncing only happens between stack PR branches. The collection branch is untouched until the user merges PRs through GitHub.
-
-Prefer merge over rebase — it preserves commit history, doesn't invalidate existing review comments, and avoids the need for force-pushing. Only rebase if explicitly requested.
-
-**Never amend or force-push stack branches.** Do not use `git commit --amend`, `--force`, or `--force-with-lease` on branches that are part of a stack. Amending a pushed commit requires a force-push, which can cause GitHub to auto-merge or auto-close other PRs in the stack. If a commit needs fixing, add a new fixup commit instead.
diff --git a/.cursor/rules/queues.mdc b/.cursor/rules/queues.mdc
deleted file mode 100644
index fe082c3b854..00000000000
--- a/.cursor/rules/queues.mdc
+++ /dev/null
@@ -1,82 +0,0 @@
----
-alwaysApply: false
-description: Sentry Queues module and Java SDK queue tracing
----
-# Sentry Queues and Java SDK Queue Tracing
-
-## Product model
-
-Sentry Queues is built from tracing data. SDKs mark queue work with queue-specific span operations and messaging span data so Sentry can identify producers, consumers, destinations, latency, and failures.
-
-The important concepts are:
-- `queue.publish`: a span for enqueueing/publishing a message to a queue or topic.
-- `queue.process`: a transaction for processing a dequeued message.
-- Messaging span data, especially:
- - `messaging.system` (for example `kafka`)
- - `messaging.destination.name` (queue/topic name)
- - `messaging.message.id`
- - `messaging.message.retry.count`
- - `messaging.message.body.size`
- - `messaging.message.envelope.size`
- - `messaging.message.receive.latency`
-- Distributed tracing headers (`sentry-trace` and `baggage`) link producer-side work to consumer-side processing.
-- Queue receive latency is the time a message spent waiting between publish/enqueue and processing. For Java Kafka, this comes from the `sentry-task-enqueued-time` header that the producer writes and the consumer reads.
-
-The Queues UI is not backed by a separate Java event type. The Java SDK contributes data through spans/transactions with the expected operations, trace context, statuses, and messaging attributes.
-
-## Java SDK implementation
-
-Queue tracing is opt-in. `SentryOptions.isEnableQueueTracing()` defaults to `false` and can be enabled with `setEnableQueueTracing(true)` or external config key `enable-queue-tracing` (`sentry.enable-queue-tracing` in Spring Boot). Captured queue spans/transactions still depend on tracing being enabled and sampled.
-
-Kafka support lives in `sentry-kafka`:
-- `SentryKafkaProducer.wrap(Producer)` wraps Kafka `Producer.send(...)` calls.
- - Creates a `queue.publish` child span when there is an active span.
- - Sets `messaging.system=kafka` and `messaging.destination.name=`.
- - Injects `sentry-trace`, `baggage`, and `sentry-task-enqueued-time` headers.
- - Still injects tracing/enqueued-time headers when queue tracing is enabled but there is no active span, so background producers can link to consumers.
- - Finishes the span from the Kafka callback with `OK` or `INTERNAL_ERROR`.
-- `SentryKafkaConsumerTracing.withTracing(record, callback)` is the manual raw-Kafka consumer helper.
- - Forks root scopes for the processing lifecycle and makes them current.
- - Continues the trace from Kafka headers.
- - Starts a `queue.process` transaction bound to scope when tracing is enabled.
- - Sets Kafka messaging data, body size, retry count, and receive latency when available.
- - Finishes with `OK` or `INTERNAL_ERROR` and never lets instrumentation failures break customer processing.
-
-Spring Kafka support lives in `sentry-spring`, `sentry-spring-jakarta`, and `sentry-spring-7`:
-- `SentryKafkaProducerBeanPostProcessor` installs a producer post-processor on `DefaultKafkaProducerFactory` and wraps created producers with `SentryKafkaProducer.wrap(...)`.
-- `SentryKafkaConsumerBeanPostProcessor` installs `SentryKafkaRecordInterceptor` on listener container factories.
-- `SentryKafkaRecordInterceptor` starts/finishes `queue.process` transactions around listener processing, continues traces from headers, forks scopes for the record lifecycle, and preserves any existing delegate interceptor.
-- Spring Boot auto-configuration registers both post-processors only when Spring Kafka and `sentry-kafka` are present and `sentry.enable-queue-tracing=true`.
-- Spring Boot queue auto-configuration is disabled when Sentry OpenTelemetry integration classes are present to avoid duplicate Kafka instrumentation.
-
-## Trace origins and suppression
-
-Queue instrumentation sets span origins so it can be identified and suppressed with `ignoredSpanOrigins`:
-- Raw Kafka producer: `auto.queue.kafka.producer`
-- Raw Kafka consumer helper: `manual.queue.kafka.consumer`
-- Spring Kafka producer: `auto.queue.spring.kafka.producer`, `auto.queue.spring_jakarta.kafka.producer`, `auto.queue.spring7.kafka.producer`
-- Spring Kafka consumer: `auto.queue.spring.kafka.consumer`, `auto.queue.spring_jakarta.kafka.consumer`, `auto.queue.spring7.kafka.consumer`
-
-## Files to inspect when changing queue tracing
-
-- Core option and conventions:
- - `sentry/src/main/java/io/sentry/SentryOptions.java`
- - `sentry/src/main/java/io/sentry/ExternalOptions.java`
- - `sentry/src/main/java/io/sentry/SpanDataConvention.java`
-- Raw Kafka:
- - `sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducer.java`
- - `sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java`
- - `sentry-kafka/src/test/kotlin/io/sentry/kafka/*Test.kt`
-- Spring Kafka:
- - `sentry-spring*/src/main/java/io/sentry/**/kafka/*`
- - `sentry-spring*/src/test/kotlin/io/sentry/**/kafka/*Test.kt`
- - `sentry-spring-boot*/src/main/java/io/sentry/**/SentryAutoConfiguration.java`
- - `sentry-spring-boot*/src/test/kotlin/io/sentry/**/SentryKafkaAutoConfigurationTest.kt`
-
-## Related rules
-
-Also fetch:
-- `options` when changing `enableQueueTracing` or configuration surfaces.
-- `scopes` when changing consumer scope forking/lifecycle.
-- `opentelemetry` when changing coexistence with OTel auto-instrumentation.
-- `api` when changing public Kafka APIs or option methods.
diff --git a/.cursor/rules/scopes.mdc b/.cursor/rules/scopes.mdc
deleted file mode 100644
index e054755d4f5..00000000000
--- a/.cursor/rules/scopes.mdc
+++ /dev/null
@@ -1,121 +0,0 @@
----
-alwaysApply: false
-description: Java SDK Hubs and Scopes
----
-# Java SDK Hubs and Scopes
-
-## `Scopes`
-
-`Scopes` implements `IScopes` and manages three `Scope` instances, `global`, `isolation` and `current` scope.
-For some data, all three `Scope` instances are combined, for others, a certain one is used exclusively and for some we look at each scope in a certain order and use the data of the first scope that has the data set. This logic is contained in `CombinedScopeView`.
-Data itself is stored on `Scope` instances.
-`Scopes` also has a `parent` field, linking the `Scopes` it was forked off of and a `creator` String, explaining why it was forked.
-
-## `Hub`
-
-Up until major version 7 of the Java SDK the `IHub` interface was a central part of the SDK.
-In major version 8 we replaced the `IHub` interface with `IScopes`. `IHub` has been deprecated.
-While there is some bridging code in place to allow for easier migration, we are planning to remove it in an upcoming major.
-
-## Scope Types
-
-We have introduced some new Scope types in the SDK, allowing for better control over what data is attached where.
-Previously there was a stack of scopes that was pushed and popped.
-Instead we now fork scopes for a given lifecycle and then restore the previous scopes.
-Since Hub is gone, it is also never cloned anymore.
-Separation of data now happens through the different scope types while making it easier to manipulate exactly what you need without having to attach data at the right time to have it apply where wanted.
-
-### Global Scope
-
-Global scope is attached to all events created by the SDK.
-It can also be modified before Sentry.init has been called.
-It can be manipulated using `Sentry.configureScope(ScopeType.GLOBAL, (scope) -> { ... })`.
-
-Global scope can be retrieved from `Scopes` via `getGlobalScope`. It can also be retrieved directly via `Sentry.getGlobalScope`.
-
-### Isolation Scope
-
-Isolation scope can be used e.g. to attach data to all events that come up while handling an incoming request.
-It can also be used for other isolation purposes.
-It can be manipulated using `Sentry.configureScope(ScopeType.ISOLATION, (scope) -> { ... })`.
-The SDK automatically forks isolation scope in certain cases like incoming requests, CRON jobs, Spring `@Async` and more.
-
-Isolation scope can be retrieved from `Scopes` via `getIsolationScope`.
-
-### Current scope
-
-Current scope is forked often and data added to it is only added to events that are created while this scope is active.
-Data is also passed on to newly forked child scopes but not to parents.
-
-Current scope can be retrieved from `Scopes` via `getScope`.
-
-### Combined Scope
-
-This is a special scope type that combines global, isolation and current scope.
-
-Refer to `CombinedScopeView` for each field of interest to see whether values from the three individual scopes are merged,
-whether a specific one is used or whether we're simply using the first one that has a value.
-
-Also see the section about `defaultScopeType` further down.
-
-## Storage of `Scopes`
-
-`Scopes` are stored in a `ThreadLocal` by default (NOTE: this is different for OpenTelemetry, see opentelemetry.mdc).
-This happens through `Sentry.scopesStorage` and `DefaultScopesStorage`.
-
-The lifetime of `Scopes` in the thread local is managed by `ISentryLifecycleToken`.
-When the scopes are forked, they are stored into the `ThreadLocal` and a `ISentryLifecycleToken` is returned.
-When the `Scopes` are no longer needed, e.g. because a request is finished, `ISentryLifecycleToken.close` can be called to restore the previous state of the `ThreadLocal`.
-
-## Old versions of the Java SDK
-
-There were several implementations of the `IHub` interface:
-- `Hub` managed a stack of `Scope` instances, which were pushed and popped.
-- A `Hub` could be cloned, meaning there could be multiple stacks of scopes active, e.g. for two separate requests being handled in a server application.
-
-### Migrating to major version 8 of the SDK
-
-`IHub` has been replaced by `IScopes`
-`HubAdapter` has been replaced by `ScopesAdapter`
-`Hub.clone` should be replaced by using `pushScope` or `pushIsolationScope`
-`Sentry.getCurrentHub` has been replaced by `Sentry.getCurrentScopes`
-`Sentry.popScope` has been deprecated. Instead `close` should be called on the `ISentryLifecycleToken` returned e.g. by `pushScope`. This can also be done in a `try-with-resource` block.
-
-## `globalHubMode`
-The SDK has a `globalHubMode` option which affects forking behaviour of the SDK.
-
-Android has `globalHubMode` enabled by default.
-For JVM Desktop applications, `globalHubMode` can be used.
-For JVM Backend applications (servers) we discourage enabling `globalHubMode` since it will cause scopes to bleed into each other. This can e.g. mean that state from request A leaks into request B and events sent to Sentry contain a mix of both request A and B potentially rendering the data useless.
-
-### Enabled
-
-If `globalHubMode` is enabled, the SDK avoids forking scopes.
-
-This means, retrieving current scopes on a thread where specific scopes do not exist yet for the thread, the root scopes are not forked but returned directly.
-The SDK also doesn't fork scopes when `Sentry.pushScope`, `Sentry.pushIsolation`, `Sentry.withScope` or `Sentry.withIsolationScope` are executed.
-
-The suppression of forking via `globalHubMode` only applies when using `Sentry` static API or `ScopesAdapter`.
-In case the `Scopes` instance is accessed directly, forking will happen as if `globalHubMode` is disabled.
-However, while it's possible to use `Sentry.setCurrentScopes` it does not have any effect due to `Sentry.getCurrentScopes` directly returning `rootScopes` if `globalHubMode` is enabled.
-This means the forked scopes have to be managed manually, e.g. by keeping a reference and accessing Sentry API via the reference instead of using static API.
-
-`ScopesAdapter` makes use of the static `Sentry` API internally. It allows us to access the correct scopes for the current context without passing it along explicitly. It also makes testing easier.
-
-### Disabled
-
-If `globalHubMode` is disabled, the SDK forks scopes freely, e.g. when:
-- `Sentry.getCurrentScopes()` is executed on a Thread where no specific scopes for that thread have been stored yet. In this case the SDK will fork `rootScopes` (stored in a `Sentry` static property).
-- `withScope` or `withIsolationScope` are executed
-- `pushScope` or `pushIsolationScope` are executed
-
-## `defaultScopeType`
-
-The `defaultScopeType` controls which `Scope` instance is being used for writing to and reading from as a default value.
-When using API like `Sentry.setTag` the SDK adds that tag to the default `Scope`.
-
-This also ensures, customers who migrate to the latest SDK version and already have `Sentry.configureScope` invocations in place, will now write to the default `Scope` instance that was chosen.
-
-The default value for `defaultScopeType` is `ISOLATION` scope for JVM and `CURRENT` scope for Android.
-
-Which fields are written/read from/to `defaultScopeType` is controlled in `CombinedScopeView`.
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 4aad35e29d3..00000000000
--- a/.editorconfig
+++ /dev/null
@@ -1,19 +0,0 @@
-root = true
-
-[*]
-indent_style = space
-indent_size = 2
-trim_trailing_whitespace = true
-insert_final_newline = true
-max_line_length = 140
-ij_java_names_count_to_use_import_on_demand = 9999
-ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL
-
-[*.md]
-trim_trailing_whitespace = false
-
-[*.java]
-charset = utf-8
-
-[*.{kt,kts}]
-charset = utf-8
diff --git a/.envrc b/.envrc
deleted file mode 100644
index f58a7cee600..00000000000
--- a/.envrc
+++ /dev/null
@@ -1,3 +0,0 @@
-export VIRTUAL_ENV="${PWD}/.venv"
-devenv sync
-PATH_add "${PWD}/.venv/bin"
diff --git a/.fossa.yml b/.fossa.yml
deleted file mode 100644
index d4ee8ca10a1..00000000000
--- a/.fossa.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-version: 3
-targets:
- exclude:
- - type: setuptools
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
deleted file mode 100644
index 2614e090e80..00000000000
--- a/.git-blame-ignore-revs
+++ /dev/null
@@ -1,2 +0,0 @@
-# Reformat codebase with Ktfmt and more accurate spotless configuration: #4499
-8b8369f06cbc5a9738de7810b1df5863b3ac6bcb
diff --git a/.gitattributes b/.gitattributes
index f444fd5957d..8383fff94e2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,12 +1 @@
-* text eol=lf
-*.png binary
-*.jpg binary
-*.pb binary
-*.gz binary
-*.bin binary
-*.zip binary
-*.jar binary
-*.gpg binary
-
-# These are explicitly windows files and should use crlf
-*.bat text eol=crlf
+CHANGES merge=union
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
deleted file mode 100644
index 6e1f71a7677..00000000000
--- a/.github/CODEOWNERS
+++ /dev/null
@@ -1 +0,0 @@
-* @adinauer @romtsn @markushi @runningcode @0xadam-brown
diff --git a/.github/ISSUE_TEMPLATE/bug_report_android.yml b/.github/ISSUE_TEMPLATE/bug_report_android.yml
deleted file mode 100644
index 5dff43579c6..00000000000
--- a/.github/ISSUE_TEMPLATE/bug_report_android.yml
+++ /dev/null
@@ -1,114 +0,0 @@
-name: 🐞 Bug Report - Android
-description: Tell us about something that's not working the way we (probably) intend.
-labels: ["Android", "Bug"]
-body:
- - type: dropdown
- id: integration
- attributes:
- description: Integration
- label: Integration
- options:
- - sentry-android
- - sentry-android-ndk
- - sentry-android-timber
- - sentry-android-fragment
- - sentry-android-sqlite
- - sentry-apollo
- - sentry-apollo-3
- - sentry-compose
- - sentry-launchdarkly-android
- - sentry-okhttp
- - other
- validations:
- required: true
-
- - type: dropdown
- id: build_system
- attributes:
- description: Build system
- label: Build System
- options:
- - Gradle
- - Buck
- - Bazel
- - Other
- validations:
- required: true
-
- - type: input
- id: agp_version
- attributes:
- description: Android Gradle Plugin Version
- placeholder: 7.0.0 ← should look like this
- label: AGP Version
- validations:
- required: true
-
- - type: dropdown
- id: proguard
- attributes:
- description: Proguard/R8
- label: Proguard
- options:
- - Enabled
- - Disabled
- validations:
- required: true
-
- - type: dropdown
- id: other_error_monitoring_solution
- attributes:
- description: Are you using any other error monitoring solution alongside Sentry?
- label: Other Error Monitoring Solution
- options:
- - "No"
- - "Bugsnag"
- - "Datadog"
- - "Firebase Crashlytics"
- - "Instabug/Luciq"
- - "NewRelic"
- - "Other (please mention in issue description)"
- validations:
- required: true
-
- - type: input
- id: version
- attributes:
- label: Version
- description: Sentry SDK Version
- placeholder: 6.0.0 ← should look like this
- validations:
- required: true
-
- - type: textarea
- id: repro
- attributes:
- label: Steps to Reproduce
- description: How can we see what you're seeing? Specific is terrific.
- placeholder: |-
- 1. foo
- 2. bar
- 3. baz
- validations:
- required: true
-
- - type: textarea
- id: expected
- attributes:
- label: Expected Result
- validations:
- required: true
-
- - type: textarea
- id: actual
- attributes:
- label: Actual Result
- description: Logs? Screenshots? Yes, please.
- validations:
- required: true
-
- - type: markdown
- attributes:
- value: |-
- ## Thanks 🙏
- Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
diff --git a/.github/ISSUE_TEMPLATE/bug_report_java.yml b/.github/ISSUE_TEMPLATE/bug_report_java.yml
deleted file mode 100644
index 8355d75a43b..00000000000
--- a/.github/ISSUE_TEMPLATE/bug_report_java.yml
+++ /dev/null
@@ -1,115 +0,0 @@
-name: 🐞 Bug Report - Java
-description: Tell us about something that's not working the way we (probably) intend.
-labels: ["Java", "Bug"]
-body:
- - type: dropdown
- id: integration
- attributes:
- description: Integration
- label: Integration
- options:
- - sentry
- - sentry-jul
- - sentry-jdbc
- - sentry-apollo
- - sentry-apollo-3
- - sentry-kotlin-extensions
- - sentry-opentelemetry-agent
- - sentry-opentelemetry-agentless
- - sentry-opentelemetry-agentless-spring
- - sentry-opentelemetry-core
- - sentry-servlet
- - sentry-servlet-jakarta
- - sentry-spring-boot
- - sentry-spring-boot-jakarta
- - sentry-spring-boot-starter
- - sentry-spring-boot-starter-jakarta
- - sentry-spring-boot-4
- - sentry-spring-boot-4-starter
- - sentry-spring
- - sentry-spring-jakarta
- - sentry-spring-7
- - sentry-logback
- - sentry-log4j2
- - sentry-graphql
- - sentry-graphql-22
- - sentry-quartz
- - sentry-openfeign
- - sentry-openfeature
- - sentry-launchdarkly-server
- - sentry-apache-http-client-5
- - sentry-okhttp
- - sentry-reactor
- - other
- validations:
- required: true
-
- - type: input
- id: java_version
- attributes:
- description: Java Version
- placeholder: 8 ← should look like this
- label: Java Version
- validations:
- required: true
-
- - type: dropdown
- id: other_error_monitoring
- attributes:
- description: Are you using any other error monitoring solution alongside Sentry?
- label: Other Error Monitoring Solution
- options:
- - "Yes"
- - "No"
- validations:
- required: true
-
- - type: input
- id: other_error_monitoring_name
- attributes:
- label: Other Error Monitoring Solution Name
- description: If you're using another error monitoring solution side-by-side, please enter the name of the other solution.
- validations:
- required: false
-
- - type: input
- id: version
- attributes:
- label: Version
- description: Sentry SDK Version
- placeholder: 6.0.0 ← should look like this
- validations:
- required: true
-
- - type: textarea
- id: repro
- attributes:
- label: Steps to Reproduce
- description: How can we see what you're seeing? Specific is terrific.
- placeholder: |-
- 1. foo
- 2. bar
- 3. baz
- validations:
- required: true
-
- - type: textarea
- id: expected
- attributes:
- label: Expected Result
- validations:
- required: true
-
- - type: textarea
- id: actual
- attributes:
- label: Actual Result
- description: Logs? Screenshots? Yes, please.
- validations:
- required: true
-
- - type: markdown
- attributes:
- value: |-
- ## Thanks 🙏
- Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644
index 819e8a1afbc..00000000000
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-blank_issues_enabled: false
-contact_links:
- - name: Join Sentry Discord
- url: https://discord.com/invite/sentry
- about: A place to talk about SDK development and other Sentry related topics. It's not meant as a support channel.
diff --git a/.github/ISSUE_TEMPLATE/feature_android.yml b/.github/ISSUE_TEMPLATE/feature_android.yml
deleted file mode 100644
index d1f71024569..00000000000
--- a/.github/ISSUE_TEMPLATE/feature_android.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: 💡 Feature Request - Android
-description: Tell us about a problem our SDK could solve but doesn't.
-labels: ["Android", "Feature"]
-body:
- - type: textarea
- id: problem
- attributes:
- label: Problem Statement
- description: What problem could Sentry solve that it doesn't?
- placeholder: |-
- I want to make whirled peas, but Sentry doesn't blend.
- validations:
- required: true
-
- - type: textarea
- id: expected
- attributes:
- label: Solution Brainstorm
- description: We know you have bright ideas to share ... share away, friend.
- placeholder: |-
- Add a blender to Sentry.
- validations:
- required: false
-
- - type: markdown
- attributes:
- value: |-
- ## Thanks 🙏
- Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
diff --git a/.github/ISSUE_TEMPLATE/feature_java.yml b/.github/ISSUE_TEMPLATE/feature_java.yml
deleted file mode 100644
index 686ad45e229..00000000000
--- a/.github/ISSUE_TEMPLATE/feature_java.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: 💡 Feature Request - Java
-description: Tell us about a problem our SDK could solve but doesn't.
-labels: ["Java", "Feature"]
-body:
- - type: textarea
- id: problem
- attributes:
- label: Problem Statement
- description: What problem could Sentry solve that it doesn't?
- placeholder: |-
- I want to make whirled peas, but Sentry doesn't blend.
- validations:
- required: true
-
- - type: textarea
- id: expected
- attributes:
- label: Solution Brainstorm
- description: We know you have bright ideas to share ... share away, friend.
- placeholder: |-
- Add a blender to Sentry.
- validations:
- required: false
-
- - type: markdown
- attributes:
- value: |-
- ## Thanks 🙏
- Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
diff --git a/.github/ISSUE_TEMPLATE/maintainer-blank.yml b/.github/ISSUE_TEMPLATE/maintainer-blank.yml
deleted file mode 100644
index 150f35a1316..00000000000
--- a/.github/ISSUE_TEMPLATE/maintainer-blank.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: Blank Issue
-description: Blank Issue. Reserved for maintainers.
-labels: ["Java"]
-body:
- - type: textarea
- id: description
- attributes:
- label: Description
- description: Please describe the issue.
- validations:
- required: true
-
- - type: markdown
- attributes:
- value: |-
- ## Thanks 🙏
- Check our [triage docs](https://open.sentry.io/triage/) for what to expect next.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 2824699563c..00000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-version: 2
-registries:
- gradle-plugin-portal:
- type: maven-repository
- url: https://plugins.gradle.org/m2
- username: dummy # Required by dependabot
- password: dummy # Required by dependabot
-updates:
- - package-ecosystem: "gradle"
- directory: "/"
- registries:
- - gradle-plugin-portal
- schedule:
- interval: "daily"
- ignore:
- - dependency-name: "org.springframework.boot*"
- commit-message:
- prefix: "chore(deps)"
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "daily"
- commit-message:
- prefix: "chore(deps)"
- groups:
- github-actions:
- patterns:
- - "*"
diff --git a/.github/file-filters.yml b/.github/file-filters.yml
deleted file mode 100644
index 2b81e2f0b6d..00000000000
--- a/.github/file-filters.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# This is used by the action https://github.com/dorny/paths-filter
-
-high_risk_code: &high_risk_code
- # Transport classes
- - "sentry/src/main/java/io/sentry/transport/AsyncHttpTransport.java"
- - "sentry/src/main/java/io/sentry/transport/HttpConnection.java"
- - "sentry/src/main/java/io/sentry/transport/QueuedThreadPoolExecutor.java"
- - "sentry/src/main/java/io/sentry/transport/RateLimiter.java"
- - "sentry-apache-http-client-5/src/main/java/io/sentry/transport/apache/ApacheHttpClientTransport.java"
-
- # Class used by hybrid SDKs
- - "sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java"
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index b337ac9ea4e..00000000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,30 +0,0 @@
-## :scroll: Description
-
-
-
-## :bulb: Motivation and Context
-
-
-
-
-
-## :green_heart: How did you test it?
-
-
-## :pencil: Checklist
-
-
-- [ ] I added GH Issue ID _&_ Linear ID
-- [ ] I added tests to verify the changes.
-- [ ] No new PII added or SDK only sends newly added PII if `sendDefaultPII` is enabled.
-- [ ] I updated the docs if needed.
-- [ ] I updated the wizard if needed.
-- [ ] Review from the native team if needed.
-- [ ] No breaking change or entry added to the changelog.
-- [ ] No breaking change for hybrid SDKs or communicated to hybrid SDKs.
-
-
-## :crystal_ball: Next steps
diff --git a/.github/workflows/add-platform-label.yml b/.github/workflows/add-platform-label.yml
deleted file mode 100644
index 82d39cb8c76..00000000000
--- a/.github/workflows/add-platform-label.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: Add Platform Label
-on:
- issues:
- types: [opened]
- pull_request:
- types: [opened]
-
-jobs:
- add_label:
- runs-on: ubuntu-latest
- permissions:
- issues: write
- steps:
- - uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # pin@1.0.4
- with:
- add-labels: 'Platform: Java'
- repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/agp-matrix.yml b/.github/workflows/agp-matrix.yml
deleted file mode 100644
index 7ef34ea563e..00000000000
--- a/.github/workflows/agp-matrix.yml
+++ /dev/null
@@ -1,121 +0,0 @@
-name: AGP Matrix Compatibility
-
-on:
- push:
- branches:
- - main
- pull_request:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- agp-matrix-compatibility:
- timeout-minutes: 30
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- agp: [ '8.7.0','8.8.0','8.9.0' ]
- integrations: [ true, false ]
-
- name: AGP Matrix Release - AGP ${{ matrix.agp }} - Integrations ${{ matrix.integrations }}
- env:
- VERSION_AGP: ${{ matrix.agp }}
- APPLY_SENTRY_INTEGRATIONS: ${{ matrix.integrations }}
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: Setup Java Version
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Enable KVM
- run: |
- echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
- sudo udevadm control --reload-rules
- sudo udevadm trigger --name-match=kvm
-
- - name: AVD cache
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- id: avd-cache
- with:
- path: |
- ~/.android/avd/*
- ~/.android/adb*
- key: avd-api-30-x86_64-aosp_atd
-
- - name: Create AVD and generate snapshot for caching
- if: steps.avd-cache.outputs.cache-hit != 'true'
- uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # pin@v2
- with:
- api-level: 30
- target: aosp_atd
- channel: canary # Necessary for ATDs
- arch: x86_64
- force-avd-creation: false
- disable-animations: true
- disable-spellchecker: true
- emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
- disk-size: 4096M
- script: echo "Generated AVD snapshot for caching."
-
- # Clean, build and release a test apk
- - name: Make assembleUiTests
- run: make assembleUiTests
-
- # We tried to use the cache action to cache gradle stuff, but it made tests slower and timeout
- - name: Run instrumentation tests
- uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # pin@v2
- with:
- api-level: 30
- target: aosp_atd
- channel: canary # Necessary for ATDs
- arch: x86_64
- force-avd-creation: false
- disable-animations: true
- disable-spellchecker: true
- emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
- disk-size: 4096M
- script: ./gradlew sentry-android-integration-tests:sentry-uitest-android:connectedReleaseAndroidTest -Denvironment=github --daemon
-
- - name: Upload test results
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: test-results-AGP${{ matrix.agp }}-Integrations${{ matrix.integrations }}
- path: |
- **/build/reports/*
- **/build/outputs/*/connected/*
- **/build/outputs/mapping/release/*
-
- - name: Test Report
- uses: phoenix-actions/test-reporting@7317eea6e13c47348dd0bb318669485157c518d6 # pin@v16
- if: always()
- with:
- name: JUnit AGP ${{ matrix.agp }} - Integrations ${{ matrix.integrations }}
- path: |
- **/build/outputs/androidTest-results/**/*.xml
- reporter: java-junit
- output-to: step-summary
- fail-on-error: false
-
- - name: Upload test results to Codecov
- if: ${{ !cancelled() }}
- uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- file: build/outputs/androidTest-results/**/*.xml
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index f5e89b2be40..00000000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,86 +0,0 @@
-name: 'Build'
-on:
- push:
- branches:
- - main
- pull_request:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- build:
- name: Build Job ubuntu-latest - Java 17
- runs-on: ubuntu-latest
-
- env:
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- ref: ${{ github.event.pull_request.head.sha || github.sha }}
- submodules: 'recursive'
-
- - name: Setup Java Version
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- # Workaround for https://github.com/gradle/actions/issues/21 to use config cache
- - name: Cache buildSrc
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- with:
- path: buildSrc/build
- key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }}
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Run Tests with coverage and Lint
- run: make preMerge
-
- - name: Install Sentry CLI
- run: curl -sL https://sentry.io/get-cli/ | bash
-
- - name: Upload Snapshots to Sentry
- run: |
- sentry-cli build snapshots ./sentry-android-core/build/test-snapshots \
- --app-id sentry-android-core
- env:
- SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- SENTRY_ORG: sentry-sdks
- SENTRY_PROJECT: sentry-android
-
- - name: Upload coverage to Codecov
- uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # pin@v4
- with:
- name: sentry-java
- fail_ci_if_error: false
- token: ${{ secrets.CODECOV_TOKEN }}
-
- - name: Upload test results
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: test-results-build
- path: |
- **/build/reports/*
-
- - name: Test Report
- uses: phoenix-actions/test-reporting@7317eea6e13c47348dd0bb318669485157c518d6 # pin@v16
- if: always()
- with:
- name: JUnit Build
- list-suites: 'failed'
- list-tests: 'failed'
- path: |
- **/build/test-results/**/*.xml
- reporter: java-junit
- output-to: step-summary
- fail-on-error: false
diff --git a/.github/workflows/changelog-preview.yml b/.github/workflows/changelog-preview.yml
deleted file mode 100644
index 4d5a78a4114..00000000000
--- a/.github/workflows/changelog-preview.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-name: Changelog Preview
-on:
- pull_request:
- types:
- - opened
- - synchronize
- - reopened
- - edited
- - labeled
- - unlabeled
-permissions:
- contents: write
- pull-requests: write
- statuses: write
-
-jobs:
- changelog-preview:
- uses: getsentry/craft/.github/workflows/changelog-preview.yml@bae212ca7aec50bb716eafd387c80bcfb28da937 # v2
- secrets: inherit
diff --git a/.github/workflows/changes-in-high-risk-code.yml b/.github/workflows/changes-in-high-risk-code.yml
deleted file mode 100644
index 4ecc23619a4..00000000000
--- a/.github/workflows/changes-in-high-risk-code.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-name: Changes In High Risk Code
-on:
- pull_request:
-
-# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-jobs:
- files-changed:
- name: Detect changed files
- runs-on: ubuntu-latest
- # Map a step output to a job output
- outputs:
- high_risk_code: ${{ steps.changes.outputs.high_risk_code }}
- high_risk_code_files: ${{ steps.changes.outputs.high_risk_code_files }}
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- - name: Get changed files
- id: changes
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
- with:
- token: ${{ github.token }}
- filters: .github/file-filters.yml
-
- # Enable listing of files matching each filter.
- # Paths to files will be available in `${FILTER_NAME}_files` output variable.
- list-files: csv
-
- validate-high-risk-code:
- if: needs.files-changed.outputs.high_risk_code == 'true'
- needs: files-changed
- runs-on: ubuntu-latest
- steps:
- - name: Comment on PR to notify of changes in high risk files
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
- env:
- high_risk_code: ${{ needs.files-changed.outputs.high_risk_code_files }}
- with:
- script: |
- const highRiskFiles = process.env.high_risk_code;
- const fileList = highRiskFiles.split(',').map(file => `- [ ] ${file}`).join('\n');
- github.rest.issues.createComment({
- issue_number: context.issue.number,
- owner: context.repo.owner,
- repo: context.repo.repo,
- body: `### 🚨 Detected changes in high risk code 🚨 \n High-risk code has higher potential to break the SDK and may be hard to test. To prevent severe bugs, apply the rollout process for releasing such changes and be extra careful when changing and reviewing these files:\n ${fileList}`
- })
diff --git a/.github/workflows/check-tombstone-proto-schema.yml b/.github/workflows/check-tombstone-proto-schema.yml
deleted file mode 100644
index f4dd5f2f957..00000000000
--- a/.github/workflows/check-tombstone-proto-schema.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-name: Check Tombstone Proto Schema
-
-on:
- schedule:
- - cron: '0 9 * * *'
- workflow_dispatch:
-
-jobs:
- check:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
-
- - name: Check for newer Tombstone proto schema
- run: ./scripts/check-tombstone-proto-schema.sh
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
deleted file mode 100644
index ae8d78d305e..00000000000
--- a/.github/workflows/codeql-analysis.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-name: 'CodeQL'
-
-on:
- push:
- branches: [main]
- schedule:
- - cron: '17 23 * * 3'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- analyze:
- name: Analyze
- runs-on: macos-15
-
- env:
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: Setup Java Version
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Initialize CodeQL
- uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e # pin@v2
- with:
- languages: 'java'
-
- - name: Build Java
- run: |
- ./gradlew buildForCodeQL --no-build-cache
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e # pin@v2
diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml
deleted file mode 100644
index 77fe824701a..00000000000
--- a/.github/workflows/danger.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-name: Danger
-
-on:
- pull_request:
- types: [opened, synchronize, reopened, edited, ready_for_review, labeled, unlabeled]
-
-jobs:
- danger:
- runs-on: ubuntu-latest
- steps:
- - uses: getsentry/github-workflows/danger@26f565c05d0dd49f703d238706b775883037d76b # v3
diff --git a/.github/workflows/enforce-license-compliance.yml b/.github/workflows/enforce-license-compliance.yml
deleted file mode 100644
index 1d1493bb7bf..00000000000
--- a/.github/workflows/enforce-license-compliance.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: Enforce License Compliance
-
-on:
- push:
- branches: [master, main, release/*]
- pull_request:
- branches: [master, main]
-
-jobs:
- enforce-license-compliance:
- runs-on: ubuntu-latest
- steps:
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
-
- - name: Set up Java
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Checkout
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
-
- # TODO: remove this when upstream is fixed
- - name: Disable Gradle configuration cache (see https://github.com/fossas/fossa-cli/issues/872)
- run: sed -i 's/^org.gradle.configuration-cache=.*/org.gradle.configuration-cache=false/' gradle.properties
-
- - name: 'Enforce License Compliance'
- uses: getsentry/action-enforce-license-compliance@48236a773346cb6552a7bda1ee370d2797365d87 # main
- with:
- skip_checkout: 'true'
- fossa_test_timeout_seconds: 3600
- fossa_api_key: ${{ secrets.FOSSA_API_KEY }}
diff --git a/.github/workflows/format-code.yml b/.github/workflows/format-code.yml
deleted file mode 100644
index c338400f958..00000000000
--- a/.github/workflows/format-code.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: format code
-on:
- pull_request:
-
-jobs:
- format-code:
- name: Format Code
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: set up JDK 17
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Format with spotlessApply
- run: ./gradlew spotlessApply
-
- # actions/checkout fetches only a single commit in a detached HEAD state. Therefore
- # we need to pass the current branch, otherwise we can't commit the changes.
- # GITHUB_HEAD_REF is the name of the head branch. GitHub Actions only sets this for PRs.
- - name: Commit Formatted Code
- run: ./scripts/commit-formatted-code.sh $GITHUB_HEAD_REF
diff --git a/.github/workflows/generate-javadocs.yml b/.github/workflows/generate-javadocs.yml
deleted file mode 100644
index b50d42f7d1d..00000000000
--- a/.github/workflows/generate-javadocs.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: 'Generate Javadocs'
-on:
- release:
- types: [released]
-
-jobs:
- build-and-deploy-javadocs:
- name: Build and deploy Javadocs
- runs-on: ubuntu-latest
- steps:
- - name: Checkout 🛎️
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: set up JDK 17
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
-
- - name: Generate Aggregate Javadocs
- run: |
- ./gradlew aggregateJavadocs
- - name: Deploy
- uses: JamesIves/github-pages-deploy-action@d92aa235d04922e8f08b40ce78cc5442fcfbfa2f # pin@4.8.0
- with:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- BRANCH: gh-pages
- FOLDER: build/docs/javadoc
- CLEAN: true
diff --git a/.github/workflows/integration-tests-benchmarks.yml b/.github/workflows/integration-tests-benchmarks.yml
deleted file mode 100644
index 2f5a63f747a..00000000000
--- a/.github/workflows/integration-tests-benchmarks.yml
+++ /dev/null
@@ -1,114 +0,0 @@
-name: 'Integration Tests - Benchmarks'
-on:
- schedule:
- - cron: '0 0 * * *' # every night at midnight UTC
- pull_request:
- paths:
- - '**/sentry/**'
- - '**/sentry-android/**'
- - '**/sentry-android-core/**'
- - '**/sentry-android-ndk/**'
- - '**/sentry-android-integration-tests/**'
- - '**/.github/**'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- test:
- name: Benchmarks
- runs-on: ubuntu-latest
-
- # we copy the secret to the env variable in order to access it in the workflow
- env:
- SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Git checkout
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: 'Set up Java: 17'
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- # Clean, build and release a test apk, but only if we will run the benchmark
- - name: Make assembleBenchmarks
- if: env.SAUCE_USERNAME != null
- run: make assembleBenchmarks
-
- - name: Run All Tests in SauceLab
- uses: saucelabs/saucectl-run-action@bc81720eb01738d9c664b07fe42621bd0014283f # pin@v3
- if: github.event_name != 'pull_request' && env.SAUCE_USERNAME != null
- env:
- GITHUB_TOKEN: ${{ github.token }}
- with:
- sauce-username: ${{ secrets.SAUCE_USERNAME }}
- sauce-access-key: ${{ secrets.SAUCE_ACCESS_KEY }}
- config-file: .sauce/sentry-uitest-android-benchmark.yml
-
- - name: Run one test in SauceLab
- uses: saucelabs/saucectl-run-action@bc81720eb01738d9c664b07fe42621bd0014283f # pin@v3
- if: github.event_name == 'pull_request' && env.SAUCE_USERNAME != null
- env:
- GITHUB_TOKEN: ${{ github.token }}
- with:
- sauce-username: ${{ secrets.SAUCE_USERNAME }}
- sauce-access-key: ${{ secrets.SAUCE_ACCESS_KEY }}
- config-file: .sauce/sentry-uitest-android-benchmark-lite.yml
-
- app-metrics:
- runs-on: ubuntu-latest
-
- # we copy the secret to the env variable in order to access it in the workflow
- env:
- SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Git checkout
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: 'Set up Java: 17'
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- id: app-plain-cache
- with:
- path: sentry-android-integration-tests/test-app-plain/build/outputs/apk/release/test-app-plain-release.apk
- key: ${{ github.workflow }}-${{ github.job }}-appplain-${{ hashFiles('sentry-android-integration-tests/test-app-plain/**') }}
-
- - name: Build Android app plain
- if: steps.app-plain-cache.outputs['cache-hit'] != 'true'
- run: ./gradlew :sentry-android-integration-tests:test-app-plain:assembleRelease
-
- - name: Build Android app with Sentry
- run: ./gradlew :sentry-android-integration-tests:test-app-sentry:assembleRelease
-
- - name: Collect app metrics
- uses: getsentry/action-app-sdk-overhead-metrics@44fb5489ac4ac252c87d84811972dc93a1e490b8
- with:
- config: sentry-android-integration-tests/metrics-test.yml
- sauce-user: ${{ secrets.SAUCE_USERNAME }}
- sauce-key: ${{ secrets.SAUCE_ACCESS_KEY }}
- if: env.SAUCE_USERNAME != null
diff --git a/.github/workflows/integration-tests-size.yml b/.github/workflows/integration-tests-size.yml
deleted file mode 100644
index 1fd6c5c2c09..00000000000
--- a/.github/workflows/integration-tests-size.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: SDK Size Analysis
-
-on:
- push:
- branches:
- - main
- pull_request:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- build:
- name: Build and Analyze SDK Size
- runs-on: ubuntu-latest
-
- env:
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
-
- - name: Setup Java Version
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: "temurin"
- java-version: "17"
-
- # Workaround for https://github.com/gradle/actions/issues/21 to use config cache
- - name: Cache buildSrc
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- with:
- path: buildSrc/build
- key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }}
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Size Analysis
- run: ./gradlew :sentry-android-integration-tests:test-app-size:bundleRelease
- env:
- SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
diff --git a/.github/workflows/integration-tests-ui-critical.yml b/.github/workflows/integration-tests-ui-critical.yml
deleted file mode 100644
index 4d6c952a161..00000000000
--- a/.github/workflows/integration-tests-ui-critical.yml
+++ /dev/null
@@ -1,144 +0,0 @@
-name: UI Tests Critical
-
-on:
- push:
- branches:
- - main
- pull_request:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-env:
- BASE_PATH: "sentry-android-integration-tests/sentry-uitest-android-critical"
- BUILD_PATH: "build/outputs/apk/release"
- APK_NAME: "sentry-uitest-android-critical-release.apk"
- APK_ARTIFACT_NAME: "sentry-uitest-android-critical-release"
- MAESTRO_VERSION: "2.1.0"
-
-jobs:
- build:
- name: Build
- runs-on: ubuntu-latest
-
- env:
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout code
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
-
- - name: Set up Java 17
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Build debug APK
- run: make assembleUiTestCriticalRelease
-
- - name: Upload APK artifact
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: ${{env.APK_ARTIFACT_NAME}}
- path: "${{env.BASE_PATH}}/${{env.BUILD_PATH}}/${{env.APK_NAME}}"
- retention-days: 1
-
- run-maestro-tests:
- name: Run Tests for API Level ${{ matrix.api-level }}
- needs: build
- runs-on: ubuntu-latest
- strategy:
- # we want that the matrix keeps running, default is to cancel them if it fails.
- fail-fast: false
- matrix:
- include:
- - api-level: 31 # Android 12
- target: google_apis
- channel: canary # Necessary for ATDs
- arch: x86_64
- - api-level: 33 # Android 13
- target: google_apis
- channel: canary # Necessary for ATDs
- arch: x86_64
- - api-level: 35 # Android 15
- target: google_apis
- channel: canary # Necessary for ATDs
- arch: x86_64
- - api-level: 36 # Android 16
- target: google_apis
- channel: canary # Necessary for ATDs
- arch: x86_64
- steps:
- - name: Checkout code
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
-
- - name: Enable KVM
- run: |
- echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
- sudo udevadm control --reload-rules
- sudo udevadm trigger --name-match=kvm
-
- - name: AVD cache
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- id: avd-cache
- with:
- path: |
- ~/.android/avd/*
- ~/.android/adb*
- key: avd-api-${{ matrix.api-level }}-${{ matrix.arch }}-${{ matrix.target }}
-
- - name: Create AVD and generate snapshot for caching
- if: steps.avd-cache.outputs.cache-hit != 'true'
- uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # pin@v2
- with:
- api-level: ${{ matrix.api-level }}
- target: ${{ matrix.target }}
- channel: ${{ matrix.channel }}
- arch: ${{ matrix.arch }}
- force-avd-creation: false
- disable-animations: true
- disable-spellchecker: true
- emulator-options: -memory 4096 -no-window -gpu auto -noaudio -no-boot-anim -camera-back none
- disk-size: 4096M
- script: echo "Generated AVD snapshot for caching."
-
- - name: Download APK artifact
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
- with:
- name: ${{env.APK_ARTIFACT_NAME}}
-
- - name: Install Maestro
- uses: dniHze/maestro-test-action@bda8a93211c86d0a05b7a4597c5ad134566fbde4 # pin@v1.0.0
- with:
- version: ${{env.MAESTRO_VERSION}}
-
- - name: Run tests
- uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # pin@v2.37.0
- with:
- api-level: ${{ matrix.api-level }}
- target: ${{ matrix.target }}
- channel: ${{ matrix.channel }}
- arch: ${{ matrix.arch }}
- force-avd-creation: false
- disable-animations: true
- disable-spellchecker: true
- emulator-options: -memory 4096 -no-window -gpu auto -noaudio -no-boot-anim -camera-back none -no-snapshot-save
- script: |
- adb uninstall io.sentry.uitest.android.critical || echo "Already uninstalled (or not found)"
- adb install -r -d "${{env.APK_NAME}}"
- mkdir "${{env.BASE_PATH}}/maestro-logs/" || true; adb emu screenrecord start --time-limit 360 "${{env.BASE_PATH}}/maestro-logs/recording.webm" || true; maestro test "${{env.BASE_PATH}}/maestro" --test-output-dir="${{env.BASE_PATH}}/maestro-logs/test-output" || MAESTRO_EXIT_CODE=$?; adb emu screenrecord stop || true; adb logcat -d > "${{env.BASE_PATH}}/maestro-logs/logcat.txt" || true; exit ${MAESTRO_EXIT_CODE:-0}
-
- - name: Upload Maestro test results
- if: ${{ always() }}
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: maestro-logs-${{ matrix.api-level }}-${{ matrix.arch }}-${{ matrix.target }}
- path: "${{env.BASE_PATH}}/maestro-logs"
- retention-days: 1
diff --git a/.github/workflows/integration-tests-ui.yml b/.github/workflows/integration-tests-ui.yml
deleted file mode 100644
index 0549577f629..00000000000
--- a/.github/workflows/integration-tests-ui.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-name: 'Integration Tests'
-on:
- push:
- branches:
- - main
- pull_request:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- test:
- name: Ui tests
- runs-on: ubuntu-latest
-
- # we copy the secret to the env variable in order to access it in the workflow
- env:
- SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
- SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Git checkout
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: 'Set up Java: 17'
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- # Clean, build and release a test apk, but only if we will run the benchmark
- - name: Make assembleUiTests
- if: env.SAUCE_USERNAME != null
- run: make assembleUiTests
-
- - name: Install SauceLabs CLI
- uses: saucelabs/saucectl-run-action@bc81720eb01738d9c664b07fe42621bd0014283f # pin@v4.4.0
- env:
- GITHUB_TOKEN: ${{ github.token }}
- with:
- skip-run: true
- if: env.SAUCE_USERNAME != null
-
- - name: Run Tests
- id: saucelabs
- env:
- GITHUB_TOKEN: ${{ github.token }}
- run: |
- exec &> >(tee -a "test_logs.txt")
- saucectl run -c .sauce/sentry-uitest-android-ui.yml
- if: env.SAUCE_USERNAME != null
- continue-on-error: true
-
- - name: Verify Test Results
- run: |
- processCrashed=$(cat test_logs.txt | grep "Instrumentation run failed due to 'Process crashed.'" | wc -l)
- if [[ ${{ steps.saucelabs.outcome }} == 'success' ]]; then
- exit 0
- elif [[ "$processCrashed" -ne 0 ]]; then
- exit 0
- else
- exit 1
- fi
- if: env.SAUCE_USERNAME != null
-
-
- - name: Upload test results to Codecov
- if: ${{ !cancelled() }}
- uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- file: ./artifacts/*.xml
diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml
deleted file mode 100644
index 3ba2d299e54..00000000000
--- a/.github/workflows/release-build.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: 'Build Release Artifacts'
-on:
- push:
- branches:
- - release/**
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- release:
- name: Build release artifacts
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: Setup Java Version
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
-
- - name: Build artifacts
- run: make publish
-
- - name: Upload artifacts
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: ${{ github.sha }}
- if-no-files-found: error
- path: |
- ./*/build/distributions/*.zip
- ./sentry-opentelemetry/*/build/distributions/*.zip
diff --git a/.github/workflows/release-comment-issues.yml b/.github/workflows/release-comment-issues.yml
deleted file mode 100644
index 0eeff26b9d8..00000000000
--- a/.github/workflows/release-comment-issues.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-name: 'Automation: Notify issues for release'
-on:
- release:
- types:
- - published
- workflow_dispatch:
- inputs:
- version:
- description: Which version to notify issues for
- required: true
-
-permissions:
- contents: read
- issues: write
- pull-requests: read
-
-jobs:
- release-comment-issues:
- runs-on: ubuntu-24.04
- name: 'Notify issues'
- steps:
- - name: Get version
- id: get_version
- env:
- INPUTS_VERSION: ${{ github.event.inputs.version }}
- RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
- run: echo "version=${INPUTS_VERSION:-$RELEASE_TAG_NAME}" >> "$GITHUB_OUTPUT"
-
- - name: Comment on linked issues that are mentioned in release
- if: |
- steps.get_version.outputs.version != ''
- && !contains(steps.get_version.outputs.version, '-beta.')
- && !contains(steps.get_version.outputs.version, '-alpha.')
- && !contains(steps.get_version.outputs.version, '-rc.')
-
- uses: getsentry/release-comment-issues-gh-action@v1
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- version: ${{ steps.get_version.outputs.version }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 8464e8d0399..00000000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: release
-on:
- workflow_dispatch:
- inputs:
- version:
- description: Version to release (or "auto")
- required: false
- force:
- description: Force a release even when there are release-blockers (optional)
- required: false
- merge_target:
- description: Target branch to merge into. Uses the default branch as a fallback (optional)
- required: false
-
-permissions:
- contents: write
- pull-requests: write
-
-jobs:
- release:
- runs-on: ubuntu-latest
- name: "Release a new version"
- steps:
- - name: Get auth token
- id: token
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- with:
- app-id: ${{ vars.SENTRY_RELEASE_BOT_CLIENT_ID }}
- private-key: ${{ secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY }}
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- token: ${{ steps.token.outputs.token }}
- # Needs to be set, otherwise git describe --tags will fail with: No names found, cannot describe anything
- fetch-depth: 0
- submodules: 'recursive'
- - name: Prepare release
- uses: getsentry/craft@bae212ca7aec50bb716eafd387c80bcfb28da937 # v2
- env:
- GITHUB_TOKEN: ${{ steps.token.outputs.token }}
- with:
- version: ${{ github.event.inputs.version }}
- force: ${{ github.event.inputs.force }}
- merge_target: ${{ github.event.inputs.merge_target }}
diff --git a/.github/workflows/spring-boot-2-matrix.yml b/.github/workflows/spring-boot-2-matrix.yml
deleted file mode 100644
index 9a69765657c..00000000000
--- a/.github/workflows/spring-boot-2-matrix.yml
+++ /dev/null
@@ -1,180 +0,0 @@
-name: Spring Boot 2.x Matrix
-
-on:
- push:
- branches:
- - main
- pull_request:
- paths-ignore:
- - '*android*/**'
- - 'sentry-compose/**'
- - 'sentry-samples/sentry-samples-android/**'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- spring-boot-2-matrix:
- timeout-minutes: 45
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- springboot-version: [ '2.1.0', '2.2.5', '2.4.13', '2.5.15', '2.6.15', '2.7.0', '2.7.18' ]
-
- name: Spring Boot ${{ matrix.springboot-version }}
- env:
- SENTRY_URL: http://127.0.0.1:8000
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: Set up Python
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
- with:
- python-version: '3.10.5'
-
- - name: Install Python dependencies
- run: |
- python3 -m pip install --upgrade pip
- python3 -m pip install -r requirements.txt
-
- - name: Set up Java
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- # Workaround for https://github.com/gradle/actions/issues/21 to use config cache
- - name: Cache buildSrc
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- with:
- path: buildSrc/build
- key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }}
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Update Spring Boot 2.x version
- run: |
- sed -i 's/^springboot2=.*/springboot2=${{ matrix.springboot-version }}/' gradle/libs.versions.toml
- echo "Updated Spring Boot 2.x version to ${{ matrix.springboot-version }}"
-
- - name: Exclude android modules from build
- run: |
- sed -i \
- -e '/.*"sentry-android-ndk",/d' \
- -e '/.*"sentry-android",/d' \
- -e '/.*"sentry-compose",/d' \
- -e '/.*"sentry-android-core",/d' \
- -e '/.*"sentry-android-fragment",/d' \
- -e '/.*"sentry-android-navigation",/d' \
- -e '/.*"sentry-android-sqlite",/d' \
- -e '/.*"sentry-android-timber",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-size",/d' \
- -e '/.*"sentry-samples:sentry-samples-android",/d' \
- -e '/.*"sentry-android-replay",/d' \
- settings.gradle.kts
-
- - name: Exclude android modules from ignore list
- run: |
- sed -i \
- -e '/.*"sentry-uitest-android",/d' \
- -e '/.*"sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-uitest-android-critical",/d' \
- -e '/.*"test-app-sentry",/d' \
- -e '/.*"test-app-size",/d' \
- -e '/.*"sentry-samples-android",/d' \
- build.gradle.kts
-
- - name: Build SDK
- run: |
- ./gradlew assemble --parallel
-
- - name: Test sentry-samples-spring-boot
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-webflux
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-webflux" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-opentelemetry agent init true
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-opentelemetry" \
- --agent true \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-opentelemetry agent init false
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-opentelemetry" \
- --agent true \
- --auto-init "false" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-opentelemetry-noagent
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-opentelemetry-noagent" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Upload test results
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: test-results-springboot-2-${{ matrix.springboot-version }}
- path: |
- **/build/reports/*
- **/build/test-results/**/*.xml
- sentry-mock-server.txt
- spring-server.txt
-
- - name: Test Report
- uses: phoenix-actions/test-reporting@7317eea6e13c47348dd0bb318669485157c518d6 # pin@v16
- if: always()
- with:
- name: JUnit Spring Boot 2.x ${{ matrix.springboot-version }}
- path: |
- **/build/test-results/**/*.xml
- reporter: java-junit
- output-to: step-summary
- fail-on-error: false
-
- - name: Upload test results to Codecov
- if: ${{ !cancelled() }}
- uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- file: '**/build/test-results/**/*.xml'
diff --git a/.github/workflows/spring-boot-3-matrix.yml b/.github/workflows/spring-boot-3-matrix.yml
deleted file mode 100644
index c6a83c597fb..00000000000
--- a/.github/workflows/spring-boot-3-matrix.yml
+++ /dev/null
@@ -1,180 +0,0 @@
-name: Spring Boot 3.x Matrix
-
-on:
- push:
- branches:
- - main
- pull_request:
- paths-ignore:
- - '*android*/**'
- - 'sentry-compose/**'
- - 'sentry-samples/sentry-samples-android/**'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- spring-boot-3-matrix:
- timeout-minutes: 45
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- springboot-version: [ '3.0.0', '3.2.12', '3.3.13', '3.4.13', '3.5.13' ]
-
- name: Spring Boot ${{ matrix.springboot-version }}
- env:
- SENTRY_URL: http://127.0.0.1:8000
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: Set up Python
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
- with:
- python-version: '3.10.5'
-
- - name: Install Python dependencies
- run: |
- python3 -m pip install --upgrade pip
- python3 -m pip install -r requirements.txt
-
- - name: Set up Java
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- # Workaround for https://github.com/gradle/actions/issues/21 to use config cache
- - name: Cache buildSrc
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- with:
- path: buildSrc/build
- key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }}
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Update Spring Boot 3.x version
- run: |
- sed -i 's/^springboot3=.*/springboot3=${{ matrix.springboot-version }}/' gradle/libs.versions.toml
- echo "Updated Spring Boot 3.x version to ${{ matrix.springboot-version }}"
-
- - name: Exclude android modules from build
- run: |
- sed -i \
- -e '/.*"sentry-android-ndk",/d' \
- -e '/.*"sentry-android",/d' \
- -e '/.*"sentry-compose",/d' \
- -e '/.*"sentry-android-core",/d' \
- -e '/.*"sentry-android-fragment",/d' \
- -e '/.*"sentry-android-navigation",/d' \
- -e '/.*"sentry-android-sqlite",/d' \
- -e '/.*"sentry-android-timber",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-size",/d' \
- -e '/.*"sentry-samples:sentry-samples-android",/d' \
- -e '/.*"sentry-android-replay",/d' \
- settings.gradle.kts
-
- - name: Exclude android modules from ignore list
- run: |
- sed -i \
- -e '/.*"sentry-uitest-android",/d' \
- -e '/.*"sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-uitest-android-critical",/d' \
- -e '/.*"test-app-sentry",/d' \
- -e '/.*"test-app-size",/d' \
- -e '/.*"sentry-samples-android",/d' \
- build.gradle.kts
-
- - name: Build SDK
- run: |
- ./gradlew assemble --parallel
-
- - name: Test sentry-samples-spring-boot-jakarta
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-jakarta" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-webflux-jakarta
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-webflux-jakarta" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-jakarta-opentelemetry agent init true
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-jakarta-opentelemetry" \
- --agent true \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-jakarta-opentelemetry agent init false
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-jakarta-opentelemetry" \
- --agent true \
- --auto-init "false" \
- --build "true"
-
- - name: Test sentry-samples-spring-boot-jakarta-opentelemetry-noagent
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-jakarta-opentelemetry-noagent" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Test sentry-samples-spring-jakarta
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-jakarta" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Upload test results
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: test-results-springboot-3-${{ matrix.springboot-version }}
- path: |
- **/build/reports/*
- **/build/test-results/**/*.xml
- sentry-mock-server.txt
- spring-server.txt
-
- - name: Test Report
- uses: phoenix-actions/test-reporting@7317eea6e13c47348dd0bb318669485157c518d6 # pin@v16
- if: always()
- with:
- name: JUnit Spring Boot 3.x ${{ matrix.springboot-version }}
- path: |
- **/build/test-results/**/*.xml
- reporter: java-junit
- output-to: step-summary
- fail-on-error: false
-
- - name: Upload test results to Codecov
- if: ${{ !cancelled() }}
- uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- file: '**/build/test-results/**/*.xml'
diff --git a/.github/workflows/spring-boot-4-matrix.yml b/.github/workflows/spring-boot-4-matrix.yml
deleted file mode 100644
index 93d314de2e3..00000000000
--- a/.github/workflows/spring-boot-4-matrix.yml
+++ /dev/null
@@ -1,180 +0,0 @@
-name: Spring Boot 4.x Matrix
-
-on:
- push:
- branches:
- - main
- pull_request:
- paths-ignore:
- - '*android*/**'
- - 'sentry-compose/**'
- - 'sentry-samples/sentry-samples-android/**'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- spring-boot-4-matrix:
- timeout-minutes: 45
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- springboot-version: [ '4.0.0', '4.0.5' ]
-
- name: Spring Boot ${{ matrix.springboot-version }}
- env:
- SENTRY_URL: http://127.0.0.1:8000
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- steps:
- - name: Checkout Repo
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - name: Set up Python
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
- with:
- python-version: '3.10.5'
-
- - name: Install Python dependencies
- run: |
- python3 -m pip install --upgrade pip
- python3 -m pip install -r requirements.txt
-
- - name: Set up Java
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- # Workaround for https://github.com/gradle/actions/issues/21 to use config cache
- - name: Cache buildSrc
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
- with:
- path: buildSrc/build
- key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }}
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Update Spring Boot 4.x version
- run: |
- sed -i 's/^springboot4=.*/springboot4=${{ matrix.springboot-version }}/' gradle/libs.versions.toml
- echo "Updated Spring Boot 4.x version to ${{ matrix.springboot-version }}"
-
- - name: Exclude android modules from build
- run: |
- sed -i \
- -e '/.*"sentry-android-ndk",/d' \
- -e '/.*"sentry-android",/d' \
- -e '/.*"sentry-compose",/d' \
- -e '/.*"sentry-android-core",/d' \
- -e '/.*"sentry-android-fragment",/d' \
- -e '/.*"sentry-android-navigation",/d' \
- -e '/.*"sentry-android-sqlite",/d' \
- -e '/.*"sentry-android-timber",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-size",/d' \
- -e '/.*"sentry-samples:sentry-samples-android",/d' \
- -e '/.*"sentry-android-replay",/d' \
- settings.gradle.kts
-
- - name: Exclude android modules from ignore list
- run: |
- sed -i \
- -e '/.*"sentry-uitest-android",/d' \
- -e '/.*"sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-uitest-android-critical",/d' \
- -e '/.*"test-app-sentry",/d' \
- -e '/.*"test-app-size",/d' \
- -e '/.*"sentry-samples-android",/d' \
- build.gradle.kts
-
- - name: Build SDK
- run: |
- ./gradlew assemble --parallel
-
- - name: Run sentry-samples-spring-boot-4
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-4" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Run sentry-samples-spring-boot-4-webflux
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-4-webflux" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Run sentry-samples-spring-boot-4-opentelemetry agent init true
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-4-opentelemetry" \
- --agent true \
- --auto-init "true" \
- --build "true"
-
- - name: Run sentry-samples-spring-boot-4-opentelemetry agent init false
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-4-opentelemetry" \
- --agent true \
- --auto-init "false" \
- --build "true"
-
- - name: Run sentry-samples-spring-boot-4-opentelemetry-noagent
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-boot-4-opentelemetry-noagent" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Run sentry-samples-spring-7
- run: |
- python3 test/system-test-runner.py test \
- --module "sentry-samples-spring-7" \
- --agent false \
- --auto-init "true" \
- --build "true"
-
- - name: Upload test results
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: test-results-springboot-4-${{ matrix.springboot-version }}
- path: |
- **/build/reports/*
- **/build/test-results/**/*.xml
- sentry-mock-server.txt
- spring-server.txt
-
- - name: Test Report
- uses: phoenix-actions/test-reporting@7317eea6e13c47348dd0bb318669485157c518d6 # pin@v16
- if: always()
- with:
- name: JUnit Spring Boot 4.x ${{ matrix.springboot-version }}
- path: |
- **/build/test-results/**/*.xml
- reporter: java-junit
- output-to: step-summary
- fail-on-error: false
-
- - name: Upload test results to Codecov
- if: ${{ !cancelled() }}
- uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- file: '**/build/test-results/**/*.xml'
diff --git a/.github/workflows/system-tests-backend.yml b/.github/workflows/system-tests-backend.yml
deleted file mode 100644
index ea6a53a8750..00000000000
--- a/.github/workflows/system-tests-backend.yml
+++ /dev/null
@@ -1,177 +0,0 @@
-name: 'System Tests Backend'
-
-on:
- push:
- branches:
- - main
- pull_request:
- paths-ignore:
- - '*android*/**'
- - 'sentry-compose/**'
- - 'sentry-samples/sentry-samples-android/**'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- system-test:
- runs-on: ubuntu-latest
- continue-on-error: true
- env:
- SENTRY_URL: http://127.0.0.1:8000
- GRADLE_ENCRYPTION_KEY: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
- strategy:
- fail-fast: false
- matrix:
- sample: [ "sentry-samples-spring-boot-jakarta" ]
- agent: [ "false" ]
- agent-auto-init: [ "true" ]
- include:
- - sample: "sentry-samples-spring-boot"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-opentelemetry-noagent"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-opentelemetry"
- agent: "true"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-opentelemetry"
- agent: "true"
- agent-auto-init: "false"
- - sample: "sentry-samples-spring-boot-webflux-jakarta"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-webflux"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-jakarta-opentelemetry-noagent"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-jakarta-opentelemetry"
- agent: "true"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-jakarta-opentelemetry"
- agent: "true"
- agent-auto-init: "false"
- - sample: "sentry-samples-console"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-console-otlp"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-logback"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-log4j2"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-jul"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-4"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-4-webflux"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-4-opentelemetry-noagent"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-4-opentelemetry"
- agent: "true"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-boot-4-opentelemetry"
- agent: "true"
- agent-auto-init: "false"
- - sample: "sentry-samples-spring-boot-4-otlp"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-7"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring-jakarta"
- agent: "false"
- agent-auto-init: "true"
- - sample: "sentry-samples-spring"
- agent: "false"
- agent-auto-init: "true"
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- with:
- submodules: 'recursive'
-
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
- with:
- python-version: '3.10.5'
-
- - name: Install Python dependencies
- run: |
- python3 -m pip install --upgrade pip
- python3 -m pip install -r requirements.txt
-
- - name: Set up Java
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Setup Gradle
- uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c
- with:
- cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
-
- - name: Exclude android modules from build
- run: |
- sed -i \
- -e '/.*"sentry-android-ndk",/d' \
- -e '/.*"sentry-android",/d' \
- -e '/.*"sentry-compose",/d' \
- -e '/.*"sentry-android-core",/d' \
- -e '/.*"sentry-android-fragment",/d' \
- -e '/.*"sentry-android-navigation",/d' \
- -e '/.*"sentry-android-sqlite",/d' \
- -e '/.*"sentry-android-timber",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android",/d' \
- -e '/.*"sentry-android-integration-tests:sentry-uitest-android-critical",/d' \
- -e '/.*"sentry-android-integration-tests:test-app-sentry",/d' \
- -e '/.*"sentry-samples:sentry-samples-android",/d' \
- -e '/.*"sentry-android-replay",/d' \
- settings.gradle.kts
-
- - name: Exclude android modules from ignore list
- run: |
- sed -i \
- -e '/.*"sentry-uitest-android",/d' \
- -e '/.*"sentry-uitest-android-benchmark",/d' \
- -e '/.*"sentry-uitest-android-critical",/d' \
- -e '/.*"test-app-sentry",/d' \
- -e '/.*"sentry-samples-android",/d' \
- build.gradle.kts
-
- - name: Build and run system tests
- run: |
- python3 test/system-test-runner.py test --module "${{ matrix.sample }}" --agent "${{ matrix.agent }}" --auto-init "${{ matrix.agent-auto-init }}" --build "true"
-
- - name: Upload test results
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
- with:
- name: test-results-${{ matrix.sample }}-${{ matrix.agent }}-${{ matrix.agent-auto-init }}-system-test
- path: |
- **/build/reports/*
- sentry-mock-server.txt
- spring-server.txt
-
- - name: Test Report
- uses: phoenix-actions/test-reporting@7317eea6e13c47348dd0bb318669485157c518d6 # pin@v16
- if: always()
- with:
- name: JUnit System Tests ${{ matrix.sample }}
- path: |
- **/build/test-results/**/*.xml
- reporter: java-junit
- output-to: step-summary
- fail-on-error: false
diff --git a/.github/workflows/update-deps.yml b/.github/workflows/update-deps.yml
deleted file mode 100644
index bfcf9ccfa85..00000000000
--- a/.github/workflows/update-deps.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Update Dependencies
-
-on:
- # Run every day.
- schedule:
- - cron: '0 3 * * *'
- # And on on every PR merge so we get the updated dependencies ASAP, and to make sure the changelog doesn't conflict.
- push:
- branches:
- - main
-
-permissions:
- contents: write
- pull-requests: write
- actions: write
-
-jobs:
- native:
- runs-on: ubuntu-latest
- steps:
- - uses: getsentry/github-workflows/updater@26f565c05d0dd49f703d238706b775883037d76b # v3
- with:
- path: scripts/update-sentry-native-ndk.sh
- name: Native SDK
- ssh-key: ${{ secrets.CI_DEPLOY_KEY }}
diff --git a/.github/workflows/validate-pr.yml b/.github/workflows/validate-pr.yml
deleted file mode 100644
index 10fe894067a..00000000000
--- a/.github/workflows/validate-pr.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-name: Validate PR
-
-on:
- pull_request_target:
- types: [opened, reopened]
-
-jobs:
- validate-pr:
- runs-on: ubuntu-24.04
- permissions:
- pull-requests: write
- steps:
- - uses: getsentry/github-workflows/validate-pr@71588ddf95134f804e82c5970a8098588e2eaecd
- with:
- app-id: ${{ vars.SDK_MAINTAINER_BOT_APP_ID }}
- private-key: ${{ secrets.SDK_MAINTAINER_BOT_PRIVATE_KEY }}
diff --git a/.gitignore b/.gitignore
index f252087a5ab..bfd95355746 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,42 +1,4 @@
-.DS_Store
-.java-version
-.idea/
-.gradle/
-.run/
-build/
-artifacts/
-out/
-local.properties
-**.iml
-*.hprof
-.cxx
-**/sentry-native-local
target/
-.classpath
-.factorypath
-.project
-.settings/
-bin/
-distributions/
-/Sentry/A1F16C4F5D23B2A1D281EE471D6F836BDEA23CB4/
-*.vscode/
-sentry-spring-boot-starter-jakarta/src/main/resources/META-INF/spring.factories
-sentry-samples/sentry-samples-spring-boot-jakarta/spy.log
-sentry-mock-server.txt
-tomcat-server.txt
-spring-server.txt
-*.pid
-spy.log
-.kotlin
-**/tomcat.8080/webapps/
-**/__pycache__
-
-# Local Claude Code settings/state that should not be committed
-.claude/settings.local.json
-.claude/worktrees/
-# Auto-generated by dotagents — do not commit these files.
-agents.lock
-.agents/.gitignore
-
-# Warden local run logs
-.warden/logs/
+infer-out/
+agent/build/
+local.properties
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
deleted file mode 100755
index 9ac51e49730..00000000000
--- a/.mvn/wrapper/MavenWrapperDownloader.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2007-present the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import java.io.*;
-import java.net.*;
-import java.nio.channels.*;
-import java.util.Properties;
-
-public class MavenWrapperDownloader {
-
- private static final String WRAPPER_VERSION = "0.5.6";
- /** Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. */
- private static final String DEFAULT_DOWNLOAD_URL =
- "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
- + WRAPPER_VERSION
- + "/maven-wrapper-"
- + WRAPPER_VERSION
- + ".jar";
-
- /**
- * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to use
- * instead of the default one.
- */
- private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
- ".mvn/wrapper/maven-wrapper.properties";
-
- /** Path where the maven-wrapper.jar will be saved to. */
- private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar";
-
- /**
- * Name of the property which should be used to override the default download url for the wrapper.
- */
- private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
-
- public static void main(String args[]) {
- System.out.println("- Downloader started");
- File baseDirectory = new File(args[0]);
- System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
-
- // If the maven-wrapper.properties exists, read it and check if it contains a custom
- // wrapperUrl parameter.
- File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
- String url = DEFAULT_DOWNLOAD_URL;
- if (mavenWrapperPropertyFile.exists()) {
- FileInputStream mavenWrapperPropertyFileInputStream = null;
- try {
- mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
- Properties mavenWrapperProperties = new Properties();
- mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
- url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
- } catch (IOException e) {
- System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
- } finally {
- try {
- if (mavenWrapperPropertyFileInputStream != null) {
- mavenWrapperPropertyFileInputStream.close();
- }
- } catch (IOException e) {
- // Ignore ...
- }
- }
- }
- System.out.println("- Downloading from: " + url);
-
- File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
- if (!outputFile.getParentFile().exists()) {
- if (!outputFile.getParentFile().mkdirs()) {
- System.out.println(
- "- ERROR creating output directory '"
- + outputFile.getParentFile().getAbsolutePath()
- + "'");
- }
- }
- System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
- try {
- downloadFileFromURL(url, outputFile);
- System.out.println("Done");
- System.exit(0);
- } catch (Throwable e) {
- System.out.println("- Error downloading");
- e.printStackTrace();
- System.exit(1);
- }
- }
-
- private static void downloadFileFromURL(String urlString, File destination) throws Exception {
- if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
- String username = System.getenv("MVNW_USERNAME");
- char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
- Authenticator.setDefault(
- new Authenticator() {
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
- });
- }
- URL website = new URL(urlString);
- ReadableByteChannel rbc;
- rbc = Channels.newChannel(website.openStream());
- FileOutputStream fos = new FileOutputStream(destination);
- fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
- fos.close();
- rbc.close();
- }
-}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100755
index 2cc7d4a55c0..00000000000
Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100755
index 642d572ce90..00000000000
--- a/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
-wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/.pi/settings.json b/.pi/settings.json
deleted file mode 100644
index e614d527837..00000000000
--- a/.pi/settings.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "skills": [
- "../.claude/skills"
- ],
- "enableSkillCommands": true
-}
diff --git a/.python-version b/.python-version
deleted file mode 100644
index 2c20ac9bea3..00000000000
--- a/.python-version
+++ /dev/null
@@ -1 +0,0 @@
-3.13.3
diff --git a/.sauce/sentry-uitest-android-benchmark-lite.yml b/.sauce/sentry-uitest-android-benchmark-lite.yml
deleted file mode 100644
index fec4a141def..00000000000
--- a/.sauce/sentry-uitest-android-benchmark-lite.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-apiVersion: v1alpha
-kind: espresso
-sauce:
- region: us-west-1
- concurrency: 1
- metadata:
- build: sentry-uitest-android-benchmark-lite-$GITHUB_REF-$GITHUB_SHA
- tags:
- - benchmarks
- - android
-
-defaults:
- timeout: 40m
-
-espresso:
- app: ./sentry-android-integration-tests/sentry-uitest-android-benchmark/build/outputs/apk/release/sentry-uitest-android-benchmark-release.apk
- testApp: ./sentry-android-integration-tests/sentry-uitest-android-benchmark/build/outputs/apk/androidTest/release/sentry-uitest-android-benchmark-release-androidTest.apk
-
-suites:
-
- - name: "Android 15 Benchmark lite (api 35)"
- testOptions:
- clearPackageData: true
- useTestOrchestrator: true
- devices:
- - name: ".*"
- platformVersion: "15"
-
-artifacts:
- download:
- when: always
- match:
- - junit.xml
- directory: ./artifacts/
diff --git a/.sauce/sentry-uitest-android-benchmark.yml b/.sauce/sentry-uitest-android-benchmark.yml
deleted file mode 100644
index 12995ea5e07..00000000000
--- a/.sauce/sentry-uitest-android-benchmark.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-apiVersion: v1alpha
-kind: espresso
-sauce:
- region: us-west-1
- concurrency: 3
- metadata:
- build: sentry-uitest-android-benchmark-$GITHUB_REF-$GITHUB_SHA
- tags:
- - benchmarks
- - android
-
-defaults:
- timeout: 90m
-
-espresso:
- app: ./sentry-android-integration-tests/sentry-uitest-android-benchmark/build/outputs/apk/release/sentry-uitest-android-benchmark-release.apk
- testApp: ./sentry-android-integration-tests/sentry-uitest-android-benchmark/build/outputs/apk/androidTest/release/sentry-uitest-android-benchmark-release-androidTest.apk
-
-suites:
-
- # Devices are chosen so that there is a high-end and a low-end device for each api level
- - name: "Android 15 (api 35)"
- testOptions:
- clearPackageData: true
- useTestOrchestrator: true
- devices:
- - id: Google_Pixel_9_Pro_XL_15_real_sjc1 # Google Pixel 9 Pro XL - api 35 (15) - high end
- - id: Samsung_Galaxy_S23_15_real_sjc1 # Samsung Galaxy S23 - api 35 (15) - mid end
- - id: Google_Pixel_6a_15_real_sjc1 # Google Pixel 6a - api 35 (15) - low end
-
- - name: "Android 14 (api 34)"
- testOptions:
- clearPackageData: true
- useTestOrchestrator: true
- devices:
- - id: Google_Pixel_9_Pro_XL_real_sjc1 # Google Pixel 9 Pro XL - api 34 (14) - high end
- - id: Samsung_Galaxy_A54_real_sjc1 # Samsung Galaxy A54 - api 34 (14) - low end
-
- - name: "Android 13 (api 33)"
- testOptions:
- clearPackageData: true
- useTestOrchestrator: true
- devices:
- - id: Google_Pixel_7_Pro_real_us # Google Pixel 7 Pro - api 33 (13) - high end
- - id: Samsung_Galaxy_A32_5G_real_sjc1 # Samsung Galaxy A32 5G - api 33 (13) - low end
-
-# At the time of writing (August, 13, 2025), the market share per android version is:
-# 15.0 = 26.75%, 14.0 = 19.5%, 13 = 15.95%
-# Using these 3 versions we cover 62.2% of all devices out there. Currently, this is enough for benchmarking scope
-
-artifacts:
- download:
- when: always
- match:
- - junit.xml
- directory: ./artifacts/
diff --git a/.sauce/sentry-uitest-android-ui.yml b/.sauce/sentry-uitest-android-ui.yml
deleted file mode 100644
index 8d84f865c95..00000000000
--- a/.sauce/sentry-uitest-android-ui.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-apiVersion: v1alpha
-kind: espresso
-sauce:
- region: us-west-1
- # Controls how many suites are executed at the same time (sauce test env only).
- concurrency: 4
- metadata:
- build: sentry-uitest-android-ui-$GITHUB_REF-$GITHUB_SHA
- tags:
- - e2e
- - android
-
-defaults:
- timeout: 45m
-
-espresso:
- app: ./sentry-android-integration-tests/sentry-uitest-android/build/outputs/apk/release/sentry-uitest-android-release.apk
- testApp: ./sentry-android-integration-tests/sentry-uitest-android/build/outputs/apk/androidTest/release/sentry-uitest-android-release-androidTest.apk
-suites:
-
- - name: "Android 15 Ui test (api 35)"
- testOptions:
- clearPackageData: true
- useTestOrchestrator: true
- devices:
- - name: ".*"
- platformVersion: "15"
-
-# Controls what artifacts to fetch when the suite on Sauce Cloud has finished.
-artifacts:
- download:
- when: always
- match:
- - junit.xml
- directory: ./artifacts/
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000000..6776a94fbf5
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,49 @@
+env:
+ global:
+ - secure: "Xs3g5ZOMymPp0EvxF0T0tk5xMaV3htMPii5uDS17z9wDWYg7hj78mrP2cFea0ZjIqIjENG7YuxIjw34yb7507pvIxv8v+QvSkwlzVz4XJNzh2w1gbB2C+oVvbmbFd0A2Pmpf3jvkey6Tk5jhW7lxNVAZ7QzONuAf66iWdi6bwSg="
+ - secure: "PBz5Jjoaf33a+Iqv5eJsFHbCYP1ZdeiQvrQBH7hJK5/Kdrbn4GCrDx+RkA58ZC8i8ZHfsW2MkMuD7RphcrgHuB3UwcvHwUgrEZaV1/ypIOe5O8CQ4Z0gkHCj2Ei/dsL3fpDU8WuPJSLa13tsMoQTdGaOhluCuSXpuArx3B3gX28="
+
+after_success:
+ - "[[ $TRAVIS_BRANCH == 'master' ]] && { python .travis/addServer.py; mvn clean deploy --settings $HOME/.m2/mySettings.xml; };"
+
+matrix:
+ include:
+ - language: java
+ dist: precise
+ jdk: oraclejdk7
+ install: make install
+ script: env | sort && make verify
+ cache:
+ directories:
+ - $HOME/.m2
+ - language: java
+ dist: precise
+ jdk: oraclejdk8
+ install: make install
+ script: env | sort && make verify
+ cache:
+ directories:
+ - $HOME/.m2
+ - language: cpp
+ dist: trusty
+ jdk: oraclejdk7
+ env: TARGET=x86_64
+ before_install: .ci/agent-install.sh
+ script: .ci/agent-build.sh
+ cache: false
+ after_success: true
+ - language: cpp
+ dist: trusty
+ jdk: oraclejdk7
+ env: TARGET=i686
+ before_install: .ci/agent-install.sh
+ script: .ci/agent-build.sh
+ cache: false
+ after_success: true
+
+deploy:
+ provider: script
+ script: .ci/agent-deploy.sh
+ skip_cleanup: true
+ on:
+ tags: true
diff --git a/.travis/addServer.py b/.travis/addServer.py
new file mode 100644
index 00000000000..746e36f1a06
--- /dev/null
+++ b/.travis/addServer.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+
+"""
+This script adjusts the existing ~/.m2/settings.xml on Travis so that it includes
+the Sonatype server, username and password for SNAPSHOT deploys. The user and password
+come from secure environment variables in .travis.yml
+"""
+
+
+import sys
+import os
+import os.path
+import xml.dom.minidom
+
+if os.environ["TRAVIS_SECURE_ENV_VARS"] == "false":
+ print "no secure env vars available, skipping deployment"
+ sys.exit()
+
+homedir = os.path.expanduser("~")
+
+m2 = xml.dom.minidom.parse(homedir + '/.m2/settings.xml')
+settings = m2.getElementsByTagName("settings")[0]
+
+serversNodes = settings.getElementsByTagName("servers")
+if not serversNodes:
+ serversNode = m2.createElement("servers")
+ settings.appendChild(serversNode)
+else:
+ serversNode = serversNodes[0]
+
+sonatypeServerNode = m2.createElement("server")
+sonatypeServerId = m2.createElement("id")
+sonatypeServerUser = m2.createElement("username")
+sonatypeServerPass = m2.createElement("password")
+
+idNode = m2.createTextNode("sonatype-nexus-snapshots")
+userNode = m2.createTextNode(os.environ["SONATYPE_USERNAME"])
+passNode = m2.createTextNode(os.environ["SONATYPE_PASSWORD"])
+
+sonatypeServerId.appendChild(idNode)
+sonatypeServerUser.appendChild(userNode)
+sonatypeServerPass.appendChild(passNode)
+
+sonatypeServerNode.appendChild(sonatypeServerId)
+sonatypeServerNode.appendChild(sonatypeServerUser)
+sonatypeServerNode.appendChild(sonatypeServerPass)
+
+serversNode.appendChild(sonatypeServerNode)
+
+m2Str = m2.toxml()
+f = open(homedir + '/.m2/mySettings.xml', 'w')
+f.write(m2Str)
+f.close()
diff --git a/AGENTS.md b/AGENTS.md
deleted file mode 100644
index ff50727c662..00000000000
--- a/AGENTS.md
+++ /dev/null
@@ -1,180 +0,0 @@
-# AGENTS.md
-
-This file provides guidance to AI coding agents when working with code in this repository.
-
-## STOP — Required Reading (Do This First)
-
-Before doing ANYTHING else (including answering questions), you MUST use the Read tool to load these files:
-1. `.cursor/rules/coding.mdc`
-2. `.cursor/rules/overview_dev.mdc`
-
-Then identify and read any topically relevant `.cursor/rules/*.mdc` files for the area you're working on (e.g., `opentelemetry.mdc` for OTel work, `metrics.mdc` for metrics work). Use the Glob tool on `.cursor/rules/*.mdc` to discover available rule files.
-
-Do NOT skip this step. Do NOT proceed without reading these files first.
-
-## Project Overview
-
-This is the Sentry Java/Android SDK - a comprehensive error monitoring and performance tracking SDK for Java and Android applications. The repository contains multiple modules for different integrations and platforms.
-
-## Build System
-
-The project uses **Gradle** with Kotlin DSL. Key build files:
-- `build.gradle.kts` - Root build configuration
-- `settings.gradle.kts` - Multi-module project structure
-- `buildSrc/` and `build-logic/` - Custom build logic and plugins
-- `Makefile` - High-level build commands
-
-## Essential Commands
-
-### Development Workflow
-```bash
-# Format code and regenerate .api files (REQUIRED before committing)
-./gradlew spotlessApply apiDump
-
-# Run all tests and linter
-./gradlew check
-
-# Build entire project
-./gradlew build
-
-# Create coverage reports
-./gradlew jacocoTestReport koverXmlReportRelease
-
-# Generate documentation
-./gradlew aggregateJavadocs
-```
-
-### Testing
-```bash
-# Run unit tests for a specific file
-./gradlew '::testDebugUnitTest' --tests="**" --info
-
-# Run system tests (requires Python virtual env)
-make systemTest
-
-# Run specific test suites
-./gradlew :sentry-android-core:testDebugUnitTest
-./gradlew :sentry:test
-```
-
-### Code Quality
-```bash
-# Check code formatting
-./gradlew spotlessJavaCheck spotlessKotlinCheck
-
-# Apply code formatting
-./gradlew spotlessApply
-
-# Update API dump files (after API changes)
-./gradlew apiDump
-
-# Dependency updates check
-./gradlew dependencyUpdates -Drevision=release
-```
-
-### Android-Specific Commands
-```bash
-# Assemble Android test APKs
-./gradlew :sentry-android-integration-tests:sentry-uitest-android:assembleRelease :sentry-android-integration-tests:sentry-uitest-android:assembleAndroidTest
-
-# Run critical UI tests
-./scripts/test-ui-critical.sh
-```
-
-## Development Workflow Rules
-
-### Planning and Implementation Process
-1. **First think through the problem**: Read the codebase for relevant files and propose a plan
-2. **Check in before beginning**: Verify the plan before starting implementation
-3. **Use todo tracking**: Work through todo items, marking them as complete as you go
-4. **High-level communication**: Give high-level explanations of changes made, not step-by-step descriptions
-5. **Simplicity first**: Make every task and code change as simple as possible. Avoid massive or complex changes. Impact as little code as possible.
-6. **Format and regenerate**: Once done, format code and regenerate .api files: `./gradlew spotlessApply apiDump`
-7. **Propose commit**: As final step, git stage relevant files and propose (but not execute) a single git commit command
-
-## Module Architecture
-
-The repository is organized into multiple modules:
-
-### Core Modules
-- **`sentry`** - Core Java SDK implementation
-- **`sentry-android-core`** - Core Android SDK implementation
-- **`sentry-android`** - High-level Android SDK
-
-### Integration Modules
-- **Spring Framework**: `sentry-spring*`, `sentry-spring-boot*`
-- **Logging**: `sentry-logback`, `sentry-log4j2`, `sentry-jul`
-- **Web**: `sentry-servlet*`, `sentry-okhttp`, `sentry-apache-http-client-5`
-- **GraphQL**: `sentry-graphql*`, `sentry-apollo*`
-- **Android UI**: `sentry-android-fragment`, `sentry-android-navigation`, `sentry-compose`
-- **Reactive**: `sentry-reactor`, `sentry-ktor-client`
-- **Monitoring**: `sentry-opentelemetry*`, `sentry-quartz`
-
-### Utility Modules
-- **`sentry-test-support`** - Shared test utilities
-- **`sentry-system-test-support`** - System testing infrastructure
-- **`sentry-samples`** - Example applications
-- **`sentry-bom`** - Bill of Materials for dependency management
-
-### Key Architectural Patterns
-- **Multi-platform**: Supports JVM, Android, and Kotlin Multiplatform (Compose modules)
-- **Modular Design**: Each integration is a separate module with minimal dependencies
-- **Options Pattern**: Features are opt-in via `SentryOptions` and similar configuration classes
-- **Transport Layer**: Pluggable transport implementations for different environments
-- **Scope Management**: Thread-safe scope/context management for error tracking
-
-## Development Guidelines
-
-### Code Style
-- **Languages**: Java 8+ and Kotlin
-- **Formatting**: Enforced via Spotless - always run `./gradlew spotlessApply` before committing
-- **API Compatibility**: Binary compatibility is enforced - run `./gradlew apiDump` after API changes
-
-### Testing Requirements
-- Write comprehensive unit tests for new features
-- Android modules require both unit tests and instrumented tests where applicable
-- System tests validate end-to-end functionality with sample applications
-- Coverage reports are generated for both JaCoCo (Java/Android) and Kover (KMP modules)
-
-### Contributing Guidelines
-1. Follow existing code style and language
-2. Do not modify API files (e.g. sentry.api) manually - run `./gradlew apiDump` to regenerate them
-3. Write comprehensive tests
-4. New features must be **opt-in by default** - extend `SentryOptions` or similar Option classes with getters/setters
-5. Consider backwards compatibility
-
-### Third-Party Code Attribution
-When adapting code from third-party libraries:
-1. Add a license header at the top of the adapted file (before the `package` statement):
- ```java
- // Adapted from .
- // Copyright .
- // Licensed under the .
- //
- ```
-2. Add a full attribution entry to `THIRD_PARTY_NOTICES.md` following the existing format (Source, License, Copyright, Scope, full license text)
-
-3. Run the `check-code-attribution` skill locally or wait for it to be auto-run against your PR to check for required fields and verify new licenses against [Sentry's Open Source Legal Policy](https://open.sentry.io/licensing/).
-
-### Getting PR Information
-
-Use `gh pr view` to get PR details from the current branch. This is needed when adding changelog entries, which require the PR number.
-
-```bash
-# Get PR number for current branch
-gh pr view --json number -q '.number'
-
-# Get PR number for a specific branch
-gh pr view --json number -q '.number'
-
-# Get PR URL
-gh pr view --json url -q '.url'
-```
-
-## Useful Resources
-
-- Main SDK documentation: https://develop.sentry.dev/sdk/overview/
-- Internal contributing guide: https://docs.sentry.io/internal/contributing/
-- Git commit message conventions: https://develop.sentry.dev/engineering-practices/commit-messages/
-
-This SDK is production-ready and used by thousands of applications. Changes should be thoroughly tested and maintain backwards compatibility.
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 3e869e9aac8..00000000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,5040 +0,0 @@
-# Changelog
-
-## 8.42.0
-
-### Features
-
-- Add option to attach raw tombstone protobuf on native crash events ([#5446](https://github.com/getsentry/sentry-java/pull/5446))
- - Enable via `options.isAttachRawTombstone = true` or manifest: ``
-- Add API to clear feature flags from scopes ([#5426](https://github.com/getsentry/sentry-java/pull/5426))
-- Add support to configure reporting historical ANRs via `AndroidManifest.xml` using the `io.sentry.anr.report-historical` attribute ([#5387](https://github.com/getsentry/sentry-java/pull/5387))
-
-### Dependencies
-
-- Bump Gradle from v9.5.0 to v9.5.1 ([#5419](https://github.com/getsentry/sentry-java/pull/5419))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v951)
- - [diff](https://github.com/gradle/gradle/compare/v9.5.0...v9.5.1)
-- Bump Native SDK from v0.14.0 to v0.14.2 ([#5433](https://github.com/getsentry/sentry-java/pull/5433), [#5441](https://github.com/getsentry/sentry-java/pull/5441))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0142)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.14.0...0.14.2)
-- Bump SAGP (Sentry Android Gradle Plugin) from v6.0.0-alpha.6 to v6.6.0 ([#5427](https://github.com/getsentry/sentry-java/pull/5427))
- - [changelog](https://github.com/getsentry/sentry-android-gradle-plugin/blob/main/CHANGELOG.md)
- - [diff](https://github.com/getsentry/sentry-android-gradle-plugin/compare/6.0.0-alpha.6...6.6.0)
-
-## 8.41.0
-
-### Features
-
-- Session Replay: experimental support for capturing `SurfaceView` content (e.g. Unity, video players, maps) ([#5333](https://github.com/getsentry/sentry-java/pull/5333))
- - To enable, set `options.sessionReplay.isCaptureSurfaceViews = true`
- - Or via manifest: ``
- - **Warning:** masking granularity is at the SurfaceView level only — the SDK cannot mask individual elements rendered inside the SurfaceView (e.g. native Unity UI, map labels, video frames). Only enable for SurfaceViews whose content is safe to record.
-- Add `Sentry.feedback()` API for `show()` and `capture()` ([#5349](https://github.com/getsentry/sentry-java/pull/5349))
- - `Sentry.showUserFeedbackDialog()` is deprecated in favor of `Sentry.feedback().show()`
- - `Sentry.captureFeedback()` is deprecated in favor of `Sentry.feedback().capture()`
- - `Sentry.captureUserFeedback()` and `UserFeedback` are deprecated in favor of `Sentry.feedback().capture()` with the new `Feedback` type
- - `SentryUserFeedbackDialog` is deprecated in favor of `SentryUserFeedbackForm`
- - All deprecated APIs will be removed in the next major version
-- Deprecate `SentryUserFeedbackButton` (View-based and Compose-based) ([#5350](https://github.com/getsentry/sentry-java/pull/5350))
- - It will be removed in the next major version
-- Add per-form shake-to-show support for `SentryUserFeedbackForm` ([#5353](https://github.com/getsentry/sentry-java/pull/5353))
- - Useful for enabling shake-to-report on specific screens instead of globally
- ```kotlin
- SentryUserFeedbackForm.Builder(activity)
- .configurator { it.isUseShakeGesture = true }
- .create()
- ```
-- Add support for Kafka ([#5249](https://github.com/getsentry/sentry-java/pull/5249))
- - You will need to add the `sentry-kafka` dependency and opt-in via the new option.
- - Set `options.setEnableQueueTracing(true)` on `Sentry.init`
- - Or set `sentry.enable-queue-tracing=true` in `application.properties`
- - For Spring Boot Kafka is auto instrumented and no further configuration is needed.
- - also see https://docs.sentry.io/platforms/java/guides/spring-boot/integrations/kafka/
- - When using `kafka-clients` directly
- - you need to wrap your `KafkaProducer` via `SentryKafkaProducer.wrap(kafkaProducer)` to get `queue.publish` spans
- - and you may use our `SentryKafkaConsumerTracing.withTracing` helper to instrument the consumer side manually.
- - also see https://docs.sentry.io/platforms/java/integrations/kafka/
-
-### Fixes
-
-- Fix soft input keyboard not being shown on the Feedback form ([#5359](https://github.com/getsentry/sentry-java/pull/5359))
-- Fix shake-to-report not triggering on some devices due to high acceleration threshold ([#5366](https://github.com/getsentry/sentry-java/pull/5366))
-- Fix feedback form retaining previous message when shown again via shake ([#5366](https://github.com/getsentry/sentry-java/pull/5366))
-- Avoid stack overflow when deserializing large flat JSON objects ([#5361](https://github.com/getsentry/sentry-java/pull/5361))
-
-### Dependencies
-
-- Bump Native SDK from v0.13.7 to v0.14.0 ([#5334](https://github.com/getsentry/sentry-java/pull/5334), [#5365](https://github.com/getsentry/sentry-java/pull/5365))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0140)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.13.7...0.14.0)
-- Bump Gradle from v9.4.1 to v9.5.0 ([#5344](https://github.com/getsentry/sentry-java/pull/5344))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v950)
- - [diff](https://github.com/gradle/gradle/compare/v9.4.1...v9.5.0)
-
-## 8.40.0
-
-### Fixes
-
-- Fix `NoSuchMethodError` for `LayoutCoordinates.localBoundingBoxOf$default` on Compose touch dispatch with AGP 8.13 and `minSdk < 24` ([#5302](https://github.com/getsentry/sentry-java/pull/5302))
-- Fix reporting OkHttp's synthetic 504 "Unsatisfiable Request" responses as errors for `CacheControl.FORCE_CACHE` cache misses ([#5299](https://github.com/getsentry/sentry-java/pull/5299))
-- Make `SentryGestureDetector` thread-safe and recycle `VelocityTracker` per gesture ([#5301](https://github.com/getsentry/sentry-java/pull/5301))
-- Fix duplicate `ui.click` breadcrumbs when another `Window.Callback` wraps `SentryWindowCallback` ([#5300](https://github.com/getsentry/sentry-java/pull/5300))
-
-### Dependencies
-
-- Bump Native SDK from v0.13.6 to v0.13.7 ([#5296](https://github.com/getsentry/sentry-java/pull/5296))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0137)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.13.6...0.13.7)
-
-## 8.39.1
-
-### Fixes
-
-- Fix `JsonObjectReader` and `MapObjectReader` hanging indefinitely when deserialization errors leave the reader in an inconsistent state ([#5293](https://github.com/getsentry/sentry-java/pull/5293))
- - Failed collection values are now skipped so parsing can continue
- - Skipped collection values emit `WARNING` logs
- - Unknown-key failures and unrecoverable recovery failures emit `ERROR` logs
-
-## 8.39.0
-
-### Fixes
-
-- Fix ANR caused by `GestureDetectorCompat` Handler/MessageQueue lock contention in `SentryWindowCallback` ([#5138](https://github.com/getsentry/sentry-java/pull/5138))
-
-### Internal
-
-- Bump AGP version from v8.6.0 to v8.13.1 ([#5063](https://github.com/getsentry/sentry-java/pull/5063))
-
-### Dependencies
-
-- Bump Native SDK from v0.13.3 to v0.13.6 ([#5277](https://github.com/getsentry/sentry-java/pull/5277))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0136)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.13.3...0.13.6)
-- Bump Gradle from v8.14.3 to v9.4.1 ([#5063](https://github.com/getsentry/sentry-java/pull/5063))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v941)
- - [diff](https://github.com/gradle/gradle/compare/v8.14.3...v9.4.1)
-
-## 8.38.0
-
-### Features
-
-- Prevent cross-organization trace continuation ([#5136](https://github.com/getsentry/sentry-java/pull/5136))
- - By default, the SDK now extracts the organization ID from the DSN (e.g. `o123.ingest.sentry.io`) and compares it with the `sentry-org_id` value in incoming baggage headers. When the two differ, the SDK starts a fresh trace instead of continuing the foreign one. This guards against accidentally linking traces across organizations.
- - New option `enableStrictTraceContinuation` (default `false`): when enabled, both the SDK's org ID **and** the incoming baggage org ID must be present and match for a trace to be continued. Traces with a missing org ID on either side are rejected. Configurable via code (`setStrictTraceContinuation(true)`), `sentry.properties` (`enable-strict-trace-continuation=true`), Android manifest (`io.sentry.strict-trace-continuation.enabled`), or Spring Boot (`sentry.strict-trace-continuation=true`).
- - New option `orgId`: allows explicitly setting the organization ID for self-hosted and Relay setups where it cannot be extracted from the DSN. Configurable via code (`setOrgId("123")`), `sentry.properties` (`org-id=123`), Android manifest (`io.sentry.org-id`), or Spring Boot (`sentry.org-id=123`).
-- Android: Attachments on the scope will now be synced to native ([#5211](https://github.com/getsentry/sentry-java/pull/5211))
-- Add THIRD_PARTY_NOTICES.md for vendored third-party code, bundled as SENTRY_THIRD_PARTY_NOTICES.md in the sentry JAR under META-INF ([#5186](https://github.com/getsentry/sentry-java/pull/5186))
-
-### Improvements
-
-- Do not retrieve `ActivityManager` if API < 35 on SDK init ([#5275](https://github.com/getsentry/sentry-java/pull/5275))
-
-## 8.37.1
-
-### Fixes
-
-- Fix deadlock in `SentryContextStorage.root()` with virtual threads and OpenTelemetry agent ([#5234](https://github.com/getsentry/sentry-java/pull/5234))
-
-## 8.37.0
-
-### Fixes
-
-- Session Replay: Fix Compose text masking mismatch with weighted text ([#5218](https://github.com/getsentry/sentry-java/pull/5218))
-
-### Features
-
-- Add cache tracing instrumentation for Spring Boot 2, 3, and 4 ([#5165](https://github.com/getsentry/sentry-java/pull/5165))
- - Wraps Spring `CacheManager` and `Cache` beans to produce cache spans
- - Set `sentry.enable-cache-tracing` to `true` to enable this feature
-- Add JCache (JSR-107) cache tracing via new `sentry-jcache` module ([#5165](https://github.com/getsentry/sentry-java/pull/5165))
- - Wraps JCache `Cache` with `SentryJCacheWrapper` to produce cache spans
- - Set the `enableCacheTracing` option to `true` to enable this feature
-- Add configurable `IScopesStorageFactory` to `SentryOptions` for providing a custom `IScopesStorage`, e.g. when the default `ThreadLocal`-backed storage is incompatible with non-pinning thread models ([#5199](https://github.com/getsentry/sentry-java/pull/5199))
-- Android: Add `beforeErrorSampling` callback to Session Replay ([#5214](https://github.com/getsentry/sentry-java/pull/5214))
- - Allows filtering which errors trigger replay capture before the `onErrorSampleRate` is checked
- - Returning `false` skips replay capture entirely for that error; returning `true` proceeds with the normal sample rate check
- - Example usage:
- ```kotlin
- SentryAndroid.init(context) { options ->
- options.sessionReplay.beforeErrorSampling =
- SentryReplayOptions.BeforeErrorSamplingCallback { event, hint ->
- // Only capture replay for crashes (excluding e.g. handled exceptions)
- event.isCrashed
- }
- }
- ```
-
-### Dependencies
-
-- Bump Native SDK from v0.13.2 to v0.13.3 ([#5215](https://github.com/getsentry/sentry-java/pull/5215))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0133)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.13.2...0.13.3)
-- Bump OpenTelemetry ([#5225](https://github.com/getsentry/sentry-java/pull/5225))
- - `opentelemetry` to `1.60.1` (was `1.57.0`)
- - `opentelemetry-instrumentation` to `2.26.0` (was `2.23.0`)
- - `opentelemetry-instrumentation-alpha` to `2.26.0-alpha` (was `2.23.0-alpha`)
- - `opentelemetry-semconv` to `1.40.0` (was `1.37.0`)
- - `opentelemetry-semconv-alpha` to `1.40.0-alpha` (was `1.37.0-alpha`)
-
-## 8.36.0
-
-### Features
-
-- Show feedback form on device shake ([#5150](https://github.com/getsentry/sentry-java/pull/5150))
- - Enable via `options.getFeedbackOptions().setUseShakeGesture(true)` or manifest meta-data `io.sentry.feedback.use-shake-gesture`
- - Uses the device's accelerometer — no special permissions required
-
-### Fixes
-
-- Support masking/unmasking and click/scroll detection for Jetpack Compose 1.10+ ([#5189](https://github.com/getsentry/sentry-java/pull/5189))
-
-### Dependencies
-
-- Bump Native SDK from v0.13.1 to v0.13.2 ([#5181](https://github.com/getsentry/sentry-java/pull/5181))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0132)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.13.1...0.13.2)
-- Bump `com.abovevacant:epitaph` to `0.1.1` to avoid old D8/R8 dexing crashes in downstream Android builds on old AGP versions such as 7.4.x. ([#5200](https://github.com/getsentry/sentry-java/pull/5200))
- - [changelog](https://github.com/abovevacant/epitaph/blob/main/CHANGELOG.md#011---2026-03-16)
- - [diff](https://github.com/abovevacant/epitaph/compare/v0.1.0...v0.1.1)
-
-## 8.35.0
-
-### Fixes
-
-- Android: Remove the dependency on protobuf-lite for tombstones ([#5157](https://github.com/getsentry/sentry-java/pull/5157))
-
-### Features
-
-- Add new experimental option to capture profiles for ANRs ([#4899](https://github.com/getsentry/sentry-java/pull/4899))
- - This feature will capture a stack profile of the main thread when it gets unresponsive
- - The profile gets attached to the ANR event on the next app start, providing a flamegraph of the ANR issue on the sentry issue details page
- - Enable via `options.setAnrProfilingSampleRate()` or AndroidManifest.xml: ``
- - The sample rate controls the probability of collecting a profile for each detected foreground ANR (0.0 to 1.0, null to disable)
-
-### Behavioral Changes
-
-- Add `enableAnrFingerprinting` option which assigns static fingerprints to ANR events with system-only stacktraces
- - When enabled, ANRs whose stacktraces contain only system frames (e.g. `java.lang` or `android.os`) are grouped into a single issue instead of creating many separate issues
- - This will help to reduce overall ANR issue noise in the Sentry dashboard
- - **IMPORTANT:** This option is enabled by default.
- - Disable via `options.setEnableAnrFingerprinting(false)` or AndroidManifest.xml: ``
-
-## 8.34.1
-
-### Fixes
-
-- Common: Finalize previous session even when auto session tracking is disabled ([#5154](https://github.com/getsentry/sentry-java/pull/5154))
-- Android: Add `filterTouchesWhenObscured` to prevent Tapjacking on user feedback dialog ([#5155](https://github.com/getsentry/sentry-java/pull/5155))
-- Android: Add proguard rules to prevent error about missing Replay classes ([#5153](https://github.com/getsentry/sentry-java/pull/5153))
-
-## 8.34.0
-
-### Features
-
-- Allow configuring shutdown and session flush timeouts externally ([#4641](https://github.com/getsentry/sentry-java/pull/4641))
- - `sentry.properties`: `shutdown-timeout-millis`, `session-flush-timeout-millis`
- - Environment variables: `SENTRY_SHUTDOWN_TIMEOUT_MILLIS`, `SENTRY_SESSION_FLUSH_TIMEOUT_MILLIS`
- - Spring Boot `application.properties`: `sentry.shutdownTimeoutMillis`, `sentry.sessionFlushTimeoutMillis`
-- Add scope-level attributes API ([#5118](https://github.com/getsentry/sentry-java/pull/5118)) via ([#5148](https://github.com/getsentry/sentry-java/pull/5148))
- - Automatically include scope attributes in logs and metrics ([#5120](https://github.com/getsentry/sentry-java/pull/5120))
- - New APIs are `Sentry.setAttribute`, `Sentry.setAttributes`, `Sentry.removeAttribute`
-- Support collections and arrays in attribute type inference ([#5124](https://github.com/getsentry/sentry-java/pull/5124))
-- Add support for `SENTRY_SAMPLE_RATE` environment variable / `sample-rate` property ([#5112](https://github.com/getsentry/sentry-java/pull/5112))
-- Create `sentry-opentelemetry-otlp` and `sentry-opentelemetry-otlp-spring` modules for combining OpenTelemetry SDK OTLP export with Sentry SDK ([#5100](https://github.com/getsentry/sentry-java/pull/5100))
- - OpenTelemetry is configured to send spans to Sentry directly using an OTLP endpoint.
- - Sentry only uses trace and span ID from OpenTelemetry (via `OpenTelemetryOtlpEventProcessor`) but will not send spans through OpenTelemetry nor use OpenTelemetry `Context` for `Scopes` propagation.
- - See the OTLP setup docs for [Java](https://docs.sentry.io/platforms/java/opentelemetry/setup/otlp/) and [Spring Boot](https://docs.sentry.io/platforms/java/guides/spring-boot/opentelemetry/setup/otlp/) for installation and configuration instructions.
-- Add screenshot masking support using view hierarchy ([#5077](https://github.com/getsentry/sentry-java/pull/5077))
- - Masks sensitive content (text, images) in error screenshots using the same view hierarchy approach as Session Replay
- - Requires the `sentry-android-replay` module to be present at runtime for masking to work
- - Enable via code:
- ```kotlin
- SentryAndroid.init(context) { options ->
- options.isAttachScreenshot = true
- options.screenshot.setMaskAllText(true)
- options.screenshot.setMaskAllImages(true)
- // Or mask specific view classes
- options.screenshot.addMaskViewClass("com.example.MyCustomView")
- }
- ```
- - Or via `AndroidManifest.xml`:
- ```xml
-
-
-
- ```
-- The `ManifestMetaDataReader` now read the `DIST` ([#5107](https://github.com/getsentry/sentry-java/pull/5107))
-
-### Fixes
-
-- Fix attribute type detection for `Long`, `Short`, `Byte`, `BigInteger`, `AtomicInteger`, and `AtomicLong` being incorrectly inferred as `double` instead of `integer` ([#5122](https://github.com/getsentry/sentry-java/pull/5122))
-- Remove `AndroidRuntimeManager` StrictMode relaxation to prevent ANRs during SDK init ([#5127](https://github.com/getsentry/sentry-java/pull/5127))
- - **IMPORTANT:** StrictMode violations may appear again in debug builds. This is intentional to prevent ANRs in production releases.
-- Fix crash when unregistering `SystemEventsBroadcastReceiver` with try-catch block. ([#5106](https://github.com/getsentry/sentry-java/pull/5106))
-- Use `peekDecorView` instead of `getDecorView` in `SentryGestureListener` to avoid forcing view hierarchy construction ([#5134](https://github.com/getsentry/sentry-java/pull/5134))
-- Log an actionable error message when Relay returns HTTP 413 (Content Too Large) ([#5115](https://github.com/getsentry/sentry-java/pull/5115))
- - Also switch the client report discard reason for all HTTP 4xx/5xx errors (except 429) from `network_error` to `send_error`
-- Trim DSN string before parsing to avoid `URISyntaxException` caused by trailing whitespace ([#5113](https://github.com/getsentry/sentry-java/pull/5113))
-- Reduce allocations and bytecode instructions during `Sentry.init` ([#5135](https://github.com/getsentry/sentry-java/pull/5135))
-
-### Dependencies
-
-- Bump Native SDK from v0.12.7 to v0.13.1 ([#5104](https://github.com/getsentry/sentry-java/pull/5104))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0131)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.12.7...0.13.1)
-
-## 8.33.0
-
-### Features
-
-- Add `installGroupsOverride` parameter to Build Distribution SDK for programmatic filtering, with support for configuration via properties file using `io.sentry.distribution.install-groups-override` ([#5066](https://github.com/getsentry/sentry-java/pull/5066))
-
-### Fixes
-
-- When merging tombstones with Native SDK, use the tombstone message if the Native SDK didn't explicitly provide one. ([#5095](https://github.com/getsentry/sentry-java/pull/5095))
-- Fix thread leak caused by eager creation of `SentryExecutorService` in `SentryOptions` ([#5093](https://github.com/getsentry/sentry-java/pull/5093))
- - There were cases where we created options that ended up unused but we failed to clean those up.
-- Attach user attributes to logs and metrics regardless of `sendDefaultPii` ([#5099](https://github.com/getsentry/sentry-java/pull/5099))
-- No longer log a warning if a logging integration cannot initialize Sentry due to missing DSN ([#5075](https://github.com/getsentry/sentry-java/pull/5075))
- - While this may have been useful to some, it caused lots of confusion.
-- Session Replay: Add `androidx.camera.view.PreviewView` to default `maskedViewClasses` to mask camera previews by default. ([#5097](https://github.com/getsentry/sentry-java/pull/5097))
-
-### Dependencies
-
-- Bump Native SDK from v0.12.4 to v0.12.7 ([#5071](https://github.com/getsentry/sentry-java/pull/5071), [#5098](https://github.com/getsentry/sentry-java/pull/5098))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0127)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.12.4...0.12.7)
-
-### Internal
-
-- Add integration to track session replay custom masking ([#5070](https://github.com/getsentry/sentry-java/pull/5070))
-
-## 8.32.0
-
-### Features
-
-- Add `installGroups` property to Build Distribution SDK ([#5062](https://github.com/getsentry/sentry-java/pull/5062))
-- Update Android targetSdk to API 36 (Android 16) ([#5016](https://github.com/getsentry/sentry-java/pull/5016))
-- Add AndroidManifest support for Spotlight configuration via `io.sentry.spotlight.enable` and `io.sentry.spotlight.url` ([#5064](https://github.com/getsentry/sentry-java/pull/5064))
-- Collect database transaction spans (`BEGIN`, `COMMIT`, `ROLLBACK`) ([#5072](https://github.com/getsentry/sentry-java/pull/5072))
- - To enable creation of these spans, set `options.enableDatabaseTransactionTracing` to `true`
- - `enable-database-transaction-tracing=true` when using `sentry.properties`
- - For Spring Boot, use `sentry.enable-database-transaction-tracing=true` in `application.properties` or in `application.yml`:
- ```yaml
- sentry:
- enable-database-transaction-tracing: true
- ```
-- Add support for collecting native crashes using Tombstones ([#4933](https://github.com/getsentry/sentry-java/pull/4933), [#5037](https://github.com/getsentry/sentry-java/pull/5037))
- - Added Tombstone integration that detects native crashes using `ApplicationExitInfo.REASON_CRASH_NATIVE` on Android 12+
- - Crashes enriched with Tombstones contain more crash details and detailed thread info
- - Tombstone and NDK integrations are now automatically merged into a single crash event, eliminating duplicate reports
- - To enable it, add the integration in your Sentry initialization:
- ```kotlin
- SentryAndroid.init(context, options -> {
- options.isTombstoneEnabled = true
- })
- ```
- or in the `AndroidManifest.xml` using:
- ```xml
-
- ```
-
-### Fixes
-
-- Extract `SpotlightIntegration` to separate `sentry-spotlight` module to prevent insecure HTTP URLs from appearing in release APKs ([#5064](https://github.com/getsentry/sentry-java/pull/5064))
- - **Breaking:** Users who enable Spotlight must now add the `io.sentry:sentry-spotlight` dependency:
- ```kotlin
- dependencies {
- debugImplementation("io.sentry:sentry-spotlight:")
- }
- ```
-- Fix scroll target detection for Jetpack Compose ([#5017](https://github.com/getsentry/sentry-java/pull/5017))
-- No longer fork Sentry `Scopes` for `reactor-kafka` consumer poll `Runnable` ([#5080](https://github.com/getsentry/sentry-java/pull/5080))
- - This was causing a memory leak because `reactor-kafka`'s poll event reschedules itself infinitely, and each invocation of `SentryScheduleHook` created forked scopes with a parent reference, building an unbounded chain that couldn't be garbage collected.
-- Fix cold/warm app start type detection for Android devices running API level 34+ ([#4999](https://github.com/getsentry/sentry-java/pull/4999))
-
-### Internal
-
-- Establish new native exception mechanisms to differentiate events generated by `sentry-native` from `ApplicationExitInfo`. ([#5052](https://github.com/getsentry/sentry-java/pull/5052))
-- Set `write` permission for `statuses` in the changelog preview GHA workflow. ([#5053](https://github.com/getsentry/sentry-java/pull/5053))
-
-### Dependencies
-
-- Bump Native SDK from v0.12.3 to v0.12.4 ([#5061](https://github.com/getsentry/sentry-java/pull/5061))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0124)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.12.3...0.12.4)
-
-## 8.31.0
-
-### Features
-
-- Added `io.sentry.ndk.sdk-name` Android manifest option to configure the native SDK's name ([#5027](https://github.com/getsentry/sentry-java/pull/5027))
-- Replace `sentry.trace.parent_span_id` attribute with `spanId` property on `SentryLogEvent` ([#5040](https://github.com/getsentry/sentry-java/pull/5040))
-
-### Fixes
-
-- Only attach user attributes to logs if `sendDefaultPii` is enabled ([#5036](https://github.com/getsentry/sentry-java/pull/5036))
-- Reject new logs if `LoggerBatchProcessor` is shutting down ([#5041](https://github.com/getsentry/sentry-java/pull/5041))
-- Downgrade protobuf-javalite dependency from 4.33.1 to 3.25.8 ([#5044](https://github.com/getsentry/sentry-java/pull/5044))
-
-### Dependencies
-
-- Bump Native SDK from v0.12.2 to v0.12.3 ([#5012](https://github.com/getsentry/sentry-java/pull/5012))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0123)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.12.2...0.12.3)
-
-## 8.30.0
-
-### Fixes
-
-- Fix ANRs when collecting device context ([#4970](https://github.com/getsentry/sentry-java/pull/4970))
- - **IMPORTANT:** This disables collecting external storage size (total/free) by default, to enable it back
- use `options.isCollectExternalStorageContext = true` or ``
-- Fix `NullPointerException` when reading ANR marker ([#4979](https://github.com/getsentry/sentry-java/pull/4979))
-- Report discarded log in batch processor as `log_byte` ([#4971](https://github.com/getsentry/sentry-java/pull/4971))
-
-### Improvements
-
-- Expose `MAX_EVENT_SIZE_BYTES` constant in SentryOptions ([#4962](https://github.com/getsentry/sentry-java/pull/4962))
-- Discard envelopes on `4xx` and `5xx` response ([#4950](https://github.com/getsentry/sentry-java/pull/4950))
- - This aims to not overwhelm Sentry after an outage or load shedding (including HTTP 429) where too many events are sent at once
-
-### Features
-
-- Add a Tombstone integration that detects native crashes without relying on the NDK integration, but instead using `ApplicationExitInfo.REASON_CRASH_NATIVE` on Android 12+. ([#4933](https://github.com/getsentry/sentry-java/pull/4933))
- - Currently exposed via options as an _internal_ API only.
- - If enabled alongside the NDK integration, crashes will be reported as two separate events. Users should enable only one; deduplication between both integrations will be added in a future release.
-- Add Sentry Metrics to Java SDK ([#5026](https://github.com/getsentry/sentry-java/pull/5026))
- - Metrics are enabled by default
- - APIs are namespaced under `Sentry.metrics()`
- - We offer the following APIs:
- - `count`: A metric that increments counts
- - `gauge`: A metric that tracks a value that can go up or down
- - `distribution`: A metric that tracks the statistical distribution of values
- - For more details, see the Metrics documentation: https://docs.sentry.io/product/explore/metrics/getting-started/
-
-## 8.29.0
-
-### Fixes
-
-- Support serialization of primitive arrays (boolean[], byte[], short[], char[], int[], long[], float[], double[]) ([#4968](https://github.com/getsentry/sentry-java/pull/4968))
-- Session Replay: Improve network body parsing and truncation handling ([#4958](https://github.com/getsentry/sentry-java/pull/4958))
-
-### Internal
-
-- Support `metric` envelope item type ([#4956](https://github.com/getsentry/sentry-java/pull/4956))
-
-## 8.28.0
-
-### Features
-
-- Android: Flush logs when app enters background ([#4951](https://github.com/getsentry/sentry-java/pull/4951))
-- Add option to capture additional OkHttp network request/response details in session replays ([#4919](https://github.com/getsentry/sentry-java/pull/4919))
- - Depends on `SentryOkHttpInterceptor` to intercept the request and extract request/response bodies
- - To enable, add url regexes via the `io.sentry.session-replay.network-detail-allow-urls` metadata tag in AndroidManifest ([code sample](https://github.com/getsentry/sentry-java/blob/b03edbb1b0d8b871c62a09bc02cbd8a4e1f6fea1/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml#L196-L205)) - Or you can manually specify SentryReplayOptions via `SentryAndroid#init`:
- _(Make sure you disable the auto init via manifest meta-data: io.sentry.auto-init=false)_
-
-
- Kotlin
-
-```kotlin
-SentryAndroid.init(
- this,
- options -> {
- // options.dsn = "https://examplePublicKey@o0.ingest.sentry.io/0"
- // options.sessionReplay.sessionSampleRate = 1.0
- // options.sessionReplay.onErrorSampleRate = 1.0
- // ..
-
- options.sessionReplay.networkDetailAllowUrls = listOf(".*")
- options.sessionReplay.networkDetailDenyUrls = listOf(".*deny.*")
- options.sessionReplay.networkRequestHeaders = listOf("Authorization", "X-Custom-Header", "X-Test-Request")
- options.sessionReplay.networkResponseHeaders = listOf("X-Response-Time", "X-Cache-Status", "X-Test-Response")
- });
-```
-
-
-
-
- Java
-
-```java
-SentryAndroid.init(
- this,
- options -> {
- options.getSessionReplay().setNetworkDetailAllowUrls(Arrays.asList(".*"));
- options.getSessionReplay().setNetworkDetailDenyUrls(Arrays.asList(".*deny.*"));
- options.getSessionReplay().setNetworkRequestHeaders(
- Arrays.asList("Authorization", "X-Custom-Header", "X-Test-Request"));
- options.getSessionReplay().setNetworkResponseHeaders(
- Arrays.asList("X-Response-Time", "X-Cache-Status", "X-Test-Response"));
- });
-
-```
-
-
-
-### Improvements
-
-- Avoid forking `rootScopes` for Reactor if current thread has `NoOpScopes` ([#4793](https://github.com/getsentry/sentry-java/pull/4793))
- - This reduces the SDKs overhead by avoiding unnecessary scope forks
-
-### Fixes
-
-- Fix missing thread stacks for ANRv1 events ([#4918](https://github.com/getsentry/sentry-java/pull/4918))
-- Fix handling of unparseable mime-type on request filter ([#4939](https://github.com/getsentry/sentry-java/pull/4939))
-
-### Internal
-
-- Support `span` envelope item type ([#4935](https://github.com/getsentry/sentry-java/pull/4935))
-
-### Dependencies
-
-- Bump Native SDK from v0.12.1 to v0.12.2 ([#4944](https://github.com/getsentry/sentry-java/pull/4944))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0122)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.12.1...0.12.2)
-
-## 8.27.1
-
-### Fixes
-
-- Do not log if `sentry.properties` in rundir has not been found ([#4929](https://github.com/getsentry/sentry-java/pull/4929))
-
-## 8.27.0
-
-### Features
-
-- Implement OpenFeature Integration that tracks Feature Flag evaluations ([#4910](https://github.com/getsentry/sentry-java/pull/4910))
- - To make use of it, add the `sentry-openfeature` dependency and register the the hook using: `openFeatureApiInstance.addHooks(new SentryOpenFeatureHook());`
-- Implement LaunchDarkly Integrations that track Feature Flag evaluations ([#4917](https://github.com/getsentry/sentry-java/pull/4917))
- - For Android, please add `sentry-launchdarkly-android` as a dependency and register the `SentryLaunchDarklyAndroidHook`
- - For Server / JVM, please add `sentry-launchdarkly-server` as a dependency and register the `SentryLaunchDarklyServerHook`
-- Detect oversized events and reduce their size ([#4903](https://github.com/getsentry/sentry-java/pull/4903))
- - You can opt into this new behaviour by setting `enableEventSizeLimiting` to `true` (`sentry.enable-event-size-limiting=true` for Spring Boot `application.properties`)
- - You may optionally register an `onOversizedEvent` callback to implement custom logic that is executed in case an oversized event is detected
- - This is executed first and if event size was reduced sufficiently, no further truncation is performed
- - 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
-
-### Improvements
-
-- Do not send manual log origin ([#4897](https://github.com/getsentry/sentry-java/pull/4897))
-
-### Dependencies
-
-- Bump Spring Boot 4 to GA ([#4923](https://github.com/getsentry/sentry-java/pull/4923))
-
-## 8.26.0
-
-### Features
-
-- Add feature flags API ([#4812](https://github.com/getsentry/sentry-java/pull/4812)) and ([#4831](https://github.com/getsentry/sentry-java/pull/4831))
- - You may now keep track of your feature flag evaluations and have them show up in Sentry.
- - Top level API (`Sentry.addFeatureFlag("my-feature-flag", true);`) writes to scopes and the current span (if there is one)
- - It is also possible to use API on `IScope`, `IScopes`, `ISpan` and `ITransaction` directly
- - Feature flag evaluations tracked on scope(s) will be added to any errors reported to Sentry.
- - The SDK keeps the latest 100 evaluations from scope(s), replacing old entries as new evaluations are added.
- - For feature flag evaluations tracked on spans:
- - Only 10 evaluations are tracked per span, existing flags are updated but new ones exceeding the limit are ignored
- - Spans do not inherit evaluations from their parent
-- Drop log events once buffer hits hard limit ([#4889](https://github.com/getsentry/sentry-java/pull/4889))
- - If we have 1000 log events queued up, we drop any new logs coming in to prevent OOM
-- Remove vendored code and upgrade to async profiler 4.2 ([#4856](https://github.com/getsentry/sentry-java/pull/4856))
- - This adds support for JDK 23+
-
-### Fixes
-
-- Removed SentryExecutorService limit for delayed scheduled tasks ([#4846](https://github.com/getsentry/sentry-java/pull/4846))
-- Fix visual artifacts for the Canvas strategy on some devices ([#4861](https://github.com/getsentry/sentry-java/pull/4861))
-- [Config] Trim whitespace on properties path ([#4880](https://github.com/getsentry/sentry-java/pull/4880))
-- Only set `DefaultReplayBreadcrumbConverter` if replay is available ([#4888](https://github.com/getsentry/sentry-java/pull/4888))
-- Session Replay: Cache connection status instead of using blocking calls ([#4891](https://github.com/getsentry/sentry-java/pull/4891))
-- Fix log count in client reports ([#4869](https://github.com/getsentry/sentry-java/pull/4869))
-- Fix profilerId propagation ([#4833](https://github.com/getsentry/sentry-java/pull/4833))
-- Fix profiling init for Spring and Spring Boot w Agent auto-init ([#4815](https://github.com/getsentry/sentry-java/pull/4815))
-- Copy active span on scope clone ([#4878](https://github.com/getsentry/sentry-java/pull/4878))
-
-### Improvements
-
-- Fallback to distinct-id as user.id logging attribute when user is not set ([#4847](https://github.com/getsentry/sentry-java/pull/4847))
-- Report Timber.tag() as `timber.tag` log attribute ([#4845](https://github.com/getsentry/sentry-java/pull/4845))
-- Session Replay: Add screenshot strategy serialization to RRWeb events ([#4851](https://github.com/getsentry/sentry-java/pull/4851))
-- Report discarded log bytes ([#4871](https://github.com/getsentry/sentry-java/pull/4871))
-- Log why a properties file was not loaded ([#4879](https://github.com/getsentry/sentry-java/pull/4879))
-
-### Dependencies
-
-- Bump Native SDK from v0.11.3 to v0.12.1 ([#4859](https://github.com/getsentry/sentry-java/pull/4859))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0121)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.11.3...0.12.1)
-- Bump Spring Boot 4 to RC2 ([#4886](https://github.com/getsentry/sentry-java/pull/4886))
-
-## 8.25.0
-
-### Fixes
-
-- [ANR] Removed AndroidTransactionProfiler lock ([#4817](https://github.com/getsentry/sentry-java/pull/4817))
-- Avoid ExecutorService for DefaultCompositePerformanceCollector timeout ([#4841](https://github.com/getsentry/sentry-java/pull/4841))
- - This avoids infinite data collection for never stopped transactions, leading to OOMs
-- Fix wrong .super() call in SentryTimberTree ([#4844](https://github.com/getsentry/sentry-java/pull/4844))
-
-### Improvements
-
-- [ANR] Defer some class availability checks ([#4825](https://github.com/getsentry/sentry-java/pull/4825))
-- Collect PerformanceCollectionData only for sampled transactions ([#4834](https://github.com/getsentry/sentry-java/pull/4834))
- - **Breaking change**: Transactions with a deferred sampling decision (`sampled == null`) won't be collecting any performance data anymore (CPU, RAM, slow/frozen frames).
-
-### Dependencies
-
-- Bump Native SDK from v0.11.2 to v0.11.3 ([#4810](https://github.com/getsentry/sentry-java/pull/4810))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0113)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.11.2...0.11.3)
-
-## 8.24.0
-
-### Features
-
-- Attach MDC properties to logs as attributes ([#4786](https://github.com/getsentry/sentry-java/pull/4786))
- - MDC properties set using supported logging frameworks (Logback, Log4j2, java.util.Logging) are now attached to structured logs as attributes.
- - The attribute reflected on the log is `mdc.`, where `` is the original key in the MDC.
- - This means that you will be able to filter/aggregate logs in the product based on these properties.
- - Only properties with keys matching the configured `contextTags` are sent as log attributes.
- - You can configure which properties are sent using `options.setContextTags` if initalizing manually, or by specifying a comma-separated list of keys with a `context-tags` entry in `sentry.properties` or `sentry.context-tags` in `application.properties`.
- - Note that keys containing spaces are not supported.
-- Add experimental Sentry Android Distribution module for integrating with Sentry Build Distribution to check for and install updates ([#4804](https://github.com/getsentry/sentry-java/pull/4804))
-- Allow passing a different `Handler` to `SystemEventsBreadcrumbsIntegration` and `AndroidConnectionStatusProvider` so their callbacks are deliver to that handler ([#4808](https://github.com/getsentry/sentry-java/pull/4808))
-- Session Replay: Add new _experimental_ Canvas Capture Strategy ([#4777](https://github.com/getsentry/sentry-java/pull/4777))
- - A new screenshot capture strategy that uses Android's Canvas API for more accurate and reliable text and image masking
- - Any `.drawText()` or `.drawBitmap()` calls are replaced by rectangles, ensuring no text or images are present in the resulting output
- - Note: If this strategy is used, all text and images will be masked, regardless of any masking configuration
- - To enable this feature, set the `screenshotStrategy`, either via code:
- ```kotlin
- SentryAndroid.init(context) { options ->
- options.sessionReplay.screenshotStrategy = ScreenshotStrategyType.CANVAS
- }
- ```
- or AndroidManifest.xml:
- ```xml
-
-
-
- ```
-
-### Fixes
-
-- Avoid StrictMode warnings ([#4724](https://github.com/getsentry/sentry-java/pull/4724))
-- Use logger from options for JVM profiler ([#4771](https://github.com/getsentry/sentry-java/pull/4771))
-- Session Replay: Avoid deadlock when pausing replay if no connection ([#4788](https://github.com/getsentry/sentry-java/pull/4788))
-- Session Replay: Fix capturing roots with no windows ([#4805](https://github.com/getsentry/sentry-java/pull/4805))
-- Session Replay: Fix `java.lang.IllegalArgumentException: width and height must be > 0` ([#4805](https://github.com/getsentry/sentry-java/pull/4805))
-- Handle `NoOpScopes` in `Context` when starting a span through OpenTelemetry ([#4823](https://github.com/getsentry/sentry-java/pull/4823))
- - This fixes "java.lang.IllegalArgumentException: The DSN is required" when combining WebFlux and OpenTelemetry
-- Session Replay: Do not use recycled screenshots for masking ([#4790](https://github.com/getsentry/sentry-java/pull/4790))
- - This fixes native crashes seen in `Canvas.`/`ScreenshotRecorder.capture`
-- Session Replay: Ensure bitmaps are recycled properly ([#4820](https://github.com/getsentry/sentry-java/pull/4820))
-
-### Miscellaneous
-
-- Mark SentryClient(SentryOptions) constructor as not internal ([#4787](https://github.com/getsentry/sentry-java/pull/4787))
-
-### Dependencies
-
-- Bump Native SDK from v0.10.1 to v0.11.2 ([#4775](https://github.com/getsentry/sentry-java/pull/4775))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0112)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.10.1...0.11.2)
-
-## 8.23.0
-
-### Features
-
-- Add session replay id to Sentry Logs ([#4740](https://github.com/getsentry/sentry-java/pull/4740))
-- Add support for continuous profiling of JVM applications on macOS and Linux ([#4556](https://github.com/getsentry/sentry-java/pull/4556))
- - [Sentry continuous profiling](https://docs.sentry.io/product/explore/profiling/) on the JVM is using async-profiler under the hood.
- - By default this feature is disabled. Set a profile sample rate and chose a lifecycle (see below) to enable it.
- - Add the `sentry-async-profiler` dependency to your project
- - Set a sample rate for profiles, e.g. `1.0` to send all of them. You may use `options.setProfileSessionSampleRate(1.0)` in code or `profile-session-sample-rate=1.0` in `sentry.properties`
- - Set a profile lifecycle via `options.setProfileLifecycle(ProfileLifecycle.TRACE)` in code or `profile-lifecycle=TRACE` in `sentry.properties`
- - By default the lifecycle is set to `MANUAL`, meaning you have to explicitly call `Sentry.startProfiler()` and `Sentry.stopProfiler()`
- - You may change it to `TRACE` which will create a profile for each transaction
- - To automatically upload Profiles for each transaction in a Spring Boot application
- - set `sentry.profile-session-sample-rate=1.0` and `sentry.profile-lifecycle=TRACE` in `application.properties`
- - or set `sentry.profile-session-sample-rate: 1.0` and `sentry.profile-lifecycle: TRACE` in `application.yml`
- - Profiling can also be combined with our OpenTelemetry integration
-
-### Fixes
-
-- Start performance collection on AppStart continuous profiling ([#4752](https://github.com/getsentry/sentry-java/pull/4752))
-- Preserve modifiers in `SentryTraced` ([#4757](https://github.com/getsentry/sentry-java/pull/4757))
-
-### Improvements
-
-- Handle `RejectedExecutionException` everywhere ([#4747](https://github.com/getsentry/sentry-java/pull/4747))
-- Mark `SentryEnvelope` as not internal ([#4748](https://github.com/getsentry/sentry-java/pull/4748))
-
-## 8.22.0
-
-### Features
-
-- Move SentryLogs out of experimental ([#4710](https://github.com/getsentry/sentry-java/pull/4710))
-- Add support for w3c traceparent header ([#4671](https://github.com/getsentry/sentry-java/pull/4671))
- - This feature is disabled by default. If enabled, outgoing requests will include the w3c `traceparent` header.
- - See https://develop.sentry.dev/sdk/telemetry/traces/distributed-tracing/#w3c-trace-context-header for more details.
- ```kotlin
- Sentry(Android).init(context) { options ->
- // ...
- options.isPropagateTraceparent = true
- }
- ```
-- Sentry now supports Spring Boot 4 M3 pre-release ([#4739](https://github.com/getsentry/sentry-java/pull/4739))
-
-### Improvements
-
-- Remove internal API status from get/setDistinctId ([#4708](https://github.com/getsentry/sentry-java/pull/4708))
-- Remove ApiStatus.Experimental annotation from check-in API ([#4721](https://github.com/getsentry/sentry-java/pull/4721))
-
-### Fixes
-
-- Session Replay: Fix `NoSuchElementException` in `BufferCaptureStrategy` ([#4717](https://github.com/getsentry/sentry-java/pull/4717))
-- Session Replay: Fix continue recording in Session mode after Buffer is triggered ([#4719](https://github.com/getsentry/sentry-java/pull/4719))
-
-### Dependencies
-
-- Bump Native SDK from v0.10.0 to v0.10.1 ([#4695](https://github.com/getsentry/sentry-java/pull/4695))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0101)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.10.0...0.10.1)
-
-## 8.21.1
-
-### Fixes
-
-- Use Kotlin stdlib 1.9.24 dependency instead of 2.2.0 for all Android modules ([#4707](https://github.com/getsentry/sentry-java/pull/4707))
- - This fixes compile time issues if your app is using Kotlin < 2.x
-
-## 8.21.0
-
-### Fixes
-
-- Only set log template for logging integrations if formatted message differs from template ([#4682](https://github.com/getsentry/sentry-java/pull/4682))
-
-### Features
-
-- Add support for Spring Boot 4 and Spring 7 ([#4601](https://github.com/getsentry/sentry-java/pull/4601))
- - NOTE: Our `sentry-opentelemetry-agentless-spring` is not working yet for Spring Boot 4. Please use `sentry-opentelemetry-agent` until OpenTelemetry has support for Spring Boot 4.
-- Replace `UUIDGenerator` implementation with Apache licensed code ([#4662](https://github.com/getsentry/sentry-java/pull/4662))
-- Replace `Random` implementation with MIT licensed code ([#4664](https://github.com/getsentry/sentry-java/pull/4664))
-- Add support for `vars` attribute in `SentryStackFrame` ([#4686](https://github.com/getsentry/sentry-java/pull/4686))
- - **Breaking change**: The type of the `vars` attribute has been changed from `Map` to `Map`.
-
-## 8.20.0
-
-### Fixes
-
-- Do not use named capturing groups for regular expressions ([#4652](https://github.com/getsentry/sentry-java/pull/4652))
- - This fixes a crash on Android versions below 8.0 (API level 26)
-
-### Features
-
-- Add onDiscard to enable users to track the type and amount of data discarded before reaching Sentry ([#4612](https://github.com/getsentry/sentry-java/pull/4612))
- - Stub for setting the callback on `Sentry.init`:
- ```java
- Sentry.init(options -> {
- ...
- options.setOnDiscard(
- (reason, category, number) -> {
- // Your logic to process discarded data
- });
- });
- ```
-
-## 8.19.1
-
-> [!Warning]
-> Android: This release is incompatible with API levels below 26. We recommend using SDK version 8.20.0 or higher instead.
-
-### Fixes
-
-- Do not store No-Op scopes onto OpenTelemetry Context when wrapping ([#4631](https://github.com/getsentry/sentry-java/pull/4631))
- - In 8.18.0 and 8.19.0 the SDK could break when initialized too late.
-
-## 8.19.0
-
-> [!Warning]
-> Android: This release is incompatible with API levels below 26. We recommend using SDK version 8.20.0 or higher instead.
-
-### Features
-
-- Add a `isEnableSystemEventBreadcrumbsExtras` option to disable reporting system events extras for breadcrumbs ([#4625](https://github.com/getsentry/sentry-java/pull/4625))
-
-### Improvements
-
-- Session Replay: Use main thread looper to schedule replay capture ([#4542](https://github.com/getsentry/sentry-java/pull/4542))
-- Use single `LifecycleObserver` and multi-cast it to the integrations interested in lifecycle states ([#4567](https://github.com/getsentry/sentry-java/pull/4567))
-- Add `sentry.origin` attribute to logs ([#4618](https://github.com/getsentry/sentry-java/pull/4618))
- - This helps identify which integration captured a log event
-- Prewarm `SentryExecutorService` for better performance at runtime ([#4606](https://github.com/getsentry/sentry-java/pull/4606))
-
-### Fixes
-
-- Cache network capabilities and status to reduce IPC calls ([#4560](https://github.com/getsentry/sentry-java/pull/4560))
-- Deduplicate battery breadcrumbs ([#4561](https://github.com/getsentry/sentry-java/pull/4561))
-- Remove unused method in ManifestMetadataReader ([#4585](https://github.com/getsentry/sentry-java/pull/4585))
-- Have single `NetworkCallback` registered at a time to reduce IPC calls ([#4562](https://github.com/getsentry/sentry-java/pull/4562))
-- Do not register for SystemEvents and NetworkCallbacks immediately when launched with non-foreground importance ([#4579](https://github.com/getsentry/sentry-java/pull/4579))
-- Limit ProGuard keep rules for native methods within `sentry-android-ndk` to the `io.sentry.**` namespace. ([#4427](https://github.com/getsentry/sentry-java/pull/4427))
- - If you relied on the Sentry SDK to keep native method names for JNI compatibility within your namespace, please review your ProGuard rules and ensure the configuration still works. Especially when you're not consuming any of the default Android proguard rules (`proguard-android.txt` or `proguard-android-optimize.txt`) the following config should be present:
- ```
- -keepclasseswithmembernames class * {
- native ;
- }
- ```
-- Fix abstract method error in `SentrySupportSQLiteDatabase` ([#4597](https://github.com/getsentry/sentry-java/pull/4597))
-- Ensure frame metrics listeners are registered/unregistered on the main thread ([#4582](https://github.com/getsentry/sentry-java/pull/4582))
-- Do not report cached events as lost ([#4575](https://github.com/getsentry/sentry-java/pull/4575))
- - Previously events were recorded as lost early despite being retried later through the cache
-- Move and flush unfinished previous session on init ([#4624](https://github.com/getsentry/sentry-java/pull/4624))
- - This removes the need for unnecessary blocking our background queue for 15 seconds in the case of a background app start
-- Switch to compileOnly dependency for compose-ui-material ([#4630](https://github.com/getsentry/sentry-java/pull/4630))
- - This fixes `StackOverflowError` when using OSS Licenses plugin
-
-### Dependencies
-
-- Bump Native SDK from v0.8.4 to v0.10.0 ([#4623](https://github.com/getsentry/sentry-java/pull/4623))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0100)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.8.4...0.10.0)
-
-## 8.18.0
-
-### Features
-
-- Add `SentryUserFeedbackButton` Composable ([#4559](https://github.com/getsentry/sentry-java/pull/4559))
- - Also added `Sentry.showUserFeedbackDialog` static method
-- Add deadlineTimeout option ([#4555](https://github.com/getsentry/sentry-java/pull/4555))
-- Add Ktor client integration ([#4527](https://github.com/getsentry/sentry-java/pull/4527))
- - To use the integration, add a dependency on `io.sentry:sentry-ktor-client`, then install the `SentryKtorClientPlugin` on your `HttpClient`,
- e.g.:
- ```kotlin
- val client =
- HttpClient(Java) {
- install(io.sentry.ktorClient.SentryKtorClientPlugin) {
- captureFailedRequests = true
- failedRequestTargets = listOf(".*")
- failedRequestStatusCodes = listOf(HttpStatusCodeRange(500, 599))
- }
- }
- ```
-
-### Fixes
-
-- Allow multiple UncaughtExceptionHandlerIntegrations to be active at the same time ([#4462](https://github.com/getsentry/sentry-java/pull/4462))
-- Prevent repeated scroll target determination during a single scroll gesture ([#4557](https://github.com/getsentry/sentry-java/pull/4557))
- - This should reduce the number of ANRs seen in `SentryGestureListener`
-- Do not use Sentry logging API in JUL if logs are disabled ([#4574](https://github.com/getsentry/sentry-java/pull/4574))
- - This was causing Sentry SDK to log warnings: "Sentry Log is disabled and this 'logger' call is a no-op."
-- Do not use Sentry logging API in Log4j2 if logs are disabled ([#4573](https://github.com/getsentry/sentry-java/pull/4573))
- - This was causing Sentry SDK to log warnings: "Sentry Log is disabled and this 'logger' call is a no-op."
-- SDKs send queue is no longer shutdown immediately on re-init ([#4564](https://github.com/getsentry/sentry-java/pull/4564))
- - This means we're no longer losing events that have been enqueued right before SDK re-init.
-- Reduce scope forking when using OpenTelemetry ([#4565](https://github.com/getsentry/sentry-java/pull/4565))
- - `Sentry.withScope` now has the correct current scope passed to the callback. Previously our OpenTelemetry integration forked scopes an additional.
- - Overall the SDK is now forking scopes a bit less often.
-
-## 8.17.0
-
-### Features
-
-- Send Timber logs through Sentry Logs ([#4490](https://github.com/getsentry/sentry-java/pull/4490))
- - Enable the Logs feature in your `SentryOptions` or with the `io.sentry.logs.enabled` manifest option and the SDK will automatically send Timber logs to Sentry, if the TimberIntegration is enabled.
- - The SDK will automatically detect Timber and use it to send logs to Sentry.
-- Send logcat through Sentry Logs ([#4487](https://github.com/getsentry/sentry-java/pull/4487))
- - Enable the Logs feature in your `SentryOptions` or with the `io.sentry.logs.enabled` manifest option and the SDK will automatically send logcat logs to Sentry, if the Sentry Android Gradle plugin is applied.
- - To set the logcat level check the [Logcat integration documentation](https://docs.sentry.io/platforms/android/integrations/logcat/#configure).
-- Read build tool info from `sentry-debug-meta.properties` and attach it to events ([#4314](https://github.com/getsentry/sentry-java/pull/4314))
-
-### Dependencies
-
-- Bump OpenTelemetry ([#4532](https://github.com/getsentry/sentry-java/pull/4532))
- - `opentelemetry-sdk` to `1.51.0`
- - `opentelemetry-instrumentation` to `2.17.0`
- - `opentelemetry-javaagent` to `2.17.0`
- - `opentelemetry-semconv` to `1.34.0`
- - We are now configuring OpenTelemetry to still behave the same way it did before for span names it generates in GraphQL auto instrumentation ([#4537](https://github.com/getsentry/sentry-java/pull/4537))
-- Bump Gradle from v8.14.2 to v8.14.3 ([#4540](https://github.com/getsentry/sentry-java/pull/4540))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8143)
- - [diff](https://github.com/gradle/gradle/compare/v8.14.2...v8.14.3)
-
-### Fixes
-
-- Use Spring Boot Starter 3 in `sentry-spring-boot-starter-jakarta` ([#4545](https://github.com/getsentry/sentry-java/pull/4545))
- - While refactoring our dependency management, we accidentally added Spring Boot 2 and Spring Boot Starter 2 as dependencies of `sentry-spring-boot-starter-jakarta`, which is intended for Spring Boot 3.
- - Now, the correct dependencies (Spring Boot 3 and Spring Boot Starter 3) are being added.
-
-## 8.16.1-alpha.2
-
-### Fixes
-
-- Optimize scope when maxBreadcrumb is 0 ([#4504](https://github.com/getsentry/sentry-java/pull/4504))
-- Fix javadoc on TransportResult ([#4528](https://github.com/getsentry/sentry-java/pull/4528))
-- Session Replay: Fix `IllegalArgumentException` when `Bitmap` is initialized with non-positive values ([#4536](https://github.com/getsentry/sentry-java/pull/4536))
-- Set thread information on transaction from OpenTelemetry attributes ([#4478](https://github.com/getsentry/sentry-java/pull/4478))
-
-### Internal
-
-- Flattened PerformanceCollectionData ([#4505](https://github.com/getsentry/sentry-java/pull/4505))
-
-## 8.16.0
-
-### Features
-
-- Send JUL logs to Sentry as logs ([#4518](https://github.com/getsentry/sentry-java/pull/4518))
- - You need to enable the logs feature, either in `sentry.properties`:
- ```properties
- logs.enabled=true
- ```
- - Or, if you manually initialize Sentry, you may also enable logs on `Sentry.init`:
- ```java
- Sentry.init(options -> {
- ...
- options.getLogs().setEnabled(true);
- });
- ```
- - It is also possible to set the `minimumLevel` in `logging.properties`, meaning any log message >= the configured level will be sent to Sentry and show up under Logs:
- ```properties
- io.sentry.jul.SentryHandler.minimumLevel=CONFIG
- ```
-- Send Log4j2 logs to Sentry as logs ([#4517](https://github.com/getsentry/sentry-java/pull/4517))
- - You need to enable the logs feature either in `sentry.properties`:
- ```properties
- logs.enabled=true
- ```
- - If you manually initialize Sentry, you may also enable logs on `Sentry.init`:
- ```java
- Sentry.init(options -> {
- ...
- options.getLogs().setEnabled(true);
- });
- ```
- - It is also possible to set the `minimumLevel` in `log4j2.xml`, meaning any log message >= the configured level will be sent to Sentry and show up under Logs:
- ```xml
-
- ```
-
-## 8.15.1
-
-### Fixes
-
-- Enabling Sentry Logs through Logback in Spring Boot config did not work in 3.15.0 ([#4523](https://github.com/getsentry/sentry-java/pull/4523))
-
-## 8.15.0
-
-### Features
-
-- Add chipset to device context ([#4512](https://github.com/getsentry/sentry-java/pull/4512))
-
-### Fixes
-
-- No longer send out empty log envelopes ([#4497](https://github.com/getsentry/sentry-java/pull/4497))
-- Session Replay: Expand fix for crash on devices to all Unisoc/Spreadtrum chipsets ([#4510](https://github.com/getsentry/sentry-java/pull/4510))
-- Log parameter objects are now turned into `String` via `toString` ([#4515](https://github.com/getsentry/sentry-java/pull/4515))
- - One of the two `SentryLogEventAttributeValue` constructors did not convert the value previously.
-- Logs are now flushed on shutdown ([#4503](https://github.com/getsentry/sentry-java/pull/4503))
-- User Feedback: Do not redefine system attributes for `SentryUserFeedbackButton`, but reference them instead ([#4519](https://github.com/getsentry/sentry-java/pull/4519))
-
-### Features
-
-- Send Logback logs to Sentry as logs ([#4502](https://github.com/getsentry/sentry-java/pull/4502))
- - You need to enable the logs feature and can also set the `minimumLevel` for log events:
- ```xml
-
-
-
- https://502f25099c204a2fbf4cb16edc5975d1@o447951.ingest.sentry.io/5428563
-
- true
-
-
-
-
- WARN
-
- DEBUG
-
- INFO
-
- ```
- - For Spring Boot you may also enable it in `application.properties` / `application.yml`:
- ```properties
- sentry.logs.enabled=true
- sentry.logging.minimum-level=error
- ```
- - If you manually initialize Sentry, you may also enable logs on `Sentry.init`:
- ```java
- Sentry.init(options -> {
- ...
- options.getLogs().setEnabled(true);
- });
- ```
- - Enabling via `sentry.properties` is also possible:
- ```properties
- logs.enabled=true
- ```
-- Automatically use `SentryOptions.Logs.BeforeSendLogCallback` Spring beans ([#4509](https://github.com/getsentry/sentry-java/pull/4509))
-
-### Dependencies
-
-- Bump Gradle from v8.14.1 to v8.14.2 ([#4473](https://github.com/getsentry/sentry-java/pull/4473))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8142)
- - [diff](https://github.com/gradle/gradle/compare/v8.14.1...v8.14.2)
-
-## 8.14.0
-
-### Fixes
-
-- Fix Session Replay masking for newer versions of Jetpack Compose (1.8+) ([#4485](https://github.com/getsentry/sentry-java/pull/4485))
-
-### Features
-
-- Add New User Feedback Widget ([#4450](https://github.com/getsentry/sentry-java/pull/4450))
- - This widget is a custom button that can be used to show the user feedback form
-- Add New User Feedback form ([#4384](https://github.com/getsentry/sentry-java/pull/4384))
- - We now introduce SentryUserFeedbackDialog, which extends AlertDialog, inheriting the show() and cancel() methods, among others.
- To use it, just instantiate it and call show() on the instance (Sentry must be previously initialized).
- For customization options, please check the [User Feedback documentation](https://docs.sentry.io/platforms/android/user-feedback/configuration/).
-
- ```java
- import io.sentry.android.core.SentryUserFeedbackDialog;
-
- new SentryUserFeedbackDialog.Builder(context).create().show();
- ```
-
- ```kotlin
- import io.sentry.android.core.SentryUserFeedbackDialog
-
- SentryUserFeedbackDialog.Builder(context).create().show()
- ```
-
-- Add `user.id`, `user.name` and `user.email` to log attributes ([#4486](https://github.com/getsentry/sentry-java/pull/4486))
-- User `name` attribute has been deprecated, please use `username` instead ([#4486](https://github.com/getsentry/sentry-java/pull/4486))
-- Add device (`device.brand`, `device.model` and `device.family`) and OS (`os.name` and `os.version`) attributes to logs ([#4493](https://github.com/getsentry/sentry-java/pull/4493))
-- Serialize `preContext` and `postContext` in `SentryStackFrame` ([#4482](https://github.com/getsentry/sentry-java/pull/4482))
-
-### Internal
-
-- User Feedback now uses SentryUser.username instead of SentryUser.name ([#4494](https://github.com/getsentry/sentry-java/pull/4494))
-
-## 8.13.3
-
-### Fixes
-
-- Send UI Profiling app start chunk when it finishes ([#4423](https://github.com/getsentry/sentry-java/pull/4423))
-- Republish Javadoc [#4457](https://github.com/getsentry/sentry-java/pull/4457)
-- Finalize `OkHttpEvent` even if no active span in `SentryOkHttpInterceptor` [#4469](https://github.com/getsentry/sentry-java/pull/4469)
-- Session Replay: Do not capture current replay for cached events from the past ([#4474](https://github.com/getsentry/sentry-java/pull/4474))
-- Session Replay: Correctly capture Dialogs and non full-sized windows ([#4354](https://github.com/getsentry/sentry-java/pull/4354))
-- Session Replay: Fix inconsistent `segment_id` ([#4471](https://github.com/getsentry/sentry-java/pull/4471))
-- Session Replay: Fix crash on devices with the Unisoc/Spreadtrum T606 chipset ([#4477](https://github.com/getsentry/sentry-java/pull/4477))
-
-## 8.13.2
-
-### Fixes
-
-- Don't apply Spring Boot plugin in `sentry-spring-boot-jakarta` ([#4456](https://github.com/getsentry/sentry-java/pull/4456))
- - The jar for `io.sentry:sentry-spring-boot-jakarta` is now correctly being built and published to Maven Central.
-
-## 8.13.1
-
-### Fixes
-
-- Fix `SentryAndroid.init` crash if SDK is initialized from a background thread while an `Activity` is in resumed state ([#4449](https://github.com/getsentry/sentry-java/pull/4449))
-
-### Dependencies
-
-- Bump Gradle from v8.14 to v8.14.1 ([#4437](https://github.com/getsentry/sentry-java/pull/4437))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8141)
- - [diff](https://github.com/gradle/gradle/compare/v8.14...v8.14.1)
-
-## 8.13.0
-
-### Features
-
-- Add debug mode for Session Replay masking ([#4357](https://github.com/getsentry/sentry-java/pull/4357))
- - Use `Sentry.replay().enableDebugMaskingOverlay()` to overlay the screen with the Session Replay masks.
- - The masks will be invalidated at most once per `frameRate` (default 1 fps).
-- Extend Logs API to allow passing in `attributes` ([#4402](https://github.com/getsentry/sentry-java/pull/4402))
- - `Sentry.logger.log` now takes a `SentryLogParameters`
- - Use `SentryLogParameters.create(SentryAttributes.of(...))` to pass attributes
- - Attribute values may be of type `string`, `boolean`, `integer` or `double`.
- - Other types will be converted to `string`. Currently we simply call `toString()` but we might offer more in the future.
- - You may manually flatten complex types into multiple separate attributes of simple types.
- - e.g. intead of `SentryAttribute.named("point", Point(10, 20))` you may store it as `SentryAttribute.integerAttribute("point.x", point.x)` and `SentryAttribute.integerAttribute("point.y", point.y)`
- - `SentryAttribute.named()` will automatically infer the type or fall back to `string`.
- - `SentryAttribute.booleanAttribute()` takes a `Boolean` value
- - `SentryAttribute.integerAttribute()` takes a `Integer` value
- - `SentryAttribute.doubleAttribute()` takes a `Double` value
- - `SentryAttribute.stringAttribute()` takes a `String` value
- - We opted for handling parameters via `SentryLogParameters` to avoid creating tons of overloads that are ambiguous.
-
-### Fixes
-
-- Isolation scope is now forked in `OtelSentrySpanProcessor` instead of `OtelSentryPropagator` ([#4434](https://github.com/getsentry/sentry-java/pull/4434))
- - Since propagator may never be invoked we moved the location where isolation scope is forked.
- - Not invoking `OtelSentryPropagator.extract` or having a `sentry-trace` header that failed to parse would cause isolation scope not to be forked.
- - This in turn caused data to bleed between scopes, e.g. from one request into another
-
-### Dependencies
-
-- Bump Spring Boot to `3.5.0` ([#4111](https://github.com/getsentry/sentry-java/pull/4111))
-
-## 8.12.0
-
-### Features
-
-- Add new User Feedback API ([#4286](https://github.com/getsentry/sentry-java/pull/4286))
- - We now introduced Sentry.captureFeedback, which supersedes Sentry.captureUserFeedback
-- Add Sentry Log Feature ([#4372](https://github.com/getsentry/sentry-java/pull/4372))
- - The feature is disabled by default and needs to be enabled by:
- - `options.getLogs().setEnabled(true)` in `Sentry.init` / `SentryAndroid.init`
- - `` in `AndroidManifest.xml`
- - `logs.enabled=true` in `sentry.properties`
- - `sentry.logs.enabled=true` in `application.properties`
- - `sentry.logs.enabled: true` in `application.yml`
- - Logs can be captured using `Sentry.logger().info()` and similar methods.
- - Logs also take a format string and arguments which we then send through `String.format`.
- - Please use `options.getLogs().setBeforeSend()` to filter outgoing logs
-
-### Fixes
-
-- Hook User Interaction integration into running Activity in case of deferred SDK init ([#4337](https://github.com/getsentry/sentry-java/pull/4337))
-
-### Dependencies
-
-- Bump Gradle from v8.13 to v8.14.0 ([#4360](https://github.com/getsentry/sentry-java/pull/4360))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8140)
- - [diff](https://github.com/gradle/gradle/compare/v8.13...v8.14.0)
-
-## 8.11.1
-
-### Fixes
-
-- Fix Android profile chunk envelope type for UI Profiling ([#4366](https://github.com/getsentry/sentry-java/pull/4366))
-
-## 8.11.0
-
-### Features
-
-- Make `RequestDetailsResolver` public ([#4326](https://github.com/getsentry/sentry-java/pull/4326))
- - `RequestDetailsResolver` is now public and has an additional constructor, making it easier to use a custom `TransportFactory`
-
-### Fixes
-
-- Session Replay: Fix masking of non-styled `Text` Composables ([#4361](https://github.com/getsentry/sentry-java/pull/4361))
-- Session Replay: Fix masking read-only `TextField` Composables ([#4362](https://github.com/getsentry/sentry-java/pull/4362))
-
-## 8.10.0
-
-### Features
-
-- Wrap configured OpenTelemetry `ContextStorageProvider` if available ([#4359](https://github.com/getsentry/sentry-java/pull/4359))
- - This is only relevant if you see `java.lang.IllegalStateException: Found multiple ContextStorageProvider. Set the io.opentelemetry.context.ContextStorageProvider property to the fully qualified class name of the provider to use. Falling back to default ContextStorage. Found providers: ...`
- - Set `-Dio.opentelemetry.context.contextStorageProvider=io.sentry.opentelemetry.SentryContextStorageProvider` on your `java` command
- - Sentry will then wrap the other `ContextStorageProvider` that has been configured by loading it through SPI
- - If no other `ContextStorageProvider` is available or there are problems loading it, we fall back to using `SentryOtelThreadLocalStorage`
-
-### Fixes
-
-- Update profile chunk rate limit and client report ([#4353](https://github.com/getsentry/sentry-java/pull/4353))
-
-### Dependencies
-
-- Bump Native SDK from v0.8.3 to v0.8.4 ([#4343](https://github.com/getsentry/sentry-java/pull/4343))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#084)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.8.3...0.8.4)
-
-## 8.9.0
-
-### Features
-
-- Add `SentryWrapper.wrapRunnable` to wrap `Runnable` for use with Sentry ([#4332](https://github.com/getsentry/sentry-java/pull/4332))
-
-### Fixes
-
-- Fix TTFD measurement when API called too early ([#4297](https://github.com/getsentry/sentry-java/pull/4297))
-- Tag sockets traffic originating from Sentry's HttpConnection ([#4340](https://github.com/getsentry/sentry-java/pull/4340))
- - This should suppress the StrictMode's `UntaggedSocketViolation`
-- Reduce debug logs verbosity ([#4341](https://github.com/getsentry/sentry-java/pull/4341))
-- Fix unregister `SystemEventsBroadcastReceiver` when entering background ([#4338](https://github.com/getsentry/sentry-java/pull/4338))
- - This should reduce ANRs seen with this class in the stack trace for Android 14 and above
-
-### Improvements
-
-- Make user interaction tracing faster and do fewer allocations ([#4347](https://github.com/getsentry/sentry-java/pull/4347))
-- Pre-load modules on a background thread upon SDK init ([#4348](https://github.com/getsentry/sentry-java/pull/4348))
-
-## 8.8.0
-
-### Features
-
-- Add `CoroutineExceptionHandler` for reporting uncaught exceptions in coroutines to Sentry ([#4259](https://github.com/getsentry/sentry-java/pull/4259))
- - This is now part of `sentry-kotlin-extensions` and can be used together with `SentryContext` when launching a coroutine
- - Any exceptions thrown in a coroutine when using the handler will be captured (not rethrown!) and reported to Sentry
- - It's also possible to extend `CoroutineExceptionHandler` to implement custom behavior in addition to the one we provide by default
-
-### Fixes
-
-- Use thread context classloader when available ([#4320](https://github.com/getsentry/sentry-java/pull/4320))
- - This ensures correct resource loading in environments like Spring Boot where the thread context classloader is used for resource loading.
-- Improve low memory breadcrumb capturing ([#4325](https://github.com/getsentry/sentry-java/pull/4325))
-- Fix do not initialize SDK for Jetpack Compose Preview builds ([#4324](https://github.com/getsentry/sentry-java/pull/4324))
-- Fix Synchronize Baggage values ([#4327](https://github.com/getsentry/sentry-java/pull/4327))
-
-### Improvements
-
-- Make `SystemEventsBreadcrumbsIntegration` faster ([#4330](https://github.com/getsentry/sentry-java/pull/4330))
-
-## 8.7.0
-
-### Features
-
-- UI Profiling GA
-
- Continuous Profiling is now GA, named UI Profiling. To enable it you can use one of the following options. More info can be found at https://docs.sentry.io/platforms/android/profiling/.
- Note: Both `options.profilesSampler` and `options.profilesSampleRate` must **not** be set to enable UI Profiling.
- To keep the same transaction-based behaviour, without the 30 seconds limitation, you can use the `trace` lifecycle mode.
-
- ```xml
-
-
-
-
-
-
-
-
- ```
-
- ```java
- import io.sentry.ProfileLifecycle;
- import io.sentry.android.core.SentryAndroid;
-
- SentryAndroid.init(context, options -> {
- // Enable UI profiling, adjust in production env. This is evaluated only once per session
- options.setProfileSessionSampleRate(1.0);
- // Set profiling lifecycle, can be `manual` (controlled through `Sentry.startProfiler()` and `Sentry.stopProfiler()`) or `trace` (automatically starts and stop a profile whenever a sampled trace starts and finishes)
- options.setProfileLifecycle(ProfileLifecycle.TRACE);
- // Enable profiling on app start. The app start profile will be stopped automatically when the app start root span finishes
- options.setStartProfilerOnAppStart(true);
- });
- ```
-
- ```kotlin
- import io.sentry.ProfileLifecycle
- import io.sentry.android.core.SentryAndroid
-
- SentryAndroid.init(context, { options ->
- // Enable UI profiling, adjust in production env. This is evaluated only once per session
- options.profileSessionSampleRate = 1.0
- // Set profiling lifecycle, can be `manual` (controlled through `Sentry.startProfiler()` and `Sentry.stopProfiler()`) or `trace` (automatically starts and stop a profile whenever a sampled trace starts and finishes)
- options.profileLifecycle = ProfileLifecycle.TRACE
- // Enable profiling on app start. The app start profile will be stopped automatically when the app start root span finishes
- options.isStartProfilerOnAppStart = true
- })
- ```
-
- - Continuous Profiling - Stop when app goes in background ([#4311](https://github.com/getsentry/sentry-java/pull/4311))
- - Continuous Profiling - Add delayed stop ([#4293](https://github.com/getsentry/sentry-java/pull/4293))
- - Continuous Profiling - Out of Experimental ([#4310](https://github.com/getsentry/sentry-java/pull/4310))
-
-### Fixes
-
-- Compress Screenshots on a background thread ([#4295](https://github.com/getsentry/sentry-java/pull/4295))
-
-## 8.6.0
-
-### Behavioral Changes
-
-- The Sentry SDK will now crash on startup if mixed versions have been detected ([#4277](https://github.com/getsentry/sentry-java/pull/4277))
- - On `Sentry.init` / `SentryAndroid.init` the SDK now checks if all Sentry Java / Android SDK dependencies have the same version.
- - While this may seem like a bad idea at first glance, mixing versions of dependencies has a very high chance of causing a crash later. We opted for a controlled crash that's hard to miss.
- - Note: This detection only works for new versions of the SDK, so please take this as a reminder to check your SDK version alignment manually when upgrading the SDK to this version and then you should be good.
- - The SDK will also print log messages if mixed versions have been detected at a later point. ([#4270](https://github.com/getsentry/sentry-java/pull/4270))
- - This takes care of cases missed by the startup check above due to older versions.
-
-### Features
-
-- Increase http timeouts from 5s to 30s to have a better chance of events being delivered without retry ([#4276](https://github.com/getsentry/sentry-java/pull/4276))
-- Add `MANIFEST.MF` to Sentry JARs ([#4272](https://github.com/getsentry/sentry-java/pull/4272))
-- Retain baggage sample rate/rand values as doubles ([#4279](https://github.com/getsentry/sentry-java/pull/4279))
-- Introduce fatal SDK logger ([#4288](https://github.com/getsentry/sentry-java/pull/4288))
- - We use this to print out messages when there is a problem that prevents the SDK from working correctly.
- - One example for this is when the SDK has been configured with mixed dependency versions where we print out details, which module and version are affected.
-
-### Fixes
-
-- Do not override user-defined `SentryOptions` ([#4262](https://github.com/getsentry/sentry-java/pull/4262))
-- Session Replay: Change bitmap config to `ARGB_8888` for screenshots ([#4282](https://github.com/getsentry/sentry-java/pull/4282))
-- The `MANIFEST.MF` of `sentry-opentelemetry-agent` now has `Implementation-Version` set to the raw version ([#4291](https://github.com/getsentry/sentry-java/pull/4291))
- - An example value would be `8.6.0`
- - The value of the `Sentry-Version-Name` attribute looks like `sentry-8.5.0-otel-2.10.0`
-- Fix tags missing for compose view hierarchies ([#4275](https://github.com/getsentry/sentry-java/pull/4275))
-- Do not leak SentryFileInputStream/SentryFileOutputStream descriptors and channels ([#4296](https://github.com/getsentry/sentry-java/pull/4296))
-- Remove "not yet implemented" from `Sentry.flush` comment ([#4305](https://github.com/getsentry/sentry-java/pull/4305))
-
-### Internal
-
-- Added `platform` to SentryEnvelopeItemHeader ([#4287](https://github.com/getsentry/sentry-java/pull/4287))
- - Set `android` platform to ProfileChunk envelope item header
-
-### Dependencies
-
-- Bump Native SDK from v0.8.1 to v0.8.3 ([#4267](https://github.com/getsentry/sentry-java/pull/4267), [#4298](https://github.com/getsentry/sentry-java/pull/4298))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#083)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.8.1...0.8.3)
-- Bump Spring Boot from 2.7.5 to 2.7.18 ([#3496](https://github.com/getsentry/sentry-java/pull/3496))
-
-## 8.5.0
-
-### Features
-
-- Add native stack frame address information and debug image metadata to ANR events ([#4061](https://github.com/getsentry/sentry-java/pull/4061))
- - This enables symbolication for stripped native code in ANRs
-- Add Continuous Profiling Support ([#3710](https://github.com/getsentry/sentry-java/pull/3710))
-
- To enable Continuous Profiling use the `Sentry.startProfiler` and `Sentry.stopProfiler` experimental APIs. Sampling rate can be set through `options.profileSessionSampleRate`, which defaults to null (disabled).
- Note: Both `options.profilesSampler` and `options.profilesSampleRate` must **not** be set to enable Continuous Profiling.
-
- ```java
- import io.sentry.ProfileLifecycle;
- import io.sentry.android.core.SentryAndroid;
-
- SentryAndroid.init(context) { options ->
-
- // Currently under experimental options:
- options.getExperimental().setProfileSessionSampleRate(1.0);
- // In manual mode, you need to start and stop the profiler manually using Sentry.startProfiler and Sentry.stopProfiler
- // In trace mode, the profiler will start and stop automatically whenever a sampled trace starts and finishes
- options.getExperimental().setProfileLifecycle(ProfileLifecycle.MANUAL);
- }
- // Start profiling
- Sentry.startProfiler();
-
- // After all profiling is done, stop the profiler. Profiles can last indefinitely if not stopped.
- Sentry.stopProfiler();
- ```
-
- ```kotlin
- import io.sentry.ProfileLifecycle
- import io.sentry.android.core.SentryAndroid
-
- SentryAndroid.init(context) { options ->
-
- // Currently under experimental options:
- options.experimental.profileSessionSampleRate = 1.0
- // In manual mode, you need to start and stop the profiler manually using Sentry.startProfiler and Sentry.stopProfiler
- // In trace mode, the profiler will start and stop automatically whenever a sampled trace starts and finishes
- options.experimental.profileLifecycle = ProfileLifecycle.MANUAL
- }
- // Start profiling
- Sentry.startProfiler()
-
- // After all profiling is done, stop the profiler. Profiles can last indefinitely if not stopped.
- Sentry.stopProfiler()
- ```
-
- To learn more visit [Sentry's Continuous Profiling](https://docs.sentry.io/product/explore/profiling/transaction-vs-continuous-profiling/#continuous-profiling-mode) documentation page.
-
-### Fixes
-
-- Reduce excessive CPU usage when serializing breadcrumbs to disk for ANRs ([#4181](https://github.com/getsentry/sentry-java/pull/4181))
-- Ensure app start type is set, even when ActivityLifecycleIntegration is not running ([#4250](https://github.com/getsentry/sentry-java/pull/4250))
-- Use `SpringServletTransactionNameProvider` as fallback for Spring WebMVC ([#4263](https://github.com/getsentry/sentry-java/pull/4263))
- - In certain cases the SDK was not able to provide a transaction name automatically and thus did not finish the transaction for the request.
- - We now first try `SpringMvcTransactionNameProvider` which would provide the route as transaction name.
- - If that does not return anything, we try `SpringServletTransactionNameProvider` next, which returns the URL of the request.
-
-### Behavioral Changes
-
-- The user's `device.name` is not reported anymore via the device context, even if `options.isSendDefaultPii` is enabled ([#4179](https://github.com/getsentry/sentry-java/pull/4179))
-
-### Dependencies
-
-- Bump Gradle from v8.12.1 to v8.13.0 ([#4209](https://github.com/getsentry/sentry-java/pull/4209))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8130)
- - [diff](https://github.com/gradle/gradle/compare/v8.12.1...v8.13.0)
-
-## 8.4.0
-
-### Fixes
-
-- The SDK now handles `null` on many APIs instead of expecting a non `null` value ([#4245](https://github.com/getsentry/sentry-java/pull/4245))
- - Certain APIs like `setTag`, `setData`, `setExtra`, `setContext` previously caused a `NullPointerException` when invoked with either `null` key or value.
- - The SDK now tries to have a sane fallback when `null` is passed and no longer throws `NullPointerException`
- - If `null` is passed, the SDK will
- - do nothing if a `null` key is passed, returning `null` for non void methods
- - remove any previous value if the new value is set to `null`
-- Add support for setting in-app-includes/in-app-excludes via AndroidManifest.xml ([#4240](https://github.com/getsentry/sentry-java/pull/4240))
-- Modifications to OkHttp requests are now properly propagated to the affected span / breadcrumbs ([#4238](https://github.com/getsentry/sentry-java/pull/4238))
- - Please ensure the SentryOkHttpInterceptor is added last to your OkHttpClient, as otherwise changes to the `Request` by subsequent interceptors won't be considered
-- Fix "class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy" ([#4206](https://github.com/getsentry/sentry-java/pull/4206))
- - In this case we cannot report the `Throwable` to Sentry as it's not available
- - If you are using OpenTelemetry v1 `OpenTelemetryAppender`, please consider upgrading to v2
-- Pass OpenTelemetry span attributes into TracesSampler callback ([#4253](https://github.com/getsentry/sentry-java/pull/4253))
- - `SamplingContext` now has a `getAttribute` method that grants access to OpenTelemetry span attributes via their String key (e.g. `http.request.method`)
-- Fix AbstractMethodError when using SentryTraced for Jetpack Compose ([#4255](https://github.com/getsentry/sentry-java/pull/4255))
-- Assume `http.client` for span `op` if not a root span ([#4257](https://github.com/getsentry/sentry-java/pull/4257))
-- Avoid unnecessary copies when using `CopyOnWriteArrayList` ([#4247](https://github.com/getsentry/sentry-java/pull/4247))
- - This affects in particular `SentryTracer.getLatestActiveSpan` which would have previously copied all child span references. This may have caused `OutOfMemoryError` on certain devices due to high frequency of calling the method.
-
-### Features
-
-- The SDK now automatically propagates the trace-context to the native layer. This allows to connect errors on different layers of the application. ([#4137](https://github.com/getsentry/sentry-java/pull/4137))
-- Capture OpenTelemetry span events ([#3564](https://github.com/getsentry/sentry-java/pull/3564))
- - OpenTelemetry spans may have exceptions attached to them (`openTelemetrySpan.recordException`). We can now send those to Sentry as errors.
- - Set `capture-open-telemetry-events=true` in `sentry.properties` to enable it
- - Set `sentry.capture-open-telemetry-events=true` in Springs `application.properties` to enable it
- - Set `sentry.captureOpenTelemetryEvents: true` in Springs `application.yml` to enable it
-
-### Behavioural Changes
-
-- Use `java.net.URI` for parsing URLs in `UrlUtils` ([#4210](https://github.com/getsentry/sentry-java/pull/4210))
- - This could affect grouping for issues with messages containing URLs that fall in known corner cases that were handled incorrectly previously (e.g. email in URL path)
-
-### Internal
-
-- Also use port when checking if a request is made to Sentry DSN ([#4231](https://github.com/getsentry/sentry-java/pull/4231))
- - For our OpenTelemetry integration we check if a span is for a request to Sentry
- - We now also consider the port when performing this check
-
-### Dependencies
-
-- Bump Native SDK from v0.7.20 to v0.8.1 ([#4137](https://github.com/getsentry/sentry-java/pull/4137))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0810)
- - [diff](https://github.com/getsentry/sentry-native/compare/v0.7.20...0.8.1)
-
-## 8.3.0
-
-### Features
-
-- Add HTTP server request headers from OpenTelemetry span attributes to sentry `request` in payload ([#4102](https://github.com/getsentry/sentry-java/pull/4102))
- - You have to explicitly enable each header by adding it to the [OpenTelemetry config](https://opentelemetry.io/docs/zero-code/java/agent/instrumentation/http/#capturing-http-request-and-response-headers)
- - Please only enable headers you actually want to send to Sentry. Some may contain sensitive data like PII, cookies, tokens etc.
- - We are no longer adding request/response headers to `contexts/otel/attributes` of the event.
-- The `ignoredErrors` option is now configurable via the manifest property `io.sentry.traces.ignored-errors` ([#4178](https://github.com/getsentry/sentry-java/pull/4178))
-- A list of active Spring profiles is attached to payloads sent to Sentry (errors, traces, etc.) and displayed in the UI when using our Spring or Spring Boot integrations ([#4147](https://github.com/getsentry/sentry-java/pull/4147))
- - This consists of an empty list when only the default profile is active
-- Added `enableTraceIdGeneration` to the AndroidOptions. This allows Hybrid SDKs to "freeze" and control the trace and connect errors on different layers of the application ([4188](https://github.com/getsentry/sentry-java/pull/4188))
-- Move to a single NetworkCallback listener to reduce number of IPC calls on Android ([#4164](https://github.com/getsentry/sentry-java/pull/4164))
-- Add GraphQL Apollo Kotlin 4 integration ([#4166](https://github.com/getsentry/sentry-java/pull/4166))
-- Add support for async dispatch requests to Spring Boot 2 and 3 ([#3983](https://github.com/getsentry/sentry-java/pull/3983))
- - To enable it, please set `sentry.keep-transactions-open-for-async-responses=true` in `application.properties` or `sentry.keepTransactionsOpenForAsyncResponses: true` in `application.yml`
-- Add constructor to JUL `SentryHandler` for disabling external config ([#4208](https://github.com/getsentry/sentry-java/pull/4208))
-
-### Fixes
-
-- Filter strings that cannot be parsed as Regex no longer cause an SDK crash ([#4213](https://github.com/getsentry/sentry-java/pull/4213))
- - This was the case e.g. for `ignoredErrors`, `ignoredTransactions` and `ignoredCheckIns`
- - We now simply don't use such strings for Regex matching and only use them for String comparison
-- `SentryOptions.setTracePropagationTargets` is no longer marked internal ([#4170](https://github.com/getsentry/sentry-java/pull/4170))
-- Session Replay: Fix crash when a navigation breadcrumb does not have "to" destination ([#4185](https://github.com/getsentry/sentry-java/pull/4185))
-- Session Replay: Cap video segment duration to maximum 5 minutes to prevent endless video encoding in background ([#4185](https://github.com/getsentry/sentry-java/pull/4185))
-- Check `tracePropagationTargets` in OpenTelemetry propagator ([#4191](https://github.com/getsentry/sentry-java/pull/4191))
- - If a URL can be retrieved from OpenTelemetry span attributes, we check it against `tracePropagationTargets` before attaching `sentry-trace` and `baggage` headers to outgoing requests
- - If no URL can be retrieved we always attach the headers
-- Fix `ignoredErrors`, `ignoredTransactions` and `ignoredCheckIns` being unset by external options like `sentry.properties` or ENV vars ([#4207](https://github.com/getsentry/sentry-java/pull/4207))
- - Whenever parsing of external options was enabled (`enableExternalConfiguration`), which is the default for many integrations, the values set on `SentryOptions` passed to `Sentry.init` would be lost
- - Even if the value was not set in any external configuration it would still be set to an empty list
-
-### Behavioural Changes
-
-- The class `io.sentry.spring.jakarta.webflux.ReactorUtils` is now deprecated, please use `io.sentry.reactor.SentryReactorUtils` in the new `sentry-reactor` module instead ([#4155](https://github.com/getsentry/sentry-java/pull/4155))
- - The new module will be exposed as an `api` dependency when using `sentry-spring-boot-jakarta` (Spring Boot 3) or `sentry-spring-jakarta` (Spring 6).
- Therefore, if you're using one of those modules, changing your imports will suffice.
-
-## 8.2.0
-
-### Breaking Changes
-
-- The Kotlin Language version is now set to 1.6 ([#3936](https://github.com/getsentry/sentry-java/pull/3936))
-
-### Features
-
-- Create onCreate and onStart spans for all Activities ([#4025](https://github.com/getsentry/sentry-java/pull/4025))
-- Add split apks info to the `App` context ([#3193](https://github.com/getsentry/sentry-java/pull/3193))
-- Expose new `withSentryObservableEffect` method overload that accepts `SentryNavigationListener` as a parameter ([#4143](https://github.com/getsentry/sentry-java/pull/4143))
- - This allows sharing the same `SentryNavigationListener` instance across fragments and composables to preserve the trace
-- (Internal) Add API to filter native debug images based on stacktrace addresses ([#4089](https://github.com/getsentry/sentry-java/pull/4089))
-- Propagate sampling random value ([#4153](https://github.com/getsentry/sentry-java/pull/4153))
- - The random value used for sampling traces is now sent to Sentry and attached to the `baggage` header on outgoing requests
-- Update `sampleRate` that is sent to Sentry and attached to the `baggage` header on outgoing requests ([#4158](https://github.com/getsentry/sentry-java/pull/4158))
- - If the SDK uses its `sampleRate` or `tracesSampler` callback, it now updates the `sampleRate` in Dynamic Sampling Context.
-
-### Fixes
-
-- Log a warning when envelope or items are dropped due to rate limiting ([#4148](https://github.com/getsentry/sentry-java/pull/4148))
-- Do not log if `OtelContextScopesStorage` cannot be found ([#4127](https://github.com/getsentry/sentry-java/pull/4127))
- - Previously `java.lang.ClassNotFoundException: io.sentry.opentelemetry.OtelContextScopesStorage` was shown in the log if the class could not be found.
- - This is just a lookup the SDK performs to configure itself. The SDK also works without OpenTelemetry.
-- Session Replay: Fix various crashes and issues ([#4135](https://github.com/getsentry/sentry-java/pull/4135))
- - Fix `FileNotFoundException` when trying to read/write `.ongoing_segment` file
- - Fix `IllegalStateException` when registering `onDrawListener`
- - Fix SIGABRT native crashes on Motorola devices when encoding a video
-- Mention javadoc and sources for published artifacts in Gradle `.module` metadata ([#3936](https://github.com/getsentry/sentry-java/pull/3936))
-- (Jetpack Compose) Modifier.sentryTag now uses Modifier.Node ([#4029](https://github.com/getsentry/sentry-java/pull/4029))
- - This allows Composables that use this modifier to be skippable
-
-### Dependencies
-
-- Bump Native SDK from v0.7.19 to v0.7.20 ([#4128](https://github.com/getsentry/sentry-java/pull/4128))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0720)
- - [diff](https://github.com/getsentry/sentry-native/compare/v0.7.19...0.7.20)
-- Bump Gradle from v8.9.0 to v8.12.1 ([#4106](https://github.com/getsentry/sentry-java/pull/4106))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8121)
- - [diff](https://github.com/gradle/gradle/compare/v8.9.0...v8.12.1)
-
-## 8.1.0
-
-### Features
-
-- Add `options.ignoredErrors` to filter out errors that match a certain String or Regex ([#4083](https://github.com/getsentry/sentry-java/pull/4083))
- - The matching is attempted on `event.message`, `event.formatted`, and `{event.throwable.class.name}: {event.throwable.message}`
- - Can be set in `sentry.properties`, e.g. `ignored-errors=Some error,Another .*`
- - Can be set in environment variables, e.g. `SENTRY_IGNORED_ERRORS=Some error,Another .*`
- - For Spring Boot, it can be set in `application.properties`, e.g. `sentry.ignored-errors=Some error,Another .*`
-- Log OpenTelemetry related Sentry config ([#4122](https://github.com/getsentry/sentry-java/pull/4122))
-
-### Fixes
-
-- Avoid logging an error when a float is passed in the manifest ([#4031](https://github.com/getsentry/sentry-java/pull/4031))
-- Add `request` details to transactions created through OpenTelemetry ([#4098](https://github.com/getsentry/sentry-java/pull/4098))
- - We now add HTTP request method and URL where Sentry expects it to display it in Sentry UI
-- Remove `java.lang.ClassNotFoundException` debug logs when searching for OpenTelemetry marker classes ([#4091](https://github.com/getsentry/sentry-java/pull/4091))
- - There was up to three of these, one for `io.sentry.opentelemetry.agent.AgentMarker`, `io.sentry.opentelemetry.agent.AgentlessMarker` and `io.sentry.opentelemetry.agent.AgentlessSpringMarker`.
- - These were not indicators of something being wrong but rather the SDK looking at what is available at runtime to configure itself accordingly.
-- Do not instrument File I/O operations if tracing is disabled ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Do not instrument User Interaction multiple times ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Speed up view traversal to find touched target in `UserInteractionIntegration` ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Reduce IPC/Binder calls performed by the SDK ([#4058](https://github.com/getsentry/sentry-java/pull/4058))
-
-### Behavioural Changes
-
-- Reduce the number of broadcasts the SDK is subscribed for ([#4052](https://github.com/getsentry/sentry-java/pull/4052))
- - Drop `TempSensorBreadcrumbsIntegration`
- - Drop `PhoneStateBreadcrumbsIntegration`
- - Reduce number of broadcasts in `SystemEventsBreadcrumbsIntegration`
-
-Current list of the broadcast events can be found [here](https://github.com/getsentry/sentry-java/blob/9b8dc0a844d10b55ddeddf55d278c0ab0f86421c/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java#L131-L153). If you'd like to subscribe for more events, consider overriding the `SystemEventsBreadcrumbsIntegration` as follows:
-
-```kotlin
-SentryAndroid.init(context) { options ->
- options.integrations.removeAll { it is SystemEventsBreadcrumbsIntegration }
- options.integrations.add(SystemEventsBreadcrumbsIntegration(context, SystemEventsBreadcrumbsIntegration.getDefaultActions() + listOf(/* your custom actions */)))
-}
-```
-
-If you would like to keep some of the default broadcast events as breadcrumbs, consider opening a [GitHub issue](https://github.com/getsentry/sentry-java/issues/new).
-
-- Set mechanism `type` to `suppressed` for suppressed exceptions ([#4125](https://github.com/getsentry/sentry-java/pull/4125))
- - This helps to distinguish an exceptions cause from any suppressed exceptions in the Sentry UI
-
-### Dependencies
-
-- Bump Spring Boot to `3.4.2` ([#4081](https://github.com/getsentry/sentry-java/pull/4081))
-- Bump Native SDK from v0.7.14 to v0.7.19 ([#4076](https://github.com/getsentry/sentry-java/pull/4076))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0719)
- - [diff](https://github.com/getsentry/sentry-native/compare/v0.7.14...0.7.19)
-
-## 8.0.0
-
-### Summary
-
-Version 8 of the Sentry Android/Java SDK brings a variety of features and fixes. The most notable changes are:
-
-- `Hub` has been replaced by `Scopes`
-- New `Scope` types have been introduced, see "Behavioural Changes" for more details.
-- Lifecycle tokens have been introduced to manage `Scope` lifecycle, see "Behavioural Changes" for more details.
-- Bumping `minSdk` level to 21 (Android 5.0)
-- Our `sentry-opentelemetry-agent` has been improved and now works in combination with the rest of Sentry. You may now combine OpenTelemetry and Sentry for instrumenting your application.
- - You may now use both OpenTelemetry SDK and Sentry SDK to capture transactions and spans. They can also be mixed and end up on the same transaction.
- - OpenTelemetry extends the Sentry SDK by adding spans for numerous integrations, like Ktor, Vert.x and MongoDB. Please check [the OpenTelemetry GitHub repository](https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation) for a full list.
- - OpenTelemetry allows propagating trace information from and to additional libraries, that Sentry did not support before, for example gRPC.
- - OpenTelemetry also has broader support for propagating the Sentry `Scopes` through reactive libraries like RxJava.
-- The SDK is now compatible with Spring Boot 3.4
-- We now support GraphQL v22 (`sentry-graphql-22`)
-- Metrics have been removed
-
-Please take a look at [our migration guide in docs](https://docs.sentry.io/platforms/java/migration/7.x-to-8.0).
-
-### Sentry Self-hosted Compatibility
-
-This SDK version is compatible with a self-hosted version of Sentry `22.12.0` or higher. If you are using an older version of [self-hosted Sentry](https://develop.sentry.dev/self-hosted/) (aka onpremise), you will need to [upgrade](https://develop.sentry.dev/self-hosted/releases/). If you're using `sentry.io` no action is required.
-
-### Breaking Changes
-
-- The Android minSdk level for all Android modules is now 21 ([#3852](https://github.com/getsentry/sentry-java/pull/3852))
-- The minSdk level for sentry-android-ndk changed from 19 to 21 ([#3851](https://github.com/getsentry/sentry-java/pull/3851))
-- Throw IllegalArgumentException when calling Sentry.init on Android ([#3596](https://github.com/getsentry/sentry-java/pull/3596))
-- Metrics have been removed from the SDK ([#3774](https://github.com/getsentry/sentry-java/pull/3774))
- - Metrics will return but we don't know in what exact form yet
-- `enableTracing` option (a.k.a `enable-tracing`) has been removed from the SDK ([#3776](https://github.com/getsentry/sentry-java/pull/3776))
- - Please set `tracesSampleRate` to a value >= 0.0 for enabling performance instead. The default value is `null` which means performance is disabled.
-- Replace `synchronized` methods and blocks with `ReentrantLock` (`AutoClosableReentrantLock`) ([#3715](https://github.com/getsentry/sentry-java/pull/3715))
- - If you are subclassing any Sentry classes, please check if the parent class used `synchronized` before. Please make sure to use the same lock object as the parent class in that case.
-- `traceOrigins` option (`io.sentry.traces.tracing-origins` in manifest) has been removed, please use `tracePropagationTargets` (`io.sentry.traces.trace-propagation-targets` in manifest`) instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `profilingEnabled` option (`io.sentry.traces.profiling.enable` in manifest) has been removed, please use `profilesSampleRate` (`io.sentry.traces.profiling.sample-rate` instead) instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `shutdownTimeout` option has been removed, please use `shutdownTimeoutMillis` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `profilingTracesIntervalMillis` option for Android has been removed ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `io.sentry.session-tracking.enable` manifest option has been removed ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `Sentry.traceHeaders()` method has been removed, please use `Sentry.getTraceparent()` instead ([#3718](https://github.com/getsentry/sentry-java/pull/3718))
-- `Sentry.reportFullDisplayed()` method has been removed, please use `Sentry.reportFullyDisplayed()` instead ([#3717](https://github.com/getsentry/sentry-java/pull/3717))
-- `User.other` has been removed, please use `data` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `SdkVersion.getIntegrations()` has been removed, please use `getIntegrationSet` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `SdkVersion.getPackages()` has been removed, please use `getPackageSet()` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `Device.language` has been removed, please use `locale` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `TraceContext.user` and `TraceContextUser` class have been removed, please use `userId` on `TraceContext` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `TransactionContext.fromSentryTrace()` has been removed, please use `Sentry.continueTrace()` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `SentryDataFetcherExceptionHandler` has been removed, please use `SentryGenericDataFetcherExceptionHandler` in combination with `SentryInstrumentation` instead ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- `sentry-android-okhttp` has been removed in favor of `sentry-okhttp`, removing android dependency from the module ([#3510](https://github.com/getsentry/sentry-java/pull/3510))
-- `Contexts` no longer extends `ConcurrentHashMap`, instead we offer a selected set of methods.
-- User segment has been removed ([#3512](https://github.com/getsentry/sentry-java/pull/3512))
-- One of the `AndroidTransactionProfiler` constructors has been removed, please use a different one ([#3780](https://github.com/getsentry/sentry-java/pull/3780))
-- Use String instead of UUID for SessionId ([#3834](https://github.com/getsentry/sentry-java/pull/3834))
- - The `Session` constructor now takes a `String` instead of a `UUID` for the `sessionId` parameter.
- - `Session.getSessionId()` now returns a `String` instead of a `UUID`.
-- All status codes below 400 are now mapped to `SpanStatus.OK` ([#3869](https://github.com/getsentry/sentry-java/pull/3869))
-- Change OkHttp sub-spans to span attributes ([#3556](https://github.com/getsentry/sentry-java/pull/3556))
- - This will reduce the number of spans created by the SDK
-- `instrumenter` option should no longer be needed as our new OpenTelemetry integration now works in combination with the rest of Sentry
-
-### Behavioural Changes
-
-- We're introducing some new `Scope` types in the SDK, allowing for better control over what data is attached where. Previously there was a stack of scopes that was pushed and popped. Instead we now fork scopes for a given lifecycle and then restore the previous scopes. Since `Hub` is gone, it is also never cloned anymore. Separation of data now happens through the different scope types while making it easier to manipulate exactly what you need without having to attach data at the right time to have it apply where wanted.
- - Global scope is attached to all events created by the SDK. It can also be modified before `Sentry.init` has been called. It can be manipulated using `Sentry.configureScope(ScopeType.GLOBAL, (scope) -> { ... })`.
- - Isolation scope can be used e.g. to attach data to all events that come up while handling an incoming request. It can also be used for other isolation purposes. It can be manipulated using `Sentry.configureScope(ScopeType.ISOLATION, (scope) -> { ... })`. The SDK automatically forks isolation scope in certain cases like incoming requests, CRON jobs, Spring `@Async` and more.
- - Current scope is forked often and data added to it is only added to events that are created while this scope is active. Data is also passed on to newly forked child scopes but not to parents. It can be manipulated using `Sentry.configureScope(ScopeType.CURRENT, (scope) -> { ... })`.
-- `Sentry.popScope` has been deprecated, please call `.close()` on the token returned by `Sentry.pushScope` instead or use it in a way described in more detail in [our migration guide](https://docs.sentry.io/platforms/java/migration/7.x-to-8.0).
-- We have chosen a default scope that is used for `Sentry.configureScope()` as well as API like `Sentry.setTag()`
- - For Android the type defaults to `CURRENT` scope
- - For Backend and other JVM applicatons it defaults to `ISOLATION` scope
-- Event processors on `Scope` can now be ordered by overriding the `getOrder` method on implementations of `EventProcessor`. NOTE: This order only applies to event processors on `Scope` but not `SentryOptions` at the moment. Feel free to request this if you need it.
-- `Hub` is deprecated in favor of `Scopes`, alongside some `Hub` relevant APIs. More details can be found in [our migration guide](https://docs.sentry.io/platforms/java/migration/7.x-to-8.0).
-- Send file name and path only if `isSendDefaultPii` is `true` ([#3919](https://github.com/getsentry/sentry-java/pull/3919))
-- (Android) Enable Performance V2 by default ([#3824](https://github.com/getsentry/sentry-java/pull/3824))
- - With this change cold app start spans will include spans for ContentProviders, Application and Activity load.
-- (Android) Replace thread id with kernel thread id in span data ([#3706](https://github.com/getsentry/sentry-java/pull/3706))
-- (Android) The JNI layer for sentry-native has now been moved from sentry-java to sentry-native ([#3189](https://github.com/getsentry/sentry-java/pull/3189))
- - This now includes prefab support for sentry-native, allowing you to link and access the sentry-native API within your native app code
- - Checkout the `sentry-samples/sentry-samples-android` example on how to configure CMake and consume `sentry.h`
-- The user ip-address is now only set to `"{{auto}}"` if `sendDefaultPii` is enabled ([#4072](https://github.com/getsentry/sentry-java/pull/4072))
- - This change gives you control over IP address collection directly on the client
-
-### Features
-
-- The SDK is now compatible with Spring Boot 3.4 ([#3939](https://github.com/getsentry/sentry-java/pull/3939))
-- Our `sentry-opentelemetry-agent` has been completely reworked and now plays nicely with the rest of the Java SDK
- - You may also want to give this new agent a try even if you haven't used OpenTelemetry (with Sentry) before. It offers support for [many more libraries and frameworks](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md), improving on our trace propagation, `Scopes` (used to be `Hub`) propagation as well as performance instrumentation (i.e. more spans).
- - If you are using a framework we did not support before and currently resort to manual instrumentation, please give the agent a try. See [here for a list of supported libraries, frameworks and application servers](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md).
- - Please see [Java SDK docs](https://docs.sentry.io/platforms/java/tracing/instrumentation/opentelemetry/) for more details on how to set up the agent. Please make sure to select the correct SDK from the dropdown on the left side of the docs.
- - What's new about the Agent
- - When the OpenTelemetry Agent is used, Sentry API creates OpenTelemetry spans under the hood, handing back a wrapper object which bridges the gap between traditional Sentry API and OpenTelemetry. We might be replacing some of the Sentry performance API in the future.
- - This is achieved by configuring the SDK to use `OtelSpanFactory` instead of `DefaultSpanFactory` which is done automatically by the auto init of the Java Agent.
- - OpenTelemetry spans are now only turned into Sentry spans when they are finished so they can be sent to the Sentry server.
- - Now registers an OpenTelemetry `Sampler` which uses Sentry sampling configuration
- - Other Performance integrations automatically stop creating spans to avoid duplicate spans
- - The Sentry SDK now makes use of OpenTelemetry `Context` for storing Sentry `Scopes` (which is similar to what used to be called `Hub`) and thus relies on OpenTelemetry for `Context` propagation.
- - Classes used for the previous version of our OpenTelemetry support have been deprecated but can still be used manually. We're not planning to keep the old agent around in favor of less complexity in the SDK.
-- Add `sentry-opentelemetry-agentless-spring` module ([#4000](https://github.com/getsentry/sentry-java/pull/4000))
- - This module can be added as a dependency when using Sentry with OpenTelemetry and Spring Boot but don't want to use our Agent. It takes care of configuring OpenTelemetry for use with Sentry.
- - You may want to set `OTEL_LOGS_EXPORTER=none;OTEL_METRICS_EXPORTER=none;OTEL_TRACES_EXPORTER=none` env vars to not have the log flooded with error messages regarding OpenTelemetry features we don't use.
-- Add `sentry-opentelemetry-agentless` module ([#3961](https://github.com/getsentry/sentry-java/pull/3961))
- - This module can be added as a dependency when using Sentry with OpenTelemetry but don't want to use our Agent. It takes care of configuring OpenTelemetry for use with Sentry.
- - To enable the auto configuration of it, please set `-Dotel.java.global-autoconfigure.enabled=true` on the `java` command, when starting your application.
- - You may also want to set `OTEL_LOGS_EXPORTER=none;OTEL_METRICS_EXPORTER=none;OTEL_TRACES_EXPORTER=none` env vars to not have the log flooded with error messages regarding OpenTelemetry features we don't use.
-- `OpenTelemetryUtil.applyOpenTelemetryOptions` now takes an enum instead of a boolean for its mode
-- Add `openTelemetryMode` option ([#3994](https://github.com/getsentry/sentry-java/pull/3994))
- - It defaults to `AUTO` meaning the SDK will figure out how to best configure itself for use with OpenTelemetry
- - Use of OpenTelemetry can also be disabled completely by setting it to `OFF` ([#3995](https://github.com/getsentry/sentry-java/pull/3995))
- - In this case even if OpenTelemetry is present, the Sentry SDK will not use it
- - Use `AGENT` when using `sentry-opentelemetry-agent`
- - Use `AGENTLESS` when using `sentry-opentelemetry-agentless`
- - Use `AGENTLESS_SPRING` when using `sentry-opentelemetry-agentless-spring`
-- Add `ignoredTransactions` option to filter out transactions by name ([#3871](https://github.com/getsentry/sentry-java/pull/3871))
- - can be used via ENV vars, e.g. `SENTRY_IGNORED_TRANSACTIONS=POST /person/,GET /pers.*`
- - can also be set in options directly, e.g. `options.setIgnoredTransactions(...)`
- - can also be set in `sentry.properties`, e.g. `ignored-transactions=POST /person/,GET /pers.*`
- - can also be set in Spring config `application.properties`, e.g. `sentry.ignored-transactions=POST /person/,GET /pers.*`
-- Add `scopeBindingMode` to `SpanOptions` ([#4004](https://github.com/getsentry/sentry-java/pull/4004))
- - This setting only affects the SDK when used with OpenTelemetry.
- - Defaults to `AUTO` meaning the SDK will decide whether the span should be bound to the current scope. It will not bind transactions to scope using `AUTO`, it will only bind spans where the parent span is on the current scope.
- - `ON` sets the new span on the current scope.
- - `OFF` does not set the new span on the scope.
-- Add `ignoredSpanOrigins` option for ignoring spans coming from certain integrations
- - We pre-configure this to ignore Performance instrumentation for Spring and other integrations when using our OpenTelemetry Agent to avoid duplicate spans
-- Support `graphql-java` v22 via a new module `sentry-graphql-22` ([#3740](https://github.com/getsentry/sentry-java/pull/3740))
- - If you are using `graphql-java` v21 or earlier, you can use the `sentry-graphql` module
- - For `graphql-java` v22 and newer please use the `sentry-graphql-22` module
-- We now provide a `SentryInstrumenter` bean directly for Spring (Boot) if there is none yet instead of using `GraphQlSourceBuilderCustomizer` to add the instrumentation ([#3744](https://github.com/getsentry/sentry-java/pull/3744))
- - It is now also possible to provide a bean of type `SentryGraphqlInstrumentation.BeforeSpanCallback` which is then used by `SentryInstrumenter`
-- Add data fetching environment hint to breadcrumb for GraphQL (#3413) ([#3431](https://github.com/getsentry/sentry-java/pull/3431))
-- Report exceptions returned by Throwable.getSuppressed() to Sentry as exception groups ([#3396] https://github.com/getsentry/sentry-java/pull/3396)
- - Any suppressed exceptions are added to the issue details page in Sentry, the same way any cause is.
- - We are planning to improve how we visualize suppressed exceptions. See https://github.com/getsentry/sentry-java/issues/4059
-- Enable `ThreadLocalAccessor` for Spring Boot 3 WebFlux by default ([#4023](https://github.com/getsentry/sentry-java/pull/4023))
-- Allow passing `environment` to `CheckinUtils.withCheckIn` ([3889](https://github.com/getsentry/sentry-java/pull/3889))
-- Add `globalHubMode` to options ([#3805](https://github.com/getsentry/sentry-java/pull/3805))
- - `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`.
- - 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.
-- Lazy uuid generation for SentryId and SpanId ([#3770](https://github.com/getsentry/sentry-java/pull/3770))
-- Faster generation of Sentry and Span IDs ([#3818](https://github.com/getsentry/sentry-java/pull/3818))
- - Uses faster implementation to convert UUID to SentryID String
- - Uses faster Random implementation to generate UUIDs
-- Android 15: Add support for 16KB page sizes ([#3851](https://github.com/getsentry/sentry-java/pull/3851))
- - See https://developer.android.com/guide/practices/page-sizes for more details
-- Add init priority settings ([#3674](https://github.com/getsentry/sentry-java/pull/3674))
- - You may now set `forceInit=true` (`force-init` for `.properties` files) to ensure a call to Sentry.init / SentryAndroid.init takes effect
-- Add force init option to Android Manifest ([#3675](https://github.com/getsentry/sentry-java/pull/3675))
- - Use `` to ensure Sentry Android auto init is not easily overwritten
-- Attach request body for `application/x-www-form-urlencoded` requests in Spring ([#3731](https://github.com/getsentry/sentry-java/pull/3731))
- - Previously request body was only attached for `application/json` requests
-- Set breadcrumb level based on http status ([#3771](https://github.com/getsentry/sentry-java/pull/3771))
-- Emit transaction.data inside contexts.trace.data ([#3735](https://github.com/getsentry/sentry-java/pull/3735))
- - Also does not emit `transaction.data` in `extras` anymore
-- 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))
-- 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))
-- Add a sample for showcasing Sentry with OpenTelemetry (`sentry-samples-console-opentelemetry-noagent`) ([#3856](https://github.com/getsentry/sentry-java/pull/3862))
-
-### Fixes
-
-- Fix incoming defer sampling decision `sentry-trace` header ([#3942](https://github.com/getsentry/sentry-java/pull/3942))
- - A `sentry-trace` header that only contains trace ID and span ID but no sampled flag (`-1`, `-0` suffix) means the receiving system can make its own sampling decision
- - When generating `sentry-trace` header from `PropagationContext` we now copy the `sampled` flag.
- - In `TransactionContext.fromPropagationContext` when there is no parent sampling decision, keep the decision `null` so a new sampling decision is made instead of defaulting to `false`
-- Fix order of calling `close` on previous Sentry instance when re-initializing ([#3750](https://github.com/getsentry/sentry-java/pull/3750))
- - Previously some parts of Sentry were immediately closed after re-init that should have stayed open and some parts of the previous init were never closed
-- All status codes below 400 are now mapped to `SpanStatus.OK` ([#3869](https://github.com/getsentry/sentry-java/pull/3869))
-- Improve ignored check performance ([#3992](https://github.com/getsentry/sentry-java/pull/3992))
- - Checking if a span origin, a transaction or a checkIn should be ignored is now faster
-- Cache requests for Spring using Springs `ContentCachingRequestWrapper` instead of our own Wrapper to also cache parameters ([#3641](https://github.com/getsentry/sentry-java/pull/3641))
- - Previously only the body was cached which could lead to problems in the FilterChain as Request parameters were not available
-- Close backpressure monitor on SDK shutdown ([#3998](https://github.com/getsentry/sentry-java/pull/3998))
- - Due to the backpressure monitor rescheduling a task to run every 10s, it very likely caused shutdown to wait the full `shutdownTimeoutMillis` (defaulting to 2s) instead of being able to terminate immediately
-- Let OpenTelemetry auto instrumentation handle extracting and injecting tracing information if present ([#3953](https://github.com/getsentry/sentry-java/pull/3953))
- - Our integrations no longer call `.continueTrace` and also do not inject tracing headers if the integration has been added to `ignoredSpanOrigins`
-- Fix testTag not working for Jetpack Compose user interaction tracking ([#3878](https://github.com/getsentry/sentry-java/pull/3878))
-- Mark `DiskFlushNotification` hint flushed when rate limited ([#3892](https://github.com/getsentry/sentry-java/pull/3892))
- - Our `UncaughtExceptionHandlerIntegration` waited for the full flush timeout duration (default 15s) when rate limited.
-- Do not replace `op` with auto generated content for OpenTelemetry spans with span kind `INTERNAL` ([#3906](https://github.com/getsentry/sentry-java/pull/3906))
-- Add `enable-spotlight` and `spotlight-connection-url` to external options and check if spotlight is enabled when deciding whether to inspect an OpenTelemetry span for connecting to splotlight ([#3709](https://github.com/getsentry/sentry-java/pull/3709))
-- Trace context on `Contexts.setTrace` has been marked `@NotNull` ([#3721](https://github.com/getsentry/sentry-java/pull/3721))
- - Setting it to `null` would cause an exception.
- - Transactions are dropped if trace context is missing
-- Remove internal annotation on `SpanOptions` ([#3722](https://github.com/getsentry/sentry-java/pull/3722))
-- `SentryLogbackInitializer` is now public ([#3723](https://github.com/getsentry/sentry-java/pull/3723))
-- Parse and use `send-default-pii` and `max-request-body-size` from `sentry.properties` ([#3534](https://github.com/getsentry/sentry-java/pull/3534))
-- `TracesSampler` is now only created once in `SentryOptions` instead of creating a new one for every `Hub` (which is now `Scopes`). This means we're now creating fewer `SecureRandom` instances.
-
-### Internal
-
-- Make `SentryClient` constructor public ([#4045](https://github.com/getsentry/sentry-java/pull/4045))
-- Warm starts cleanup ([#3954](https://github.com/getsentry/sentry-java/pull/3954))
-
-### Changes in pre-releases
-
-These changes have been made during development of `8.0.0`. You may skip this section. We just put it here for sake of completeness.
-
-- Extract OpenTelemetry `URL_PATH` span attribute into description ([#3933](https://github.com/getsentry/sentry-java/pull/3933))
-- Replace OpenTelemetry `ContextStorage` wrapper with `ContextStorageProvider` ([#3938](https://github.com/getsentry/sentry-java/pull/3938))
- - The wrapper had to be put in place before any call to `Context` whereas `ContextStorageProvider` is automatically invoked at the correct time.
-- Send `otel.kind` to Sentry ([#3907](https://github.com/getsentry/sentry-java/pull/3907))
-- Spring Boot now automatically detects if OpenTelemetry is available and makes use of it ([#3846](https://github.com/getsentry/sentry-java/pull/3846))
- - This is only enabled if there is no OpenTelemetry agent available
- - We prefer to use the OpenTelemetry agent as it offers more auto instrumentation
- - 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.
- - In this mode the SDK makes use of the `OpenTelemetry` bean that is created by `opentelemetry-spring-boot-starter` instead of `GlobalOpenTelemetry`
-- Spring Boot now automatically detects our OpenTelemetry agent if its auto init is disabled ([#3848](https://github.com/getsentry/sentry-java/pull/3848))
- - This means Spring Boot config mechanisms can now be combined with our OpenTelemetry agent
- - 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.
- - 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.
- - In this mode the SDK makes use of `GlobalOpenTelemetry`
-- Automatically set span factory based on presence of OpenTelemetry ([#3858](https://github.com/getsentry/sentry-java/pull/3858))
- - `SentrySpanFactoryHolder` has been removed as it is no longer required.
-
-- Replace deprecated `SimpleInstrumentation` with `SimplePerformantInstrumentation` for graphql 22 ([#3974](https://github.com/getsentry/sentry-java/pull/3974))
-- We now hold a strong reference to the underlying OpenTelemetry span when it is created through Sentry API ([#3997](https://github.com/getsentry/sentry-java/pull/3997))
- - This keeps it from being garbage collected too early
-- Defer sampling decision by setting `sampled` to `null` in `PropagationContext` when using OpenTelemetry in case of an incoming defer sampling `sentry-trace` header. ([#3945](https://github.com/getsentry/sentry-java/pull/3945))
-- Build `PropagationContext` from `SamplingDecision` made by `SentrySampler` instead of parsing headers and potentially ignoring a sampling decision in case a `sentry-trace` header comes in with deferred sampling decision. ([#3947](https://github.com/getsentry/sentry-java/pull/3947))
-- 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))
- - 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.
-- Fix `startChild` for span that is not in current OpenTelemetry `Context` ([#3862](https://github.com/getsentry/sentry-java/pull/3862))
- - 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).
-- Add `auto.graphql.graphql22` to ignored span origins when using OpenTelemetry ([#3828](https://github.com/getsentry/sentry-java/pull/3828))
-- Use OpenTelemetry span name as fallback for transaction name ([#3557](https://github.com/getsentry/sentry-java/pull/3557))
- - In certain cases we were sending transactions as "" when using OpenTelemetry
-- Add OpenTelemetry span data to Sentry span ([#3593](https://github.com/getsentry/sentry-java/pull/3593))
-- No longer selectively copy OpenTelemetry attributes to Sentry spans / transactions `data` ([#3663](https://github.com/getsentry/sentry-java/pull/3663))
-- Remove `PROCESS_COMMAND_ARGS` (`process.command_args`) OpenTelemetry span attribute as it can be very large ([#3664](https://github.com/getsentry/sentry-java/pull/3664))
-- Use RECORD_ONLY sampling decision if performance is disabled ([#3659](https://github.com/getsentry/sentry-java/pull/3659))
- - Also fix check whether Performance is enabled when making a sampling decision in the OpenTelemetry sampler
-- Sentry OpenTelemetry Java Agent now sets Instrumenter to SENTRY (used to be OTEL) ([#3697](https://github.com/getsentry/sentry-java/pull/3697))
-- Set span origin in `ActivityLifecycleIntegration` on span options instead of after creating the span / transaction ([#3702](https://github.com/getsentry/sentry-java/pull/3702))
- - This allows spans to be filtered by span origin on creation
-- Honor ignored span origins in `SentryTracer.startChild` ([#3704](https://github.com/getsentry/sentry-java/pull/3704))
-- Use span id of remote parent ([#3548](https://github.com/getsentry/sentry-java/pull/3548))
- - Traces were broken because on an incoming request, OtelSentrySpanProcessor did not set the parentSpanId on the span correctly. Traces were not referencing the actual parent span but some other (random) span ID which the server doesn't know.
-- Attach active span to scope when using OpenTelemetry ([#3549](https://github.com/getsentry/sentry-java/pull/3549))
- - Errors weren't linked to traces correctly due to parts of the SDK not knowing the current span
-- Record dropped spans in client report when sampling out OpenTelemetry spans ([#3552](https://github.com/getsentry/sentry-java/pull/3552))
-- Retrieve the correct current span from `Scope`/`Scopes` when using OpenTelemetry ([#3554](https://github.com/getsentry/sentry-java/pull/3554))
-- Support spans that are split into multiple batches ([#3539](https://github.com/getsentry/sentry-java/pull/3539))
- - When spans belonging to a single transaction were split into multiple batches for SpanExporter, we did not add all spans because the isSpanTooOld check wasn't inverted.
-- Partially fix bootstrap class loading ([#3543](https://github.com/getsentry/sentry-java/pull/3543))
- - There was a problem with two separate Sentry `Scopes` being active inside each OpenTelemetry `Context` due to using context keys from more than one class loader.
-- The Spring Boot 3 WebFlux sample now uses our GraphQL v22 integration ([#3828](https://github.com/getsentry/sentry-java/pull/3828))
-- Do not ignore certain span origins for OpenTelemetry without agent ([#3856](https://github.com/getsentry/sentry-java/pull/3856))
-- `span.startChild` now uses `.makeCurrent()` by default ([#3544](https://github.com/getsentry/sentry-java/pull/3544))
- - This caused an issue where the span tree wasn't correct because some spans were not added to their direct parent
-- Do not set the exception group marker when there is a suppressed exception ([#4056](https://github.com/getsentry/sentry-java/pull/4056))
- - Due to how grouping works in Sentry currently sometimes the suppressed exception is treated as the main exception. This change ensures we keep using the main exception and not change how grouping works.
- - As a consequence the list of exceptions in the group on top of an issue is no longer shown in Sentry UI.
- - We are planning to improve this in the future but opted for this fix first.
-
-### Dependencies
-
-- Bump Native SDK from v0.7.0 to v0.7.17 ([#3441](https://github.com/getsentry/sentry-java/pull/3189)) ([#3851](https://github.com/getsentry/sentry-java/pull/3851)) ([#3914](https://github.com/getsentry/sentry-java/pull/3914)) ([#4003](https://github.com/getsentry/sentry-java/pull/4003))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0717)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.7.0...0.7.17)
-- Bump OpenTelemetry to 1.44.1, OpenTelemetry Java Agent to 2.10.0 and Semantic Conventions to 1.28.0 ([#3668](https://github.com/getsentry/sentry-java/pull/3668)) ([#3935](https://github.com/getsentry/sentry-java/pull/3935))
-
-### Migration Guide / Deprecations
-
-Please take a look at [our migration guide in docs](https://docs.sentry.io/platforms/java/migration/7.x-to-8.0).
-
-- `Hub` has been deprecated, we're replacing the following:
- - `IHub` has been replaced by `IScopes`, however you should be able to simply pass `IHub` instances to code expecting `IScopes`, allowing for an easier migration.
- - `HubAdapter.getInstance()` has been replaced by `ScopesAdapter.getInstance()`
- - The `.clone()` method on `IHub`/`IScopes` has been deprecated, please use `.pushScope()` or `.pushIsolationScope()` instead
- - Some internal methods like `.getCurrentHub()` and `.setCurrentHub()` have also been replaced.
-- `Sentry.popScope` has been replaced by calling `.close()` on the token returned by `Sentry.pushScope()` and `Sentry.pushIsolationScope()`. The token can also be used in a `try` block like this:
-
-```
-try (final @NotNull ISentryLifecycleToken ignored = Sentry.pushScope()) {
- // this block has its separate current scope
-}
-```
-
-as well as:
-
-```
-try (final @NotNull ISentryLifecycleToken ignored = Sentry.pushIsolationScope()) {
- // this block has its separate isolation scope
-}
-```
-
-- Classes used by our previous OpenTelemetry integration have been deprecated (`SentrySpanProcessor`, `SentryPropagator`, `OpenTelemetryLinkErrorEventProcessor`). Please take a look at [docs](https://docs.sentry.io/platforms/java/tracing/instrumentation/opentelemetry/) on how to setup OpenTelemetry in v8.
-
-You may also use `LifecycleHelper.close(token)`, e.g. in case you need to pass the token around for closing later.
-
-### Changes from `rc.4`
-
-If you have been using `8.0.0-rc.4` of the Java SDK, here's the new changes that have been included in the `8.0.0` release:
-
-- Make `SentryClient` constructor public ([#4045](https://github.com/getsentry/sentry-java/pull/4045))
-- The user ip-address is now only set to `"{{auto}}"` if sendDefaultPii is enabled ([#4072](https://github.com/getsentry/sentry-java/pull/4072))
- - This change gives you control over IP address collection directly on the client
-- Do not set the exception group marker when there is a suppressed exception ([#4056](https://github.com/getsentry/sentry-java/pull/4056))
- - Due to how grouping works in Sentry currently sometimes the suppressed exception is treated as the main exception. This change ensures we keep using the main exception and not change how grouping works.
- - As a consequence the list of exceptions in the group on top of an issue is no longer shown in Sentry UI.
- - We are planning to improve this in the future but opted for this fix first.
-- Fix swallow NDK loadLibrary errors ([#4082](https://github.com/getsentry/sentry-java/pull/4082))
-
-## 7.22.6
-
-### Fixes
-
-- Compress Screenshots on a background thread ([#4295](https://github.com/getsentry/sentry-java/pull/4295))
-- Improve low memory breadcrumb capturing ([#4325](https://github.com/getsentry/sentry-java/pull/4325))
-- Make `SystemEventsBreadcrumbsIntegration` faster ([#4330](https://github.com/getsentry/sentry-java/pull/4330))
-- Fix unregister `SystemEventsBroadcastReceiver` when entering background ([#4338](https://github.com/getsentry/sentry-java/pull/4338))
- - This should reduce ANRs seen with this class in the stack trace for Android 14 and above
-- Pre-load modules on a background thread upon SDK init ([#4348](https://github.com/getsentry/sentry-java/pull/4348))
-- Session Replay: Fix inconsistent `segment_id` ([#4471](https://github.com/getsentry/sentry-java/pull/4471))
-- Session Replay: Do not capture current replay for cached events from the past ([#4474](https://github.com/getsentry/sentry-java/pull/4474))
-- Session Replay: Fix crash on devices with the Unisoc/Spreadtrum T606 chipset ([#4477](https://github.com/getsentry/sentry-java/pull/4477))
-- Session Replay: Fix masking of non-styled `Text` Composables ([#4361](https://github.com/getsentry/sentry-java/pull/4361))
-- Session Replay: Fix masking read-only `TextField` Composables ([#4362](https://github.com/getsentry/sentry-java/pull/4362))
-- Fix Session Replay masking for newer versions of Jetpack Compose (1.8+) ([#4485](https://github.com/getsentry/sentry-java/pull/4485))
-- Session Replay: Expand fix for crash on devices to all Unisoc/Spreadtrum chipsets ([#4510](https://github.com/getsentry/sentry-java/pull/4510))
-
-## 7.22.5
-
-### Fixes
-
-- Session Replay: Change bitmap config to `ARGB_8888` for screenshots ([#4282](https://github.com/getsentry/sentry-java/pull/4282))
-
-## 7.22.4
-
-### Fixes
-
-- Session Replay: Fix crash when a navigation breadcrumb does not have "to" destination ([#4185](https://github.com/getsentry/sentry-java/pull/4185))
-- Session Replay: Cap video segment duration to maximum 5 minutes to prevent endless video encoding in background ([#4185](https://github.com/getsentry/sentry-java/pull/4185))
-- Avoid logging an error when a float is passed in the manifest ([#4266](https://github.com/getsentry/sentry-java/pull/4266))
-
-## 7.22.3
-
-### Fixes
-
-- Reduce excessive CPU usage when serializing breadcrumbs to disk for ANRs ([#4181](https://github.com/getsentry/sentry-java/pull/4181))
-
-## 7.22.2
-
-### Fixes
-
-- Fix AbstractMethodError when using SentryTraced for Jetpack Compose ([#4256](https://github.com/getsentry/sentry-java/pull/4256))
-
-## 7.22.1
-
-### Fixes
-
-- Fix Ensure app start type is set, even when ActivityLifecycleIntegration is not running ([#4216](https://github.com/getsentry/sentry-java/pull/4216))
-- Fix properly reset application/content-provider timespans for warm app starts ([#4244](https://github.com/getsentry/sentry-java/pull/4244))
-
-## 7.22.0
-
-### Fixes
-
-- Session Replay: Fix various crashes and issues ([#4135](https://github.com/getsentry/sentry-java/pull/4135))
- - Fix `FileNotFoundException` when trying to read/write `.ongoing_segment` file
- - Fix `IllegalStateException` when registering `onDrawListener`
- - Fix SIGABRT native crashes on Motorola devices when encoding a video
-- (Jetpack Compose) Modifier.sentryTag now uses Modifier.Node ([#4029](https://github.com/getsentry/sentry-java/pull/4029))
- - This allows Composables that use this modifier to be skippable
-
-## 7.21.0
-
-### Fixes
-
-- Do not instrument File I/O operations if tracing is disabled ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Do not instrument User Interaction multiple times ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Speed up view traversal to find touched target in `UserInteractionIntegration` ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Reduce IPC/Binder calls performed by the SDK ([#4058](https://github.com/getsentry/sentry-java/pull/4058))
-
-### Behavioural Changes
-
-- (changed in [7.20.1](https://github.com/getsentry/sentry-java/releases/tag/7.20.1)) The user ip-address is now only set to `"{{auto}}"` if sendDefaultPii is enabled ([#4071](https://github.com/getsentry/sentry-java/pull/4071))
- - This change gives you control over IP address collection directly on the client
-- Reduce the number of broadcasts the SDK is subscribed for ([#4052](https://github.com/getsentry/sentry-java/pull/4052))
- - Drop `TempSensorBreadcrumbsIntegration`
- - Drop `PhoneStateBreadcrumbsIntegration`
- - Reduce number of broadcasts in `SystemEventsBreadcrumbsIntegration`
-
-Current list of the broadcast events can be found [here](https://github.com/getsentry/sentry-java/blob/9b8dc0a844d10b55ddeddf55d278c0ab0f86421c/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java#L131-L153). If you'd like to subscribe for more events, consider overriding the `SystemEventsBreadcrumbsIntegration` as follows:
-
-```kotlin
-SentryAndroid.init(context) { options ->
- options.integrations.removeAll { it is SystemEventsBreadcrumbsIntegration }
- options.integrations.add(SystemEventsBreadcrumbsIntegration(context, SystemEventsBreadcrumbsIntegration.getDefaultActions() + listOf(/* your custom actions */)))
-}
-```
-
-If you would like to keep some of the default broadcast events as breadcrumbs, consider opening a [GitHub issue](https://github.com/getsentry/sentry-java/issues/new).
-
-## 7.21.0-beta.1
-
-### Fixes
-
-- Do not instrument File I/O operations if tracing is disabled ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Do not instrument User Interaction multiple times ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Speed up view traversal to find touched target in `UserInteractionIntegration` ([#4051](https://github.com/getsentry/sentry-java/pull/4051))
-- Reduce IPC/Binder calls performed by the SDK ([#4058](https://github.com/getsentry/sentry-java/pull/4058))
-
-### Behavioural Changes
-
-- Reduce the number of broadcasts the SDK is subscribed for ([#4052](https://github.com/getsentry/sentry-java/pull/4052))
- - Drop `TempSensorBreadcrumbsIntegration`
- - Drop `PhoneStateBreadcrumbsIntegration`
- - Reduce number of broadcasts in `SystemEventsBreadcrumbsIntegration`
-
-Current list of the broadcast events can be found [here](https://github.com/getsentry/sentry-java/blob/9b8dc0a844d10b55ddeddf55d278c0ab0f86421c/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java#L131-L153). If you'd like to subscribe for more events, consider overriding the `SystemEventsBreadcrumbsIntegration` as follows:
-
-```kotlin
-SentryAndroid.init(context) { options ->
- options.integrations.removeAll { it is SystemEventsBreadcrumbsIntegration }
- options.integrations.add(SystemEventsBreadcrumbsIntegration(context, SystemEventsBreadcrumbsIntegration.getDefaultActions() + listOf(/* your custom actions */)))
-}
-```
-
-If you would like to keep some of the default broadcast events as breadcrumbs, consider opening a [GitHub issue](https://github.com/getsentry/sentry-java/issues/new).
-
-## 7.20.1
-
-### Behavioural Changes
-
-- The user ip-address is now only set to `"{{auto}}"` if sendDefaultPii is enabled ([#4071](https://github.com/getsentry/sentry-java/pull/4071))
- - This change gives you control over IP address collection directly on the client
-
-## 7.20.0
-
-### Features
-
-- Session Replay GA ([#4017](https://github.com/getsentry/sentry-java/pull/4017))
-
-To enable Replay use the `sessionReplay.sessionSampleRate` or `sessionReplay.onErrorSampleRate` options.
-
-```kotlin
-import io.sentry.SentryReplayOptions
-import io.sentry.android.core.SentryAndroid
-
-SentryAndroid.init(context) { options ->
-
- options.sessionReplay.sessionSampleRate = 1.0
- options.sessionReplay.onErrorSampleRate = 1.0
-
- // To change default redaction behavior (defaults to true)
- options.sessionReplay.redactAllImages = true
- options.sessionReplay.redactAllText = true
-
- // To change quality of the recording (defaults to MEDIUM)
- options.sessionReplay.quality = SentryReplayOptions.SentryReplayQuality.MEDIUM // (LOW|MEDIUM|HIGH)
-}
-```
-
-### Fixes
-
-- Fix warm start detection ([#3937](https://github.com/getsentry/sentry-java/pull/3937))
-- Session Replay: Reduce memory allocations, disk space consumption, and payload size ([#4016](https://github.com/getsentry/sentry-java/pull/4016))
-- Session Replay: Do not try to encode corrupted frames multiple times ([#4016](https://github.com/getsentry/sentry-java/pull/4016))
-
-### Internal
-
-- Session Replay: Allow overriding `SdkVersion` for replay events ([#4014](https://github.com/getsentry/sentry-java/pull/4014))
-- Session Replay: Send replay options as tags ([#4015](https://github.com/getsentry/sentry-java/pull/4015))
-
-### Breaking changes
-
-- Session Replay options were moved from under `experimental` to the main `options` object ([#4017](https://github.com/getsentry/sentry-java/pull/4017))
-
-## 7.19.1
-
-### Fixes
-
-- Change TTFD timeout to 25 seconds ([#3984](https://github.com/getsentry/sentry-java/pull/3984))
-- Session Replay: Fix memory leak when masking Compose screens ([#3985](https://github.com/getsentry/sentry-java/pull/3985))
-- Session Replay: Fix potential ANRs in `GestureRecorder` ([#4001](https://github.com/getsentry/sentry-java/pull/4001))
-
-### Internal
-
-- Session Replay: Flutter improvements ([#4007](https://github.com/getsentry/sentry-java/pull/4007))
-
-## 7.19.0
-
-### Fixes
-
-- Session Replay: fix various crashes and issues ([#3970](https://github.com/getsentry/sentry-java/pull/3970))
- - Fix `IndexOutOfBoundsException` when tracking window changes
- - Fix `IllegalStateException` when adding/removing draw listener for a dead view
- - Fix `ConcurrentModificationException` when registering window listeners and stopping `WindowRecorder`/`GestureRecorder`
-- Add support for setting sentry-native handler_strategy ([#3671](https://github.com/getsentry/sentry-java/pull/3671))
-
-### Dependencies
-
-- Bump Native SDK from v0.7.8 to v0.7.16 ([#3671](https://github.com/getsentry/sentry-java/pull/3671))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0716)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.7.8...0.7.16)
-
-## 7.18.1
-
-### Fixes
-
-- Fix testTag not working for Jetpack Compose user interaction tracking ([#3878](https://github.com/getsentry/sentry-java/pull/3878))
-
-## 7.18.0
-
-### Features
-
-- Android 15: Add support for 16KB page sizes ([#3620](https://github.com/getsentry/sentry-java/pull/3620))
- - See https://developer.android.com/guide/practices/page-sizes for more details
-- Session Replay: Add `beforeSendReplay` callback ([#3855](https://github.com/getsentry/sentry-java/pull/3855))
-- Session Replay: Add support for masking/unmasking view containers ([#3881](https://github.com/getsentry/sentry-java/pull/3881))
-
-### Fixes
-
-- Avoid collecting normal frames ([#3782](https://github.com/getsentry/sentry-java/pull/3782))
-- Ensure android initialization process continues even if options configuration block throws an exception ([#3887](https://github.com/getsentry/sentry-java/pull/3887))
-- Do not report parsing ANR error when there are no threads ([#3888](https://github.com/getsentry/sentry-java/pull/3888))
- - This should significantly reduce the number of events with message "Sentry Android SDK failed to parse system thread dump..." reported
-- Session Replay: Disable replay in session mode when rate limit is active ([#3854](https://github.com/getsentry/sentry-java/pull/3854))
-
-### Dependencies
-
-- Bump Native SDK from v0.7.2 to v0.7.8 ([#3620](https://github.com/getsentry/sentry-java/pull/3620))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#078)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.7.2...0.7.8)
-
-## 7.17.0
-
-### Features
-
-- Add meta option to set the maximum amount of breadcrumbs to be logged. ([#3836](https://github.com/getsentry/sentry-java/pull/3836))
-- Use a separate `Random` instance per thread to improve SDK performance ([#3835](https://github.com/getsentry/sentry-java/pull/3835))
-
-### Fixes
-
-- Using MaxBreadcrumb with value 0 no longer crashes. ([#3836](https://github.com/getsentry/sentry-java/pull/3836))
-- Accept manifest integer values when requiring floating values ([#3823](https://github.com/getsentry/sentry-java/pull/3823))
-- Fix standalone tomcat jndi issue ([#3873](https://github.com/getsentry/sentry-java/pull/3873))
- - Using Sentry Spring Boot on a standalone tomcat caused the following error:
- - Failed to bind properties under 'sentry.parsed-dsn' to io.sentry.Dsn
-
-## 7.16.0
-
-### Features
-
-- Add meta option to attach ANR thread dumps ([#3791](https://github.com/getsentry/sentry-java/pull/3791))
-
-### Fixes
-
-- Cache parsed Dsn ([#3796](https://github.com/getsentry/sentry-java/pull/3796))
-- fix invalid profiles when the transaction name is empty ([#3747](https://github.com/getsentry/sentry-java/pull/3747))
-- Deprecate `enableTracing` option ([#3777](https://github.com/getsentry/sentry-java/pull/3777))
-- Vendor `java.util.Random` and replace `java.security.SecureRandom` usages ([#3783](https://github.com/getsentry/sentry-java/pull/3783))
-- Fix potential ANRs due to NDK scope sync ([#3754](https://github.com/getsentry/sentry-java/pull/3754))
-- Fix potential ANRs due to NDK System.loadLibrary calls ([#3670](https://github.com/getsentry/sentry-java/pull/3670))
-- Fix slow `Log` calls on app startup ([#3793](https://github.com/getsentry/sentry-java/pull/3793))
-- Fix slow Integration name parsing ([#3794](https://github.com/getsentry/sentry-java/pull/3794))
-- Session Replay: Reduce startup and capture overhead ([#3799](https://github.com/getsentry/sentry-java/pull/3799))
-- Load lazy fields on init in the background ([#3803](https://github.com/getsentry/sentry-java/pull/3803))
-- Replace setOf with HashSet.add ([#3801](https://github.com/getsentry/sentry-java/pull/3801))
-
-### Breaking changes
-
-- The method `addIntegrationToSdkVersion(Ljava/lang/Class;)V` has been removed from the core (`io.sentry:sentry`) package. Please make sure all of the packages (e.g. `io.sentry:sentry-android-core`, `io.sentry:sentry-android-fragment`, `io.sentry:sentry-okhttp` and others) are all aligned and using the same version to prevent the `NoSuchMethodError` exception.
-
-## 7.16.0-alpha.1
-
-### Features
-
-- Add meta option to attach ANR thread dumps ([#3791](https://github.com/getsentry/sentry-java/pull/3791))
-
-### Fixes
-
-- Cache parsed Dsn ([#3796](https://github.com/getsentry/sentry-java/pull/3796))
-- fix invalid profiles when the transaction name is empty ([#3747](https://github.com/getsentry/sentry-java/pull/3747))
-- Deprecate `enableTracing` option ([#3777](https://github.com/getsentry/sentry-java/pull/3777))
-- Vendor `java.util.Random` and replace `java.security.SecureRandom` usages ([#3783](https://github.com/getsentry/sentry-java/pull/3783))
-- Fix potential ANRs due to NDK scope sync ([#3754](https://github.com/getsentry/sentry-java/pull/3754))
-- Fix potential ANRs due to NDK System.loadLibrary calls ([#3670](https://github.com/getsentry/sentry-java/pull/3670))
-- Fix slow `Log` calls on app startup ([#3793](https://github.com/getsentry/sentry-java/pull/3793))
-- Fix slow Integration name parsing ([#3794](https://github.com/getsentry/sentry-java/pull/3794))
-- Session Replay: Reduce startup and capture overhead ([#3799](https://github.com/getsentry/sentry-java/pull/3799))
-
-## 7.15.0
-
-### Features
-
-- Add support for `feedback` envelope header item type ([#3687](https://github.com/getsentry/sentry-java/pull/3687))
-- Add breadcrumb.origin field ([#3727](https://github.com/getsentry/sentry-java/pull/3727))
-- Session Replay: Add options to selectively mask/unmask views captured in replay. The following options are available: ([#3689](https://github.com/getsentry/sentry-java/pull/3689))
- - `android:tag="sentry-mask|sentry-unmask"` in XML or `view.setTag("sentry-mask|sentry-unmask")` in code tags
- - if you already have a tag set for a view, you can set a tag by id: `` in XML or `view.setTag(io.sentry.android.replay.R.id.sentry_privacy, "mask|unmask")` in code
- - `view.sentryReplayMask()` or `view.sentryReplayUnmask()` extension functions
- - mask/unmask `View`s of a certain type by adding fully-qualified classname to one of the lists `options.experimental.sessionReplay.addMaskViewClass()` or `options.experimental.sessionReplay.addUnmaskViewClass()`. Note, that all of the view subclasses/subtypes will be masked/unmasked as well
- - For example, (this is already a default behavior) to mask all `TextView`s and their subclasses (`RadioButton`, `EditText`, etc.): `options.experimental.sessionReplay.addMaskViewClass("android.widget.TextView")`
- - If you're using code obfuscation, adjust your proguard-rules accordingly, so your custom view class name is not minified
-- Session Replay: Support Jetpack Compose masking ([#3739](https://github.com/getsentry/sentry-java/pull/3739))
- - To selectively mask/unmask @Composables, use `Modifier.sentryReplayMask()` and `Modifier.sentryReplayUnmask()` modifiers
-- Session Replay: Mask `WebView`, `VideoView` and `androidx.media3.ui.PlayerView` by default ([#3775](https://github.com/getsentry/sentry-java/pull/3775))
-
-### Fixes
-
-- Avoid stopping appStartProfiler after application creation ([#3630](https://github.com/getsentry/sentry-java/pull/3630))
-- Session Replay: Correctly detect dominant color for `TextView`s with Spans ([#3682](https://github.com/getsentry/sentry-java/pull/3682))
-- Fix ensure Application Context is used even when SDK is initialized via Activity Context ([#3669](https://github.com/getsentry/sentry-java/pull/3669))
-- Fix potential ANRs due to `Calendar.getInstance` usage in Breadcrumbs constructor ([#3736](https://github.com/getsentry/sentry-java/pull/3736))
-- Fix potential ANRs due to default integrations ([#3778](https://github.com/getsentry/sentry-java/pull/3778))
-- Lazily initialize heavy `SentryOptions` members to avoid ANRs on app start ([#3749](https://github.com/getsentry/sentry-java/pull/3749))
-
-_Breaking changes_:
-
-- `options.experimental.sessionReplay.errorSampleRate` was renamed to `options.experimental.sessionReplay.onErrorSampleRate` ([#3637](https://github.com/getsentry/sentry-java/pull/3637))
-- Manifest option `io.sentry.session-replay.error-sample-rate` was renamed to `io.sentry.session-replay.on-error-sample-rate` ([#3637](https://github.com/getsentry/sentry-java/pull/3637))
-- Change `redactAllText` and `redactAllImages` to `maskAllText` and `maskAllImages` ([#3741](https://github.com/getsentry/sentry-java/pull/3741))
-
-## 7.14.0
-
-### Features
-
-- Session Replay: Gesture/touch support for Flutter ([#3623](https://github.com/getsentry/sentry-java/pull/3623))
-
-### Fixes
-
-- Fix app start spans missing from Pixel devices ([#3634](https://github.com/getsentry/sentry-java/pull/3634))
-- Avoid ArrayIndexOutOfBoundsException on Android cpu data collection ([#3598](https://github.com/getsentry/sentry-java/pull/3598))
-- Fix lazy select queries instrumentation ([#3604](https://github.com/getsentry/sentry-java/pull/3604))
-- Session Replay: buffer mode improvements ([#3622](https://github.com/getsentry/sentry-java/pull/3622))
- - Align next segment timestamp with the end of the buffered segment when converting from buffer mode to session mode
- - Persist `buffer` replay type for the entire replay when converting from buffer mode to session mode
- - Properly store screen names for `buffer` mode
-- Session Replay: fix various crashes and issues ([#3628](https://github.com/getsentry/sentry-java/pull/3628))
- - Fix video not being encoded on Pixel devices
- - Fix SIGABRT native crashes on Xiaomi devices when encoding a video
- - Fix `RejectedExecutionException` when redacting a screenshot
- - Fix `FileNotFoundException` when persisting segment values
-
-### Chores
-
-- Introduce `ReplayShadowMediaCodec` and refactor tests using custom encoder ([#3612](https://github.com/getsentry/sentry-java/pull/3612))
-
-## 7.13.0
-
-### Features
-
-- Session Replay: ([#3565](https://github.com/getsentry/sentry-java/pull/3565)) ([#3609](https://github.com/getsentry/sentry-java/pull/3609))
- - Capture remaining replay segment for ANRs on next app launch
- - Capture remaining replay segment for unhandled crashes on next app launch
-
-### Fixes
-
-- Session Replay: ([#3565](https://github.com/getsentry/sentry-java/pull/3565)) ([#3609](https://github.com/getsentry/sentry-java/pull/3609))
- - Fix stopping replay in `session` mode at 1 hour deadline
- - Never encode full frames for a video segment, only do partial updates. This further reduces size of the replay segment
- - Use propagation context when no active transaction for ANRs
-
-### Dependencies
-
-- Bump Spring Boot to 3.3.2 ([#3541](https://github.com/getsentry/sentry-java/pull/3541))
-
-## 7.12.1
-
-### Fixes
-
-- Check app start spans time and ignore background app starts ([#3550](https://github.com/getsentry/sentry-java/pull/3550))
- - This should eliminate long-lasting App Start transactions
-
-## 7.12.0
-
-### Features
-
-- Session Replay Public Beta ([#3339](https://github.com/getsentry/sentry-java/pull/3339))
-
- To enable Replay use the `sessionReplay.sessionSampleRate` or `sessionReplay.errorSampleRate` experimental options.
-
- ```kotlin
- import io.sentry.SentryReplayOptions
- import io.sentry.android.core.SentryAndroid
-
- SentryAndroid.init(context) { options ->
-
- // Currently under experimental options:
- options.experimental.sessionReplay.sessionSampleRate = 1.0
- options.experimental.sessionReplay.errorSampleRate = 1.0
-
- // To change default redaction behavior (defaults to true)
- options.experimental.sessionReplay.redactAllImages = true
- options.experimental.sessionReplay.redactAllText = true
-
- // To change quality of the recording (defaults to MEDIUM)
- options.experimental.sessionReplay.quality = SentryReplayOptions.SentryReplayQuality.MEDIUM // (LOW|MEDIUM|HIGH)
- }
- ```
-
- To learn more visit [Sentry's Mobile Session Replay](https://docs.sentry.io/product/explore/session-replay/mobile/) documentation page.
-
-## 7.11.0
-
-### Features
-
-- Report dropped spans ([#3528](https://github.com/getsentry/sentry-java/pull/3528))
-
-### Fixes
-
-- Fix duplicate session start for React Native ([#3504](https://github.com/getsentry/sentry-java/pull/3504))
-- Move onFinishCallback before span or transaction is finished ([#3459](https://github.com/getsentry/sentry-java/pull/3459))
-- Add timestamp when a profile starts ([#3442](https://github.com/getsentry/sentry-java/pull/3442))
-- Move fragment auto span finish to onFragmentStarted ([#3424](https://github.com/getsentry/sentry-java/pull/3424))
-- Remove profiling timeout logic and disable profiling on API 21 ([#3478](https://github.com/getsentry/sentry-java/pull/3478))
-- Properly reset metric flush flag on metric emission ([#3493](https://github.com/getsentry/sentry-java/pull/3493))
-- Use SecureRandom in favor of Random for Metrics ([#3495](https://github.com/getsentry/sentry-java/pull/3495))
-- Fix UncaughtExceptionHandlerIntegration Memory Leak ([#3398](https://github.com/getsentry/sentry-java/pull/3398))
-- Deprecated `User.segment`. Use a custom tag or context instead. ([#3511](https://github.com/getsentry/sentry-java/pull/3511))
-- Fix duplicated http spans ([#3526](https://github.com/getsentry/sentry-java/pull/3526))
-- When capturing unhandled hybrid exception session should be ended and new start if need ([#3480](https://github.com/getsentry/sentry-java/pull/3480))
-
-### Dependencies
-
-- Bump Native SDK from v0.7.0 to v0.7.2 ([#3314](https://github.com/getsentry/sentry-java/pull/3314))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#072)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.7.0...0.7.2)
-
-## 7.10.0
-
-### Features
-
-- Publish Gradle module metadata ([#3422](https://github.com/getsentry/sentry-java/pull/3422))
-
-### Fixes
-
-- Fix faulty `span.frame_delay` calculation for early app start spans ([#3427](https://github.com/getsentry/sentry-java/pull/3427))
-- Fix crash when installing `ShutdownHookIntegration` and the VM is shutting down ([#3456](https://github.com/getsentry/sentry-java/pull/3456))
-
-## 7.9.0
-
-### Features
-
-- Add start_type to app context ([#3379](https://github.com/getsentry/sentry-java/pull/3379))
-- Add ttid/ttfd contribution flags ([#3386](https://github.com/getsentry/sentry-java/pull/3386))
-
-### Fixes
-
-- (Internal) Metrics code cleanup ([#3403](https://github.com/getsentry/sentry-java/pull/3403))
-- Fix Frame measurements in app start transactions ([#3382](https://github.com/getsentry/sentry-java/pull/3382))
-- Fix timing metric value different from span duration ([#3368](https://github.com/getsentry/sentry-java/pull/3368))
-- Do not always write startup crash marker ([#3409](https://github.com/getsentry/sentry-java/pull/3409))
- - This may have been causing the SDK init logic to block the main thread
-
-## 7.8.0
-
-### Features
-
-- Add description to OkHttp spans ([#3320](https://github.com/getsentry/sentry-java/pull/3320))
-- Enable backpressure management by default ([#3284](https://github.com/getsentry/sentry-java/pull/3284))
-
-### Fixes
-
-- Add rate limit to Metrics ([#3334](https://github.com/getsentry/sentry-java/pull/3334))
-- Fix java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping in Spring Boot Servlet mode without WebMVC ([#3336](https://github.com/getsentry/sentry-java/pull/3336))
-- Fix normalization of metrics keys, tags and values ([#3332](https://github.com/getsentry/sentry-java/pull/3332))
-
-## 7.7.0
-
-### Features
-
-- Add support for Spring Rest Client ([#3199](https://github.com/getsentry/sentry-java/pull/3199))
-- Extend Proxy options with proxy type ([#3326](https://github.com/getsentry/sentry-java/pull/3326))
-
-### Fixes
-
-- Fixed default deadline timeout to 30s instead of 300s ([#3322](https://github.com/getsentry/sentry-java/pull/3322))
-- Fixed `Fix java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerExceptionResolver` in Spring Boot Servlet mode without WebMVC ([#3333](https://github.com/getsentry/sentry-java/pull/3333))
-
-## 7.6.0
-
-### Features
-
-- Experimental: Add support for Sentry Developer Metrics ([#3205](https://github.com/getsentry/sentry-java/pull/3205), [#3238](https://github.com/getsentry/sentry-java/pull/3238), [#3248](https://github.com/getsentry/sentry-java/pull/3248), [#3250](https://github.com/getsentry/sentry-java/pull/3250))
- Use the Metrics API to track processing time, download sizes, user signups, and conversion rates and correlate them back to tracing data in order to get deeper insights and solve issues faster. Our API supports counters, distributions, sets, gauges and timers, and it's easy to get started:
- ```kotlin
- Sentry.metrics()
- .increment(
- "button_login_click", // key
- 1.0, // value
- null, // unit
- mapOf( // tags
- "provider" to "e-mail"
- )
- )
- ```
- To learn more about Sentry Developer Metrics, head over to our [Java](https://docs.sentry.io/platforms/java/metrics/) and [Android](https://docs.sentry.io//platforms/android/metrics/) docs page.
-
-## 7.5.0
-
-### Features
-
-- Add support for measurements at span level ([#3219](https://github.com/getsentry/sentry-java/pull/3219))
-- Add `enableScopePersistence` option to disable `PersistingScopeObserver` used for ANR reporting which may increase performance overhead. Defaults to `true` ([#3218](https://github.com/getsentry/sentry-java/pull/3218))
- - When disabled, the SDK will not enrich ANRv2 events with scope data (e.g. breadcrumbs, user, tags, etc.)
-- Configurable defaults for Cron - MonitorConfig ([#3195](https://github.com/getsentry/sentry-java/pull/3195))
-- We now display a warning on startup if an incompatible version of Spring Boot is detected ([#3233](https://github.com/getsentry/sentry-java/pull/3233))
- - This should help notice a mismatching Sentry dependency, especially when upgrading a Spring Boot application
-- Experimental: Add Metrics API ([#3205](https://github.com/getsentry/sentry-java/pull/3205))
-
-### Fixes
-
-- Ensure performance measurement collection is not taken too frequently ([#3221](https://github.com/getsentry/sentry-java/pull/3221))
-- Fix old profiles deletion on SDK init ([#3216](https://github.com/getsentry/sentry-java/pull/3216))
-- Fix hub restore point in wrappers: SentryWrapper, SentryTaskDecorator and SentryScheduleHook ([#3225](https://github.com/getsentry/sentry-java/pull/3225))
- - We now reset the hub to its previous value on the thread where the `Runnable`/`Callable`/`Supplier` is executed instead of setting it to the hub that was used on the thread where the `Runnable`/`Callable`/`Supplier` was created.
-- Fix add missing thread name/id to app start spans ([#3226](https://github.com/getsentry/sentry-java/pull/3226))
-
-## 7.4.0
-
-### Features
-
-- Add new threshold parameters to monitor config ([#3181](https://github.com/getsentry/sentry-java/pull/3181))
-- Report process init time as a span for app start performance ([#3159](https://github.com/getsentry/sentry-java/pull/3159))
-- (perf-v2): Calculate frame delay on a span level ([#3197](https://github.com/getsentry/sentry-java/pull/3197))
-- Resolve spring properties in @SentryCheckIn annotation ([#3194](https://github.com/getsentry/sentry-java/pull/3194))
-- Experimental: Add Spotlight integration ([#3166](https://github.com/getsentry/sentry-java/pull/3166))
- - For more details about Spotlight head over to https://spotlightjs.com/
- - Set `options.isEnableSpotlight = true` to enable Spotlight
-
-### Fixes
-
-- Don't wait on main thread when SDK restarts ([#3200](https://github.com/getsentry/sentry-java/pull/3200))
-- Fix Jetpack Compose widgets are not being correctly identified for user interaction tracing ([#3209](https://github.com/getsentry/sentry-java/pull/3209))
-- Fix issue title on Android when a wrapping `RuntimeException` is thrown by the system ([#3212](https://github.com/getsentry/sentry-java/pull/3212))
- - This will change grouping of the issues that were previously titled `RuntimeInit$MethodAndArgsCaller` to have them split up properly by the original root cause exception
-
-## 7.3.0
-
-### Features
-
-- Added App Start profiling
- - This depends on the new option `io.sentry.profiling.enable-app-start`, other than the already existing `io.sentry.traces.profiling.sample-rate`.
- - Sampler functions can check the new `isForNextAppStart` flag, to adjust startup profiling sampling programmatically.
- Relevant PRs:
- - Decouple Profiler from Transaction ([#3101](https://github.com/getsentry/sentry-java/pull/3101))
- - Add options and sampling logic ([#3121](https://github.com/getsentry/sentry-java/pull/3121))
- - Add ContentProvider and start profile ([#3128](https://github.com/getsentry/sentry-java/pull/3128))
-- Extend internal performance collector APIs ([#3102](https://github.com/getsentry/sentry-java/pull/3102))
-- Collect slow and frozen frames for spans using `OnFrameMetricsAvailableListener` ([#3111](https://github.com/getsentry/sentry-java/pull/3111))
-- Interpolate total frame count to match span duration ([#3158](https://github.com/getsentry/sentry-java/pull/3158))
-
-### Fixes
-
-- Avoid multiple breadcrumbs from OkHttpEventListener ([#3175](https://github.com/getsentry/sentry-java/pull/3175))
-- Apply OkHttp listener auto finish timestamp to all running spans ([#3167](https://github.com/getsentry/sentry-java/pull/3167))
-- Fix not eligible for auto proxying warnings ([#3154](https://github.com/getsentry/sentry-java/pull/3154))
-- Set default fingerprint for ANRv2 events to correctly group background and foreground ANRs ([#3164](https://github.com/getsentry/sentry-java/pull/3164))
- - This will improve grouping of ANRs that have similar stacktraces but differ in background vs foreground state. Only affects newly-ingested ANR events with `mechanism:AppExitInfo`
-- Fix UserFeedback disk cache name conflicts with linked events ([#3116](https://github.com/getsentry/sentry-java/pull/3116))
-
-### Breaking changes
-
-- Remove `HostnameVerifier` option as it's flagged by security tools of some app stores ([#3150](https://github.com/getsentry/sentry-java/pull/3150))
- - If you were using this option, you have 3 possible paths going forward:
- - Provide a custom `ITransportFactory` through `SentryOptions.setTransportFactory()`, where you can copy over most of the parts like `HttpConnection` and `AsyncHttpTransport` from the SDK with necessary modifications
- - Get a certificate for your server through e.g. [Let's Encrypt](https://letsencrypt.org/)
- - Fork the SDK and add the hostname verifier back
-
-### Dependencies
-
-- Bump Native SDK from v0.6.7 to v0.7.0 ([#3133](https://github.com/getsentry/sentry-java/pull/3133))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#070)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.7...0.7.0)
-
-## 7.2.0
-
-### Features
-
-- Handle `monitor`/`check_in` in client reports and rate limiter ([#3096](https://github.com/getsentry/sentry-java/pull/3096))
-- Add support for `graphql-java` version 21 ([#3090](https://github.com/getsentry/sentry-java/pull/3090))
-
-### Fixes
-
-- Avoid concurrency in AndroidProfiler performance data collection ([#3130](https://github.com/getsentry/sentry-java/pull/3130))
-- Improve thresholds for network changes breadcrumbs ([#3083](https://github.com/getsentry/sentry-java/pull/3083))
-- SchedulerFactoryBeanCustomizer now runs first so user customization is not overridden ([#3095](https://github.com/getsentry/sentry-java/pull/3095))
- - If you are setting global job listeners please also add `SentryJobListener`
-- Ensure serialVersionUID of Exception classes are unique ([#3115](https://github.com/getsentry/sentry-java/pull/3115))
-- Get rid of "is not eligible for getting processed by all BeanPostProcessors" warnings in Spring Boot ([#3108](https://github.com/getsentry/sentry-java/pull/3108))
-- Fix missing `release` and other fields for ANRs reported with `mechanism:AppExitInfo` ([#3074](https://github.com/getsentry/sentry-java/pull/3074))
-
-### Dependencies
-
-- Bump `opentelemetry-sdk` to `1.33.0` and `opentelemetry-javaagent` to `1.32.0` ([#3112](https://github.com/getsentry/sentry-java/pull/3112))
-
-## 7.1.0
-
-### Features
-
-- Support multiple debug-metadata.properties ([#3024](https://github.com/getsentry/sentry-java/pull/3024))
-- Automatically downsample transactions when the system is under load ([#3072](https://github.com/getsentry/sentry-java/pull/3072))
- - You can opt into this behaviour by setting `enable-backpressure-handling=true`.
- - We're happy to receive feedback, e.g. [in this GitHub issue](https://github.com/getsentry/sentry-java/issues/2829)
- - When the system is under load we start reducing the `tracesSampleRate` automatically.
- - Once the system goes back to healthy, we reset the `tracesSampleRate` to its original value.
-- (Android) Experimental: Provide more detailed cold app start information ([#3057](https://github.com/getsentry/sentry-java/pull/3057))
- - Attaches spans for Application, ContentProvider, and Activities to app-start timings
- - Application and ContentProvider timings are added using bytecode instrumentation, which requires sentry-android-gradle-plugin version `4.1.0` or newer
- - Uses Process.startUptimeMillis to calculate app-start timings
- - To enable this feature set `options.isEnablePerformanceV2 = true`
-- Move slow+frozen frame calculation, as well as frame delay inside SentryFrameMetricsCollector ([#3100](https://github.com/getsentry/sentry-java/pull/3100))
-- Extract Activity Breadcrumbs generation into own Integration ([#3064](https://github.com/getsentry/sentry-java/pull/3064))
-
-### Fixes
-
-- Send breadcrumbs and client error in `SentryOkHttpEventListener` even without transactions ([#3087](https://github.com/getsentry/sentry-java/pull/3087))
-- Keep `io.sentry.exception.SentryHttpClientException` from obfuscation to display proper issue title on Sentry ([#3093](https://github.com/getsentry/sentry-java/pull/3093))
-- (Android) Fix wrong activity transaction duration in case SDK init is deferred ([#3092](https://github.com/getsentry/sentry-java/pull/3092))
-
-### Dependencies
-
-- Bump Gradle from v8.4.0 to v8.5.0 ([#3070](https://github.com/getsentry/sentry-java/pull/3070))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v850)
- - [diff](https://github.com/gradle/gradle/compare/v8.4.0...v8.5.0)
-
-## 7.0.0
-
-Version 7 of the Sentry Android/Java SDK brings a variety of features and fixes. The most notable changes are:
-
-- Bumping `minSdk` level to 19 (Android 4.4)
-- The SDK will now listen to connectivity changes and try to re-upload cached events when internet connection is re-established additionally to uploading events on app restart
-- `Sentry.getSpan` now returns the root transaction, which should improve the span hierarchy and make it leaner
-- Multiple improvements to reduce probability of the SDK causing ANRs
-- New `sentry-okhttp` artifact is unbundled from Android and can be used in pure JVM-only apps
-
-## Sentry Self-hosted Compatibility
-
-This SDK version is compatible with a self-hosted version of Sentry `22.12.0` or higher. If you are using an older version of [self-hosted Sentry](https://develop.sentry.dev/self-hosted/) (aka onpremise), you will need to [upgrade](https://develop.sentry.dev/self-hosted/releases/). If you're using `sentry.io` no action is required.
-
-## Sentry Integrations Version Compatibility (Android)
-
-Make sure to align _all_ Sentry dependencies to the same version when bumping the SDK to 7.+, otherwise it will crash at runtime due to binary incompatibility. (E.g. if you're using `-timber`, `-okhttp` or other packages)
-
-For example, if you're using the [Sentry Android Gradle plugin](https://github.com/getsentry/sentry-android-gradle-plugin) with the `autoInstallation` [feature](https://docs.sentry.io/platforms/android/configuration/gradle/#auto-installation) (enabled by default), make sure to use version 4.+ of the gradle plugin together with version 7.+ of the SDK. If you can't do that for some reason, you can specify sentry version via the plugin config block:
-
-```kotlin
-sentry {
- autoInstallation {
- sentryVersion.set("7.0.0")
- }
-}
-```
-
-Similarly, if you have a Sentry SDK (e.g. `sentry-android-core`) dependency on one of your Gradle modules and you're updating it to 7.+, make sure the Gradle plugin is at 4.+ or specify the SDK version as shown in the snippet above.
-
-## Breaking Changes
-
-- Bump min API to 19 ([#2883](https://github.com/getsentry/sentry-java/pull/2883))
-- If you're using `sentry-kotlin-extensions`, it requires `kotlinx-coroutines-core` version `1.6.1` or higher now ([#2838](https://github.com/getsentry/sentry-java/pull/2838))
-- Move enableNdk from SentryOptions to SentryAndroidOptions ([#2793](https://github.com/getsentry/sentry-java/pull/2793))
-- Apollo v2 BeforeSpanCallback now allows returning null ([#2890](https://github.com/getsentry/sentry-java/pull/2890))
-- `SentryOkHttpUtils` was removed from public API as it's been exposed by mistake ([#3005](https://github.com/getsentry/sentry-java/pull/3005))
-- `Scope` now implements the `IScope` interface, therefore some methods like `ScopeCallback.run` accept `IScope` now ([#3066](https://github.com/getsentry/sentry-java/pull/3066))
-- Cleanup `startTransaction` overloads ([#2964](https://github.com/getsentry/sentry-java/pull/2964))
- - We have reduced the number of overloads by allowing to pass in a `TransactionOptions` object instead of having separate parameters for certain options
- - `TransactionOptions` has defaults set and can be customized, for example:
-
-```kotlin
-// old
-val transaction = Sentry.startTransaction("name", "op", bindToScope = true)
-// new
-val transaction = Sentry.startTransaction("name", "op", TransactionOptions().apply { isBindToScope = true })
-```
-
-## Behavioural Changes
-
-- Android only: `Sentry.getSpan()` returns the root span/transaction instead of the latest span ([#2855](https://github.com/getsentry/sentry-java/pull/2855))
-- Capture failed HTTP and GraphQL (Apollo) requests by default ([#2794](https://github.com/getsentry/sentry-java/pull/2794))
- - This can increase your event consumption and may affect your quota, because we will report failed network requests as Sentry events by default, if you're using the `sentry-android-okhttp` or `sentry-apollo-3` integrations. You can customize what errors you want/don't want to have reported for [OkHttp](https://docs.sentry.io/platforms/android/integrations/okhttp#http-client-errors) and [Apollo3](https://docs.sentry.io/platforms/android/integrations/apollo3#graphql-client-errors) respectively.
-- Measure AppStart time till First Draw instead of `onResume` ([#2851](https://github.com/getsentry/sentry-java/pull/2851))
-- Automatic user interaction tracking: every click now starts a new automatic transaction ([#2891](https://github.com/getsentry/sentry-java/pull/2891))
- - Previously performing a click on the same UI widget twice would keep the existing transaction running, the new behavior now better aligns with other SDKs
-- Add deadline timeout for automatic transactions ([#2865](https://github.com/getsentry/sentry-java/pull/2865))
- - This affects all automatically generated transactions on Android (UI, clicks), the default timeout is 30s, meaning the automatic transaction will be force-finished with status `deadline_exceeded` when reaching the deadline
-- Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#2860](https://github.com/getsentry/sentry-java/pull/2860))
- - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io
-- Raw logback message and parameters are now guarded by `sendDefaultPii` if an `encoder` has been configured ([#2976](https://github.com/getsentry/sentry-java/pull/2976))
-- The `maxSpans` setting (defaults to 1000) is enforced for nested child spans which means a single transaction can have `maxSpans` number of children (nested or not) at most ([#3065](https://github.com/getsentry/sentry-java/pull/3065))
-- The `ScopeCallback` in `withScope` is now always executed ([#3066](https://github.com/getsentry/sentry-java/pull/3066))
-
-## Deprecations
-
-- `sentry-android-okhttp` was deprecated in favour of the new `sentry-okhttp` module. Make sure to replace `io.sentry.android.okhttp` package name with `io.sentry.okhttp` before the next major, where the classes will be removed ([#3005](https://github.com/getsentry/sentry-java/pull/3005))
-
-## Other Changes
-
-### Features
-
-- Observe network state to upload any unsent envelopes ([#2910](https://github.com/getsentry/sentry-java/pull/2910))
- - Android: it works out-of-the-box as part of the default `SendCachedEnvelopeIntegration`
- - JVM: you'd have to install `SendCachedEnvelopeFireAndForgetIntegration` as mentioned in https://docs.sentry.io/platforms/java/configuration/#configuring-offline-caching and provide your own implementation of `IConnectionStatusProvider` via `SentryOptions`
-- Add `sentry-okhttp` module to support instrumenting OkHttp in non-Android projects ([#3005](https://github.com/getsentry/sentry-java/pull/3005))
-- Do not filter out Sentry SDK frames in case of uncaught exceptions ([#3021](https://github.com/getsentry/sentry-java/pull/3021))
-- Do not try to send and drop cached envelopes when rate-limiting is active ([#2937](https://github.com/getsentry/sentry-java/pull/2937))
-
-### Fixes
-
-- Use `getMyMemoryState()` instead of `getRunningAppProcesses()` to retrieve process importance ([#3004](https://github.com/getsentry/sentry-java/pull/3004))
- - This should prevent some app stores from flagging apps as violating their privacy
-- Reduce flush timeout to 4s on Android to avoid ANRs ([#2858](https://github.com/getsentry/sentry-java/pull/2858))
-- Reduce timeout of AsyncHttpTransport to avoid ANR ([#2879](https://github.com/getsentry/sentry-java/pull/2879))
-- Do not overwrite UI transaction status if set by the user ([#2852](https://github.com/getsentry/sentry-java/pull/2852))
-- Capture unfinished transaction on Scope with status `aborted` in case a crash happens ([#2938](https://github.com/getsentry/sentry-java/pull/2938))
- - This will fix the link between transactions and corresponding crashes, you'll be able to see them in a single trace
-- Fix Coroutine Context Propagation using CopyableThreadContextElement ([#2838](https://github.com/getsentry/sentry-java/pull/2838))
-- Fix don't overwrite the span status of unfinished spans ([#2859](https://github.com/getsentry/sentry-java/pull/2859))
-- Migrate from `default` interface methods to proper implementations in each interface implementor ([#2847](https://github.com/getsentry/sentry-java/pull/2847))
- - This prevents issues when using the SDK on older AGP versions (< 4.x.x)
-- Reduce main thread work on init ([#3036](https://github.com/getsentry/sentry-java/pull/3036))
-- Move Integrations registration to background on init ([#3043](https://github.com/getsentry/sentry-java/pull/3043))
-- Fix `SentryOkHttpInterceptor.BeforeSpanCallback` was not finishing span when it was dropped ([#2958](https://github.com/getsentry/sentry-java/pull/2958))
-
-## 6.34.0
-
-### Features
-
-- Add current activity name to app context ([#2999](https://github.com/getsentry/sentry-java/pull/2999))
-- Add `MonitorConfig` param to `CheckInUtils.withCheckIn` ([#3038](https://github.com/getsentry/sentry-java/pull/3038))
- - This makes it easier to automatically create or update (upsert) monitors.
-- (Internal) Extract Android Profiler and Measurements for Hybrid SDKs ([#3016](https://github.com/getsentry/sentry-java/pull/3016))
-- (Internal) Remove SentryOptions dependency from AndroidProfiler ([#3051](https://github.com/getsentry/sentry-java/pull/3051))
-- (Internal) Add `readBytesFromFile` for use in Hybrid SDKs ([#3052](https://github.com/getsentry/sentry-java/pull/3052))
-- (Internal) Add `getProguardUuid` for use in Hybrid SDKs ([#3054](https://github.com/getsentry/sentry-java/pull/3054))
-
-### Fixes
-
-- Fix SIGSEV, SIGABRT and SIGBUS crashes happening after/around the August Google Play System update, see [#2955](https://github.com/getsentry/sentry-java/issues/2955) for more details (fix provided by Native SDK bump)
-- Ensure DSN uses http/https protocol ([#3044](https://github.com/getsentry/sentry-java/pull/3044))
-
-### Dependencies
-
-- Bump Native SDK from v0.6.6 to v0.6.7 ([#3048](https://github.com/getsentry/sentry-java/pull/3048))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#067)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.6...0.6.7)
-
-## 6.33.2-beta.1
-
-### Fixes
-
-- Fix SIGSEV, SIGABRT and SIGBUS crashes happening after/around the August Google Play System update, see [#2955](https://github.com/getsentry/sentry-java/issues/2955) for more details (fix provided by Native SDK bump)
-
-### Dependencies
-
-- Bump Native SDK from v0.6.6 to v0.6.7 ([#3048](https://github.com/getsentry/sentry-java/pull/3048))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#067)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.6...0.6.7)
-
-## 6.33.1
-
-### Fixes
-
-- Do not register `sentrySpringFilter` in ServletContext for Spring Boot ([#3027](https://github.com/getsentry/sentry-java/pull/3027))
-
-## 6.33.0
-
-### Features
-
-- Add thread information to spans ([#2998](https://github.com/getsentry/sentry-java/pull/2998))
-- Use PixelCopy API for capturing screenshots on API level 24+ ([#3008](https://github.com/getsentry/sentry-java/pull/3008))
-
-### Fixes
-
-- Fix crash when HTTP connection error message contains formatting symbols ([#3002](https://github.com/getsentry/sentry-java/pull/3002))
-- Cap max number of stack frames to 100 to not exceed payload size limit ([#3009](https://github.com/getsentry/sentry-java/pull/3009))
- - This will ensure we report errors with a big number of frames such as `StackOverflowError`
-- Fix user interaction tracking not working for Jetpack Compose 1.5+ ([#3010](https://github.com/getsentry/sentry-java/pull/3010))
-- Make sure to close all Closeable resources ([#3000](https://github.com/getsentry/sentry-java/pull/3000))
-
-## 6.32.0
-
-### Features
-
-- Make `DebugImagesLoader` public ([#2993](https://github.com/getsentry/sentry-java/pull/2993))
-
-### Fixes
-
-- Make `SystemEventsBroadcastReceiver` exported on API 33+ ([#2990](https://github.com/getsentry/sentry-java/pull/2990))
- - This will fix the `SystemEventsBreadcrumbsIntegration` crashes that you might have encountered on Play Console
-
-## 6.31.0
-
-### Features
-
-- Improve default debouncing mechanism ([#2945](https://github.com/getsentry/sentry-java/pull/2945))
-- Add `CheckInUtils.withCheckIn` which abstracts away some of the manual check-ins complexity ([#2959](https://github.com/getsentry/sentry-java/pull/2959))
-- Add `@SentryCaptureExceptionParameter` annotation which captures exceptions passed into an annotated method ([#2764](https://github.com/getsentry/sentry-java/pull/2764))
- - This can be used to replace `Sentry.captureException` calls in `@ExceptionHandler` of a `@ControllerAdvice`
-- Add `ServerWebExchange` to `Hint` for WebFlux as `WEBFLUX_EXCEPTION_HANDLER_EXCHANGE` ([#2977](https://github.com/getsentry/sentry-java/pull/2977))
-- Allow filtering GraphQL errors ([#2967](https://github.com/getsentry/sentry-java/pull/2967))
- - This list can be set directly when calling the constructor of `SentryInstrumentation`
- - For Spring Boot it can also be set in `application.properties` as `sentry.graphql.ignored-error-types=SOME_ERROR,ANOTHER_ERROR`
-
-### Fixes
-
-- Add OkHttp span auto-close when response body is not read ([#2923](https://github.com/getsentry/sentry-java/pull/2923))
-- Fix json parsing of nullable/empty fields for Hybrid SDKs ([#2968](https://github.com/getsentry/sentry-java/pull/2968))
- - (Internal) Rename `nextList` to `nextListOrNull` to actually match what the method does
- - (Hybrid) Check if there's any object in a collection before trying to parse it (which prevents the "Failed to deserilize object in list" log message)
- - (Hybrid) If a date can't be parsed as an ISO timestamp, attempts to parse it as millis silently, without printing a log message
- - (Hybrid) If `op` is not defined as part of `SpanContext`, fallback to an empty string, because the filed is optional in the spec
-- Always attach OkHttp errors and Http Client Errors only to call root span ([#2961](https://github.com/getsentry/sentry-java/pull/2961))
-- Fixed crash accessing Choreographer instance ([#2970](https://github.com/getsentry/sentry-java/pull/2970))
-
-### Dependencies
-
-- Bump Native SDK from v0.6.5 to v0.6.6 ([#2975](https://github.com/getsentry/sentry-java/pull/2975))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#066)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.5...0.6.6)
-- Bump Gradle from v8.3.0 to v8.4.0 ([#2966](https://github.com/getsentry/sentry-java/pull/2966))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v840)
- - [diff](https://github.com/gradle/gradle/compare/v8.3.0...v8.4.0)
-
-## 6.30.0
-
-### Features
-
-- Add `sendModules` option for disable sending modules ([#2926](https://github.com/getsentry/sentry-java/pull/2926))
-- Send `db.system` and `db.name` in span data for androidx.sqlite spans ([#2928](https://github.com/getsentry/sentry-java/pull/2928))
-- Check-ins (CRONS) support ([#2952](https://github.com/getsentry/sentry-java/pull/2952))
- - Add API for sending check-ins (CRONS) manually ([#2935](https://github.com/getsentry/sentry-java/pull/2935))
- - Support check-ins (CRONS) for Quartz ([#2940](https://github.com/getsentry/sentry-java/pull/2940))
- - `@SentryCheckIn` annotation and advice config for Spring ([#2946](https://github.com/getsentry/sentry-java/pull/2946))
- - Add option for ignoring certain monitor slugs ([#2943](https://github.com/getsentry/sentry-java/pull/2943))
-
-### Fixes
-
-- Always send memory stats for transactions ([#2936](https://github.com/getsentry/sentry-java/pull/2936))
- - This makes it possible to query transactions by the `device.class` tag on Sentry
-- Add `sentry.enable-aot-compatibility` property to SpringBoot Jakarta `SentryAutoConfiguration` to enable building for GraalVM ([#2915](https://github.com/getsentry/sentry-java/pull/2915))
-
-### Dependencies
-
-- Bump Gradle from v8.2.1 to v8.3.0 ([#2900](https://github.com/getsentry/sentry-java/pull/2900))
- - [changelog](https://github.com/gradle/gradle/blob/master release-test/CHANGELOG.md#v830)
- - [diff](https://github.com/gradle/gradle/compare/v8.2.1...v8.3.0)
-
-## 6.29.0
-
-### Features
-
-- Send `db.system` and `db.name` in span data ([#2894](https://github.com/getsentry/sentry-java/pull/2894))
-- Send `http.request.method` in span data ([#2896](https://github.com/getsentry/sentry-java/pull/2896))
-- Add `enablePrettySerializationOutput` option for opting out of pretty print ([#2871](https://github.com/getsentry/sentry-java/pull/2871))
-
-## 6.28.0
-
-### Features
-
-- Add HTTP response code to Spring WebFlux transactions ([#2870](https://github.com/getsentry/sentry-java/pull/2870))
-- Add `sampled` to Dynamic Sampling Context ([#2869](https://github.com/getsentry/sentry-java/pull/2869))
-- Improve server side GraphQL support for spring-graphql and Nextflix DGS ([#2856](https://github.com/getsentry/sentry-java/pull/2856))
- - If you have already been using `SentryDataFetcherExceptionHandler` that still works but has been deprecated. Please use `SentryGenericDataFetcherExceptionHandler` combined with `SentryInstrumentation` instead for better error reporting.
- - More exceptions and errors caught and reported to Sentry by also looking at the `ExecutionResult` (more specifically its `errors`)
- - You may want to filter out certain errors, please see [docs on filtering](https://docs.sentry.io/platforms/java/configuration/filtering/)
- - More details for Sentry events: query, variables and response (where possible)
- - Breadcrumbs for operation (query, mutation, subscription), data fetchers and data loaders (Spring only)
- - Better hub propagation by using `GraphQLContext`
-- Add autoconfigure modules for Spring Boot called `sentry-spring-boot` and `sentry-spring-boot-jakarta` ([#2880](https://github.com/getsentry/sentry-java/pull/2880))
- - The autoconfigure modules `sentry-spring-boot` and `sentry-spring-boot-jakarta` have a `compileOnly` dependency on `spring-boot-starter` which is needed for our auto installation in [sentry-android-gradle-plugin](https://github.com/getsentry/sentry-android-gradle-plugin)
- - The starter modules `sentry-spring-boot-starter` and `sentry-spring-boot-starter-jakarta` now bring `spring-boot-starter` as a dependency
-- You can now disable Sentry by setting the `enabled` option to `false` ([#2840](https://github.com/getsentry/sentry-java/pull/2840))
-
-### Fixes
-
-- Propagate OkHttp status to parent spans ([#2872](https://github.com/getsentry/sentry-java/pull/2872))
-
-## 6.27.0
-
-### Features
-
-- Add TraceOrigin to Transactions and Spans ([#2803](https://github.com/getsentry/sentry-java/pull/2803))
-
-### Fixes
-
-- Deduplicate events happening in multiple threads simultaneously (e.g. `OutOfMemoryError`) ([#2845](https://github.com/getsentry/sentry-java/pull/2845))
- - This will improve Crash-Free Session Rate as we no longer will send multiple Session updates with `Crashed` status, but only the one that is relevant
-- Ensure no Java 8 method reference sugar is used for Android ([#2857](https://github.com/getsentry/sentry-java/pull/2857))
-- Do not send session updates for terminated sessions ([#2849](https://github.com/getsentry/sentry-java/pull/2849))
-
-## 6.26.0
-
-### Features
-
-- (Internal) Extend APIs for hybrid SDKs ([#2814](https://github.com/getsentry/sentry-java/pull/2814), [#2846](https://github.com/getsentry/sentry-java/pull/2846))
-
-### Fixes
-
-- Fix ANRv2 thread dump parsing for native-only threads ([#2839](https://github.com/getsentry/sentry-java/pull/2839))
-- Derive `TracingContext` values from event for ANRv2 events ([#2839](https://github.com/getsentry/sentry-java/pull/2839))
-
-## 6.25.2
-
-### Fixes
-
-- Change Spring Boot, Apollo, Apollo 3, JUL, Logback, Log4j2, OpenFeign, GraphQL and Kotlin coroutines core dependencies to compileOnly ([#2837](https://github.com/getsentry/sentry-java/pull/2837))
-
-## 6.25.1
-
-### Fixes
-
-- Allow removing integrations in SentryAndroid.init ([#2826](https://github.com/getsentry/sentry-java/pull/2826))
-- Fix concurrent access to frameMetrics listener ([#2823](https://github.com/getsentry/sentry-java/pull/2823))
-
-### Dependencies
-
-- Bump Native SDK from v0.6.4 to v0.6.5 ([#2822](https://github.com/getsentry/sentry-java/pull/2822))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#065)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.4...0.6.5)
-- Bump Gradle from v8.2.0 to v8.2.1 ([#2830](https://github.com/getsentry/sentry-java/pull/2830))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v821)
- - [diff](https://github.com/gradle/gradle/compare/v8.2.0...v8.2.1)
-
-## 6.25.0
-
-### Features
-
-- Add manifest `AutoInit` to integrations list ([#2795](https://github.com/getsentry/sentry-java/pull/2795))
-- Tracing headers (`sentry-trace` and `baggage`) are now attached and passed through even if performance is disabled ([#2788](https://github.com/getsentry/sentry-java/pull/2788))
-
-### Fixes
-
-- Set `environment` from `SentryOptions` if none persisted in ANRv2 ([#2809](https://github.com/getsentry/sentry-java/pull/2809))
-- Remove code that set `tracesSampleRate` to `0.0` for Spring Boot if not set ([#2800](https://github.com/getsentry/sentry-java/pull/2800))
- - This used to enable performance but not send any transactions by default.
- - Performance is now disabled by default.
-- Fix slow/frozen frames were not reported with transactions ([#2811](https://github.com/getsentry/sentry-java/pull/2811))
-
-### Dependencies
-
-- Bump Native SDK from v0.6.3 to v0.6.4 ([#2796](https://github.com/getsentry/sentry-java/pull/2796))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#064)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.3...0.6.4)
-- Bump Gradle from v8.1.1 to v8.2.0 ([#2810](https://github.com/getsentry/sentry-java/pull/2810))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v820)
- - [diff](https://github.com/gradle/gradle/compare/v8.1.1...v8.2.0)
-
-## 6.24.0
-
-### Features
-
-- Add debouncing mechanism and before-capture callbacks for screenshots and view hierarchies ([#2773](https://github.com/getsentry/sentry-java/pull/2773))
-- Improve ANRv2 implementation ([#2792](https://github.com/getsentry/sentry-java/pull/2792))
- - Add a proguard rule to keep `ApplicationNotResponding` class from obfuscation
- - Add a new option `setReportHistoricalAnrs`; when enabled, it will report all of the ANRs from the [getHistoricalExitReasons]() list.
- By default, the SDK only reports and enriches the latest ANR and only this one counts towards ANR rate.
- Worth noting that this option is mainly useful when updating the SDK to the version where ANRv2 has been introduced, to report all ANRs happened prior to the SDK update. After that, the SDK will always pick up the latest ANR from the historical exit reasons list on next app restart, so there should be no historical ANRs to report.
- These ANRs are reported with the `HistoricalAppExitInfo` mechanism.
- - Add a new option `setAttachAnrThreadDump` to send ANR thread dump from the system as an attachment.
- This is only useful as additional information, because the SDK attempts to parse the thread dump into proper threads with stacktraces by default.
- - If [ApplicationExitInfo#getTraceInputStream]() returns null, the SDK no longer reports an ANR event, as these events are not very useful without it.
- - Enhance regex patterns for native stackframes
-
-## 6.23.0
-
-### Features
-
-- Add profile rate limiting ([#2782](https://github.com/getsentry/sentry-java/pull/2782))
-- Support for automatically capturing Failed GraphQL (Apollo 3) Client errors ([#2781](https://github.com/getsentry/sentry-java/pull/2781))
-
-```kotlin
-import com.apollographql.apollo3.ApolloClient
-import io.sentry.apollo3.sentryTracing
-
-val apolloClient = ApolloClient.Builder()
- .serverUrl("https://example.com/graphql")
- .sentryTracing(captureFailedRequests = true)
- .build()
-```
-
-### Dependencies
-
-- Bump Native SDK from v0.6.2 to v0.6.3 ([#2746](https://github.com/getsentry/sentry-java/pull/2746))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#063)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.2...0.6.3)
-
-### Fixes
-
-- Align http.status with [span data conventions](https://develop.sentry.dev/sdk/performance/span-data-conventions/) ([#2786](https://github.com/getsentry/sentry-java/pull/2786))
-
-## 6.22.0
-
-### Features
-
-- Add `lock` attribute to the `SentryStackFrame` protocol to better highlight offending frames in the UI ([#2761](https://github.com/getsentry/sentry-java/pull/2761))
-- Enrich database spans with blocked main thread info ([#2760](https://github.com/getsentry/sentry-java/pull/2760))
-- Add `api_target` to `Request` and `data` to `Response` Protocols ([#2775](https://github.com/getsentry/sentry-java/pull/2775))
-
-### Fixes
-
-- No longer use `String.join` in `Baggage` as it requires API level 26 ([#2778](https://github.com/getsentry/sentry-java/pull/2778))
-
-## 6.21.0
-
-### Features
-
-- Introduce new `sentry-android-sqlite` integration ([#2722](https://github.com/getsentry/sentry-java/pull/2722))
- - This integration replaces the old `androidx.sqlite` database instrumentation in the Sentry Android Gradle plugin
- - A new capability to manually instrument your `androidx.sqlite` databases.
- - You can wrap your custom `SupportSQLiteOpenHelper` instance into `SentrySupportSQLiteOpenHelper(myHelper)` if you're not using the Sentry Android Gradle plugin and still benefit from performance auto-instrumentation.
-- Add SentryWrapper for Callable and Supplier Interface ([#2720](https://github.com/getsentry/sentry-java/pull/2720))
-- Load sentry-debug-meta.properties ([#2734](https://github.com/getsentry/sentry-java/pull/2734))
- - This enables source context for Java
- - For more information on how to enable source context, please refer to [#633](https://github.com/getsentry/sentry-java/issues/633#issuecomment-1465599120)
-
-### Fixes
-
-- Finish WebFlux transaction before popping scope ([#2724](https://github.com/getsentry/sentry-java/pull/2724))
-- Use daemon threads for SentryExecutorService ([#2747](https://github.com/getsentry/sentry-java/pull/2747))
- - We started using `SentryExecutorService` in `6.19.0` which caused the application to hang on shutdown unless `Sentry.close()` was called. By using daemon threads we no longer block shutdown.
-- Use Base64.NO_WRAP to avoid unexpected char errors in Apollo ([#2745](https://github.com/getsentry/sentry-java/pull/2745))
-- Don't warn R8 on missing `ComposeViewHierarchyExporter` class ([#2743](https://github.com/getsentry/sentry-java/pull/2743))
-
-## 6.20.0
-
-### Features
-
-- Add support for Sentry Kotlin Compiler Plugin ([#2695](https://github.com/getsentry/sentry-java/pull/2695))
- - In conjunction with our sentry-kotlin-compiler-plugin we improved Jetpack Compose support for
- - [View Hierarchy](https://docs.sentry.io/platforms/android/enriching-events/viewhierarchy/) support for Jetpack Compose screens
- - Automatic breadcrumbs for [user interactions](https://docs.sentry.io/platforms/android/performance/instrumentation/automatic-instrumentation/#user-interaction-instrumentation)
-- More granular http requests instrumentation with a new SentryOkHttpEventListener ([#2659](https://github.com/getsentry/sentry-java/pull/2659))
- - Create spans for time spent on:
- - Proxy selection
- - DNS resolution
- - HTTPS setup
- - Connection
- - Requesting headers
- - Receiving response
- - You can attach the event listener to your OkHttpClient through `client.eventListener(new SentryOkHttpEventListener()).addInterceptor(new SentryOkHttpInterceptor()).build();`
- - In case you already have an event listener you can use the SentryOkHttpEventListener as well through `client.eventListener(new SentryOkHttpEventListener(myListener)).addInterceptor(new SentryOkHttpInterceptor()).build();`
-- Add a new option to disable `RootChecker` ([#2735](https://github.com/getsentry/sentry-java/pull/2735))
-
-### Fixes
-
-- Base64 encode internal Apollo3 Headers ([#2707](https://github.com/getsentry/sentry-java/pull/2707))
-- Fix `SentryTracer` crash when scheduling auto-finish of a transaction, but the timer has already been cancelled ([#2731](https://github.com/getsentry/sentry-java/pull/2731))
-- Fix `AndroidTransactionProfiler` crash when finishing a profile that happened due to race condition ([#2731](https://github.com/getsentry/sentry-java/pull/2731))
-
-## 6.19.1
-
-### Fixes
-
-- Ensure screenshots and view hierarchies are captured on the main thread ([#2712](https://github.com/getsentry/sentry-java/pull/2712))
-
-## 6.19.0
-
-### Features
-
-- Add Screenshot and ViewHierarchy to integrations list ([#2698](https://github.com/getsentry/sentry-java/pull/2698))
-- New ANR detection based on [ApplicationExitInfo API](https://developer.android.com/reference/android/app/ApplicationExitInfo) ([#2697](https://github.com/getsentry/sentry-java/pull/2697))
- - This implementation completely replaces the old one (based on a watchdog) on devices running Android 11 and above:
- - New implementation provides more precise ANR events/ANR rate detection as well as system thread dump information. The new implementation reports ANRs exactly as Google Play Console, without producing false positives or missing important background ANR events.
- - New implementation reports ANR events with a new mechanism `mechanism:AppExitInfo`.
- - However, despite producing many false positives, the old implementation is capable of better enriching ANR errors (which is not available with the new implementation), for example:
- - Capturing screenshots at the time of ANR event;
- - Capturing transactions and profiling data corresponding to the ANR event;
- - Auxiliary information (such as current memory load) at the time of ANR event.
- - If you would like us to provide support for the old approach working alongside the new one on Android 11 and above (e.g. for raising events for slow code on main thread), consider upvoting [this issue](https://github.com/getsentry/sentry-java/issues/2693).
- - The old watchdog implementation will continue working for older API versions (Android < 11):
- - The old implementation reports ANR events with the existing mechanism `mechanism:ANR`.
-- Open up `TransactionOptions`, `ITransaction` and `IHub` methods allowing consumers modify start/end timestamp of transactions and spans ([#2701](https://github.com/getsentry/sentry-java/pull/2701))
-- Send source bundle IDs to Sentry to enable source context ([#2663](https://github.com/getsentry/sentry-java/pull/2663))
- - For more information on how to enable source context, please refer to [#633](https://github.com/getsentry/sentry-java/issues/633#issuecomment-1465599120)
-
-### Fixes
-
-- Android Profiler on calling thread ([#2691](https://github.com/getsentry/sentry-java/pull/2691))
-- Use `configureScope` instead of `withScope` in `Hub.close()`. This ensures that the main scope releases the in-memory data when closing a hub instance. ([#2688](https://github.com/getsentry/sentry-java/pull/2688))
-- Remove null keys/values before creating concurrent hashmap in order to avoid NPE ([#2708](https://github.com/getsentry/sentry-java/pull/2708))
-- Exclude SentryOptions from R8/ProGuard obfuscation ([#2699](https://github.com/getsentry/sentry-java/pull/2699))
- - This fixes AGP 8.+ incompatibility, where full R8 mode is enforced
-
-### Dependencies
-
-- Bump Gradle from v8.1.0 to v8.1.1 ([#2666](https://github.com/getsentry/sentry-java/pull/2666))
- - [changelog](https://github.com/gradle/gradle/blob/master release-test/CHANGELOG.md#v811)
- - [diff](https://github.com/gradle/gradle/compare/v8.1.0...v8.1.1)
-- Bump Native SDK from v0.6.1 to v0.6.2 ([#2689](https://github.com/getsentry/sentry-java/pull/2689))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#062)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.1...0.6.2)
-
-## 6.18.1
-
-### Fixes
-
-- Fix crash when Sentry SDK is initialized more than once ([#2679](https://github.com/getsentry/sentry-java/pull/2679))
-- Track a ttfd span per Activity ([#2673](https://github.com/getsentry/sentry-java/pull/2673))
-
-## 6.18.0
-
-### Features
-
-- Attach Trace Context when an ANR is detected (ANRv1) ([#2583](https://github.com/getsentry/sentry-java/pull/2583))
-- Make log4j2 integration compatible with log4j 3.0 ([#2634](https://github.com/getsentry/sentry-java/pull/2634))
- - Instead of relying on package scanning, we now use an annotation processor to generate `Log4j2Plugins.dat`
-- Create `User` and `Breadcrumb` from map ([#2614](https://github.com/getsentry/sentry-java/pull/2614))
-- Add `sent_at` to envelope header item ([#2638](https://github.com/getsentry/sentry-java/pull/2638))
-
-### Fixes
-
-- Fix timestamp intervals of PerformanceCollectionData in profiles ([#2648](https://github.com/getsentry/sentry-java/pull/2648))
-- Fix timestamps of PerformanceCollectionData in profiles ([#2632](https://github.com/getsentry/sentry-java/pull/2632))
-- Fix missing propagateMinConstraints flag for SentryTraced ([#2637](https://github.com/getsentry/sentry-java/pull/2637))
-- Fix potential SecurityException thrown by ConnectivityManager on Android 11 ([#2653](https://github.com/getsentry/sentry-java/pull/2653))
-- Fix aar artifacts publishing for Maven ([#2641](https://github.com/getsentry/sentry-java/pull/2641))
-
-### Dependencies
-
-- Bump Kotlin compile version from v1.6.10 to 1.8.0 ([#2563](https://github.com/getsentry/sentry-java/pull/2563))
-- Bump Compose compile version from v1.1.1 to v1.3.0 ([#2563](https://github.com/getsentry/sentry-java/pull/2563))
-- Bump AGP version from v7.3.0 to v7.4.2 ([#2574](https://github.com/getsentry/sentry-java/pull/2574))
-- Bump Gradle from v7.6.0 to v8.0.2 ([#2563](https://github.com/getsentry/sentry-java/pull/2563))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v802)
- - [diff](https://github.com/gradle/gradle/compare/v7.6.0...v8.0.2)
-- Bump Gradle from v8.0.2 to v8.1.0 ([#2650](https://github.com/getsentry/sentry-java/pull/2650))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v810)
- - [diff](https://github.com/gradle/gradle/compare/v8.0.2...v8.1.0)
-
-## 6.17.0
-
-### Features
-
-- Add `name` and `geo` to `User` ([#2556](https://github.com/getsentry/sentry-java/pull/2556))
-- Add breadcrumbs on network changes ([#2608](https://github.com/getsentry/sentry-java/pull/2608))
-- Add time-to-initial-display and time-to-full-display measurements to Activity transactions ([#2611](https://github.com/getsentry/sentry-java/pull/2611))
-- Read integration list written by sentry gradle plugin from manifest ([#2598](https://github.com/getsentry/sentry-java/pull/2598))
-- Add Logcat adapter ([#2620](https://github.com/getsentry/sentry-java/pull/2620))
-- Provide CPU count/frequency data as device context ([#2622](https://github.com/getsentry/sentry-java/pull/2622))
-
-### Fixes
-
-- Trim time-to-full-display span if reportFullyDisplayed API is never called ([#2631](https://github.com/getsentry/sentry-java/pull/2631))
-- Fix Automatic UI transactions having wrong durations ([#2623](https://github.com/getsentry/sentry-java/pull/2623))
-- Fix wrong default environment in Session ([#2610](https://github.com/getsentry/sentry-java/pull/2610))
-- Pass through unknown sentry baggage keys into SentryEnvelopeHeader ([#2618](https://github.com/getsentry/sentry-java/pull/2618))
-- Fix missing null check when removing lifecycle observer ([#2625](https://github.com/getsentry/sentry-java/pull/2625))
-
-### Dependencies
-
-- Bump Native SDK from v0.6.0 to v0.6.1 ([#2629](https://github.com/getsentry/sentry-java/pull/2629))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#061)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.6.0...0.6.1)
-
-## 6.16.0
-
-### Features
-
-- Improve versatility of exception resolver component for Spring with more flexible API for consumers. ([#2577](https://github.com/getsentry/sentry-java/pull/2577))
-- Automatic performance instrumentation for WebFlux ([#2597](https://github.com/getsentry/sentry-java/pull/2597))
- - You can enable it by adding `sentry.enable-tracing=true` to your `application.properties`
-- The Spring Boot integration can now be configured to add the `SentryAppender` to specific loggers instead of the `ROOT` logger ([#2173](https://github.com/getsentry/sentry-java/pull/2173))
- - You can specify the loggers using `"sentry.logging.loggers[0]=foo.bar` and `"sentry.logging.loggers[1]=baz` in your `application.properties`
-- Add capabilities to track Jetpack Compose composition/rendering time ([#2507](https://github.com/getsentry/sentry-java/pull/2507))
-- Adapt span op and description for graphql to fit spec ([#2607](https://github.com/getsentry/sentry-java/pull/2607))
-
-### Fixes
-
-- Fix timestamps of slow and frozen frames for profiles ([#2584](https://github.com/getsentry/sentry-java/pull/2584))
-- Deprecate reportFullDisplayed in favor of reportFullyDisplayed ([#2585](https://github.com/getsentry/sentry-java/pull/2585))
-- Add mechanism for logging integrations and update spring mechanism types ([#2595](https://github.com/getsentry/sentry-java/pull/2595))
- - NOTE: If you're using these mechanism types (`HandlerExceptionResolver`, `SentryWebExceptionHandler`) in your dashboards please update them to use the new types.
-- Filter out session cookies sent by Spring and Spring Boot integrations ([#2593](https://github.com/getsentry/sentry-java/pull/2593))
- - We filter out some common cookies like JSESSIONID
- - We also read the value from `server.servlet.session.cookie.name` and filter it out
-- No longer send event / transaction to Sentry if `beforeSend` / `beforeSendTransaction` throws ([#2591](https://github.com/getsentry/sentry-java/pull/2591))
-- Add version to sentryClientName used in auth header ([#2596](https://github.com/getsentry/sentry-java/pull/2596))
-- Keep integration names from being obfuscated ([#2599](https://github.com/getsentry/sentry-java/pull/2599))
-- Change log level from INFO to WARN for error message indicating a failed Log4j2 Sentry.init ([#2606](https://github.com/getsentry/sentry-java/pull/2606))
- - The log message was often not visible as our docs suggest a minimum log level of WARN
-- Fix session tracking on Android ([#2609](https://github.com/getsentry/sentry-java/pull/2609))
- - Incorrect number of session has been sent. In addition, some of the sessions were not properly ended, messing up Session Health Metrics.
-
-### Dependencies
-
-- Bump `opentelemetry-sdk` to `1.23.1` and `opentelemetry-javaagent` to `1.23.0` ([#2590](https://github.com/getsentry/sentry-java/pull/2590))
-- Bump Native SDK from v0.5.4 to v0.6.0 ([#2545](https://github.com/getsentry/sentry-java/pull/2545))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#060)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.5.4...0.6.0)
-
-## 6.15.0
-
-### Features
-
-- Adjust time-to-full-display span if reportFullDisplayed is called too early ([#2550](https://github.com/getsentry/sentry-java/pull/2550))
-- Add `enableTracing` option ([#2530](https://github.com/getsentry/sentry-java/pull/2530))
- - This change is backwards compatible. The default is `null` meaning existing behaviour remains unchanged (setting either `tracesSampleRate` or `tracesSampler` enables performance).
- - If set to `true`, performance is enabled, even if no `tracesSampleRate` or `tracesSampler` have been configured.
- - If set to `false` performance is disabled, regardless of `tracesSampleRate` and `tracesSampler` options.
-- Detect dependencies by listing MANIFEST.MF files at runtime ([#2538](https://github.com/getsentry/sentry-java/pull/2538))
-- Report integrations in use, report packages in use more consistently ([#2179](https://github.com/getsentry/sentry-java/pull/2179))
-- Implement `ThreadLocalAccessor` for propagating Sentry hub with reactor / WebFlux ([#2570](https://github.com/getsentry/sentry-java/pull/2570))
- - Requires `io.micrometer:context-propagation:1.0.2+` as well as Spring Boot 3.0.3+
- - Enable the feature by setting `sentry.reactive.thread-local-accessor-enabled=true`
- - This is still considered experimental. Once we have enough feedback we may turn this on by default.
- - Checkout the sample here: https://github.com/getsentry/sentry-java/tree/main/sentry-samples/sentry-samples-spring-boot-webflux-jakarta
- - A new hub is now cloned from the main hub for every request
-
-### Fixes
-
-- Leave `inApp` flag for stack frames undecided in SDK if unsure and let ingestion decide instead ([#2547](https://github.com/getsentry/sentry-java/pull/2547))
-- Allow `0.0` error sample rate ([#2573](https://github.com/getsentry/sentry-java/pull/2573))
-- Fix memory leak in WebFlux related to an ever growing stack ([#2580](https://github.com/getsentry/sentry-java/pull/2580))
-- Use the same hub in WebFlux exception handler as we do in WebFilter ([#2566](https://github.com/getsentry/sentry-java/pull/2566))
-- Switch upstream Jetpack Compose dependencies to `compileOnly` in `sentry-compose-android` ([#2578](https://github.com/getsentry/sentry-java/pull/2578))
- - NOTE: If you're using Compose Navigation/User Interaction integrations, make sure to have the following dependencies on the classpath as we do not bring them in transitively anymore:
- - `androidx.navigation:navigation-compose:`
- - `androidx.compose.runtime:runtime:`
- - `androidx.compose.ui:ui:`
-
-## 6.14.0
-
-### Features
-
-- Add time-to-full-display span to Activity auto-instrumentation ([#2432](https://github.com/getsentry/sentry-java/pull/2432))
-- Add `main` flag to threads and `in_foreground` flag for app contexts ([#2516](https://github.com/getsentry/sentry-java/pull/2516))
-
-### Fixes
-
-- Ignore Shutdown in progress when closing ShutdownHookIntegration ([#2521](https://github.com/getsentry/sentry-java/pull/2521))
-- Fix app start span end-time is wrong if SDK init is deferred ([#2519](https://github.com/getsentry/sentry-java/pull/2519))
-- Fix invalid session creation when app is launched in background ([#2543](https://github.com/getsentry/sentry-java/pull/2543))
-
-## 6.13.1
-
-### Fixes
-
-- Fix transaction performance collector oom ([#2505](https://github.com/getsentry/sentry-java/pull/2505))
-- Remove authority from URLs sent to Sentry ([#2366](https://github.com/getsentry/sentry-java/pull/2366))
-- Fix `sentry-bom` containing incorrect artifacts ([#2504](https://github.com/getsentry/sentry-java/pull/2504))
-
-### Dependencies
-
-- Bump Native SDK from v0.5.3 to v0.5.4 ([#2500](https://github.com/getsentry/sentry-java/pull/2500))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#054)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.5.3...0.5.4)
-
-## 6.13.0
-
-### Features
-
-- Send cpu usage percentage in profile payload ([#2469](https://github.com/getsentry/sentry-java/pull/2469))
-- Send transaction memory stats in profile payload ([#2447](https://github.com/getsentry/sentry-java/pull/2447))
-- Add cpu usage collection ([#2462](https://github.com/getsentry/sentry-java/pull/2462))
-- Improve ANR implementation: ([#2475](https://github.com/getsentry/sentry-java/pull/2475))
- - Add `abnormal_mechanism` to sessions for ANR rate calculation
- - Always attach thread dump to ANR events
- - Distinguish between foreground and background ANRs
-- Improve possible date precision to 10 μs ([#2451](https://github.com/getsentry/sentry-java/pull/2451))
-
-### Fixes
-
-- Fix performance collector setup called in main thread ([#2499](https://github.com/getsentry/sentry-java/pull/2499))
-- Expand guard against CVE-2018-9492 "Privilege Escalation via Content Provider" ([#2482](https://github.com/getsentry/sentry-java/pull/2482))
-- Prevent OOM by disabling TransactionPerformanceCollector for now ([#2498](https://github.com/getsentry/sentry-java/pull/2498))
-
-## 6.12.1
-
-### Fixes
-
-- Create timer in `TransactionPerformanceCollector` lazily ([#2478](https://github.com/getsentry/sentry-java/pull/2478))
-
-## 6.12.0
-
-### Features
-
-- Attach View Hierarchy to the errored/crashed events ([#2440](https://github.com/getsentry/sentry-java/pull/2440))
-- Collect memory usage in transactions ([#2445](https://github.com/getsentry/sentry-java/pull/2445))
-- Add `traceOptionsRequests` option to disable tracing of OPTIONS requests ([#2453](https://github.com/getsentry/sentry-java/pull/2453))
-- Extend list of HTTP headers considered sensitive ([#2455](https://github.com/getsentry/sentry-java/pull/2455))
-
-### Fixes
-
-- Use a single TransactionPerfomanceCollector ([#2464](https://github.com/getsentry/sentry-java/pull/2464))
-- Don't override sdk name with Timber ([#2450](https://github.com/getsentry/sentry-java/pull/2450))
-- Set transactionNameSource to CUSTOM when setting transaction name ([#2405](https://github.com/getsentry/sentry-java/pull/2405))
-- Guard against CVE-2018-9492 "Privilege Escalation via Content Provider" ([#2466](https://github.com/getsentry/sentry-java/pull/2466))
-
-## 6.11.0
-
-### Features
-
-- Disable Android concurrent profiling ([#2434](https://github.com/getsentry/sentry-java/pull/2434))
-- Add logging for OpenTelemetry integration ([#2425](https://github.com/getsentry/sentry-java/pull/2425))
-- Auto add `OpenTelemetryLinkErrorEventProcessor` for Spring Boot ([#2429](https://github.com/getsentry/sentry-java/pull/2429))
-
-### Fixes
-
-- Use minSdk compatible `Objects` class ([#2436](https://github.com/getsentry/sentry-java/pull/2436))
-- Prevent R8 from warning on missing classes, as we check for their presence at runtime ([#2439](https://github.com/getsentry/sentry-java/pull/2439))
-
-### Dependencies
-
-- Bump Gradle from v7.5.1 to v7.6.0 ([#2438](https://github.com/getsentry/sentry-java/pull/2438))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v760)
- - [diff](https://github.com/gradle/gradle/compare/v7.5.1...v7.6.0)
-
-## 6.10.0
-
-### Features
-
-- Add time-to-initial-display span to Activity transactions ([#2369](https://github.com/getsentry/sentry-java/pull/2369))
-- Start a session after init if AutoSessionTracking is enabled ([#2356](https://github.com/getsentry/sentry-java/pull/2356))
-- Provide automatic breadcrumbs and transactions for click/scroll events for Compose ([#2390](https://github.com/getsentry/sentry-java/pull/2390))
-- Add `blocked_main_thread` and `call_stack` to File I/O spans to detect performance issues ([#2382](https://github.com/getsentry/sentry-java/pull/2382))
-
-### Dependencies
-
-- Bump Native SDK from v0.5.2 to v0.5.3 ([#2423](https://github.com/getsentry/sentry-java/pull/2423))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#053)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.5.2...0.5.3)
-
-## 6.9.2
-
-### Fixes
-
-- Updated ProfileMeasurementValue types ([#2412](https://github.com/getsentry/sentry-java/pull/2412))
-- Clear window reference only on activity stop in profileMeasurements collector ([#2407](https://github.com/getsentry/sentry-java/pull/2407))
-- No longer disable OpenTelemetry exporters in default Java Agent config ([#2408](https://github.com/getsentry/sentry-java/pull/2408))
-- Fix `ClassNotFoundException` for `io.sentry.spring.SentrySpringServletContainerInitializer` in `sentry-spring-jakarta` ([#2411](https://github.com/getsentry/sentry-java/issues/2411))
-- Fix `sentry-samples-spring-jakarta` ([#2411](https://github.com/getsentry/sentry-java/issues/2411))
-
-### Features
-
-- Add SENTRY_AUTO_INIT environment variable to control OpenTelemetry Agent init ([#2410](https://github.com/getsentry/sentry-java/pull/2410))
-- Add OpenTelemetryLinkErrorEventProcessor for linking errors to traces created via OpenTelemetry ([#2418](https://github.com/getsentry/sentry-java/pull/2418))
-
-### Dependencies
-
-- Bump OpenTelemetry to 1.20.1 and OpenTelemetry Java Agent to 1.20.2 ([#2420](https://github.com/getsentry/sentry-java/pull/2420))
-
-## 6.9.1
-
-### Fixes
-
-- OpenTelemetry modules were missing in `6.9.0` so we released the same code again as `6.9.1` including OpenTelemetry modules
-
-## 6.9.0
-
-### Fixes
-
-- Use `canonicalName` in Fragment Integration for better de-obfuscation ([#2379](https://github.com/getsentry/sentry-java/pull/2379))
-- Fix Timber and Fragment integrations auto-installation for obfuscated builds ([#2379](https://github.com/getsentry/sentry-java/pull/2379))
-- Don't attach screenshots to events from Hybrid SDKs ([#2360](https://github.com/getsentry/sentry-java/pull/2360))
-- Ensure Hints do not cause memory leaks ([#2387](https://github.com/getsentry/sentry-java/pull/2387))
-- Do not attach empty `sentry-trace` and `baggage` headers ([#2385](https://github.com/getsentry/sentry-java/pull/2385))
-
-### Features
-
-- Add beforeSendTransaction which allows users to filter and change transactions ([#2388](https://github.com/getsentry/sentry-java/pull/2388))
-- Add experimental support for OpenTelemetry ([README](sentry-opentelemetry/README.md))([#2344](https://github.com/getsentry/sentry-java/pull/2344))
-
-### Dependencies
-
-- Update Spring Boot Jakarta to Spring Boot 3.0.0 ([#2389](https://github.com/getsentry/sentry-java/pull/2389))
-- Bump Spring Boot to 2.7.5 ([#2383](https://github.com/getsentry/sentry-java/pull/2383))
-
-## 6.8.0
-
-### Features
-
-- Add FrameMetrics to Android profiling data ([#2342](https://github.com/getsentry/sentry-java/pull/2342))
-
-### Fixes
-
-- Remove profiler main thread io ([#2348](https://github.com/getsentry/sentry-java/pull/2348))
-- Fix ensure all options are processed before integrations are loaded ([#2377](https://github.com/getsentry/sentry-java/pull/2377))
-
-## 6.7.1
-
-### Fixes
-
-- Fix `Gpu.vendorId` should be a String ([#2343](https://github.com/getsentry/sentry-java/pull/2343))
-- Don't set device name on Android if `sendDefaultPii` is disabled ([#2354](https://github.com/getsentry/sentry-java/pull/2354))
-- Fix corrupted UUID on Motorola devices ([#2363](https://github.com/getsentry/sentry-java/pull/2363))
-- Fix ANR on dropped uncaught exception events ([#2368](https://github.com/getsentry/sentry-java/pull/2368))
-
-### Features
-
-- Update Spring Boot Jakarta to Spring Boot 3.0.0-RC2 ([#2347](https://github.com/getsentry/sentry-java/pull/2347))
-
-## 6.7.0
-
-### Fixes
-
-- Use correct set-cookie for the HTTP Client response object ([#2326](https://github.com/getsentry/sentry-java/pull/2326))
-- Fix NoSuchElementException in CircularFifoQueue when cloning a Scope ([#2328](https://github.com/getsentry/sentry-java/pull/2328))
-
-### Features
-
-- Customizable fragment lifecycle breadcrumbs ([#2299](https://github.com/getsentry/sentry-java/pull/2299))
-- Provide hook for Jetpack Compose navigation instrumentation ([#2320](https://github.com/getsentry/sentry-java/pull/2320))
-- Populate `event.modules` with dependencies metadata ([#2324](https://github.com/getsentry/sentry-java/pull/2324))
-- Support Spring 6 and Spring Boot 3 ([#2289](https://github.com/getsentry/sentry-java/pull/2289))
-
-### Dependencies
-
-- Bump Native SDK from v0.5.1 to v0.5.2 ([#2315](https://github.com/getsentry/sentry-java/pull/2315))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#052)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.5.1...0.5.2)
-
-## 6.6.0
-
-### Fixes
-
-- Ensure potential callback exceptions are caught #2123 ([#2291](https://github.com/getsentry/sentry-java/pull/2291))
-- Remove verbose FrameMetricsAggregator failure logging ([#2293](https://github.com/getsentry/sentry-java/pull/2293))
-- Ignore broken regex for tracePropagationTarget ([#2288](https://github.com/getsentry/sentry-java/pull/2288))
-- No longer serialize static fields; use toString as fallback ([#2309](https://github.com/getsentry/sentry-java/pull/2309))
-- Fix `SentryFileWriter`/`SentryFileOutputStream` append overwrites file contents ([#2304](https://github.com/getsentry/sentry-java/pull/2304))
-- Respect incoming parent sampled decision when continuing a trace ([#2311](https://github.com/getsentry/sentry-java/pull/2311))
-
-### Features
-
-- Profile envelopes are sent directly from profiler ([#2298](https://github.com/getsentry/sentry-java/pull/2298))
-- Add support for using Encoder with logback.SentryAppender ([#2246](https://github.com/getsentry/sentry-java/pull/2246))
-- Report Startup Crashes ([#2277](https://github.com/getsentry/sentry-java/pull/2277))
-- HTTP Client errors for OkHttp ([#2287](https://github.com/getsentry/sentry-java/pull/2287))
-- Add option to enable or disable Frame Tracking ([#2314](https://github.com/getsentry/sentry-java/pull/2314))
-
-### Dependencies
-
-- Bump Native SDK from v0.5.0 to v0.5.1 ([#2306](https://github.com/getsentry/sentry-java/pull/2306))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#051)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.5.0...0.5.1)
-
-## 6.5.0
-
-### Fixes
-
-- Improve public facing API for creating Baggage from header ([#2284](https://github.com/getsentry/sentry-java/pull/2284))
-
-## 6.5.0-beta.3
-
-### Features
-
-- Provide API for attaching custom measurements to transactions ([#2260](https://github.com/getsentry/sentry-java/pull/2260))
-- Bump spring to 2.7.4 ([#2279](https://github.com/getsentry/sentry-java/pull/2279))
-
-## 6.5.0-beta.2
-
-### Features
-
-- Make user segment a top level property ([#2257](https://github.com/getsentry/sentry-java/pull/2257))
-- Replace user `other` with `data` ([#2258](https://github.com/getsentry/sentry-java/pull/2258))
-- `isTraceSampling` is now on by default. `tracingOrigins` has been replaced by `tracePropagationTargets` ([#2255](https://github.com/getsentry/sentry-java/pull/2255))
-
-## 6.5.0-beta.1
-
-### Features
-
-- Server-Side Dynamic Sampling Context support ([#2226](https://github.com/getsentry/sentry-java/pull/2226))
-
-## 6.4.4
-
-### Fixes
-
-- Fix ConcurrentModificationException due to FrameMetricsAggregator manipulation ([#2282](https://github.com/getsentry/sentry-java/pull/2282))
-
-## 6.4.3
-
-- Fix slow and frozen frames tracking ([#2271](https://github.com/getsentry/sentry-java/pull/2271))
-
-## 6.4.2
-
-### Fixes
-
-- Fixed AbstractMethodError when getting Lifecycle ([#2228](https://github.com/getsentry/sentry-java/pull/2228))
-- Missing unit fields for Android measurements ([#2204](https://github.com/getsentry/sentry-java/pull/2204))
-- Avoid sending empty profiles ([#2232](https://github.com/getsentry/sentry-java/pull/2232))
-- Fix file descriptor leak in FileIO instrumentation ([#2248](https://github.com/getsentry/sentry-java/pull/2248))
-
-## 6.4.1
-
-### Fixes
-
-- Fix memory leak caused by throwableToSpan ([#2227](https://github.com/getsentry/sentry-java/pull/2227))
-
-## 6.4.0
-
-### Fixes
-
-- make profiling rate defaults to 101 hz ([#2211](https://github.com/getsentry/sentry-java/pull/2211))
-- SentryOptions.setProfilingTracesIntervalMillis has been deprecated
-- Added cpu architecture and default environment in profiles envelope ([#2207](https://github.com/getsentry/sentry-java/pull/2207))
-- SentryOptions.setProfilingEnabled has been deprecated in favor of setProfilesSampleRate
-- Use toString for enum serialization ([#2220](https://github.com/getsentry/sentry-java/pull/2220))
-
-### Features
-
-- Concurrent profiling 3 - added truncation reason ([#2247](https://github.com/getsentry/sentry-java/pull/2247))
-- Concurrent profiling 2 - added list of transactions ([#2218](https://github.com/getsentry/sentry-java/pull/2218))
-- Concurrent profiling 1 - added envelope payload data format ([#2216](https://github.com/getsentry/sentry-java/pull/2216))
-- Send source for transactions ([#2180](https://github.com/getsentry/sentry-java/pull/2180))
-- Add profilesSampleRate and profileSampler options for Android sdk ([#2184](https://github.com/getsentry/sentry-java/pull/2184))
-- Add baggage header to RestTemplate ([#2206](https://github.com/getsentry/sentry-java/pull/2206))
-- Bump Native SDK from v0.4.18 to v0.5.0 ([#2199](https://github.com/getsentry/sentry-java/pull/2199))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#050)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.4.18...0.5.0)
-- Bump Gradle from v7.5.0 to v7.5.1 ([#2212](https://github.com/getsentry/sentry-java/pull/2212))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v751)
- - [diff](https://github.com/gradle/gradle/compare/v7.5.0...v7.5.1)
-
-## 6.3.1
-
-### Fixes
-
-- Prevent NPE by checking SentryTracer.timer for null again inside synchronized ([#2200](https://github.com/getsentry/sentry-java/pull/2200))
-- Weakly reference Activity for transaction finished callback ([#2203](https://github.com/getsentry/sentry-java/pull/2203))
-- `attach-screenshot` set on Manual init. didn't work ([#2186](https://github.com/getsentry/sentry-java/pull/2186))
-- Remove extra space from `spring.factories` causing issues in old versions of Spring Boot ([#2181](https://github.com/getsentry/sentry-java/pull/2181))
-
-### Features
-
-- Bump Native SDK to v0.4.18 ([#2154](https://github.com/getsentry/sentry-java/pull/2154))
- - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0418)
- - [diff](https://github.com/getsentry/sentry-native/compare/0.4.17...0.4.18)
-- Bump Gradle to v7.5.0 ([#2174](https://github.com/getsentry/sentry-java/pull/2174), [#2191](https://github.com/getsentry/sentry-java/pull/2191))
- - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v750)
- - [diff](https://github.com/gradle/gradle/compare/v7.4.2...v7.5.0)
-
-## 6.3.0
-
-### Features
-
-- Switch upstream dependencies to `compileOnly` in integrations ([#2175](https://github.com/getsentry/sentry-java/pull/2175))
-
-### Fixes
-
-- Lazily retrieve HostnameCache in MainEventProcessor ([#2170](https://github.com/getsentry/sentry-java/pull/2170))
-
-## 6.2.1
-
-### Fixes
-
-- Only send userid in Dynamic Sampling Context if sendDefaultPii is true ([#2147](https://github.com/getsentry/sentry-java/pull/2147))
-- Remove userId from baggage due to PII ([#2157](https://github.com/getsentry/sentry-java/pull/2157))
-
-### Features
-
-- Add integration for Apollo-Kotlin 3 ([#2109](https://github.com/getsentry/sentry-java/pull/2109))
-- New package `sentry-android-navigation` for AndroidX Navigation support ([#2136](https://github.com/getsentry/sentry-java/pull/2136))
-- New package `sentry-compose` for Jetpack Compose support (Navigation) ([#2136](https://github.com/getsentry/sentry-java/pull/2136))
-- Add sample rate to baggage as well as trace in envelope header and flatten user ([#2135](https://github.com/getsentry/sentry-java/pull/2135))
-
-Breaking Changes:
-
-- The boolean parameter `samplingDecision` in the `TransactionContext` constructor has been replaced with a `TracesSamplingDecision` object. Feel free to ignore the `@ApiStatus.Internal` in this case.
-
-## 6.1.4
-
-### Fixes
-
-- Filter out app starts with more than 60s ([#2127](https://github.com/getsentry/sentry-java/pull/2127))
-
-## 6.1.3
-
-### Fixes
-
-- Fix thread leak due to Timer being created and never cancelled ([#2131](https://github.com/getsentry/sentry-java/pull/2131))
-
-## 6.1.2
-
-### Fixes
-
-- Swallow error when reading ActivityManager#getProcessesInErrorState instead of crashing ([#2114](https://github.com/getsentry/sentry-java/pull/2114))
-- Use charset string directly as StandardCharsets is not available on earlier Android versions ([#2111](https://github.com/getsentry/sentry-java/pull/2111))
-
-## 6.1.1
-
-### Features
-
-- Replace `tracestate` header with `baggage` header ([#2078](https://github.com/getsentry/sentry-java/pull/2078))
-- Allow opting out of device info collection that requires Inter-Process Communication (IPC) ([#2100](https://github.com/getsentry/sentry-java/pull/2100))
-
-## 6.1.0
-
-### Features
-
-- Implement local scope by adding overloads to the capture methods that accept a ScopeCallback ([#2084](https://github.com/getsentry/sentry-java/pull/2084))
-- SentryOptions#merge is now public and can be used to load ExternalOptions ([#2088](https://github.com/getsentry/sentry-java/pull/2088))
-
-### Fixes
-
-- Fix proguard rules to work R8 [issue](https://issuetracker.google.com/issues/235733922) around on AGP 7.3.0-betaX and 7.4.0-alphaX ([#2094](https://github.com/getsentry/sentry-java/pull/2094))
-- Fix GraalVM Native Image compatibility ([#2172](https://github.com/getsentry/sentry-java/pull/2172))
-
-## 6.0.0
-
-### Sentry Self-hosted Compatibility
-
-- Starting with version `6.0.0` of the `sentry` package, [Sentry's self hosted version >= v21.9.0](https://github.com/getsentry/self-hosted/releases) is required or you have to manually disable sending client reports via the `sendClientReports` option. This only applies to self-hosted Sentry. If you are using [sentry.io](https://sentry.io), no action is needed.
-
-### Features
-
-- Allow optimization and obfuscation of the SDK by reducing proguard rules ([#2031](https://github.com/getsentry/sentry-java/pull/2031))
-- Relax TransactionNameProvider ([#1861](https://github.com/getsentry/sentry-java/pull/1861))
-- Use float instead of Date for protocol types for higher precision ([#1737](https://github.com/getsentry/sentry-java/pull/1737))
-- Allow setting SDK info (name & version) in manifest ([#2016](https://github.com/getsentry/sentry-java/pull/2016))
-- Allow setting native Android SDK name during build ([#2035](https://github.com/getsentry/sentry-java/pull/2035))
-- Include application permissions in Android events ([#2018](https://github.com/getsentry/sentry-java/pull/2018))
-- Automatically create transactions for UI events ([#1975](https://github.com/getsentry/sentry-java/pull/1975))
-- Hints are now used via a Hint object and passed into beforeSend and EventProcessor as @NotNull Hint object ([#2045](https://github.com/getsentry/sentry-java/pull/2045))
-- Attachments can be manipulated via hint ([#2046](https://github.com/getsentry/sentry-java/pull/2046))
-- Add sentry-servlet-jakarta module ([#1987](https://github.com/getsentry/sentry-java/pull/1987))
-- Add client reports ([#1982](https://github.com/getsentry/sentry-java/pull/1982))
-- Screenshot is taken when there is an error ([#1967](https://github.com/getsentry/sentry-java/pull/1967))
-- Add Android profiling traces ([#1897](https://github.com/getsentry/sentry-java/pull/1897)) ([#1959](https://github.com/getsentry/sentry-java/pull/1959)) and its tests ([#1949](https://github.com/getsentry/sentry-java/pull/1949))
-- Enable enableScopeSync by default for Android ([#1928](https://github.com/getsentry/sentry-java/pull/1928))
-- Feat: Vendor JSON ([#1554](https://github.com/getsentry/sentry-java/pull/1554))
- - Introduce `JsonSerializable` and `JsonDeserializer` interfaces for manual json
- serialization/deserialization.
- - Introduce `JsonUnknwon` interface to preserve unknown properties when deserializing/serializing
- SDK classes.
- - When passing custom objects, for example in `Contexts`, these are supported for serialization:
- - `JsonSerializable`
- - `Map`, `Collection`, `Array`, `String` and all primitive types.
- - Objects with the help of refection.
- - `Map`, `Collection`, `Array`, `String` and all primitive types.
- - Call `toString()` on objects that have a cyclic reference to a ancestor object.
- - Call `toString()` where object graphs exceed max depth.
- - Remove `gson` dependency.
- - Remove `IUnknownPropertiesConsumer`
-- Pass MDC tags as Sentry tags ([#1954](https://github.com/getsentry/sentry-java/pull/1954))
-
-### Fixes
-
-- Calling Sentry.init and specifying contextTags now has an effect on the Logback SentryAppender ([#2052](https://github.com/getsentry/sentry-java/pull/2052))
-- Calling Sentry.init and specifying contextTags now has an effect on the Log4j SentryAppender ([#2054](https://github.com/getsentry/sentry-java/pull/2054))
-- Calling Sentry.init and specifying contextTags now has an effect on the jul SentryAppender ([#2057](https://github.com/getsentry/sentry-java/pull/2057))
-- Update Spring Boot dependency to 2.6.8 and fix the CVE-2022-22970 ([#2068](https://github.com/getsentry/sentry-java/pull/2068))
-- Sentry can now self heal after a Thread had its currentHub set to a NoOpHub ([#2076](https://github.com/getsentry/sentry-java/pull/2076))
-- No longer close OutputStream that is passed into JsonSerializer ([#2029](https://github.com/getsentry/sentry-java/pull/2029))
-- Fix setting context tags on events captured by Spring ([#2060](https://github.com/getsentry/sentry-java/pull/2060))
-- Isolate cached events with hashed DSN subfolder ([#2038](https://github.com/getsentry/sentry-java/pull/2038))
-- SentryThread.current flag will not be overridden by DefaultAndroidEventProcessor if already set ([#2050](https://github.com/getsentry/sentry-java/pull/2050))
-- Fix serialization of Long inside of Request.data ([#2051](https://github.com/getsentry/sentry-java/pull/2051))
-- Update sentry-native to 0.4.17 ([#2033](https://github.com/getsentry/sentry-java/pull/2033))
-- Update Gradle to 7.4.2 and AGP to 7.2 ([#2042](https://github.com/getsentry/sentry-java/pull/2042))
-- Change order of event filtering mechanisms ([#2001](https://github.com/getsentry/sentry-java/pull/2001))
-- Only send session update for dropped events if state changed ([#2002](https://github.com/getsentry/sentry-java/pull/2002))
-- Android profiling initializes on first profile start ([#2009](https://github.com/getsentry/sentry-java/pull/2009))
-- Profiling rate decreased from 300hz to 100hz ([#1997](https://github.com/getsentry/sentry-java/pull/1997))
-- Allow disabling sending of client reports via Android Manifest and external options ([#2007](https://github.com/getsentry/sentry-java/pull/2007))
-- Ref: Upgrade Spring Boot dependency to 2.5.13 ([#2011](https://github.com/getsentry/sentry-java/pull/2011))
-- Ref: Make options.printUncaughtStackTrace primitive type ([#1995](https://github.com/getsentry/sentry-java/pull/1995))
-- Ref: Remove not needed interface abstractions on Android ([#1953](https://github.com/getsentry/sentry-java/pull/1953))
-- Ref: Make hints Map instead of only Object ([#1929](https://github.com/getsentry/sentry-java/pull/1929))
-- Ref: Simplify DateUtils with ISO8601Utils ([#1837](https://github.com/getsentry/sentry-java/pull/1837))
-- Ref: Remove deprecated and scheduled fields ([#1875](https://github.com/getsentry/sentry-java/pull/1875))
-- Ref: Add shutdownTimeoutMillis in favor of shutdownTimeout ([#1873](https://github.com/getsentry/sentry-java/pull/1873))
-- Ref: Remove Attachment ContentType since the Server infers it ([#1874](https://github.com/getsentry/sentry-java/pull/1874))
-- Ref: Bind external properties to a dedicated class. ([#1750](https://github.com/getsentry/sentry-java/pull/1750))
-- Ref: Debug log serializable objects ([#1795](https://github.com/getsentry/sentry-java/pull/1795))
-- Ref: catch Throwable instead of Exception to suppress internal SDK errors ([#1812](https://github.com/getsentry/sentry-java/pull/1812))
-- `SentryOptions` can merge properties from `ExternalOptions` instead of another instance of `SentryOptions`
-- Following boolean properties from `SentryOptions` that allowed `null` values are now not nullable - `debug`, `enableUncaughtExceptionHandler`, `enableDeduplication`
-- `SentryOptions` cannot be created anymore using `PropertiesProvider` with `SentryOptions#from` method. Use `ExternalOptions#from` instead and merge created object with `SentryOptions#merge`
-- Bump: Kotlin to 1.5 and compatibility to 1.4 for sentry-android-timber ([#1815](https://github.com/getsentry/sentry-java/pull/1815))
-
-## 5.7.4
-
-### Fixes
-
-- Change order of event filtering mechanisms and only send session update for dropped events if session state changed (#2028)
-
-## 5.7.3
-
-### Fixes
-
-- Sentry Timber integration throws an exception when using args ([#1986](https://github.com/getsentry/sentry-java/pull/1986))
-
-## 5.7.2
-
-### Fixes
-
-- Bring back support for `Timber.tag` ([#1974](https://github.com/getsentry/sentry-java/pull/1974))
-
-## 5.7.1
-
-### Fixes
-
-- Sentry Timber integration does not submit msg.formatted breadcrumbs ([#1957](https://github.com/getsentry/sentry-java/pull/1957))
-- ANR WatchDog won't crash on SecurityException ([#1962](https://github.com/getsentry/sentry-java/pull/1962))
-
-## 5.7.0
-
-### Features
-
-- Automatically enable `Timber` and `Fragment` integrations if they are present on the classpath ([#1936](https://github.com/getsentry/sentry-java/pull/1936))
-
-## 5.6.3
-
-### Fixes
-
-- If transaction or span is finished, do not allow to mutate ([#1940](https://github.com/getsentry/sentry-java/pull/1940))
-- Keep used AndroidX classes from obfuscation (Fixes UI breadcrumbs and Slow/Frozen frames) ([#1942](https://github.com/getsentry/sentry-java/pull/1942))
-
-## 5.6.2
-
-### Fixes
-
-- Ref: Make ActivityFramesTracker public to be used by Hybrid SDKs ([#1931](https://github.com/getsentry/sentry-java/pull/1931))
-- Bump: AGP to 7.1.2 ([#1930](https://github.com/getsentry/sentry-java/pull/1930))
-- NPE while adding "response_body_size" breadcrumb, when response body length is unknown ([#1908](https://github.com/getsentry/sentry-java/pull/1908))
-- Do not include stacktrace frames into Timber message ([#1898](https://github.com/getsentry/sentry-java/pull/1898))
-- Potential memory leaks ([#1909](https://github.com/getsentry/sentry-java/pull/1909))
-
-Breaking changes:
-`Timber.tag` is no longer supported by our [Timber integration](https://docs.sentry.io/platforms/android/configuration/integrations/timber/) and will not appear on Sentry for error events.
-Please vote on this [issue](https://github.com/getsentry/sentry-java/issues/1900), if you'd like us to provide support for that.
-
-## 5.6.2-beta.3
-
-### Fixes
-
-- Ref: Make ActivityFramesTracker public to be used by Hybrid SDKs ([#1931](https://github.com/getsentry/sentry-java/pull/1931))
-- Bump: AGP to 7.1.2 ([#1930](https://github.com/getsentry/sentry-java/pull/1930))
-
-## 5.6.2-beta.2
-
-### Fixes
-
-- NPE while adding "response_body_size" breadcrumb, when response body length is unknown ([#1908](https://github.com/getsentry/sentry-java/pull/1908))
-
-## 5.6.2-beta.1
-
-### Fixes
-
-- Do not include stacktrace frames into Timber message ([#1898](https://github.com/getsentry/sentry-java/pull/1898))
-- Potential memory leaks ([#1909](https://github.com/getsentry/sentry-java/pull/1909))
-
-Breaking changes:
-`Timber.tag` is no longer supported by our [Timber integration](https://docs.sentry.io/platforms/android/configuration/integrations/timber/) and will not appear on Sentry for error events.
-Please vote on this [issue](https://github.com/getsentry/sentry-java/issues/1900), if you'd like us to provide support for that.
-
-## 5.6.1
-
-### Features
-
-- Add options.printUncaughtStackTrace to print uncaught exceptions ([#1890](https://github.com/getsentry/sentry-java/pull/1890))
-
-### Fixes
-
-- NPE while adding "response_body_size" breadcrumb, when response body is null ([#1884](https://github.com/getsentry/sentry-java/pull/1884))
-- Bump: AGP to 7.1.0 ([#1892](https://github.com/getsentry/sentry-java/pull/1892))
-
-## 5.6.0
-
-### Features
-
-- Add breadcrumbs support for UI events (automatically captured) ([#1876](https://github.com/getsentry/sentry-java/pull/1876))
-
-### Fixes
-
-- Change scope of servlet-api to compileOnly ([#1880](https://github.com/getsentry/sentry-java/pull/1880))
-
-## 5.5.3
-
-### Fixes
-
-- Do not create SentryExceptionResolver bean when Spring MVC is not on the classpath ([#1865](https://github.com/getsentry/sentry-java/pull/1865))
-
-## 5.5.2
-
-### Fixes
-
-- Detect App Cold start correctly for Hybrid SDKs ([#1855](https://github.com/getsentry/sentry-java/pull/1855))
-- Bump: log4j to 2.17.0 ([#1852](https://github.com/getsentry/sentry-java/pull/1852))
-- Bump: logback to 1.2.9 ([#1853](https://github.com/getsentry/sentry-java/pull/1853))
-
-## 5.5.1
-
-### Fixes
-
-- Bump: log4j to 2.16.0 ([#1845](https://github.com/getsentry/sentry-java/pull/1845))
-- Make App start cold/warm visible to Hybrid SDKs ([#1848](https://github.com/getsentry/sentry-java/pull/1848))
-
-## 5.5.0
-
-### Features
-
-- Add locale to device context and deprecate language ([#1832](https://github.com/getsentry/sentry-java/pull/1832))
-- Add `SentryFileInputStream` and `SentryFileOutputStream` for File I/O performance instrumentation ([#1826](https://github.com/getsentry/sentry-java/pull/1826))
-- Add `SentryFileReader` and `SentryFileWriter` for File I/O instrumentation ([#1843](https://github.com/getsentry/sentry-java/pull/1843))
-
-### Fixes
-
-- Bump: log4j to 2.15.0 ([#1839](https://github.com/getsentry/sentry-java/pull/1839))
-- Ref: Rename Fragment span operation from `ui.fragment.load` to `ui.load` ([#1824](https://github.com/getsentry/sentry-java/pull/1824))
-- Ref: change `java.util.Random` to `java.security.SecureRandom` for possible security reasons ([#1831](https://github.com/getsentry/sentry-java/pull/1831))
-
-## 5.4.3
-
-### Fixes
-
-- Only report App start measurement for full launch on Android ([#1821](https://github.com/getsentry/sentry-java/pull/1821))
-
-## 5.4.2
-
-### Fixes
-
-- Ref: catch Throwable instead of Exception to suppress internal SDK errors ([#1812](https://github.com/getsentry/sentry-java/pull/1812))
-
-## 5.4.1
-
-### Features
-
-- Refactor OkHttp and Apollo to Kotlin functional interfaces ([#1797](https://github.com/getsentry/sentry-java/pull/1797))
-- Add secondary constructor to SentryInstrumentation ([#1804](https://github.com/getsentry/sentry-java/pull/1804))
-
-### Fixes
-
-- Do not start fragment span if not added to the Activity ([#1813](https://github.com/getsentry/sentry-java/pull/1813))
-
-## 5.4.0
-
-### Features
-
-- Add `graphql-java` instrumentation ([#1777](https://github.com/getsentry/sentry-java/pull/1777))
-
-### Fixes
-
-- Do not crash when event processors throw a lower level Throwable class ([#1800](https://github.com/getsentry/sentry-java/pull/1800))
-- ActivityFramesTracker does not throw if Activity has no observers ([#1799](https://github.com/getsentry/sentry-java/pull/1799))
-
-## 5.3.0
-
-### Features
-
-- Add datasource tracing with P6Spy ([#1784](https://github.com/getsentry/sentry-java/pull/1784))
-
-### Fixes
-
-- ActivityFramesTracker does not throw if Activity has not been added ([#1782](https://github.com/getsentry/sentry-java/pull/1782))
-- PerformanceAndroidEventProcessor uses up to date isTracingEnabled set on Configuration callback ([#1786](https://github.com/getsentry/sentry-java/pull/1786))
-
-## 5.2.4
-
-### Fixes
-
-- Window.FEATURE_NO_TITLE does not work when using activity traces ([#1769](https://github.com/getsentry/sentry-java/pull/1769))
-- unregister UncaughtExceptionHandler on close ([#1770](https://github.com/getsentry/sentry-java/pull/1770))
-
-## 5.2.3
-
-### Fixes
-
-- Make ActivityFramesTracker operations thread-safe ([#1762](https://github.com/getsentry/sentry-java/pull/1762))
-- Clone Scope Contexts ([#1763](https://github.com/getsentry/sentry-java/pull/1763))
-- Bump: AGP to 7.0.3 ([#1765](https://github.com/getsentry/sentry-java/pull/1765))
-
-## 5.2.2
-
-### Fixes
-
-- Close HostnameCache#executorService on SentryClient#close ([#1757](https://github.com/getsentry/sentry-java/pull/1757))
-
-## 5.2.1
-
-### Features
-
-- Add isCrashedLastRun support ([#1739](https://github.com/getsentry/sentry-java/pull/1739))
-- Attach Java vendor and version to events and transactions ([#1703](https://github.com/getsentry/sentry-java/pull/1703))
-
-### Fixes
-
-- Handle exception if Context.registerReceiver throws ([#1747](https://github.com/getsentry/sentry-java/pull/1747))
-
-## 5.2.0
-
-### Features
-
-- Allow setting proguard via Options and/or external resources ([#1728](https://github.com/getsentry/sentry-java/pull/1728))
-- Add breadcrumbs for the Apollo integration ([#1726](https://github.com/getsentry/sentry-java/pull/1726))
-
-### Fixes
-
-- Don't set lastEventId for transactions ([#1727](https://github.com/getsentry/sentry-java/pull/1727))
-- ActivityLifecycleIntegration#appStartSpan memory leak ([#1732](https://github.com/getsentry/sentry-java/pull/1732))
-
-## 5.2.0-beta.3
-
-### Features
-
-- Add "data" to spans ([#1717](https://github.com/getsentry/sentry-java/pull/1717))
-
-### Fixes
-
-- Check at runtime if AndroidX.Core is available ([#1718](https://github.com/getsentry/sentry-java/pull/1718))
-- Should not capture unfinished transaction ([#1719](https://github.com/getsentry/sentry-java/pull/1719))
-
-## 5.2.0-beta.2
-
-### Fixes
-
-- Bump AGP to 7.0.2 ([#1650](https://github.com/getsentry/sentry-java/pull/1650))
-- Drop spans in BeforeSpanCallback. ([#1713](https://github.com/getsentry/sentry-java/pull/1713))
-
-## 5.2.0-beta.1
-
-### Features
-
-- Add tracestate HTTP header support ([#1683](https://github.com/getsentry/sentry-java/pull/1683))
-- Add option to filter which origins receive tracing headers ([#1698](https://github.com/getsentry/sentry-java/pull/1698))
-- Include unfinished spans in transaction ([#1699](https://github.com/getsentry/sentry-java/pull/1699))
-- Add static helpers for creating breadcrumbs ([#1702](https://github.com/getsentry/sentry-java/pull/1702))
-- Performance support for Android Apollo ([#1705](https://github.com/getsentry/sentry-java/pull/1705))
-
-### Fixes
-
-- Move tags from transaction.contexts.trace.tags to transaction.tags ([#1700](https://github.com/getsentry/sentry-java/pull/1700))
-
-Breaking changes:
-
-- Updated proguard keep rule for enums, which affects consumer application code ([#1694](https://github.com/getsentry/sentry-java/pull/1694))
-
-## 5.1.2
-
-### Fixes
-
-- Servlet 3.1 compatibility issue ([#1681](https://github.com/getsentry/sentry-java/pull/1681))
-- Do not drop Contexts key if Collection, Array or Char ([#1680](https://github.com/getsentry/sentry-java/pull/1680))
-
-## 5.1.1
-
-### Features
-
-- Add support for async methods in Spring MVC ([#1652](https://github.com/getsentry/sentry-java/pull/1652))
-- Add secondary constructor taking IHub to SentryOkHttpInterceptor ([#1657](https://github.com/getsentry/sentry-java/pull/1657))
-- Merge external map properties ([#1656](https://github.com/getsentry/sentry-java/pull/1656))
-
-### Fixes
-
-- Remove onActivityPreCreated call in favor of onActivityCreated ([#1661](https://github.com/getsentry/sentry-java/pull/1661))
-- Do not crash if SENSOR_SERVICE throws ([#1655](https://github.com/getsentry/sentry-java/pull/1655))
-- Make sure scope is popped when processing request results in exception ([#1665](https://github.com/getsentry/sentry-java/pull/1665))
-
-## 5.1.0
-
-### Features
-
-- Spring WebClient integration ([#1621](https://github.com/getsentry/sentry-java/pull/1621))
-- OpenFeign integration ([#1632](https://github.com/getsentry/sentry-java/pull/1632))
-- Add more convenient way to pass BeforeSpanCallback in OpenFeign integration ([#1637](https://github.com/getsentry/sentry-java/pull/1637))
-
-### Fixes
-
-- Bump: sentry-native to 0.4.12 ([#1651](https://github.com/getsentry/sentry-java/pull/1651))
-
-## 5.1.0-beta.9
-
-- No documented changes.
-
-## 5.1.0-beta.8
-
-### Features
-
-- Generate Sentry BOM ([#1486](https://github.com/getsentry/sentry-java/pull/1486))
-
-## 5.1.0-beta.7
-
-### Features
-
-- Slow/Frozen frames metrics ([#1609](https://github.com/getsentry/sentry-java/pull/1609))
-
-## 5.1.0-beta.6
-
-### Features
-
-- Add request body extraction for Spring MVC integration ([#1595](https://github.com/getsentry/sentry-java/pull/1595))
-
-### Fixes
-
-- set min sdk version of sentry-android-fragment to API 14 ([#1608](https://github.com/getsentry/sentry-java/pull/1608))
-- Ser/Deser of the UserFeedback from cached envelope ([#1611](https://github.com/getsentry/sentry-java/pull/1611))
-
-## 5.1.0-beta.5
-
-### Fixes
-
-- Make SentryAppender non-final for Log4j2 and Logback ([#1603](https://github.com/getsentry/sentry-java/pull/1603))
-- Do not throw IAE when tracing header contain invalid trace id ([#1605](https://github.com/getsentry/sentry-java/pull/1605))
-
-## 5.1.0-beta.4
-
-### Fixes
-
-- Update sentry-native to 0.4.11 ([#1591](https://github.com/getsentry/sentry-java/pull/1591))
-
-## 5.1.0-beta.3
-
-### Features
-
-- Spring Webflux integration ([#1529](https://github.com/getsentry/sentry-java/pull/1529))
-
-## 5.1.0-beta.2
-
-### Features
-
-- Support transaction waiting for children to finish. ([#1535](https://github.com/getsentry/sentry-java/pull/1535))
-- Capture logged marker in log4j2 and logback appenders ([#1551](https://github.com/getsentry/sentry-java/pull/1551))
-- Allow clearing of attachments in the scope ([#1562](https://github.com/getsentry/sentry-java/pull/1562))
-- Set mechanism type in SentryExceptionResolver ([#1556](https://github.com/getsentry/sentry-java/pull/1556))
-- Perf. for fragments ([#1528](https://github.com/getsentry/sentry-java/pull/1528))
-
-### Fixes
-
-- Handling missing Spring Security on classpath on Java 8 ([#1552](https://github.com/getsentry/sentry-java/pull/1552))
-- Use a different method to get strings from JNI, and avoid excessive Stack Space usage. ([#1214](https://github.com/getsentry/sentry-java/pull/1214))
-- Add data field to SentrySpan ([#1555](https://github.com/getsentry/sentry-java/pull/1555))
-- Clock drift issue when calling DateUtils#getDateTimeWithMillisPrecision ([#1557](https://github.com/getsentry/sentry-java/pull/1557))
-- Prefer snake case for HTTP integration data keys ([#1559](https://github.com/getsentry/sentry-java/pull/1559))
-- Assign lastEventId only if event was queued for submission ([#1565](https://github.com/getsentry/sentry-java/pull/1565))
-
-## 5.1.0-beta.1
-
-### Features
-
-- Measure app start time ([#1487](https://github.com/getsentry/sentry-java/pull/1487))
-- Automatic breadcrumbs logging for fragment lifecycle ([#1522](https://github.com/getsentry/sentry-java/pull/1522))
-
-## 5.0.1
-
-### Fixes
-
-- Sources and Javadoc artifacts were mixed up ([#1515](https://github.com/getsentry/sentry-java/pull/1515))
-
-## 5.0.0
-
-This release brings many improvements but also new features:
-
-- OkHttp Interceptor for Android ([#1330](https://github.com/getsentry/sentry-java/pull/1330))
-- GraalVM Native Image Compatibility ([#1329](https://github.com/getsentry/sentry-java/pull/1329))
-- Add option to ignore exceptions by type ([#1352](https://github.com/getsentry/sentry-java/pull/1352))
-- Enrich transactions with device contexts ([#1430](https://github.com/getsentry/sentry-java/pull/1430)) ([#1469](https://github.com/getsentry/sentry-java/pull/1469))
-- Better interoperability with Kotlin null-safety ([#1439](https://github.com/getsentry/sentry-java/pull/1439)) and ([#1462](https://github.com/getsentry/sentry-java/pull/1462))
-- Add coroutines support ([#1479](https://github.com/getsentry/sentry-java/pull/1479))
-- OkHttp callback for Customising the Span ([#1478](https://github.com/getsentry/sentry-java/pull/1478))
-- Add breadcrumb in Spring RestTemplate integration ([#1481](https://github.com/getsentry/sentry-java/pull/1481))
-
-Breaking changes:
-
-- Migration Guide for [Java](https://docs.sentry.io/platforms/java/migration/)
-- Migration Guide for [Android](https://docs.sentry.io/platforms/android/migration/)
-
-Other fixes:
-
-- Fix: Add attachmentType to envelope ser/deser. ([#1504](https://github.com/getsentry/sentry-java/pull/1504))
-
-Thank you:
-
-- @maciejwalkowiak for coding most of it.
-
-## 5.0.0-beta.7
-
-### Fixes
-
-- Ref: Deprecate SentryBaseEvent#getOriginThrowable and add SentryBaseEvent#getThrowableMechanism ([#1502](https://github.com/getsentry/sentry-java/pull/1502))
-- Graceful Shutdown flushes event instead of Closing SDK ([#1500](https://github.com/getsentry/sentry-java/pull/1500))
-- Do not append threads that come from the EnvelopeFileObserver ([#1501](https://github.com/getsentry/sentry-java/pull/1501))
-- Ref: Deprecate cacheDirSize and add maxCacheItems ([#1499](https://github.com/getsentry/sentry-java/pull/1499))
-- Append all threads if Hint is Cached but attachThreads is enabled ([#1503](https://github.com/getsentry/sentry-java/pull/1503))
-
-## 5.0.0-beta.6
-
-### Features
-
-- Add secondary constructor to SentryOkHttpInterceptor ([#1491](https://github.com/getsentry/sentry-java/pull/1491))
-- Add option to enable debug mode in Log4j2 integration ([#1492](https://github.com/getsentry/sentry-java/pull/1492))
-
-### Fixes
-
-- Ref: Replace clone() with copy constructor ([#1496](https://github.com/getsentry/sentry-java/pull/1496))
-
-## 5.0.0-beta.5
-
-### Features
-
-- OkHttp callback for Customising the Span ([#1478](https://github.com/getsentry/sentry-java/pull/1478))
-- Add breadcrumb in Spring RestTemplate integration ([#1481](https://github.com/getsentry/sentry-java/pull/1481))
-- Add coroutines support ([#1479](https://github.com/getsentry/sentry-java/pull/1479))
-
-### Fixes
-
-- Cloning Stack ([#1483](https://github.com/getsentry/sentry-java/pull/1483))
-
-## 5.0.0-beta.4
-
-### Fixes
-
-- Enrich Transactions with Context Data ([#1469](https://github.com/getsentry/sentry-java/pull/1469))
-- Bump: Apache HttpClient to 5.0.4 ([#1476](https://github.com/getsentry/sentry-java/pull/1476))
-
-## 5.0.0-beta.3
-
-### Fixes
-
-- Handling immutable collections on SentryEvent and protocol objects ([#1468](https://github.com/getsentry/sentry-java/pull/1468))
-- Associate event with transaction when thrown exception is not a direct cause ([#1463](https://github.com/getsentry/sentry-java/pull/1463))
-- Ref: nullability annotations to Sentry module ([#1439](https://github.com/getsentry/sentry-java/pull/1439)) and ([#1462](https://github.com/getsentry/sentry-java/pull/1462))
-- NPE when adding Context Data with null values for log4j2 ([#1465](https://github.com/getsentry/sentry-java/pull/1465))
-
-## 5.0.0-beta.2
-
-### Fixes
-
-- sentry-android-timber package sets sentry.java.android.timber as SDK name ([#1456](https://github.com/getsentry/sentry-java/pull/1456))
-- When AppLifecycleIntegration is closed, it should remove observer using UI thread ([#1459](https://github.com/getsentry/sentry-java/pull/1459))
-- Bump: AGP to 4.2.0 ([#1460](https://github.com/getsentry/sentry-java/pull/1460))
-
-Breaking Changes:
-
-- Remove: Settings.Secure.ANDROID_ID in favor of generated installationId ([#1455](https://github.com/getsentry/sentry-java/pull/1455))
-- Rename: enableSessionTracking to enableAutoSessionTracking ([#1457](https://github.com/getsentry/sentry-java/pull/1457))
-
-## 5.0.0-beta.1
-
-### Fixes
-
-- Ref: Refactor converting HttpServletRequest to Sentry Request in Spring integration ([#1387](https://github.com/getsentry/sentry-java/pull/1387))
-- Bump: sentry-native to 0.4.9 ([#1431](https://github.com/getsentry/sentry-java/pull/1431))
-- Activity tracing auto instrumentation for Android API < 29 ([#1402](https://github.com/getsentry/sentry-java/pull/1402))
-- use connection and read timeouts in ApacheHttpClient based transport ([#1397](https://github.com/getsentry/sentry-java/pull/1397))
-- set correct transaction status for unhandled exceptions in SentryTracingFilter ([#1406](https://github.com/getsentry/sentry-java/pull/1406))
-- handle network errors in SentrySpanClientHttpRequestInterceptor ([#1407](https://github.com/getsentry/sentry-java/pull/1407))
-- set scope on transaction ([#1409](https://github.com/getsentry/sentry-java/pull/1409))
-- set status and associate events with transactions ([#1426](https://github.com/getsentry/sentry-java/pull/1426))
-- Do not set free memory and is low memory fields when it's a NDK hard crash ([#1399](https://github.com/getsentry/sentry-java/pull/1399))
-- Apply user from the scope to transaction ([#1424](https://github.com/getsentry/sentry-java/pull/1424))
-- Pass maxBreadcrumbs config. to sentry-native ([#1425](https://github.com/getsentry/sentry-java/pull/1425))
-- Run event processors and enrich transactions with contexts ([#1430](https://github.com/getsentry/sentry-java/pull/1430))
-- Set Span status for OkHttp integration ([#1447](https://github.com/getsentry/sentry-java/pull/1447))
-- Set user on transaction in Spring & Spring Boot integrations ([#1443](https://github.com/getsentry/sentry-java/pull/1443))
-
-## 4.4.0-alpha.2
-
-### Features
-
-- Add option to ignore exceptions by type ([#1352](https://github.com/getsentry/sentry-java/pull/1352))
-- Sentry closes Android NDK and ShutdownHook integrations ([#1358](https://github.com/getsentry/sentry-java/pull/1358))
-- Allow inheritance of SentryHandler class in sentry-jul package([#1367](https://github.com/getsentry/sentry-java/pull/1367))
-- Make NoOpHub public ([#1379](https://github.com/getsentry/sentry-java/pull/1379))
-- Configure max spans per transaction ([#1394](https://github.com/getsentry/sentry-java/pull/1394))
-
-### Fixes
-
-- Bump: Upgrade Apache HttpComponents Core to 5.0.3 ([#1375](https://github.com/getsentry/sentry-java/pull/1375))
-- NPE when MDC contains null values (sentry-logback) ([#1364](https://github.com/getsentry/sentry-java/pull/1364))
-- Avoid NPE when MDC contains null values (sentry-jul) ([#1385](https://github.com/getsentry/sentry-java/pull/1385))
-- Accept only non null value maps ([#1368](https://github.com/getsentry/sentry-java/pull/1368))
-- Do not bind transactions to scope by default. ([#1376](https://github.com/getsentry/sentry-java/pull/1376))
-- Hub thread safety ([#1388](https://github.com/getsentry/sentry-java/pull/1388))
-- SentryTransactionAdvice should operate on the new scope ([#1389](https://github.com/getsentry/sentry-java/pull/1389))
-
-## 4.4.0-alpha.1
-
-### Features
-
-- Add an overload for `startTransaction` that sets the created transaction to the Scope ([#1313](https://github.com/getsentry/sentry-java/pull/1313))
-- Set SDK version on Transactions ([#1307](https://github.com/getsentry/sentry-java/pull/1307))
-- GraalVM Native Image Compatibility ([#1329](https://github.com/getsentry/sentry-java/pull/1329))
-- Add OkHttp client application interceptor ([#1330](https://github.com/getsentry/sentry-java/pull/1330))
-
-### Fixes
-
-- Bump: sentry-native to 0.4.8
-- Ref: Separate user facing and protocol classes in the Performance feature ([#1304](https://github.com/getsentry/sentry-java/pull/1304))
-- Use logger set on SentryOptions in GsonSerializer ([#1308](https://github.com/getsentry/sentry-java/pull/1308))
-- Use the bindToScope correctly
-- Allow 0.0 to be set on tracesSampleRate ([#1328](https://github.com/getsentry/sentry-java/pull/1328))
-- set "java" platform to transactions ([#1332](https://github.com/getsentry/sentry-java/pull/1332))
-- Allow disabling tracing through SentryOptions ([#1337](https://github.com/getsentry/sentry-java/pull/1337))
-
-## 4.3.0
-
-### Features
-
-- Activity tracing auto instrumentation
-
-### Fixes
-
-- Aetting in-app-includes from external properties ([#1291](https://github.com/getsentry/sentry-java/pull/1291))
-- Initialize Sentry in Logback appender when DSN is not set in XML config ([#1296](https://github.com/getsentry/sentry-java/pull/1296))
-- JUL integration SDK name ([#1293](https://github.com/getsentry/sentry-java/pull/1293))
-
-## 4.2.0
-
-### Features
-
-- Improve EventProcessor nullability annotations ([#1229](https://github.com/getsentry/sentry-java/pull/1229)).
-- Add ability to flush events synchronously.
-- Support @SentrySpan and @SentryTransaction on classes and interfaces. ([#1243](https://github.com/getsentry/sentry-java/pull/1243))
-- Do not serialize empty collections and maps ([#1245](https://github.com/getsentry/sentry-java/pull/1245))
-- Integration interface better compatibility with Kotlin null-safety
-- Simplify Sentry configuration in Spring integration ([#1259](https://github.com/getsentry/sentry-java/pull/1259))
-- Simplify configuring Logback integration when environment variable with the DSN is not set ([#1271](https://github.com/getsentry/sentry-java/pull/1271))
-- Add Request to the Scope. [#1270](https://github.com/getsentry/sentry-java/pull/1270))
-- Optimize SentryTracingFilter when hub is disabled.
-
-### Fixes
-
-- Bump: sentry-native to 0.4.7
-- Optimize DuplicateEventDetectionEventProcessor performance ([#1247](https://github.com/getsentry/sentry-java/pull/1247)).
-- Prefix sdk.package names with io.sentry ([#1249](https://github.com/getsentry/sentry-java/pull/1249))
-- Remove experimental annotation for Attachment ([#1257](https://github.com/getsentry/sentry-java/pull/1257))
-- Mark stacktrace as snapshot if captured at arbitrary moment ([#1231](https://github.com/getsentry/sentry-java/pull/1231))
-- Disable Gson HTML escaping
-- Make the ANR Atomic flags immutable
-- Prevent NoOpHub from creating heavy SentryOptions objects ([#1272](https://github.com/getsentry/sentry-java/pull/1272))
-- SentryTransaction#getStatus NPE ([#1273](https://github.com/getsentry/sentry-java/pull/1273))
-- Discard unfinished Spans before sending them over to Sentry ([#1279](https://github.com/getsentry/sentry-java/pull/1279))
-- Interrupt the thread in QueuedThreadPoolExecutor ([#1276](https://github.com/getsentry/sentry-java/pull/1276))
-- SentryTransaction#finish should not clear another transaction from the scope ([#1278](https://github.com/getsentry/sentry-java/pull/1278))
-
-Breaking Changes:
-
-- Enchancement: SentryExceptionResolver should not send handled errors by default ([#1248](https://github.com/getsentry/sentry-java/pull/1248)).
-- Ref: Simplify RestTemplate instrumentation ([#1246](https://github.com/getsentry/sentry-java/pull/1246))
-- Enchancement: Add overloads for startTransaction taking op and description ([#1244](https://github.com/getsentry/sentry-java/pull/1244))
-
-## 4.1.0
-
-### Features
-
-- Improve Kotlin compatibility for SdkVersion ([#1213](https://github.com/getsentry/sentry-java/pull/1213))
-- Support logging via JUL ([#1211](https://github.com/getsentry/sentry-java/pull/1211))
-
-### Fixes
-
-- Returning Sentry trace header from Span ([#1217](https://github.com/getsentry/sentry-java/pull/1217))
-- Remove misleading error logs ([#1222](https://github.com/getsentry/sentry-java/pull/1222))
-
-## 4.0.0
-
-This release brings the Sentry Performance feature to Java SDK, Spring, Spring Boot, and Android integrations. Read more in the reference documentation:
-
-- [Performance for Java](https://docs.sentry.io/platforms/java/performance/)
-- [Performance for Spring](https://docs.sentry.io/platforms/java/guides/spring/)
-- [Performance for Spring Boot](https://docs.sentry.io/platforms/java/guides/spring-boot/)
-- [Performance for Android](https://docs.sentry.io/platforms/android/performance/)
-
-### Other improvements:
-
-#### Core:
-
-- Improved loading external configuration:
- - Load `sentry.properties` from the application's current working directory ([#1046](https://github.com/getsentry/sentry-java/pull/1046))
- - Resolve `in-app-includes`, `in-app-excludes`, `tags`, `debug`, `uncaught.handler.enabled` parameters from the external configuration
-- Set global tags on SentryOptions and load them from external configuration ([#1066](https://github.com/getsentry/sentry-java/pull/1066))
-- Add support for attachments ([#1082](https://github.com/getsentry/sentry-java/pull/1082))
-- Resolve `servername` from the localhost address
-- Simplified transport configuration through setting `TransportFactory` instead of `ITransport` on SentryOptions ([#1124](https://github.com/getsentry/sentry-java/pull/1124))
-
-#### Spring Boot:
-
-- Add the ability to register multiple `OptionsConfiguration` beans ([#1093](https://github.com/getsentry/sentry-java/pull/1093))
-- Initialize Logback after context refreshes ([#1129](https://github.com/getsentry/sentry-java/pull/1129))
-
-#### Android:
-
-- Add `isSideLoaded` and `installerStore` tags automatically (Where your App. was installed from eg Google Play, Amazon Store, downloaded APK, etc...)
-- Bump: sentry-native to 0.4.6
-- Bump: Gradle to 6.8.1 and AGP to 4.1.2
-
-## 4.0.0-beta.1
-
-### Features
-
-- Add addToTransactions to Attachment ([#1191](https://github.com/getsentry/sentry-java/pull/1191))
-- Support SENTRY_TRACES_SAMPLE_RATE conf. via env variables ([#1171](https://github.com/getsentry/sentry-java/pull/1171))
-- Pass request to CustomSamplingContext in Spring integration ([#1172](https://github.com/getsentry/sentry-java/pull/1172))
-- Move `SentrySpanClientHttpRequestInterceptor` to Spring module ([#1181](https://github.com/getsentry/sentry-java/pull/1181))
-- Add overload for `transaction/span.finish(SpanStatus)` ([#1182](https://github.com/getsentry/sentry-java/pull/1182))
-- Simplify registering traces sample callback in Spring integration ([#1184](https://github.com/getsentry/sentry-java/pull/1184))
-- Polish Performance API ([#1165](https://github.com/getsentry/sentry-java/pull/1165))
-- Set "debug" through external properties ([#1186](https://github.com/getsentry/sentry-java/pull/1186))
-- Simplify Spring integration ([#1188](https://github.com/getsentry/sentry-java/pull/1188))
-- Init overload with dsn ([#1195](https://github.com/getsentry/sentry-java/pull/1195))
-- Enable Kotlin map-like access on CustomSamplingContext ([#1192](https://github.com/getsentry/sentry-java/pull/1192))
-- Auto register custom ITransportFactory in Spring integration ([#1194](https://github.com/getsentry/sentry-java/pull/1194))
-- Improve Kotlin property access in Performance API ([#1193](https://github.com/getsentry/sentry-java/pull/1193))
-- Copy options tags to transactions ([#1198](https://github.com/getsentry/sentry-java/pull/1198))
-- Add convenient method for accessing event's throwable ([#1202](https://github.com/getsentry/sentry-java/pull/1202))
-
-### Fixes
-
-- Ref: Set SpanContext on SentryTransaction to avoid potential NPE ([#1173](https://github.com/getsentry/sentry-java/pull/1173))
-- Free Local Refs manually due to Android local ref. count limits
-- Bring back support for setting transaction name without ongoing transaction ([#1183](https://github.com/getsentry/sentry-java/pull/1183))
-
-## 4.0.0-alpha.3
-
-### Features
-
-- Improve ITransaction and ISpan null-safety compatibility ([#1161](https://github.com/getsentry/sentry-java/pull/1161))
-- Automatically assign span context to captured events ([#1156](https://github.com/getsentry/sentry-java/pull/1156))
-- Autoconfigure Apache HttpClient 5 based Transport in Spring Boot integration ([#1143](https://github.com/getsentry/sentry-java/pull/1143))
-- Send user.ip_address = {{auto}} when sendDefaultPii is true ([#1015](https://github.com/getsentry/sentry-java/pull/1015))
-- Read tracesSampleRate from AndroidManifest
-- OutboxSender supports all envelope item types ([#1158](https://github.com/getsentry/sentry-java/pull/1158))
-- Read `uncaught.handler.enabled` property from the external configuration
-- Resolve servername from the localhost address
-- Add maxAttachmentSize to SentryOptions ([#1138](https://github.com/getsentry/sentry-java/pull/1138))
-- Drop invalid attachments ([#1134](https://github.com/getsentry/sentry-java/pull/1134))
-- Set isSideLoaded info tags
-- Add non blocking Apache HttpClient 5 based Transport ([#1136](https://github.com/getsentry/sentry-java/pull/1136))
-
-### Fixes
-
-- Ref: Make Attachment immutable ([#1120](https://github.com/getsentry/sentry-java/pull/1120))
-- Ref: using Calendar to generate Dates
-- Ref: Return NoOpTransaction instead of null ([#1126](https://github.com/getsentry/sentry-java/pull/1126))
-- Ref: `ITransport` implementations are now responsible for executing request in asynchronous or synchronous way ([#1118](https://github.com/getsentry/sentry-java/pull/1118))
-- Ref: Add option to set `TransportFactory` instead of `ITransport` on `SentryOptions` ([#1124](https://github.com/getsentry/sentry-java/pull/1124))
-- Ref: Simplify ITransport creation in ITransportFactory ([#1135](https://github.com/getsentry/sentry-java/pull/1135))
-- Fixes and Tests: Session serialization and deserialization
-- Inheriting sampling decision from parent ([#1100](https://github.com/getsentry/sentry-java/pull/1100))
-- Exception only sets a stack trace if there are frames
-- Initialize Logback after context refreshes ([#1129](https://github.com/getsentry/sentry-java/pull/1129))
-- Do not crash when passing null values to @Nullable methods, eg User and Scope
-- Resolving dashed properties from external configuration
-- Consider {{ auto }} as a default ip address ([#1015](https://github.com/getsentry/sentry-java/pull/1015))
-- Set release and environment on Transactions ([#1152](https://github.com/getsentry/sentry-java/pull/1152))
-- Do not set transaction on the scope automatically
-
-## 4.0.0-alpha.2
-
-### Features
-
-- Add basic support for attachments ([#1082](https://github.com/getsentry/sentry-java/pull/1082))
-- Set transaction name on events and transactions sent using Spring integration ([#1067](https://github.com/getsentry/sentry-java/pull/1067))
-- Set global tags on SentryOptions and load them from external configuration ([#1066](https://github.com/getsentry/sentry-java/pull/1066))
-- Add API validator and remove deprecated methods
-- Add more convenient method to start a child span ([#1073](https://github.com/getsentry/sentry-java/pull/1073))
-- Autoconfigure traces callback in Spring Boot integration ([#1074](https://github.com/getsentry/sentry-java/pull/1074))
-- Resolve in-app-includes and in-app-excludes parameters from the external configuration
-- Make InAppIncludesResolver public ([#1084](https://github.com/getsentry/sentry-java/pull/1084))
-- Add the ability to register multiple OptionsConfiguration beans ([#1093](https://github.com/getsentry/sentry-java/pull/1093))
-- Database query tracing with datasource-proxy ([#1095](https://github.com/getsentry/sentry-java/pull/1095))
-
-### Fixes
-
-- Ref: Refactor resolving SpanContext for Throwable ([#1068](https://github.com/getsentry/sentry-java/pull/1068))
-- Ref: Change "op" to "operation" in @SentrySpan and @SentryTransaction
-- Remove method reference in SentryEnvelopeItem ([#1091](https://github.com/getsentry/sentry-java/pull/1091))
-- Set current thread only if there are no exceptions
-- SentryOptions creates GsonSerializer by default
-- Append DebugImage list if event already has it
-- Sort breadcrumbs by Date if there are breadcrumbs already in the event
-
-## 4.0.0-alpha.1
-
-### Features
-
-- Load `sentry.properties` from the application's current working directory ([#1046](https://github.com/getsentry/sentry-java/pull/1046))
-- Performance monitoring ([#971](https://github.com/getsentry/sentry-java/pull/971))
-- Performance monitoring for Spring Boot applications ([#971](https://github.com/getsentry/sentry-java/pull/971))
-
-### Fixes
-
-- Ref: Refactor JSON deserialization ([#1047](https://github.com/getsentry/sentry-java/pull/1047))
-
-## 3.2.1
-
-### Fixes
-
-- Set current thread only if theres no exceptions ([#1064](https://github.com/getsentry/sentry-java/pull/1064))
-- Append DebugImage list if event already has it ([#1092](https://github.com/getsentry/sentry-java/pull/1092))
-- Sort breadcrumbs by Date if there are breadcrumbs already in the event ([#1094](https://github.com/getsentry/sentry-java/pull/1094))
-- Free Local Refs manually due to Android local ref. count limits ([#1179](https://github.com/getsentry/sentry-java/pull/1179))
-
-## 3.2.0
-
-### Features
-
-- Expose a Module (Debug images) Loader for Android thru sentry-native ([#1043](https://github.com/getsentry/sentry-java/pull/1043))
-- Added java doc to protocol classes based on sentry-data-schemes project ([#1045](https://github.com/getsentry/sentry-java/pull/1045))
-- Make SentryExceptionResolver Order configurable to not send handled web exceptions ([#1008](https://github.com/getsentry/sentry-java/pull/1008))
-- Resolve HTTP Proxy parameters from the external configuration ([#1028](https://github.com/getsentry/sentry-java/pull/1028))
-- Sentry NDK integration is compiled against default NDK version based on AGP's version ([#1048](https://github.com/getsentry/sentry-java/pull/1048))
-
-### Fixes
-
-- Bump: AGP 4.1.1 ([#1040](https://github.com/getsentry/sentry-java/pull/1040))
-- Update to sentry-native 0.4.4 and fix shared library builds ([#1039](https://github.com/getsentry/sentry-java/pull/1039))
-- use neutral Locale for String operations ([#1033](https://github.com/getsentry/sentry-java/pull/1033))
-- Clean up JNI code and properly free strings ([#1050](https://github.com/getsentry/sentry-java/pull/1050))
-- set userId for hard-crashes if no user is set ([#1049](https://github.com/getsentry/sentry-java/pull/1049))
-
-## 3.1.3
-
-### Fixes
-
-- Fix broken NDK integration on 3.1.2 (release failed on packaging a .so file)
-- Increase max cached events to 30 ([#1029](https://github.com/getsentry/sentry-java/pull/1029))
-- Normalize DSN URI ([#1030](https://github.com/getsentry/sentry-java/pull/1030))
-
-## 3.1.2
-
-### Features
-
-- Manually capturing User Feedback
-- Set environment to "production" by default.
-- Make public the Breadcrumb constructor that accepts a Date ([#1012](https://github.com/getsentry/sentry-java/pull/1012))
-
-### Fixes
-
-- ref: Validate event id on user feedback submission
-
-## 3.1.1
-
-### Features
-
-- Bind logging related SentryProperties to Slf4j Level instead of Logback to improve Log4j2 compatibility
-
-### Fixes
-
-- Prevent Logback and Log4j2 integrations from re-initializing Sentry when Sentry is already initialized
-- Make sure HttpServletRequestSentryUserProvider runs by default before custom SentryUserProvider beans
-- Fix setting up Sentry in Spring Webflux annotation by changing the scope of Spring WebMvc related dependencies
-
-## 3.1.0
-
-### Features
-
-- Make getThrowable public and improve set contexts ([#967](https://github.com/getsentry/sentry-java/pull/967))
-- Accepted quoted values in properties from external configuration ([#972](https://github.com/getsentry/sentry-java/pull/972))
-
-### Fixes
-
-- Auto-Configure `inAppIncludes` in Spring Boot integration ([#966](https://github.com/getsentry/sentry-java/pull/966))
-- Bump: Android Gradle Plugin 4.0.2 ([#968](https://github.com/getsentry/sentry-java/pull/968))
-- Don't require `sentry.dsn` to be set when using `io.sentry:sentry-spring-boot-starter` and `io.sentry:sentry-logback` together ([#965](https://github.com/getsentry/sentry-java/pull/965))
-- Remove chunked streaming mode ([#974](https://github.com/getsentry/sentry-java/pull/974))
-- Android 11 + targetSdkVersion 30 crashes Sentry on start ([#977](https://github.com/getsentry/sentry-java/pull/977))
-
-## 3.0.0
-
-## Java + Android
-
-This release marks the re-unification of Java and Android SDK code bases.
-It's based on the Android 2.0 SDK, which implements [Sentry's unified API](https://develop.sentry.dev/sdk/unified-api/).
-
-Considerable changes were done, which include a lot of improvements. More are covered below, but the highlights are:
-
-- Improved `log4j2` integration
- - Capture breadcrumbs for level INFO and higher
- - Raises event for ERROR and higher.
- - Minimum levels are configurable.
- - Optionally initializes the SDK via appender.xml
-- Dropped support to `log4j`.
-- Improved `logback` integration
- - Capture breadcrumbs for level INFO and higher
- - Raises event for ERROR and higher.
- - Minimum levels are configurable.
- - Optionally initializes the SDK via appender.xml
- - Configurable via Spring integration if both are enabled
-- Spring
- - No more duplicate events with Spring and logback
- - Auto initalizes if DSN is available
- - Configuration options available with auto complete
-- Google App Engine support dropped
-
-## What’s Changed
-
-- Callback to validate SSL certificate ([#944](https://github.com/getsentry/sentry-java/pull/944))
-- Attach stack traces enabled by default
-
-### Android specific
-
-- Release health enabled by default for Android
-- Sync of Scopes for Java -> Native (NDK)
-- Bump Sentry-Native v0.4.2
-- Android 11 Support
-
-[Android migration docs](https://docs.sentry.io/platforms/android/migration/#migrating-from-sentry-android-2x-to-sentry-android-3x)
-
-### Java specific
-
-- Unified API for Java SDK and integrations (Spring, Spring boot starter, Servlet, Logback, Log4j2)
-
-New Java [docs](https://docs.sentry.io/platforms/java/) are live and being improved.
-
-## Acquisition
-
-Packages were released on [`bintray sentry-java`](https://dl.bintray.com/getsentry/sentry-java/io/sentry/), [`bintray sentry-android`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/)
-
-## Where is the Java 1.7 code base?
-
-The previous Java releases, are all available in this repository through the tagged releases.
-
-## 3.0.0-beta.1
-
-## What’s Changed
-
-- feat: ssl support ([#944](https://github.com/getsentry/sentry-java/pull/944)) @ninekaw9 @marandaneto
-- feat: sync Java to C ([#937](https://github.com/getsentry/sentry-java/pull/937)) @bruno-garcia @marandaneto
-- feat: Auto-configure Logback appender in Spring Boot integration. ([#938](https://github.com/getsentry/sentry-java/pull/938)) @maciejwalkowiak
-- feat: Add Servlet integration. ([#935](https://github.com/getsentry/sentry-java/pull/935)) @maciejwalkowiak
-- fix: Pop scope at the end of the request in Spring integration. ([#936](https://github.com/getsentry/sentry-java/pull/936)) @maciejwalkowiak
-- bump: Upgrade Spring Boot to 2.3.4. ([#932](https://github.com/getsentry/sentry-java/pull/932)) @maciejwalkowiak
-- fix: Do not set cookies when send pii is set to false. ([#931](https://github.com/getsentry/sentry-java/pull/931)) @maciejwalkowiak
-
-Packages were released on [`bintray sentry-java`](https://dl.bintray.com/getsentry/sentry-java/io/sentry/), [`bintray sentry-android`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/)
-
-We'd love to get feedback.
-
-## 3.0.0-alpha.3
-
-### Features
-
-- Enable attach stack traces and disable attach threads by default ([#921](https://github.com/getsentry/sentry-java/pull/921)) @marandaneto
-
-### Fixes
-
-- Bump sentry-native to 0.4.2 ([#926](https://github.com/getsentry/sentry-java/pull/926)) @marandaneto
-- ref: remove log level as RN do not use it anymore ([#924](https://github.com/getsentry/sentry-java/pull/924)) @marandaneto
-- Read sample rate correctly from manifest meta data ([#923](https://github.com/getsentry/sentry-java/pull/923)) @marandaneto
-
-Packages were released on [`bintray sentry-android`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/) and [`bintray sentry-java`](https://dl.bintray.com/getsentry/sentry-java/io/sentry/)
-
-We'd love to get feedback.
-
-## 3.0.0-alpha.2
-
-TBD
-
-Packages were released on [bintray](https://dl.bintray.com/getsentry/maven/io/sentry/)
-
-> Note: This release marks the unification of the Java and Android Sentry codebases based on the core of the Android SDK (version 2.x).
-> Previous releases for the Android SDK (version 2.x) can be found on the now archived: https://github.com/getsentry/sentry-android/
-
-## 3.0.0-alpha.1
-
-### Features
-
-### Fixes
-
-## New releases will happen on a different repository:
-
-https://github.com/getsentry/sentry-java
-
-## What’s Changed
-
-### Features
-
-### Fixes
-
-- feat: enable release health by default
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.3.1
-
-### Fixes
-
-- Add main thread checker for the app lifecycle integration ([#525](https://github.com/getsentry/sentry-android/pull/525)) @marandaneto
-- Set correct migration link ([#523](https://github.com/getsentry/sentry-android/pull/523)) @fupduck
-- Warn about Sentry re-initialization. ([#521](https://github.com/getsentry/sentry-android/pull/521)) @maciejwalkowiak
-- Set SDK version in `MainEventProcessor`. ([#513](https://github.com/getsentry/sentry-android/pull/513)) @maciejwalkowiak
-- Bump sentry-native to 0.4.0 ([#512](https://github.com/getsentry/sentry-android/pull/512)) @marandaneto
-- Bump Gradle to 6.6 and fix linting issues ([#510](https://github.com/getsentry/sentry-android/pull/510)) @marandaneto
-- fix(sentry-java): Contexts belong on the Scope ([#504](https://github.com/getsentry/sentry-android/pull/504)) @maciejwalkowiak
-- Add tests for verifying scope changes thread isolation ([#508](https://github.com/getsentry/sentry-android/pull/508)) @maciejwalkowiak
-- Set `SdkVersion` in default `SentryOptions` created in sentry-core module ([#506](https://github.com/getsentry/sentry-android/pull/506)) @maciejwalkowiak
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.3.0
-
-### Features
-
-- Add console application sample. ([#502](https://github.com/getsentry/sentry-android/pull/502)) @maciejwalkowiak
-- Log stacktraces in SystemOutLogger ([#498](https://github.com/getsentry/sentry-android/pull/498)) @maciejwalkowiak
-- Add method to add breadcrumb with string parameter. ([#501](https://github.com/getsentry/sentry-android/pull/501)) @maciejwalkowiak
-
-### Fixes
-
-- Converting UTC and ISO timestamp when missing Locale/TimeZone do not error ([#505](https://github.com/getsentry/sentry-android/pull/505)) @marandaneto
-- Call `Sentry#close` on JVM shutdown. ([#497](https://github.com/getsentry/sentry-android/pull/497)) @maciejwalkowiak
-- ref: sentry-core changes for console app ([#473](https://github.com/getsentry/sentry-android/pull/473)) @marandaneto
-
-Obs: If you are using its own instance of `Hub`/`SentryClient` and reflection to set up the SDK to be usable within Libraries, this change may break your code, please fix the renamed classes.
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.2.2
-
-### Features
-
-- Add sdk to envelope header ([#488](https://github.com/getsentry/sentry-android/pull/488)) @marandaneto
-- Log request if response code is not 200 ([#484](https://github.com/getsentry/sentry-android/pull/484)) @marandaneto
-
-### Fixes
-
-- Bump plugin versions ([#487](https://github.com/getsentry/sentry-android/pull/487)) @marandaneto
-- Bump: AGP 4.0.1 ([#486](https://github.com/getsentry/sentry-android/pull/486)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.2.1
-
-### Fixes
-
-- Timber adds breadcrumb even if event level is < minEventLevel ([#480](https://github.com/getsentry/sentry-android/pull/480)) @marandaneto
-- Contexts serializer avoids reflection and fixes desugaring issue ([#478](https://github.com/getsentry/sentry-android/pull/478)) @marandaneto
-- clone session before sending to the transport ([#474](https://github.com/getsentry/sentry-android/pull/474)) @marandaneto
-- Bump Gradle 6.5.1 ([#479](https://github.com/getsentry/sentry-android/pull/479)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.2.0
-
-### Fixes
-
-- Negative session sequence if the date is before java date epoch ([#471](https://github.com/getsentry/sentry-android/pull/471)) @marandaneto
-- Deserialise unmapped contexts values from envelope ([#470](https://github.com/getsentry/sentry-android/pull/470)) @marandaneto
-- Bump: sentry-native 0.3.4 ([#468](https://github.com/getsentry/sentry-android/pull/468)) @marandaneto
-
-- feat: timber integration ([#464](https://github.com/getsentry/sentry-android/pull/464)) @marandaneto
-
-1. To add integrations it requires a [manual initialization](https://docs.sentry.io/platforms/android/#manual-initialization) of the Android SDK.
-
-2. Add the `sentry-android-timber` dependency:
-
-```groovy
-implementation 'io.sentry:sentry-android-timber:{version}' // version >= 2.2.0
-```
-
-3. Initialize and add the `SentryTimberIntegration`:
-
-```java
-SentryAndroid.init(this, options -> {
- // default values:
- // minEventLevel = ERROR
- // minBreadcrumbLevel = INFO
- options.addIntegration(new SentryTimberIntegration());
-
- // custom values for minEventLevel and minBreadcrumbLevel
- // options.addIntegration(new SentryTimberIntegration(SentryLevel.WARNING, SentryLevel.ERROR));
-});
-```
-
-4. Use the Timber integration:
-
-```java
-try {
- int x = 1 / 0;
-} catch (Exception e) {
- Timber.e(e);
-}
-```
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.7
-
-### Fixes
-
-- Init native libs if available on SDK init ([#461](https://github.com/getsentry/sentry-android/pull/461)) @marandaneto
-- Make JVM target explicit in sentry-core ([#462](https://github.com/getsentry/sentry-android/pull/462)) @dilbernd
-- Timestamp with millis from react-native should be in UTC format ([#456](https://github.com/getsentry/sentry-android/pull/456)) @marandaneto
-- Bump Gradle to 6.5 ([#454](https://github.com/getsentry/sentry-android/pull/454)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.6
-
-### Fixes
-
-- Do not lookup sentry-debug-meta but instead load it directly ([#445](https://github.com/getsentry/sentry-android/pull/445)) @marandaneto
-- Regression on v2.1.5 which can cause a crash on SDK init
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.5
-
-### Fixes
-
-This version has a severe bug and can cause a crash on SDK init
-
-Please upgrade to https://github.com/getsentry/sentry-android/releases/tag/2.1.6
-
-## 2.1.4
-
-### Features
-
-- Make gzip as default content encoding type ([#433](https://github.com/getsentry/sentry-android/pull/433)) @marandaneto
-- Use AGP 4 features ([#366](https://github.com/getsentry/sentry-android/pull/366)) @marandaneto
-- Create GH Actions CI for Ubuntu/macOS ([#403](https://github.com/getsentry/sentry-android/pull/403)) @marandaneto
-- Make root checker better and minimize false positive ([#417](https://github.com/getsentry/sentry-android/pull/417)) @marandaneto
-
-### Fixes
-
-- bump: sentry-native to 0.3.1 ([#440](https://github.com/getsentry/sentry-android/pull/440)) @marandaneto
-- Update last session timestamp ([#437](https://github.com/getsentry/sentry-android/pull/437)) @marandaneto
-- Filter trim memory breadcrumbs ([#431](https://github.com/getsentry/sentry-android/pull/431)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.3
-
-### Fixes
-
-This fixes several critical bugs in sentry-android 2.0 and 2.1
-
-- Sentry.init register integrations after creating the main Hub instead of doing it in the main Hub ctor ([#427](https://github.com/getsentry/sentry-android/pull/427)) @marandaneto
-- make NoOpLogger public ([#425](https://github.com/getsentry/sentry-android/pull/425)) @marandaneto
-- ConnectivityChecker returns connection status and events are not trying to be sent if no connection. ([#420](https://github.com/getsentry/sentry-android/pull/420)) @marandaneto
-- thread pool executor is a single thread executor instead of scheduled thread executor ([#422](https://github.com/getsentry/sentry-android/pull/422)) @marandaneto
-- Add Abnormal to the Session.State enum as its part of the protocol ([#424](https://github.com/getsentry/sentry-android/pull/424)) @marandaneto
-- Bump: Gradle to 6.4.1 ([#419](https://github.com/getsentry/sentry-android/pull/419)) @marandaneto
-
-We recommend that you use sentry-android 2.1.3 over the initial release of sentry-android 2.0 and 2.1.
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.2
-
-### Features
-
-- Added options to configure http transport ([#411](https://github.com/getsentry/sentry-android/pull/411)) @marandaneto
-
-### Fixes
-
-- Phone state breadcrumbs require read_phone_state on older OS versions ([#415](https://github.com/getsentry/sentry-android/pull/415)) @marandaneto @bsergean
-- before raising ANR events, we check ProcessErrorStateInfo if available ([#412](https://github.com/getsentry/sentry-android/pull/412)) @marandaneto
-- send cached events to use a single thread executor ([#405](https://github.com/getsentry/sentry-android/pull/405)) @marandaneto
-- initing SDK on AttachBaseContext ([#409](https://github.com/getsentry/sentry-android/pull/409)) @marandaneto
-- sessions can't be abnormal, but exited if not ended properly ([#410](https://github.com/getsentry/sentry-android/pull/410)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.1
-
-### Features
-
-- Added missing getters on Breadcrumb and SentryEvent ([#397](https://github.com/getsentry/sentry-android/pull/397)) @marandaneto
-- Add trim memory breadcrumbs ([#395](https://github.com/getsentry/sentry-android/pull/395)) @marandaneto
-- Only set breadcrumb extras if not empty ([#394](https://github.com/getsentry/sentry-android/pull/394)) @marandaneto
-- Added samples of how to disable automatic breadcrumbs ([#389](https://github.com/getsentry/sentry-android/pull/389)) @marandaneto
-
-### Fixes
-
-- Set missing release, environment and dist to sentry-native options ([#404](https://github.com/getsentry/sentry-android/pull/404)) @marandaneto
-- Do not add automatic and empty sensor breadcrumbs ([#401](https://github.com/getsentry/sentry-android/pull/401)) @marandaneto
-- ref: removed Thread.sleep from LifecycleWatcher tests, using awaitility and DateProvider ([#392](https://github.com/getsentry/sentry-android/pull/392)) @marandaneto
-- ref: added a DateTimeProvider for making retry after testable ([#391](https://github.com/getsentry/sentry-android/pull/391)) @marandaneto
-- Bump Gradle to 6.4 ([#390](https://github.com/getsentry/sentry-android/pull/390)) @marandaneto
-- Bump sentry-native to 0.2.6 ([#396](https://github.com/getsentry/sentry-android/pull/396)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.0
-
-### Features
-
-- Includes all the changes of 2.1.0 alpha, beta and RC
-
-### Fixes
-
-- fix when PhoneStateListener is not ready for use ([#387](https://github.com/getsentry/sentry-android/pull/387)) @marandaneto
-- make ANR 5s by default ([#388](https://github.com/getsentry/sentry-android/pull/388)) @marandaneto
-- rate limiting by categories ([#381](https://github.com/getsentry/sentry-android/pull/381)) @marandaneto
-- Bump NDK to latest stable version 21.1.6352462 ([#386](https://github.com/getsentry/sentry-android/pull/386)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.0.3
-
-### Fixes
-
-- patch from 2.1.0-alpha.2 - avoid crash if NDK throws UnsatisfiedLinkError ([#344](https://github.com/getsentry/sentry-android/pull/344)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.0-RC.1
-
-### Features
-
-- Options for uncaught exception and make SentryOptions list Thread-Safe ([#384](https://github.com/getsentry/sentry-android/pull/384)) @marandaneto
-- Automatic breadcrumbs for app, activity and sessions lifecycles and system events ([#348](https://github.com/getsentry/sentry-android/pull/348)) @marandaneto
-- Make capture session and envelope internal ([#372](https://github.com/getsentry/sentry-android/pull/372)) @marandaneto
-
-### Fixes
-
-- If retry after header has empty categories, apply retry after to all of them ([#377](https://github.com/getsentry/sentry-android/pull/377)) @marandaneto
-- Discard events and envelopes if cached and retry after ([#378](https://github.com/getsentry/sentry-android/pull/378)) @marandaneto
-- Merge loadLibrary calls for sentry-native and clean up CMake files ([#373](https://github.com/getsentry/sentry-android/pull/373)) @Swatinem
-- Exceptions should be sorted oldest to newest ([#370](https://github.com/getsentry/sentry-android/pull/370)) @marandaneto
-- Check external storage size even if its read only ([#368](https://github.com/getsentry/sentry-android/pull/368)) @marandaneto
-- Wrong check for cellular network capability ([#369](https://github.com/getsentry/sentry-android/pull/369)) @marandaneto
-- add ScheduledForRemoval annotation to deprecated methods ([#375](https://github.com/getsentry/sentry-android/pull/375)) @marandaneto
-- Bump NDK to 21.0.6113669 ([#367](https://github.com/getsentry/sentry-android/pull/367)) @marandaneto
-- Bump AGP and add new make cmd to check for updates ([#365](https://github.com/getsentry/sentry-android/pull/365)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.0-beta.2
-
-### Fixes
-
-- Bump sentry-native to 0.2.4 ([#364](https://github.com/getsentry/sentry-android/pull/364)) @marandaneto
-- Update current session on session start after deleting previous session ([#362](https://github.com/getsentry/sentry-android/pull/362)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.0-beta.1
-
-### Fixes
-
-- Bump sentry-native to 0.2.3 ([#357](https://github.com/getsentry/sentry-android/pull/357)) @marandaneto
-- Check for androidx availability on runtime ([#356](https://github.com/getsentry/sentry-android/pull/356)) @marandaneto
-- If theres a left over session file and its crashed, we should not overwrite its state ([#354](https://github.com/getsentry/sentry-android/pull/354)) @marandaneto
-- Session should be exited state if state was ok ([#352](https://github.com/getsentry/sentry-android/pull/352)) @marandaneto
-- Envelope has dedicated endpoint ([#353](https://github.com/getsentry/sentry-android/pull/353)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.0-alpha.2
-
-### Fixes
-
-- Change integration order for cached outbox events ([#347](https://github.com/getsentry/sentry-android/pull/347)) @marandaneto
-- Avoid crash if NDK throws UnsatisfiedLinkError ([#344](https://github.com/getsentry/sentry-android/pull/344)) @marandaneto
-- Avoid getting a threadlocal twice. ([#339](https://github.com/getsentry/sentry-android/pull/339)) @metlos
-- Removing session tracking guard on hub and client ([#338](https://github.com/getsentry/sentry-android/pull/338)) @marandaneto
-- Bump agp to 3.6.2 ([#336](https://github.com/getsentry/sentry-android/pull/336)) @marandaneto
-- Fix racey ANR integration ([#332](https://github.com/getsentry/sentry-android/pull/332)) @marandaneto
-- Logging envelopes path when possible instead of nullable id ([#331](https://github.com/getsentry/sentry-android/pull/331)) @marandaneto
-- Renaming transport gate method ([#330](https://github.com/getsentry/sentry-android/pull/330)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.1.0-alpha.1
-
-Release of Sentry's new SDK for Android.
-
-## What’s Changed
-
-### Features
-
-- Release health @marandaneto @bruno-garcia
-- ANR report should have 'was active=yes' on the dashboard ([#299](https://github.com/getsentry/sentry-android/pull/299)) @marandaneto
-- NDK events apply scoped data ([#322](https://github.com/getsentry/sentry-android/pull/322)) @marandaneto
-- Add a StdoutTransport ([#310](https://github.com/getsentry/sentry-android/pull/310)) @mike-burns
-- Implementing new retry after protocol ([#306](https://github.com/getsentry/sentry-android/pull/306)) @marandaneto
-
-### Fixes
-
-- Bump sentry-native to 0.2.2 ([#305](https://github.com/getsentry/sentry-android/pull/305)) @Swatinem
-- Missing App's info ([#315](https://github.com/getsentry/sentry-android/pull/315)) @marandaneto
-- Buffered writers/readers - otimizations ([#311](https://github.com/getsentry/sentry-android/pull/311)) @marandaneto
-- Boot time should be UTC ([#309](https://github.com/getsentry/sentry-android/pull/309)) @marandaneto
-- Make transport result public ([#300](https://github.com/getsentry/sentry-android/pull/300)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.0.2
-
-Release of Sentry's new SDK for Android.
-
-### Features
-
-- MavenCentral support ([#284](https://github.com/getsentry/sentry-android/pull/284)) @marandaneto
-
-### Fixes
-
-- Bump AGP to 3.6.1 ([#285](https://github.com/getsentry/sentry-android/pull/285)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/sentry-android/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/) and [`mavenCentral`](https://repo.maven.apache.org/maven2/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.0.1
-
-Release of Sentry's new SDK for Android.
-
-## What’s Changed
-
-### Features
-
-- Attach threads/stacktraces ([#267](https://github.com/getsentry/sentry-android/pull/267)) @marandaneto
-- Add the default serverName to SentryOptions and use it in MainEventProcessor ([#279](https://github.com/getsentry/sentry-android/pull/279)) @metlos
-
-### Fixes
-
-- set current threadId when there's no mechanism set ([#277](https://github.com/getsentry/sentry-android/pull/277)) @marandaneto
-- Preview package manager ([#269](https://github.com/getsentry/sentry-android/pull/269)) @bruno-garcia
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.0.0
-
-Release of Sentry's new SDK for Android.
-
-New features not offered by (1.7.x):
-
-- NDK support
- - Captures crashes caused by native code
- - Access to the [`sentry-native` SDK](https://github.com/getsentry/sentry-native/) API by your native (C/C++/Rust code/..).
-- Automatic init (just add your `DSN` to the manifest)
- - Proguard rules are added automatically
- - Permission (Internet) is added automatically
-- Uncaught Exceptions might be captured even before the app restarts
-- Sentry's Unified API.
-- More context/device information
-- Packaged as `aar`
-- Frames from the app automatically marked as `InApp=true` (stack traces in Sentry highlights them by default).
-- Complete Sentry Protocol available.
-- All threads and their stack traces are captured.
-- Sample project in this repo to test many features (segfault, uncaught exception, ANR...)
-
-Features from the current SDK like `ANR` are also available (by default triggered after 4 seconds).
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback.
-
-## 2.0.0-rc04
-
-Release of Sentry's new SDK for Android.
-
-### Features
-
-- Take sampleRate from metadata ([#262](https://github.com/getsentry/sentry-android/pull/262)) @bruno-garcia
-- Support mills timestamp format ([#263](https://github.com/getsentry/sentry-android/pull/263)) @marandaneto
-- Adding logs to installed integrations ([#265](https://github.com/getsentry/sentry-android/pull/265)) @marandaneto
-
-### Fixes
-
-- Breacrumb.data to string,object, Add LOG level ([#264](https://github.com/getsentry/sentry-android/pull/264)) @HazAT
-- Read release conf. on manifest ([#266](https://github.com/getsentry/sentry-android/pull/266)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.30](https://github.com/getsentry/sentry-java/releases/tag/v1.7.30)
-
-## 2.0.0-rc03
-
-Release of Sentry's new SDK for Android.
-
-### Fixes
-
-- fixes ([#259](https://github.com/getsentry/sentry-android/issues/259)) - NPE check on getExternalFilesDirs items. ([#260](https://github.com/getsentry/sentry-android/pull/260)) @marandaneto
-- strictMode typo ([#258](https://github.com/getsentry/sentry-android/pull/258)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.30](https://github.com/getsentry/sentry-java/releases/tag/v1.7.30)
-
-## 2.0.0-rc02
-
-Release of Sentry's new SDK for Android.
-
-### Features
-
-- Hub mode configurable ([#247](https://github.com/getsentry/sentry-android/pull/247)) @bruno-garcia
-- Added remove methods (tags/extras) to the sentry static class ([#243](https://github.com/getsentry/sentry-android/pull/243)) @marandaneto
-
-### Fixes
-
-- Update ndk for new sentry-native version ([#235](https://github.com/getsentry/sentry-android/pull/235)) @Swatinem @marandaneto
-- Make integrations public ([#256](https://github.com/getsentry/sentry-android/pull/256)) @marandaneto
-- Bump build-tools ([#255](https://github.com/getsentry/sentry-android/pull/255)) @marandaneto
-- Added javadocs to scope and its dependencies ([#253](https://github.com/getsentry/sentry-android/pull/253)) @marandaneto
-- Build all ABIs ([#254](https://github.com/getsentry/sentry-android/pull/254)) @marandaneto
-- Moving back ANR timeout from long to int param. ([#252](https://github.com/getsentry/sentry-android/pull/252)) @marandaneto
-- Added HubAdapter to call Sentry static methods from Integrations ([#250](https://github.com/getsentry/sentry-android/pull/250)) @marandaneto
-- New Release format ([#242](https://github.com/getsentry/sentry-android/pull/242)) @marandaneto
-- Javadocs for SentryOptions ([#246](https://github.com/getsentry/sentry-android/pull/246)) @marandaneto
-- non-app is already inApp excluded by default. ([#244](https://github.com/getsentry/sentry-android/pull/244)) @marandaneto
-- Fix if symlink exists for sentry-native ([#241](https://github.com/getsentry/sentry-android/pull/241)) @marandaneto
-- Clone method - race condition free ([#226](https://github.com/getsentry/sentry-android/pull/226)) @marandaneto
-- Refactoring breadcrumbs callback ([#239](https://github.com/getsentry/sentry-android/pull/239)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.30](https://github.com/getsentry/sentry-java/releases/tag/v1.7.30)
-
-## 2.0.0-rc01
-
-Release of Sentry's new SDK for Android.
-
-## What’s Changed
-
-### Features
-
-- Added remove methods for Scope data ([#237](https://github.com/getsentry/sentry-android/pull/237)) @marandaneto
-- More device context (deviceId, connectionType and language) ([#229](https://github.com/getsentry/sentry-android/pull/229)) @marandaneto
-- Added a few java docs (Sentry, Hub and SentryClient) ([#223](https://github.com/getsentry/sentry-android/pull/223)) @marandaneto
-- Implemented diagnostic logger ([#218](https://github.com/getsentry/sentry-android/pull/218)) @marandaneto
-- Added event processors to scope ([#209](https://github.com/getsentry/sentry-android/pull/209)) @marandaneto
-- Added android transport gate ([#206](https://github.com/getsentry/sentry-android/pull/206)) @marandaneto
-- Added executor for caching values out of the main thread ([#201](https://github.com/getsentry/sentry-android/pull/201)) @marandaneto
-
-### Fixes
-
-- Honor RetryAfter ([#236](https://github.com/getsentry/sentry-android/pull/236)) @marandaneto
-- Add tests for SentryValues ([#238](https://github.com/getsentry/sentry-android/pull/238)) @philipphofmann
-- Do not set frames if there's none ([#234](https://github.com/getsentry/sentry-android/pull/234)) @marandaneto
-- Always call interrupt after InterruptedException ([#232](https://github.com/getsentry/sentry-android/pull/232)) @marandaneto
-- Mark as current thread if its the main thread ([#228](https://github.com/getsentry/sentry-android/pull/228)) @marandaneto
-- Fix lgtm alerts ([#219](https://github.com/getsentry/sentry-android/pull/219)) @marandaneto
-- Written unit tests to ANR integration ([#215](https://github.com/getsentry/sentry-android/pull/215)) @marandaneto
-- Added blog posts to README ([#214](https://github.com/getsentry/sentry-android/pull/214)) @marandaneto
-- Raise code coverage for Dsn to 100% ([#212](https://github.com/getsentry/sentry-android/pull/212)) @philipphofmann
-- Remove redundant times(1) for Mockito.verify ([#211](https://github.com/getsentry/sentry-android/pull/211)) @philipphofmann
-- Transport may be set on options ([#203](https://github.com/getsentry/sentry-android/pull/203)) @marandaneto
-- dist may be set on options ([#204](https://github.com/getsentry/sentry-android/pull/204)) @marandaneto
-- Throw an exception if DSN is not set ([#200](https://github.com/getsentry/sentry-android/pull/200)) @marandaneto
-- Migration guide markdown ([#197](https://github.com/getsentry/sentry-android/pull/197)) @marandaneto
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.29](https://github.com/getsentry/sentry-java/releases/tag/v1.7.29)
-
-## 2.0.0-beta02
-
-Release of Sentry's new SDK for Android.
-
-### Features
-
-- addBreadcrumb overloads ([#196](https://github.com/getsentry/sentry-android/pull/196)) and ([#198](https://github.com/getsentry/sentry-android/pull/198))
-
-### Fixes
-
-- fix Android bug on API 24 and 25 about getting current threads and stack traces ([#194](https://github.com/getsentry/sentry-android/pull/194))
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
-
-## 2.0.0-beta01
-
-Release of Sentry's new SDK for Android.
-
-### Fixes
-
-- ref: ANR doesn't set handled flag ([#186](https://github.com/getsentry/sentry-android/pull/186))
-- SDK final review ([#183](https://github.com/getsentry/sentry-android/pull/183))
-- ref: Drop errored in favor of crashed ([#187](https://github.com/getsentry/sentry-android/pull/187))
-- Workaround android_id ([#185](https://github.com/getsentry/sentry-android/pull/185))
-- Renamed sampleRate ([#191](https://github.com/getsentry/sentry-android/pull/191))
-- Making timestamp package-private or test-only ([#190](https://github.com/getsentry/sentry-android/pull/190))
-- Split event processor in Device/App data ([#180](https://github.com/getsentry/sentry-android/pull/180))
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
-
-## 2.0.0-alpha09
-
-Release of Sentry's new SDK for Android.
-
-### Features
-
-- Adding nativeBundle plugin ([#161](https://github.com/getsentry/sentry-android/pull/161))
-- Adding scope methods to sentry static class ([#179](https://github.com/getsentry/sentry-android/pull/179))
-
-### Fixes
-
-- fix: DSN parsing ([#165](https://github.com/getsentry/sentry-android/pull/165))
-- Don't avoid exception type minification ([#166](https://github.com/getsentry/sentry-android/pull/166))
-- make Gson retro compatible with older versions of AGP ([#177](https://github.com/getsentry/sentry-android/pull/177))
-- Bump sentry-native with message object instead of a string ([#172](https://github.com/getsentry/sentry-android/pull/172))
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
-
-## 2.0.0-alpha08
-
-Release of Sentry's new SDK for Android.
-
-### Fixes
-
-- DebugId endianness ([#162](https://github.com/getsentry/sentry-android/pull/162))
-- Executed beforeBreadcrumb also for scope ([#160](https://github.com/getsentry/sentry-android/pull/160))
-- Benefit of manifest merging when minSdk ([#159](https://github.com/getsentry/sentry-android/pull/159))
-- Add method to captureMessage with level ([#157](https://github.com/getsentry/sentry-android/pull/157))
-- Listing assets file on the wrong dir ([#156](https://github.com/getsentry/sentry-android/pull/156))
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
-
-## 2.0.0-alpha07
-
-Third release of Sentry's new SDK for Android.
-
-### Fixes
-
-- Fixed release for jcenter and bintray
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
-
-## 2.0.0-alpha06
-
-Second release of Sentry's new SDK for Android.
-
-### Fixes
-
-- Fixed a typo on pom generation.
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
-
-## 2.0.0-alpha05
-
-First release of Sentry's new SDK for Android.
-
-New features not offered by our current (1.7.x), stable SDK are:
-
-- NDK support
- - Captures crashes caused by native code
- - Access to the [`sentry-native` SDK](https://github.com/getsentry/sentry-native/) API by your native (C/C++/Rust code/..).
-- Automatic init (just add your `DSN` to the manifest)
- - Proguard rules are added automatically
- - Permission (Internet) is added automatically
-- Uncaught Exceptions might be captured even before the app restarts
-- Unified API which include scopes etc.
-- More context/device information
-- Packaged as `aar`
-- Frames from the app automatically marked as `InApp=true` (stack traces in Sentry highlights them by default).
-- Complete Sentry Protocol available.
-- All threads and their stack traces are captured.
-- Sample project in this repo to test many features (segfault, uncaught exception, scope)
-
-Features from the current SDK like `ANR` are also available (by default triggered after 4 seconds).
-
-Packages were released on [`bintray`](https://dl.bintray.com/getsentry/sentry-android/io/sentry/), [`jcenter`](https://jcenter.bintray.com/io/sentry/sentry-android/)
-
-We'd love to get feedback and we'll work in getting the GA `2.0.0` out soon.
-Until then, the [stable SDK offered by Sentry is at version 1.7.28](https://github.com/getsentry/sentry-java/releases/tag/v1.7.28)
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 00000000000..f030f7fad2b
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,371 @@
+Version 1.7.8
+-------------
+
+-
+
+Version 1.7.7
+-------------
+
+- Handle exceptions in `toString` calls when marshalling arbitrary objects to JSON.
+
+Version 1.7.6
+-------------
+
+*Built with the incorrect version of Java, please skip this release*
+
+Version 1.7.5
+-------------
+
+- Add `BreadcrumbBuilder.withData` (thanks kohenkatz)
+
+Version 1.7.4
+-------------
+
+- Allow new-style DSNs without the secret key.
+
+Version 1.7.3
+-------------
+
+- Handle Event `extra` deserialization failures when using Proguard. (thanks mcomella)
+- Fix support for JUL handler level. (thanks nsitbon)
+
+Version 1.7.2
+-------------
+
+- Set HTTPConnection read timeout to 5 seconds. (thanks kalaspuffar)
+
+Version 1.7.1
+-------------
+
+- Android Gradle Plugin: Improve various directory structure support. (thanks ruZZil)
+
+Version 1.7.0
+-------------
+
+- Warn (once) when a client lockdown is first initiated and why.
+- Log events skipped by a lockdown at the DEBUG level.
+- Don't log a full stacktrace when an HTTP 429 (Too Many Requests) is returned.
+- Fix parsing of Retry-After header which apparently changed to a floating point number.
+- Pass MDC context down to AsyncConnection worker threads.
+- Changed `buffer.size` default from 50 to 10.
+- When buffering is enabled, only retry sending events when the network is down or the project
+ is being throttled (HTTP 429).
+
+Version 1.6.8
+-------------
+
+- Create a noop sentry client when the user provides bad configuration. (thanks dmclain)
+- Use project.name instead of hardcoding 'app' in Android Gradle Plugin.
+
+Version 1.6.7
+-------------
+
+- Add Automatic-Module-Name to manifest so we have basic Java 9 support.
+- Print unhandled exceptions to stderr by default (like ThreadGroup does).
+
+Version 1.6.6
+-------------
+
+- Attempt to unregister async/buffer shutdown hooks when connection is closed. (thanks obourgain)
+
+Version 1.6.5
+-------------
+
+- Implemented Serializable for DebugImage, fixes buffering with Proguard symbols.
+- Use default DSN when empty string is provided. (thanks afking)
+
+Version 1.6.4
+-------------
+
+- Add web-fragment.xml to prevent classpath scanning.
+- Update Android Gradle plugin to use new NPM package if available.
+
+Version 1.6.3
+-------------
+
+- Fix issue where Gradle tasks were not created. (thanks szymanskip)
+
+Version 1.6.2
+-------------
+
+- Handle multi-APK projects with different version codes.
+
+Version 1.6.1
+-------------
+
+- Don't throw a ConnectionException if an event is filtered by the Sentry server (HTTP 403).
+
+Version 1.6.0
+-------------
+
+- Add transaction field to Event and EventBuilder.
+- Deprecate culprits in favor of transactions.
+- Culprit is no longer set automatically in logging integrations.
+
+Version 1.5.6
+-------------
+
+- Add ``in_app`` frame blacklist regex list to skip CGLIB generated classes in Spring.
+
+Version 1.5.5
+-------------
+
+- Fix crash on Android API < 16. (thanks Syhids)
+
+Version 1.5.4
+-------------
+
+- Change ``EventBuilder$HostnameCache`` timeout to only log at debug level.
+
+Version 1.5.3
+-------------
+
+- Cleanup SentryEnvironment state to avoid memory leak warnings on Tomcat.
+- Fix for buffering Events to disk that have null values in their extras map.
+
+Version 1.5.2
+-------------
+
+- Add ability to remove individual tags or extra data from the context, or clear them entirely.
+
+Version 1.5.1
+-------------
+
+- Don't attempt to serialize Iterables and don't special case serialization for Path objects, fixes broken Android release.
+
+Version 1.5.0
+-------------
+
+- Reduce logging noise if JNDI is missing.
+- Add OSGi support. (thanks markwoon)
+- Local variable agent beta.
+
+Version 1.4.0
+-------------
+
+- Automatically set ``stacktrace.app.packages`` on Android if it is not provided by the user.
+- Enable UncaughtExceptionHandler by default, add ``uncaught.handler.enabled`` option.
+- Add Spring exception reporter and Spring Boot servlet initializer.
+
+Version 1.3.1
+-------------
+
+- Reduce startup and shutdown logging noise by moving a lot of INFO level logs to DEBUG.
+- Android: fallback to `os.version` property for kernel version is `/proc/version` is unreadable.
+
+Version 1.3.0
+-------------
+
+- Deprecate ``extratags`` in favor of the more clear ``mdctags``.
+- Add ability to set ``extra`` data via options and on ``SentryClient`` instances.
+- Add ability to set ``extra`` data and ``tags`` in the current context.
+
+Version 1.2.2
+-------------
+
+- Make operations on Context threadsafe.
+
+Version 1.2.1
+-------------
+
+- Fix ``SentryStackTraceElement`` to implement ``Serializable``.
+
+Version 1.2.0
+-------------
+
+- Allow overriding the location of the properties file.
+- Add support for handling and uploading Proguard files to Sentry (for Android applications).
+- Cleanup thread local context in ``ThreadLocalContextManager`` after each servlet request finishes.
+- Change the ``EventBuilder`` hostname lookup code to only run one thread at a time.
+- Add ``ShouldSendEventCallback``, which can be added to each ``SentryClient`` instance.
+- Add ability to set extra data on the ``UserInterface``.
+
+Version 1.1.0
+-------------
+
+- Add ability to set the culprit from a SentryStackTraceElement.
+- (alpha) Add agent to collect local variable informatino when an exception occurs.
+
+Version 1.0.0
+-------------
+
+1.0.0 is a major refactor, please see the official documentation to see how configuration and usage
+has changed: https://docs.sentry.io/clients/java/
+
+- Move from ``com.getsentry.raven`` package to ``io.sentry``.
+- Rename from ``raven-java`` to ``sentry-java``.
+- Rename the ``Sentry`` class to ``SentryClient``.
+- Rename the ``SentryFactory`` class to ``SentryClientFactory``, and renamed all subclasses
+ to now end in ``ClientFactory``.
+- Remove ``Breadcrumbs`` class.
+- Add new ``Sentry`` class for static client initialization, access and usage.
+- Remove ``android.Sentry`` in favor of using the single static ``Sentry`` class everywhere.
+- Rename ``sentryFactory`` option to ``factory`` so that the environment variable configuration is
+ now ``SENTRY_FACTORY`` and the Java System Property is ``sentry.factory``.
+- Add ``dist`` field to Event.
+- Compressed JSON payloads are no longer base64 encoded.
+- Rename ``EventSendFailureCallback`` to ``EventSendCallback``, add ``onSuccess`` callback.
+- Add way to set release, dist, environment, serverName, tags, and extraTags on a ``SentryClient``.
+- Add way to set release, dist, environment, serverName, tags, and extraTags via the DSN.
+- Logging integrations now use the new ``Sentry`` static API.
+- Configuration can now be provided by a ``sentry.properties`` file provided in resources.
+
+raven-java changelog (before rename to sentry-java)
+===================================================
+
+Version 8.0.2
+-------------
+
+- Add user breadcrumb type. (thanks NLthijs48)
+- Add getter for underlying ``Event`` in ``EventBuilder`` so that helpers can read fields. (thanks anjo-swe)
+
+Version 8.0.1
+-------------
+
+- Fix setting the ``RavenFactory`` via Java System Properties or environment variables.
+- Fix message interface errors in log4j2 integration.
+
+Version 8.0.0
+-------------
+
+- Remove ``DefaultRavenFactory.getNotInAppFrames()`` blacklist in favor of a new whitelist method,
+ ``DefaultRavenFactory.getInAppFrames(Dsn dsn)``.
+- Add ``raven.stacktrace.app.packages`` DSN option for configuring your application's package prefixes.
+- Fix so that system properties and environment variables always override hardcoded logger configuration for settings
+ such as release, environment, etc.
+- Fix Raven initialization so that slf4j doesn't emit log replay warning on startup.
+- Changed ``Breadcrumb`` and `BreadcrumbBuilder`` to use enums for some fields.
+
+Version 7.8.6
+-------------
+
+- Automatically collect device information in ``contexts`` field on Android.
+- Updated Jackson, slf4j, log4j2 and logback dependencies.
+
+Version 7.8.5
+-------------
+
+- Add optional ``body`` field to HttpInterface.
+- Fix name of the lockdown logger.
+
+Version 7.8.4
+-------------
+
+- Add ``contexts`` field support to Events.
+- Add ``com.getsentry.raven.Raven.lockdown`` logger that can be disabled to ignore warning messages
+ on each attempted Event send when Raven is in lockdown mode.
+
+Version 7.8.3
+-------------
+
+- Add User to RavenContext and ContextBuilderHelper. (thanks mpecan)
+- Drop Events when the connection is locked down, users must enable buffering to attempt to resend later.
+- Respect the Sentry server's ``Retry-After`` header.
+
+Version 7.8.2
+-------------
+
+- Fix race condition, ensuring Raven initialization is synchronized in appenders. (thanks OutOfBrain)
+- Allow use of custom AndroidRavenFactory. (thanks kassim)
+- Add ``sdk`` field to payload, identify subprojects in SDK name.
+- Add ``raven.sample.rate`` DSN option to optionally reduce the number of events sent to the server.
+
+Version 7.8.1
+-------------
+
+- Make Breadcrumbs serializable.
+- Don't log errors in RavenServletRequestListener if Raven hasn't been initialized.
+
+Version 7.8.0
+-------------
+
+- Add Android support under the ``raven-android`` subproject.
+- Add Filters to drop all Raven logs before they go to the Sentry server.
+- Loosen permission on some Appender/Handler methods to allow for easier overriding. (thanks briprowe)
+
+Version 7.7.1
+-------------
+
+- Add ``raven.maxmessagelength`` DSN option. (thanks vektory79)
+- Add ``Buffer`` interface, used to store events that fail to be sent to the Sentry server.
+ Includes a DiskBuffer implementation and related ``raven.buffer.*`` options.
+- Broke out many helper methods inside of ``DefaultRavenFactory`` to allow for easier
+ overrides.
+- Add a way to retrieve the thread's last sent Event ID, if any. Useful for integrating
+ with the user feedback feature.
+- Add ``raven.async.queue.overflow`` option for controlling what to do when the async
+ executor queue is full. (thanks barogi)
+
+Version 7.7.0
+-------------
+
+- Add static ``Raven.capture`` methods that send to the most recently constructed Raven instance.
+- Add support for setting ``ravenFactory``, ``release``, ``environment`` and ``serverName``
+ via JNDI, System Environment or Java System Properties (like the DSN).
+- Send headers as an array of arrays, no longer wrapped in added apostrophes.
+
+Version 7.6.0
+-------------
+
+- Add ``environment`` property to events and appenders.
+
+Version 7.5.0
+-------------
+
+- Add support for configuring an HTTP proxy in the DSN.
+- Add more debugging information to ``RavenFactory.ravenInstance``.
+- Add ``formatted`` field to JSON payload if possible.
+
+Version 7.4.0
+-------------
+
+- Changed default ``raven.async.queuesize`` from unlimited to 50.
+- Add callback system for exceptions raised while attempting to send events.
+
+Version 7.3.0
+-------------
+
+- Add (manual) support for breadcrumbs to event objects.
+- Add ``sendEvent(EventBuilder)`` method which calls builder helpers before building and sending the ``Event``.
+- Add ``RavenContext`` which tracks thread-local state.
+- Add ``Breadcrumbs`` helper to log breadcrumbs from anywhere without manually passing context around.
+
+Version 7.2.3
+-------------
+
+- Accept ``Throwable`` instances as parameter to ``Raven.sendException``.
+- Add ``raven.async.shutdowntimeout`` option.
+- Remove default ``WARNING`` filter level for the Logback appender.
+
+Version 7.2.2
+-------------
+
+- Fix ServerName configuration in ``raven-log4j``.
+
+Version 7.2.1
+-------------
+
+- Drop dependency on Guava.
+
+Version 7.2.0
+-------------
+
+- Add printfStyle option to JUL integration. (thanks giilby)
+- Updated Log4j2 documentation to refer to the Thread Context rather than the MDC. (thanks grobmeier)
+- Fix duplicate ShutdownHook warnings in ``raven-log4j2``.
+- Add way to override how remote addresses are resolved (RemoteAddressResolver interface). (thanks j-fernandes)
+- Add way to set ``serverName`` statically in configuration. (thanks mattbillenstein)
+
+Version 7.1.0
+-------------
+
+- Use RavenFactory's class loader when creating the service loader, fixing some issues in containers. (thanks exell-christopher)
+- Add ``release`` property to ``raven-log4j``. (thanks molaschi)
+- Add ``release`` property to JUL integration and ``raven-log4j2``.
+- Add setters for ``dsn`` and ``tags`` in JUL integration, fixes integration with WildFly. (thanks giilby)
+
+
+Version 7.0.0
+-------------
+
+- Changed Maven groupId to ``com.getsentry``
diff --git a/CLAUDE.md b/CLAUDE.md
deleted file mode 100644
index 19507016af4..00000000000
--- a/CLAUDE.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# CLAUDE.md
-
-## STOP — Required Reading (Do This First)
-
-Before doing ANYTHING else (including answering questions), you MUST use the Read tool to load [AGENTS.md](AGENTS.md) and follow ALL of its instructions, including reading the required `.cursor/rules/*.mdc` files it references.
-Do NOT skip this step. Do NOT proceed without reading these files first.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7eb38413d64..bf76825124e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,70 +1,17 @@
# Contributing to sentry-java
We love pull requests from everyone.
-We suggest opening an issue to discuss bigger changes before investing on a big PR.
-# Requirements
+The test suite currently requires you run JDK version `1.7.0_80`.
+See [#487](https://github.com/getsentry/sentry-java/issues/478)
+for more information.
-The project requires you to run JDK 17.
-
-## Android
-
-This repository is a monorepo which includes Java and Android libraries.
-If you'd like to contribute to Java and don't have an Android SDK with NDK installed,
-you can remove the Android libraries from `settings.gradle.kts` to make sure you can build the project.
-
-# Git commit hook:
-
-Optionally, you can install spotlessCheck pre-commit hook:
-
-```shell
-git config core.hooksPath hooks/
-```
-
-To run the build and tests:
-
-```shell
-make compile
-```
-
-# Format
-
-To format the changed code and make CI happy you can run:
-
-```shell
-make format
-```
-
-or
-
-```shell
-./gradlew spotlessApply
-```
-
-# Binary compatibility validation
-
-To prevent breaking ABI changes and exposing things we should not, we make use of https://github.com/Kotlin/binary-compatibility-validator. If your change intended to introduce a new public method/property or modify the existing one you can overwrite the API declarations to make CI happy as follows (overwrites them from scratch):
+To run the tests (and checkstyle):
```shell
-make api
+make test
```
-or
-
-```shell
-./gradlew apiDump
-```
-
-However, if your change did not intend to modify the public API, consider changing the method/property visibility or removing the change altogether.
-
-# Linking issues
-
-If a PR should notify a linked issue after release, use a GitHub closing keyword in the PR
-description, such as `Fixes #123`, `Closes #123`, or `Resolves #123`. Release notification
-automation only comments on issues GitHub recognizes as closed by the released PR; mentioning an
-issue without a closing keyword is not enough.
-
-# CI
-
-Build and tests are automatically run against branches and pull requests
-via GH Actions.
+Tests are automatically run against branches and pull requests
+via TravisCI, so you can also depend on that if you'd rather not
+deal with installing an older JDK.
diff --git a/LICENSE b/LICENSE
index 6b8b8d58af0..02802804714 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,22 +1,13 @@
-MIT License
+Copyright (c) 2016 Functional Software, Inc.
+Copyright (c) 2012 Ken Cochrane and individual contributors.
+All rights reserved.
-Copyright (c) 2019 Sentry
-Copyright (c) 2015 Salomon BRYS for Android ANRWatchDog
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/MIGRATION.md b/MIGRATION.md
deleted file mode 100644
index 5513d143ddb..00000000000
--- a/MIGRATION.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# Migrating from `sentry-java` to `sentry-android`
-
-#### Docs
-
-Migration page from [sentry-android 1.x to sentry-android 2.x](https://docs.sentry.io/platforms/android/migrate).
-
-#### Installation
-
-_Old_:
-
-```
-Sentry.init("___PUBLIC_DSN___", new AndroidSentryClientFactory(context));
-```
-
-_New_:
-
-The SDK is able to initialize automatically. The only thing required is to make the DSN available.
-*`sentry.properties` has been discontinued and configurations on this SDK version is over `AndroidManifest.xml` or code.*
-
-```xml
-
-```
-_Or:_
-
-*If you want to call `SentryAndroid.init(...)` by yourself, first of all you need to disable the `auto-init` feature.*
-
-```xml
-
-```
-
-```
-SentryAndroid.init(context, options -> {
- options.setDsn("___PUBLIC_DSN___");
-});
-```
-
-#### Set tag
-
-_Old_:
-
-```
-Sentry.getContext().addTag("tagName", "tagValue");
-```
-
-_New_:
-
-```
-Sentry.setTag("tagName", "tagValue");
-```
-
-#### Capture custom exception
-
-_Old_:
-
-```
-try {
- int x = 1 / 0;
-} catch (Exception e) {
- Sentry.capture(e);
-}
-```
-
-_New_:
-
-```
-try {
- int x = 1 / 0;
-} catch (Exception e) {
- Sentry.captureException(e);
-}
-```
-
-#### Capture a custom event
-
-_Old_:
-
-```
-Exception exception = new Exception("custom error");
-EventBuilder eventBuilder = new EventBuilder()
- .withLevel(Event.Level.ERROR)
- .withSentryInterface(new ExceptionInterface(exception));
-Sentry.capture(eventBuilder);
-```
-
-_New_:
-
-```
-Exception exception = new Exception("custom error");
-SentryEvent event = new SentryEvent(exception);
-event.setLevel(SentryLevel.ERROR);
-Sentry.captureEvent(event);
-```
-
-#### Capture a message
-
-_Old_:
-
-```
-Sentry.capture("This is a test");
-```
-
-_New_:
-
-```
-Sentry.captureMessage("This is a test"); // SentryLevel.INFO by default
-Sentry.captureMessage("This is a test", SentryLevel.WARNING); // or specific level
-```
-
-#### Breadcrumbs
-
-_Old_:
-
-```
-Sentry.getContext().recordBreadcrumb(
- new BreadcrumbBuilder().setMessage("User made an action").build()
-);
-```
-
-_New_:
-
-```
-Sentry.addBreadcrumb("User made an action");
-```
-
-#### User
-
-_Old_:
-
-```
-Sentry.getContext().setUser(
- new UserBuilder().setEmail("hello@sentry.io").build()
-);
-```
-
-_New_:
-
-```
-User user = new User();
-user.setEmail("hello@sentry.io");
-Sentry.setUser(user);
-```
-
-#### Set extra
-
-_Old_:
-
-```
-Sentry.getContext().addExtra("extra", "thing");
-```
-
-_New_:
-
-```
-Sentry.setExtra("extra", "thing");
-```
diff --git a/Makefile b/Makefile
index c9eca8b8b7e..917e2905803 100644
--- a/Makefile
+++ b/Makefile
@@ -1,77 +1,60 @@
-.PHONY: all clean compile javadocs dryRelease update checkFormat api assembleBenchmarkTestRelease assembleUiTestRelease assembleUiTestCriticalRelease createCoverageReports runUiTestCritical setupPython systemTest systemTestInteractive check preMerge publish
+# Temporary: Required for macOS release
+# export GPG_TTY=`tty`
+# eval $(gpg-agent --daemon)
-all: stop clean javadocs compile createCoverageReports
-assembleBenchmarks: assembleBenchmarkTestRelease
-assembleUiTests: assembleUiTestRelease
-preMerge: check createCoverageReports
-publish: clean dryRelease
+# the test suite currently only works with 1.7.0_80
+# https://github.com/getsentry/sentry-java/issues/478
-# deep clean
-clean:
- ./gradlew clean --no-configuration-cache
- rm -rf distributions
- rm -rf .venv
+.PHONY: checkstyle compile test install clean prepare prepareMvn prepareChanges perform verify
+
+# TODO: Fix to work between macOS and Linux
+MVN=mvn -e -Dhttps.protocols=TLSv1.2
+ECHO=echo
+SED=sed
+
+all: checkstyle test install
-# build and run tests
compile:
- ./gradlew build
-
-javadocs:
- ./gradlew aggregateJavadocs
-
-# do a dry release (like a local deploy)
-dryRelease:
- ./gradlew aggregateJavadocs distZip --no-build-cache --no-configuration-cache
-
-# check for dependencies update
-update:
- ./gradlew dependencyUpdates -Drevision=release
-
-# Spotless check's code
-checkFormat:
- ./gradlew spotlessJavaCheck spotlessKotlinCheck
-
-# Binary compatibility validator
-api:
- ./gradlew apiDump
-
-# Assemble release and Android test apk of the uitest-android-benchmark module
-assembleBenchmarkTestRelease:
- ./gradlew :sentry-android-integration-tests:sentry-uitest-android-benchmark:assembleRelease :sentry-android-integration-tests:sentry-uitest-android-benchmark:assembleAndroidTest
-
-# Assemble release and Android test apk of the uitest-android module
-assembleUiTestRelease:
- ./gradlew :sentry-android-integration-tests:sentry-uitest-android:assembleRelease :sentry-android-integration-tests:sentry-uitest-android:assembleAndroidTest
-
-# Assemble release of the uitest-android-critical module
-assembleUiTestCriticalRelease:
- ./gradlew :sentry-android-integration-tests:sentry-uitest-android-critical:assembleRelease
-
-# Run Maestro tests for the uitest-android-critical module
-runUiTestCritical:
- ./scripts/test-ui-critical.sh
-
-# Create coverage reports
-# - Jacoco for Java & Android modules
-# - Kover for KMP modules e.g sentry-compose
-createCoverageReports:
- ./gradlew jacocoTestReport
- ./gradlew koverXmlReportRelease
-
-# Create the Python virtual environment for system tests, and install the necessary dependencies
-setupPython:
- @test -d .venv || python3 -m venv .venv
- .venv/bin/pip install --upgrade pip
- .venv/bin/pip install -r requirements.txt
-
-# Run system tests for sample applications
-systemTest: setupPython
- .venv/bin/python test/system-test-runner.py test --all
-
-# Run system tests with interactive module selection
-systemTestInteractive: setupPython
- .venv/bin/python test/system-test-runner.py test --interactive
-
-# Run tests and lint
-check:
- ./gradlew check
+ $(MVN) compile
+
+checkstyle:
+ $(MVN) checkstyle:check
+
+verify:
+ $(MVN) verify
+
+test: verify
+
+install:
+ $(MVN) source:jar install -Dcheckstyle.skip=true -DskipTests -Dmaven.javadoc.skip=true -B -V
+
+clean:
+ $(MVN) clean
+
+prepareMvn:
+# Prepare release (interactive)
+ $(MVN) release:prepare
+
+prepareChanges:
+# Store new project version
+ $(eval DEV_VERSION=$(shell mvn help:evaluate -Dexpression=project.version | grep -Ev '^\[' | $(SED) -e 's/-SNAPSHOT//'))
+ @echo Development version: $(DEV_VERSION)
+# Store enough dashes to go under "Version X.Y.Z", accounting for changes in the $VERSION length
+ $(eval DASHES=$(shell python -c 'print("-" * (8 + len("$(DEV_VERSION)")))'))
+# Add new Version section to the top of the CHANGES file
+ @echo Updating CHANGES file
+ $(ECHO) -e "Version $(DEV_VERSION)\n$(DASHES)\n\n-\n" > CHANGES.new && cat CHANGES >> CHANGES.new && mv CHANGES.new CHANGES
+ git add CHANGES
+ git commit -m "Bump CHANGES to $(DEV_VERSION)"
+
+change-version:
+ $(MVN) release:update-versions
+
+# Prepare is broken into stages because otherwise `make` will run things out of order
+prepare: prepareMvn prepareChanges
+
+perform:
+ $(MVN) release:perform
+
+rollback:
+ $(MVN) release:rollback
diff --git a/README.md b/README.md
index 9aaf7aca4d8..15a9246060b 100644
--- a/README.md
+++ b/README.md
@@ -1,133 +1,25 @@