Skip to content

Merge release/3.12.0 into master#3638

Merged
gh-worker-dd-mergequeue-cf854d[bot] merged 236 commits into
masterfrom
yl/merge-release-to-master
Jul 15, 2026
Merged

Merge release/3.12.0 into master#3638
gh-worker-dd-mergequeue-cf854d[bot] merged 236 commits into
masterfrom
yl/merge-release-to-master

Conversation

@ambushwork

Copy link
Copy Markdown
Member

What does this PR do?

Merge release/3.12.0 into master

Review checklist (to be filled by reviewers)

  • Feature or bugfix MUST have appropriate tests (unit, integration, e2e)
  • Make sure you discussed the feature or bugfix with the maintaining team in an Issue
  • Make sure each commit and the PR mention the Issue number (cf the CONTRIBUTING doc)

gonzalezreal and others added 30 commits February 25, 2026 10:50
…us-sample-rate-api

RUM-15189: Add setContinuousSampleRate API to ProfilingConfiguration
…-continuous-profiling-250326

Merge `develop` branch into `feature/continuous-profiling` branch
…aunch-duration

RUM-15190: Extend app launch profiling duration for continuous merge
…event-to-profiling

Send event to Profiling feature when RUM session is renewed
…us-profiling-scheduler

RUM-15191: Implement ContinuousProfilingScheduler
…inuous-profiling

RUM-15323: RUM sends ANR & LongTask events to Profiling Feature
…lback

RUM-15307: Report failure through ProfilerCallback
…e-profiling-rum-context

RUM-15334: Commonize ProfilingRumContext for TTID and Continuous Profiling
…ing-rum-event

RUM-15334: Add id to RumAnrEvent and RumLongTaskEvent
…filing-cycle

Fix continuous profiling back-to-back with app launch by inserting a cooldown window
…-to-scheduler

RUM-15321: Continuous profiling writes are gated on pending RUM events
…-continuous-profiling-030426

Merge `develop` branch into `feature/continuous-profiling`
…ndicator

RUM-15454: Add Profiler status in RUM debug widget
kikoveiga and others added 16 commits July 9, 2026 18:17
RUM-17216: Remove unused consts from LogsFeature
RUM-17182: Stablize MoveDataMigrationOperationTest under high CPU usage
…-hosts-patterns

RUM-16668: Add wildcard host pattern matching to first-party tracing
…nsole-validation-tokens

Revert "Add Play SDK console verification token to new modules"
Several Continuous Profiling minor bug fixes
RUM-16362: Fix interop wireframe positioning in Compose windows
@ambushwork ambushwork requested review from a team as code owners July 15, 2026 15:05
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.96058% with 248 lines in your changes missing coverage. Please review.
✅ Project coverage is 73.30%. Comparing base (560a4db) to head (d2cae63).

Files with missing lines Patch % Lines
...dog/android/profiling/internal/ProfilingFeature.kt 82.35% 7 Missing and 20 partials ⚠️
...datadog/android/profiling/internal/NoOpProfiler.kt 13.79% 25 Missing ⚠️
...atadog/android/internal/profiling/ProfilerEvent.kt 0.00% 22 Missing ⚠️
.../android/profiling/internal/ProfilingDataWriter.kt 86.96% 16 Missing and 5 partials ⚠️
...iling/internal/anr/AnrProfilingTriggerRegistrar.kt 77.78% 9 Missing and 7 partials ⚠️
...profiling/internal/ContinuousProfilingScheduler.kt 92.25% 8 Missing and 3 partials ⚠️
.../android/rum/internal/monitor/DatadogRumMonitor.kt 88.51% 7 Missing and 3 partials ⚠️
...oid/rum/internal/heatmaps/HeatmapActionResolver.kt 79.07% 7 Missing and 2 partials ⚠️
...roid/insights/internal/DefaultInsightsCollector.kt 0.00% 8 Missing ⚠️
...nsights/internal/overlay/DefaultInsightsOverlay.kt 0.00% 8 Missing ⚠️
... and 26 more
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #3638      +/-   ##
==========================================
+ Coverage   72.43%   73.30%   +0.87%     
==========================================
  Files         967      995      +28     
  Lines       35712    36258     +546     
  Branches     5972     6125     +153     
