Skip to content

Commit 89dc510

Browse files
adinauerclaude
authored andcommitted
docs(java): Document Data Collection controls (#19401)
Document the Java and Android Data Collection controls planned for SDK 8.57.0. This explains the new defaults, migration behavior from `sendDefaultPii`, built-in filtering, and configuration through code, properties, environment variables, Spring Boot, and Android manifest metadata. It also documents support across HTTP, GraphQL, Apollo, OkHttp, Ktor, OpenFeign, and File I/O integrations. Update onboarding examples to opt into Data Collection with `userInfo=false`, matching the privacy-conscious JavaScript setup without adding unnecessary body configuration. Update Logback setup to load SDK options from `sentry.properties` and document the scoped `includeUnencodedMessage` control. The documentation was checked against the cumulative sentry-java implementation rather than the original plan. `databaseQueryData` remains undocumented until a production integration consumes it. Related implementation: getsentry/sentry-java#5759 Refs getsentry/sentry-java#5666 --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 8e834c4 commit 89dc510

32 files changed

Lines changed: 541 additions & 275 deletions

File tree

‎docs/platforms/android/configuration/options.mdx‎

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ AndroidManifest.xml key: `io.sentry.additional-context`.
100100

101101
If this flag is enabled, certain personally identifiable information (PII) is added by active integrations.
102102

103+
This is a legacy flag. Use [`dataCollection`](#dataCollection) for granular control over automatically collected data.
104+
105+
For backwards compatibility, `sendDefaultPii` keeps its existing behavior when no Data Collection field is configured. As soon as you configure any `dataCollection` field, Data Collection becomes the source of truth for its categories and `sendDefaultPii` no longer controls them.
106+
103107
<Alert>
104108

105109
If you are using Sentry in your mobile app, read our [frequently asked questions about mobile data privacy](/security-legal-pii/security/mobile-privacy/) to assist with Apple App Store and Google Play app privacy details.
@@ -110,6 +114,110 @@ If you enable this option, be sure to manually remove what you don't want to sen
110114

111115
</SdkOption>
112116

117+
<SdkOption name="dataCollection" type="DataCollection" availableSince="8.58.0">
118+
119+
Controls which categories of data SDK integrations collect automatically. Data Collection applies only where an integration supports the category. It doesn't remove data you add explicitly through scopes, event processors, or callbacks such as `beforeSend`.
120+
121+
<Alert>
122+
123+
Call `options.getDataCollection().forceDataCollection()` or explicitly configure any field to enable Data Collection. All fields you don't configure use the defaults below, and the `sendDefaultPii` option is ignored.
124+
125+
</Alert>
126+
127+
| Field | Type | Default | Behavior |
128+
| ------------------------ | ---------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
129+
| `userInfo` | `boolean` | `true` | Allows integrations to populate user identity and IP address information. |
130+
| `cookies`\* | `KeyValueCollectionBehavior` | `DENY_LIST` | Collects cookies and filters sensitive values. |
131+
| `httpHeaders.request`\* | `KeyValueCollectionBehavior` | `DENY_LIST` | Collects request headers and filters sensitive values. |
132+
| `httpHeaders.response`\* | `KeyValueCollectionBehavior` | `DENY_LIST` | Collects response headers and filters sensitive values. |
133+
| `httpBodies` | `Set<HttpBodyType>` | all body types | Collects supported incoming and outgoing request and response bodies. An empty set disables body collection. |
134+
| `urlQueryParams`\* | `KeyValueCollectionBehavior` | `DENY_LIST` | Collects URL query parameters and filters sensitive values. |
135+
| `graphql.document` | `boolean` | `true` | Collects GraphQL documents. |
136+
| `graphql.variables` | `boolean` | `true` | Collects GraphQL variables. |
137+
| `filePaths` | `boolean` | `true` | Allows File I/O instrumentation to collect file names and absolute paths. File extensions and byte counts remain available when disabled. |
138+
139+
\* Fields marked with an asterisk take a single `KeyValueCollectionBehavior` value in code. Properties, environment variables, Spring Boot, and Android manifest metadata expose that value as separate `mode` and `terms` settings. `terms` contains additional matching terms for deny-list or allow-list behavior.
140+
141+
The marked fields support three modes:
142+
143+
- `OFF` (`KeyValueCollectionBehavior.off()`): Don't collect the category.
144+
- `DENY_LIST` (`KeyValueCollectionBehavior.denyList(...)`): Collect values except those matching the built-in sensitive list or additional configured terms. The no-argument constructor uses this mode without custom terms.
145+
- `ALLOW_LIST` (`KeyValueCollectionBehavior.allowList(...)`): Include plaintext values only for keys that match configured terms and don't match the built-in sensitive list. Sensitive values are always replaced with `"[Filtered]"`.
146+
147+
Matching is partial and case-insensitive. The built-in terms are `auth`, `token`, `secret`, `password`, `passwd`, `pwd`, `key`, `jwt`, `bearer`, `sso`, `saml`, `csrf`, `xsrf`, `credentials`, `session`, `sid`, and `identity`. Filtered values are replaced with `"[Filtered]"`. Custom deny-list terms extend the built-in list rather than replacing it.
148+
149+
When migrating from `sendDefaultPii=false`, configuring Data Collection causes supported integrations to send HTTP request and response headers by default. Review these headers for sensitive data and adjust `httpHeaders.request` and `httpHeaders.response` as needed.
150+
151+
The legacy header filtering also omitted sensitive headers such as `X-Forwarded-For`, `X-Real-IP`, and `Remote-Addr` in supported integrations. After you configure any Data Collection field, `sendDefaultPii` no longer controls these headers. Data Collection's default deny list filters credential and secret values but doesn't automatically match those identifying headers. To continue filtering them, add `forwarded`, `-ip`, `remote-`, `via`, and `-user` to a deny list. These terms also match keys such as `CF-Connecting-IP` and `X-User-Id`. Add them to `cookies`, `httpHeaders.request`, `httpHeaders.response`, or `urlQueryParams` as needed.
152+
153+
Configure Data Collection in `AndroidManifest.xml`:
154+
155+
```xml {filename:AndroidManifest.xml}
156+
<application>
157+
<meta-data
158+
android:name="io.sentry.data-collection.user-info"
159+
android:value="false" />
160+
<meta-data
161+
android:name="io.sentry.data-collection.http-bodies"
162+
android:value="outgoing_request,incoming_response" />
163+
<meta-data
164+
android:name="io.sentry.data-collection.http-headers.request.mode"
165+
android:value="deny_list" />
166+
<meta-data
167+
android:name="io.sentry.data-collection.http-headers.request.terms"
168+
android:value="forwarded,-ip,remote-,via,-user" />
169+
<meta-data
170+
android:name="io.sentry.data-collection.url-query-params.mode"
171+
android:value="off" />
172+
<meta-data
173+
android:name="io.sentry.data-collection.file-paths"
174+
android:value="false" />
175+
</application>
176+
```
177+
178+
Supported manifest keys are:
179+
180+
- `io.sentry.data-collection.user-info`
181+
- `io.sentry.data-collection.http-bodies`
182+
- `io.sentry.data-collection.cookies.mode` and `.terms`
183+
- `io.sentry.data-collection.http-headers.request.mode` and `.terms`
184+
- `io.sentry.data-collection.http-headers.response.mode` and `.terms`
185+
- `io.sentry.data-collection.url-query-params.mode` and `.terms`
186+
- `io.sentry.data-collection.graphql.document`
187+
- `io.sentry.data-collection.graphql.variables`
188+
- `io.sentry.data-collection.file-paths`
189+
190+
For manual initialization, use the same Java API as the Java SDK:
191+
192+
```kotlin
193+
import io.sentry.KeyValueCollectionBehavior
194+
import io.sentry.android.core.SentryAndroid
195+
196+
SentryAndroid.init(this) { options ->
197+
options.dataCollection.userInfo = false
198+
options.dataCollection.filePaths = false
199+
options.dataCollection.urlQueryParams = KeyValueCollectionBehavior.off()
200+
options.dataCollection.httpHeaders.request =
201+
KeyValueCollectionBehavior.denyList("forwarded", "-ip", "remote-", "via", "-user")
202+
}
203+
```
204+
205+
### Migrating From `sendDefaultPii`
206+
207+
Data Collection preserves existing applications until you opt in:
208+
209+
| Configuration | Result |
210+
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
211+
| No Data Collection fields | Existing `sendDefaultPii` behavior is preserved. |
212+
| `forceDataCollection()` | All Data Collection categories use the defaults above. |
213+
| Any Data Collection field | That field uses its configured value, omitted fields use the defaults above, and `sendDefaultPii` is ignored for Data Collection categories. |
214+
215+
If you previously used `sendDefaultPii=false`, either leave Data Collection unset to preserve that behavior or explicitly disable every category you don't want collected. If you used `sendDefaultPii=true`, call `options.getDataCollection().forceDataCollection()` to opt into the new filtered defaults.
216+
217+
Data Collection doesn't control Session Replay. Configure Replay's URL, header, and body collection separately in the <PlatformLink to="/session-replay/configuration/">Session Replay options</PlatformLink>.
218+
219+
</SdkOption>
220+
113221
<SdkOption name="autoSessionTracking" type="bool" defaultValue="true">
114222

115223
When set to `true`, the SDK will send session events to Sentry. This is supported in all browser SDKs, emitting one session per pageload and page navigation to Sentry. In mobile SDKs, when the app goes to the background for longer than 30 seconds, sessions are ended.

‎docs/platforms/android/data-management/data-collected.mdx‎

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,45 +6,47 @@ sidebar_order: 1
66

77
Sentry takes data privacy very seriously and has default settings in place that prioritize data safety, especially when it comes to personally identifiable information (PII) data. When you add the Sentry SDK to your application, you allow it to collect data and send it to Sentry during the runtime of your application.
88

9-
The category types and amount of data collected vary, depending on the integrations you've enabled in the Sentry SDK. This page lists data categories that the Sentry Android SDK collects.
9+
The category types and amount of data collected vary, depending on the integrations you've enabled in the Sentry SDK. This page lists data categories that the Sentry Android SDK collects. Use <PlatformLink to="/configuration/options/#dataCollection"><PlatformIdentifier name="data-collection" /></PlatformLink> to control automatic collection for supported categories.
1010

11-
Many of the categories listed here require you to enable the <PlatformLink to="/configuration/options/#sendDefaultPii">sendDefaultPii option</PlatformLink>.
11+
After you configure any Data Collection field or call `options.getDataCollection().forceDataCollection()`, unconfigured fields use their documented defaults.
12+
13+
Data Collection controls only data added automatically by SDK integrations. Data you add through scopes, event processors, `beforeSend`, or other APIs is still sent.
1214

1315
## HTTP Headers
1416

15-
By default, the Sentry SDK doesn't send any headers for outgoing HTTP requests. Even when sending HTTP headers is enabled, we have a [denylist](https://github.com/getsentry/sentry-java/blob/main/sentry/src/main/java/io/sentry/util/HttpUtils.java#L21-L34) in place, which filters out any headers that contain sensitive data.
17+
Request and response headers use `DENY_LIST` by default. Supported integrations collect header names and non-sensitive values while replacing sensitive values with `"[Filtered]"`.
1618

17-
To start sending HTTP headers, set <PlatformLink to="/configuration/options/#sendDefaultPii">`sendDefaultPii=true`</PlatformLink>. Outside of the `sendDefaultPii` flag, you can opt to have specific headers captured in recorded user sessions. See the [Session Replay network detail options](/platforms/android/session-replay/configuration/) for more details.
19+
Configure <PlatformLink to="/configuration/options/#dataCollection">`dataCollection.httpHeaders.request`</PlatformLink> and <PlatformLink to="/configuration/options/#dataCollection">`dataCollection.httpHeaders.response`</PlatformLink> to control header collection. `Cookie` and `Set-Cookie` values in the general HTTP header map are always replaced with `"[Filtered]"`; use `dataCollection.cookies` to control separately collected cookie data. OkHttp, Ktor Client, and Apollo 3 and 4 can attach available request and response headers to captured HTTP client errors.
1820

19-
## Cookies
21+
Session Replay network details use [separate options](/platforms/android/session-replay/configuration/).
2022

21-
By default, the Sentry SDK doesn't send cookies. Sentry tries to remove any cookies that contain sensitive information, such as the Session ID and CSRF Token cookies.
23+
## Cookies
2224

23-
If you want to send cookies, set <PlatformLink to="/configuration/options/#send-default-pii">`sendDefaultPii=true`</PlatformLink>.
25+
Cookies use `DENY_LIST` by default. Supported integrations collect cookies while replacing sensitive values with `"[Filtered]"`. Use `dataCollection.cookies` to control cookie collection.
2426

2527
## Information About Logged-in User
2628

27-
By default, the Sentry SDK doesn't send any information about the logged-in user, such as email address, user ID, or username. Even if enabled, the type of logged-in user information you'll be able to send depends on the integrations you enable in Sentry's SDK. Most integrations won't send any user information. Some will only set the user ID, but there are a few that will set the user ID, username, and email address.
29+
The SDK assigns a random installation ID when an event has no user ID. This ID is generated once per app installation and isn't controlled by Data Collection.
2830

29-
To start sending logged-in user information, set <PlatformLink to="/configuration/options/#send-default-pii">`sendDefaultPii=true`</PlatformLink>.
31+
`dataCollection.userInfo` allows integrations to populate other user identity information automatically. It defaults to `true`. Set it to `false` to disable automatic user enrichment. User information you set explicitly with `Sentry.setUser()` or on a scope isn't removed.
3032

3133
## Users' IP Addresses
3234

33-
By default, the Sentry SDK doesn't send the user's IP address. Once enabled, the Sentry backend services will infer the user ip address based on the incoming request, unless certain integrations you can enable override this behavior.
34-
35-
To enable sending the user's IP address, set <PlatformLink to="/configuration/options/#send-default-pii">`sendDefaultPii=true`</PlatformLink>.
35+
When `dataCollection.userInfo` is `true`, the SDK adds `"{{auto}}"` as the user's IP address so Sentry can infer it from the connection. Set `dataCollection.userInfo=false` to disable automatic IP enrichment.
3636

3737
## Request URL
3838

39-
The full request URL of outgoing and incoming HTTP requests is **always sent to Sentry**. Depending on your application, this could contain PII data.
39+
The request URL (without the query string) of outgoing and incoming HTTP requests is **always sent to Sentry**. Depending on your application, this could contain PII data.
4040

4141
## Request Query String
4242

43-
The full request query string of outgoing and incoming HTTP requests is **always sent to Sentry**. Depending on your application, this could contain PII data.
43+
Query parameters use `DENY_LIST` by default. Use `dataCollection.urlQueryParams` to filter or disable query string collection for instrumented request URLs.
4444

4545
## Request and Response Bodies
4646

47-
By default, no request or response bodies are sent to Sentry from the Android SDK. If you want to collect request or response bodies in recorded user sessions, see the Session Replay [network detail configuration docs](/platforms/android/session-replay/configuration/).
47+
All request and response body directions are enabled by default, but integrations collect bodies only where supported. Some integrations collect body content, while others collect only body sizes.
48+
49+
Use `dataCollection.httpBodies` to choose which directions to collect or an empty set to disable body collection. Session Replay network body collection uses [separate options](/platforms/android/session-replay/configuration/).
4850

4951
## Source Context
5052

@@ -54,20 +56,26 @@ To opt into sending this source context to Sentry, you have to enable the featur
5456

5557
## File I/O
5658

57-
By default the Sentry SDK does not send the name or path of files when instrumenting File I/O.
59+
File I/O instrumentation collects file names and absolute paths by default. Set `dataCollection.filePaths=false` to omit them. File extensions and byte counts remain available when paths are disabled.
60+
61+
## Device Context
5862

59-
If you want to send file names and paths, set <PlatformLink to="/configuration/options/#send-default-pii">`sendDefaultPii=true`</PlatformLink>.
63+
The SDK automatically collects device and operating-system context, including the manufacturer, model, architecture, orientation, display details, boot time, timezone, memory size, and emulator status.
6064

61-
## Device Information
65+
Set <PlatformLink to="/configuration/options/#collectAdditionalContext">`collectAdditionalContext=false`</PlatformLink> to reduce additional dynamic context such as battery level, available memory, storage state, and connectivity.
6266

63-
By default the Sentry SDK does not send the name of the device (Android phone).
67+
## GraphQL Data
6468

65-
If you want to send the device name, set <PlatformLink to="/configuration/options/#send-default-pii">`sendDefaultPii=true`</PlatformLink>.
69+
GraphQL document and variable collection default to `true`. Use `dataCollection.graphql.document` and `dataCollection.graphql.variables` to disable either category. Operation metadata used for tracing and grouping can still be collected when document or variable content is disabled.
6670

6771
## SQL Queries
6872

6973
While SQL queries are sent to Sentry, neither the full SQL query (`UPDATE app_user SET password='supersecret' WHERE id=1;`), nor the values of its parameters will ever be sent. A parameterized version of the query (`UPDATE app_user SET password=? WHERE id=?;`) is sent instead.
7074

75+
## Logs
76+
77+
Log messages, parameters, and breadcrumb content may contain application data. Data Collection doesn't filter this content. Use `beforeBreadcrumb` for breadcrumbs, `beforeSend` for events, or `options.getLogs().setBeforeSend(...)` for Sentry Logs when you need application-specific filtering.
78+
7179
## Session Replay
7280

7381
By default, our Session Replay SDK masks all text content, images, webviews, and user input. This helps ensure that no sensitive data is exposed. You can find <PlatformLink to="/session-replay/privacy/">more details in the Session Replay documentation</PlatformLink>.

0 commit comments

Comments
 (0)