Commit 55f4869a authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch 'zj-faster-charts-page' into 'master'

Improve performance for pipeline charts

Closes #32407

See merge request !12378
parents 5c8e8662 7ccc6322
...@@ -135,7 +135,12 @@ class Projects::PipelinesController < Projects::ApplicationController ...@@ -135,7 +135,12 @@ class Projects::PipelinesController < Projects::ApplicationController
@charts[:week] = Ci::Charts::WeekChart.new(project) @charts[:week] = Ci::Charts::WeekChart.new(project)
@charts[:month] = Ci::Charts::MonthChart.new(project) @charts[:month] = Ci::Charts::MonthChart.new(project)
@charts[:year] = Ci::Charts::YearChart.new(project) @charts[:year] = Ci::Charts::YearChart.new(project)
@charts[:build_times] = Ci::Charts::BuildTime.new(project) @charts[:pipeline_times] = Ci::Charts::PipelineTime.new(project)
@counts = {}
@counts[:total] = @project.pipelines.count(:all)
@counts[:success] = @project.pipelines.success.count(:all)
@counts[:failed] = @project.pipelines.failed.count(:all)
end end
private private
......
...@@ -17,13 +17,10 @@ module GraphHelper ...@@ -17,13 +17,10 @@ module GraphHelper
ids.zip(parent_spaces) ids.zip(parent_spaces)
end end
def success_ratio(success_builds, failed_builds) def success_ratio(counts)
failed_builds = failed_builds.count(:all) return 100 if counts[:failed].zero?
success_builds = success_builds.count(:all)
return 100 if failed_builds.zero? ratio = (counts[:success].to_f / (counts[:success] + counts[:failed])) * 100
ratio = (success_builds.to_f / (success_builds + failed_builds)) * 100
ratio.to_i ratio.to_i
end end
end end
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
.col-md-6 .col-md-6
= render 'projects/pipelines/charts/overall' = render 'projects/pipelines/charts/overall'
.col-md-6 .col-md-6
= render 'projects/pipelines/charts/build_times' = render 'projects/pipelines/charts/pipeline_times'
%hr %hr
= render 'projects/pipelines/charts/builds' = render 'projects/pipelines/charts/pipelines'
...@@ -2,18 +2,14 @@ ...@@ -2,18 +2,14 @@
%ul %ul
%li %li
Total: Total:
%strong= pluralize @project.builds.count(:all), 'job' %strong= pluralize @counts[:total], 'pipeline'
%li %li
Successful: Successful:
%strong= pluralize @project.builds.success.count(:all), 'job' %strong= pluralize @counts[:success], 'pipeline'
%li %li
Failed: Failed:
%strong= pluralize @project.builds.failed.count(:all), 'job' %strong= pluralize @counts[:failed], 'pipeline'
%li %li
Success ratio: Success ratio:
%strong %strong
#{success_ratio(@project.builds.success, @project.builds.failed)}% #{success_ratio(@counts)}%
%li
Commits covered:
%strong
= @project.pipelines.count(:all)
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
:javascript :javascript
var data = { var data = {
labels : #{@charts[:build_times].labels.to_json}, labels : #{@charts[:pipeline_times].labels.to_json},
datasets : [ datasets : [
{ {
fillColor : "rgba(220,220,220,0.5)", fillColor : "rgba(220,220,220,0.5)",
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
barStrokeWidth: 1, barStrokeWidth: 1,
barValueSpacing: 1, barValueSpacing: 1,
barDatasetSpacing: 1, barDatasetSpacing: 1,
data : #{@charts[:build_times].build_times.to_json} data : #{@charts[:pipeline_times].pipeline_times.to_json}
} }
] ]
} }
......
---
title: Improve performance of the pipeline charts page
merge_request: 12378
author:
...@@ -3,7 +3,7 @@ module Ci ...@@ -3,7 +3,7 @@ module Ci
module DailyInterval module DailyInterval
def grouped_count(query) def grouped_count(query)
query query
.group("DATE(#{Ci::Build.table_name}.created_at)") .group("DATE(#{Ci::Pipeline.table_name}.created_at)")
.count(:created_at) .count(:created_at)
.transform_keys { |date| date.strftime(@format) } .transform_keys { |date| date.strftime(@format) }
end end
...@@ -17,12 +17,12 @@ module Ci ...@@ -17,12 +17,12 @@ module Ci
def grouped_count(query) def grouped_count(query)
if Gitlab::Database.postgresql? if Gitlab::Database.postgresql?
query query
.group("to_char(#{Ci::Build.table_name}.created_at, '01 Month YYYY')") .group("to_char(#{Ci::Pipeline.table_name}.created_at, '01 Month YYYY')")
.count(:created_at) .count(:created_at)
.transform_keys(&:squish) .transform_keys(&:squish)
else else
query query
.group("DATE_FORMAT(#{Ci::Build.table_name}.created_at, '01 %M %Y')") .group("DATE_FORMAT(#{Ci::Pipeline.table_name}.created_at, '01 %M %Y')")
.count(:created_at) .count(:created_at)
end end
end end
...@@ -33,21 +33,21 @@ module Ci ...@@ -33,21 +33,21 @@ module Ci
end end
class Chart class Chart
attr_reader :labels, :total, :success, :project, :build_times attr_reader :labels, :total, :success, :project, :pipeline_times
def initialize(project) def initialize(project)
@labels = [] @labels = []
@total = [] @total = []
@success = [] @success = []
@build_times = [] @pipeline_times = []
@project = project @project = project
collect collect
end end
def collect def collect
query = project.builds query = project.pipelines
.where("? > #{Ci::Build.table_name}.created_at AND #{Ci::Build.table_name}.created_at > ?", @to, @from) .where("? > #{Ci::Pipeline.table_name}.created_at AND #{Ci::Pipeline.table_name}.created_at > ?", @to, @from)
totals_count = grouped_count(query) totals_count = grouped_count(query)
success_count = grouped_count(query.success) success_count = grouped_count(query.success)
...@@ -101,14 +101,14 @@ module Ci ...@@ -101,14 +101,14 @@ module Ci
end end
end end
class BuildTime < Chart class PipelineTime < Chart
def collect def collect
commits = project.pipelines.last(30) commits = project.pipelines.last(30)
commits.each do |commit| commits.each do |commit|
@labels << commit.short_sha @labels << commit.short_sha
duration = commit.duration || 0 duration = commit.duration || 0
@build_times << (duration / 60) @pipeline_times << (duration / 60)
end end
end end
end end
......
require 'spec_helper' require 'spec_helper'
describe Ci::Charts, lib: true do describe Ci::Charts, lib: true do
context "build_times" do context "pipeline_times" do
let(:project) { create(:empty_project) } let(:project) { create(:empty_project) }
let(:chart) { Ci::Charts::BuildTime.new(project) } let(:chart) { Ci::Charts::PipelineTime.new(project) }
subject { chart.build_times } subject { chart.pipeline_times }
before do before do
create(:ci_empty_pipeline, project: project, duration: 120) create(:ci_empty_pipeline, project: project, duration: 120)
end end
it 'returns build times in minutes' do it 'returns pipeline times in minutes' do
is_expected.to contain_exactly(2) is_expected.to contain_exactly(2)
end end
it 'handles nil build times' do it 'handles nil pipeline times' do
create(:ci_empty_pipeline, project: project, duration: nil) create(:ci_empty_pipeline, project: project, duration: nil)
is_expected.to contain_exactly(2, 0) is_expected.to contain_exactly(2, 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment