Fix negative Lead Time for Changes calculation in Dora::DailyMetrics::RefreshWorker

Description:

Problem

During investigation of Dora::DailyMetrics::RefreshWorker errors (issue #553333 (closed)), we discovered that deployments can be linked to merge requests where the deployment finishes before the MR is merged. This causes negative Lead Time for Changes (LtfC) values, which violate the database constraint dora_daily_metrics_lead_time_for_changes_in_seconds_positive.

Root Cause

The deployment linking process doesn't check if the merge request is merged - it links deployments to MRs regardless of merge state. This can happen when:

  • Deployment pipelines are triggered manually
  • Deployments occur before the associated MR is merged

Solution

Set LtfC to zero when deployment occurs before MR merge, as decided in the Optimize team weekly meeting.

Implementation Details: Modify the query in ee/app/models/dora/daily_metrics.rb (lines 62-76) to handle negative LtfC values:

  # Set LtfC to 0 when deployment happens before merge
  query.select(
    # ... other fields
    "GREATEST(0, EXTRACT(EPOCH FROM (deployments.finished_at - merge_request_metrics.merged_at))) as lead_time_for_changes_in_seconds"
  )
)
Edited by Amr Taha