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