Querying deployment count from GraphQL times out on analytics dashboards
There are intermittent timeouts when querying deployment frequency from GraphQL.
Sample query:
query {
group(fullPath: "gitlab-org") {
flowMetrics {
deploymentCount(from: "2025-01-01", to: "2025-01-30") {
unit
value
}
}
}
}Logs of failures
Relevant backtrace snippet
"ee/app/graphql/ee/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb:25:in `count'",
"app/graphql/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb:9:in `resolve'",
"graphql (2.5.11) lib/graphql/schema/resolver.rb:118:in `public_send'",
"graphql (2.5.11) lib/graphql/schema/resolver.rb:118:in `call_resolve'",
"graphql (2.5.11) lib/graphql/schema/resolver.rb:105:in `block (3 levels) in resolve_with_support'",
"graphql (2.5.11) lib/graphql/schema.rb:1647:in `after_lazy'",
"graphql (2.5.11) lib/graphql/query.rb:30:in `after_lazy'",Root cause
The query load is proportional to how many environments are present in a group hierarchy. The timeout happens when we filter by production environments when fetching records from daily_dora_metrics table.
Suggested fix
We only create records on daily_dora_metrics for production environments at the aggregation service, which makes this filter redundant.
- Remove the filter by production env
- Use
all_project_idsscope when filtering by projects
--- a/ee/app/graphql/ee/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb
+++ b/ee/app/graphql/ee/resolvers/analytics/cycle_analytics/deployment_count_resolver.rb
@@ -14,13 +14,11 @@ def count(args)
# Only licensed customers can get the aggregated DORA data (premium, ultimate)
return super unless ::Gitlab::Analytics::CycleAnalytics.licensed?(object)
- projects_query = object.is_a?(Group) ? object.all_projects : object.project
+ projects_query = object.is_a?(Group) ? object.all_project_ids : object.project
projects_query = projects_query.id_in(args[:project_ids]) if args[:project_ids]
- environments = ::Environment.for_project(projects_query).for_tier(:production)
-
::Dora::DailyMetrics
- .for_environments(environments)
+ .for_projects(projects_query) #Introduce this new scope
.in_range_of(args[:from].to_date, args[:to].to_date)
.sum(:deployment_frequency)
endEdited by 🤖 GitLab Bot 🤖