What's Changed
Features
- Flags: Add retained first-flags client events with per-registration cancellation. See #3269
- Add experimental client-side APM stats, enabled with
Trace.Configuration.featureFlags[.clientSideStats], or withclient_side_statsinDDTraceConfiguration.featureFlagsfrom Objective-C. The SDK aggregates request counts, error counts and latency distributions on-device from eligible finished spans, independently of trace upload sampling. Disabled by default. See #3301
Fixes
- Stop attributing crashes to a RUM session stopped with
stopSession(). Before, with background events tracking enabled, a crash in the background after the stop was reported into the stopped session. See #3321 - Stop reporting slow frames and slow rendering for RUM views on macOS and watchOS, where rendering is not measured yet. See #3319
- Prevent crashes when recording certain SwiftUI views with Session Replay's
compositionTreeRecordingfeature on iOS 17 and earlier. See #3330 - Start the
DatadogFlagsassignments request without waiting for the initial cache read, and report successful assignments before cache persistence. See #3078 - NSPrivacyAccessedAPICategoryFileTimestamp added to DatadogCore's privacy manifest as required. See #3339
- Attribute a TTFD vital reported before the TTID is written to the view and connectivity active when
reportAppFullyDisplayed()was called, instead of the TTID's view. See #3317. (Thanks @thedavidharris) - Fix profile sample timestamps after device sleep and stop attaching app hangs and long tasks that the profile did not sample. See #3342
Improvements
- Track RUM events and crashes on macOS when no view is active, for example after the last window closes or in a menu bar app. See #3351
- Add support for
unrealsource for cross-platform RUM events from Unreal Engine applications. See #3353 - Overlapping
FlagsClient.setEvaluationContextcalls no longer let an earlier result replace assignments for a newer context. Earlier calls still complete, and listeners skip state notifications superseded before delivery. Fetch-result completions run on a global utility queue. See #3078 - Keep capturing HTTP headers that fit after one exceeds the 2 KB limit. See #3332
- Reduce image resource sizes with WebP encoding and speed up image hashing in Session Replay's experimental composition tree recorder. See #3336
Full Changelog: 3.20.0...3.21.0