From f1a7724d41fc72b287317560bbee517de0515c78 Mon Sep 17 00:00:00 2001 From: Rajendra Kadam <rkadam@gitlab.com> Date: Tue, 20 Feb 2024 14:09:25 +0000 Subject: [PATCH] Track catalog release service execution time --- .../ci/catalog/resources/release_service.rb | 20 +++++++++++++-- .../catalog/resources/release_service_spec.rb | 25 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/app/services/ci/catalog/resources/release_service.rb b/app/services/ci/catalog/resources/release_service.rb index ad77bff3ef94a..7721b27da9fb3 100644 --- a/app/services/ci/catalog/resources/release_service.rb +++ b/app/services/ci/catalog/resources/release_service.rb @@ -11,8 +11,10 @@ def initialize(release) end def execute - validate_catalog_resource - create_version + track_release_duration do + validate_catalog_resource + create_version + end if errors.empty? ServiceResponse.success @@ -25,6 +27,20 @@ def execute attr_reader :project, :errors, :release + def track_release_duration + name = :gitlab_ci_catalog_release_duration_seconds + comment = 'CI Catalog Release duration' + buckets = [0.01, 0.05, 0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 240.0] + + histogram = ::Gitlab::Metrics.histogram(name, comment, {}, buckets) + start_time = ::Gitlab::Metrics::System.monotonic_time + + yield + + duration = ::Gitlab::Metrics::System.monotonic_time - start_time + histogram.observe({}, duration.seconds) + end + def validate_catalog_resource response = Ci::Catalog::Resources::ValidateService.new(project, release.sha).execute return if response.success? diff --git a/spec/services/ci/catalog/resources/release_service_spec.rb b/spec/services/ci/catalog/resources/release_service_spec.rb index 790ec971e29c3..4ef09adb4c445 100644 --- a/spec/services/ci/catalog/resources/release_service_spec.rb +++ b/spec/services/ci/catalog/resources/release_service_spec.rb @@ -4,6 +4,31 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeline_composition do describe '#execute' do + context 'when executing release service' do + let(:histogram) { instance_double(Prometheus::Client::Histogram) } + + before do + allow(Gitlab::Metrics).to receive(:histogram).and_call_original + + allow(::Gitlab::Metrics).to receive(:histogram).with( + :gitlab_ci_catalog_release_duration_seconds, + 'CI Catalog Release duration', + {}, + [0.01, 0.05, 0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 240.0] + ).and_return(histogram) + allow(::Gitlab::Metrics::System).to receive(:monotonic_time).and_call_original + end + + it 'tracks release duration' do + project = create(:project, :catalog_resource_with_components) + release = create(:release, project: project, sha: project.repository.root_ref_sha) + + expect(histogram).to receive(:observe).with({}, an_instance_of(Float)) + + described_class.new(release).execute + end + end + context 'with a valid catalog resource and release' do it 'validates the catalog resource and creates a version' do project = create(:project, :catalog_resource_with_components) -- GitLab