diff --git a/app/serializers/analytics_stage_entity.rb b/app/serializers/analytics_stage_entity.rb new file mode 100644 index 0000000000000000000000000000000000000000..72a587c8c1d813506730ba323cfbe1c35849f32a --- /dev/null +++ b/app/serializers/analytics_stage_entity.rb @@ -0,0 +1,12 @@ +class AnalyticsStageEntity < Grape::Entity + include EntityDateHelper + + expose :stage, as: :title do |object| + object[:stage].to_s.capitalize + end + expose :description + + expose :median, as: :value do |stage| + stage[:median] && !stage[:median].zero? ? distance_of_time_in_words(stage[:median]) : nil + end +end diff --git a/app/serializers/analytics_stage_serializer.rb b/app/serializers/analytics_stage_serializer.rb new file mode 100644 index 0000000000000000000000000000000000000000..613cf6874d866750d4497ae0630797008779eece --- /dev/null +++ b/app/serializers/analytics_stage_serializer.rb @@ -0,0 +1,3 @@ +class AnalyticsStageSerializer < BaseSerializer + entity AnalyticsStageEntity +end diff --git a/lib/gitlab/cycle_analytics/base_stage.rb b/lib/gitlab/cycle_analytics/base_stage.rb index 70f1e1018c9a6867ab0758a2f58a45923ca60fbf..49d1e6304a91837894c5f65a8a155867c3e423a2 100644 --- a/lib/gitlab/cycle_analytics/base_stage.rb +++ b/lib/gitlab/cycle_analytics/base_stage.rb @@ -1,6 +1,8 @@ module Gitlab module CycleAnalytics class BaseStage + attr_reader :stage, :description + def initialize(project:, options:, stage: stage) @project = project @options = options diff --git a/lib/gitlab/cycle_analytics/code_stage.rb b/lib/gitlab/cycle_analytics/code_stage.rb index 9d28393ce53db5ed945d7da048571fbb39910c4b..f72989c9a7230a41f7ac34e228bbfb955a95426f 100644 --- a/lib/gitlab/cycle_analytics/code_stage.rb +++ b/lib/gitlab/cycle_analytics/code_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class CodeStage < BaseStage + def initialize(*args) + super(*args) + + @description = "Time until first merge request" + end + def median @fetcher.calculate_metric(:code, Issue::Metrics.arel_table[:first_mentioned_in_commit_at], diff --git a/lib/gitlab/cycle_analytics/issue_stage.rb b/lib/gitlab/cycle_analytics/issue_stage.rb index 6793cc77976211ca458e8cc7cc17e80f8b169fe9..a2ada238cd283ea164b458f3aa5ca939b903a263 100644 --- a/lib/gitlab/cycle_analytics/issue_stage.rb +++ b/lib/gitlab/cycle_analytics/issue_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class IssueStage < BaseStage + def initialize(*args) + super(*args) + + @description = "Time before an issue gets scheduled" + end + def median @fetcher.calculate_metric(:issue, Issue.arel_table[:created_at], diff --git a/lib/gitlab/cycle_analytics/plan_stage.rb b/lib/gitlab/cycle_analytics/plan_stage.rb index 772237087c09926679085806d011aea752042575..c836068c4ef8524deb1b99117756df062de68894 100644 --- a/lib/gitlab/cycle_analytics/plan_stage.rb +++ b/lib/gitlab/cycle_analytics/plan_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class PlanStage < BaseStage + def initialize(*args) + super(*args) + + @description = "Time before an issue starts implementation" + end + def median @fetcher.calculate_metric(:plan, [Issue::Metrics.arel_table[:first_associated_with_milestone_at], diff --git a/lib/gitlab/cycle_analytics/production_stage.rb b/lib/gitlab/cycle_analytics/production_stage.rb index 2fb087a8cac60a6faa5a1a66c7b334fdfca77d53..d46d37e1acc86cfe9d68df3464aa1df45a1e8612 100644 --- a/lib/gitlab/cycle_analytics/production_stage.rb +++ b/lib/gitlab/cycle_analytics/production_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class ProductionStage < BaseStage + def initialize(*args) + super(*args) + + @description = "From issue creation until deploy to production" + end + def median @fetcher.calculate_metric(:production, Issue.arel_table[:created_at], diff --git a/lib/gitlab/cycle_analytics/review_stage.rb b/lib/gitlab/cycle_analytics/review_stage.rb index ec9f07319e84ec84a2bb8ffb0777cb9ffbe3b489..4159ba5d70d5ad0bc9aeaa7bc909108f4a3fce0f 100644 --- a/lib/gitlab/cycle_analytics/review_stage.rb +++ b/lib/gitlab/cycle_analytics/review_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class ReviewStage < BaseStage + def initialize(*args) + super(*args) + + @description = "Time between merge request creation and merge/close" + end + def median @fetcher.calculate_metric(:review, MergeRequest.arel_table[:created_at], diff --git a/lib/gitlab/cycle_analytics/staging_stage.rb b/lib/gitlab/cycle_analytics/staging_stage.rb index 9c67a2aa6fe1c91697e5eb5ba349f445f7531873..cb4398f15ac2efefc3b7f367dba9a96b1dad5fc3 100644 --- a/lib/gitlab/cycle_analytics/staging_stage.rb +++ b/lib/gitlab/cycle_analytics/staging_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class StagingStage < BaseStage + def initialize(*args) + super(*args) + + @description = "From merge request merge until deploy to production" + end + def median @fetcher.calculate_metric(:staging, MergeRequest::Metrics.arel_table[:merged_at], diff --git a/lib/gitlab/cycle_analytics/test_stage.rb b/lib/gitlab/cycle_analytics/test_stage.rb index 6bedfdbba6127dd9b9b255e0b1919f80e6fdc72a..3ab93bebd878b4092b9c04e41506478b48e41e2b 100644 --- a/lib/gitlab/cycle_analytics/test_stage.rb +++ b/lib/gitlab/cycle_analytics/test_stage.rb @@ -1,6 +1,12 @@ module Gitlab module CycleAnalytics class TestStage < BaseStage + def initialize(*args) + super(*args) + + @description = "Total test time for all commits/merges" + end + def median @fetcher.calculate_metric(:test, MergeRequest::Metrics.arel_table[:latest_build_started_at],