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"
)
)