==========================================
+ Hits        25865    26576     +711     
+ Misses       8192     7971     -221     
- Partials     1655     1711      +56     
Files with missing lines Coverage Δ
...src/main/kotlin/com/datadog/android/DatadogSite.kt 100.00% <100.00%> (ø)
...kotlin/com/datadog/android/core/InternalSdkCore.kt 100.00% <ø> (ø)
...atadog/android/core/configuration/Configuration.kt 99.07% <100.00%> (-0.02%) ⬇️
...nal/net/DefaultFirstPartyHostHeaderTypeResolver.kt 97.50% <100.00%> (+19.24%) ⬆️
...sistence/file/advanced/ConsentAwareFileMigrator.kt 81.40% <100.00%> (-1.58%) ⬇️
...rsistence/file/advanced/FeatureFileOrchestrator.kt 100.00% <100.00%> (ø)
...stence/file/advanced/MoveDataMigrationOperation.kt 100.00% <100.00%> (ø)
...stence/file/advanced/WipeDataMigrationOperation.kt 100.00% <100.00%> (ø)
.../core/internal/time/DefaultAppStartTimeProvider.kt 100.00% <100.00%> (+5.00%) ⬆️
...ava/com/datadog/android/heatmaps/HeatmapViewKey.kt 100.00% <100.00%> (ø)
... and 97 more

... and 317 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d2cae63546

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// so their reads fail and their profiles are dropped as perfetto_unreadable.
// Deletion ownership needs to move to a single coordinator (read-once-and-fan-out
// bytes, or reference-count across instances) before multi-instance is supported.
safeDelete(profilingResult.resultFilePath)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve shared Perfetto files until all SDK instances read them

In apps that initialize more than one SDK instance, DdProfilingContentProvider starts a single Perfetto recording with all saved instance names, and PerfettoProfiler dispatches the same resultFilePath to each registered ProfilingFeature. With this delete in each writer, whichever instance writes first removes the file before the remaining instances can read it, so their profile uploads are dropped as unreadable. The deletion needs to be coordinated once per shared result rather than performed by every per-instance writer.

Useful? React with 👍 / 👎.

runnable = {
val cooldownMs = jitter(CONTINUOUS_COOLDOWN_DURATION_MS)
logToUser { LOG_ACTIVE_WINDOW_ENDED.format(Locale.US, cooldownMs) }
scheduleCooldown(cooldownMs)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clear active state when the profiling window ends

When a continuous profiling window reaches its scheduled duration, this callback moves the scheduler to cooldown but leaves isActive true until the Perfetto result callback arrives. During that callback delay, ProfilingFeature.isRecordingProfile() still accepts RUM long task/ANR/vital events, so events that happened after capture ended can be drained into the finished profile and corrupt its RUM metadata; clear the active flag at the active-window boundary before scheduling cooldown.

Useful? React with 👍 / 👎.

- docker buildx build --tag $CI_IMAGE_DOCKER -f ./ci/Dockerfile.gitlab --push .
- METADATA_FILE=$(mktemp)
- docker buildx build --tag $CI_IMAGE_DOCKER -f ./ci/Dockerfile.gitlab --push --metadata-file ${METADATA_FILE} .
- ddsign sign $CI_IMAGE_DOCKER --docker-metadata-file ${METADATA_FILE}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Run ddsign from an image that contains it

In the ci-image job, this command runs in 486234852809.dkr.ecr.us-east-1.amazonaws.com/docker:24.0.4-jammy, while the only ddsign installation added in this change is copied into ci/Dockerfile.gitlab, i.e. the image being built for later jobs rather than the runner image executing this script. Unless that external Docker image already ships ddsign, the manual image-publish job will push the image and then fail with ddsign: command not found; install or invoke ddsign in the job image itself.

Useful? React with 👍 / 👎.

val lastFatalAnrSent = sdkCore.lastFatalAnrSent
if (anrExitInfo.timestamp == lastFatalAnrSent) return@withWriteContext
if (lastFatalAnrSent != null &&
abs(anrExitInfo.timestamp - lastFatalAnrSent) <= FATAL_ANR_DEDUP_TOLERANCE_MS

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid deduping distinct fatal ANRs by timestamp tolerance

Because this check now suppresses any ApplicationExitInfo within 10 seconds of the persisted marker, a recoverable ANR that was reported in-process can hide a different fatal ANR that happens shortly afterward: RumViewScope now writes the same marker for successful non-fatal ANRExceptions, and the next launch returns here before reading or writing the fatal ANR trace. The dedupe should distinguish the same ANR from a later fatal one instead of treating every nearby timestamp as already reported.

Useful? React with 👍 / 👎.

if (hierarchyChanged) {
lastPublishedScreenName = context.viewUrl
lastPublishedEntries.clear()
lastPublishedEntries.putAll(context.entries)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Republish heatmap identifiers after RUM becomes available

When Session Replay starts before RUM and captures a snapshot before RUM registers, LazyHeatmapIdentifierRegistry.setHeatmapIdentifiers() is a no-op because there is no delegate yet. This line still records the snapshot as already published, so if the next traversals are identical after RUM registers, hierarchyChanged stays false and the real RUM registry never receives the identifiers; native tap heatmaps then miss permanent IDs until the view hierarchy changes. Avoid marking the snapshot as published unless the delegate accepted it, or buffer it for retry.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.