summaryrefslogtreecommitdiff
path: root/app/models/deployment_metrics.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/deployment_metrics.rb')
-rw-r--r--app/models/deployment_metrics.rb61
1 files changed, 61 insertions, 0 deletions
diff --git a/app/models/deployment_metrics.rb b/app/models/deployment_metrics.rb
new file mode 100644
index 00000000000..cfe762ca25e
--- /dev/null
+++ b/app/models/deployment_metrics.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+class DeploymentMetrics
+ include Gitlab::Utils::StrongMemoize
+
+ attr_reader :project, :deployment
+
+ delegate :cluster, to: :deployment
+
+ def initialize(project, deployment)
+ @project = project
+ @deployment = deployment
+ end
+
+ def has_metrics?
+ deployment.success? && prometheus_adapter&.can_query?
+ end
+
+ def metrics
+ return {} unless has_metrics?
+
+ metrics = prometheus_adapter.query(:deployment, deployment)
+ metrics&.merge(deployment_time: deployment.finished_at.to_i) || {}
+ end
+
+ def additional_metrics
+ return {} unless has_metrics?
+
+ metrics = prometheus_adapter.query(:additional_metrics_deployment, deployment)
+ metrics&.merge(deployment_time: deployment.finished_at.to_i) || {}
+ end
+
+ private
+
+ def prometheus_adapter
+ strong_memoize(:prometheus_adapter) do
+ service = project.find_or_initialize_service('prometheus')
+
+ if service.can_query?
+ service
+ else
+ cluster_prometheus
+ end
+ end
+ end
+
+ # TODO remove fallback case to deployment_platform_cluster.
+ # Otherwise we will continue to pay the performance penalty described in
+ # https://gitlab.com/gitlab-org/gitlab-ce/issues/63475
+ #
+ # Removal issue: https://gitlab.com/gitlab-org/gitlab-ce/issues/64105
+ def cluster_prometheus
+ cluster_with_fallback = cluster || deployment_platform_cluster
+
+ cluster_with_fallback.application_prometheus if cluster_with_fallback&.application_prometheus_available?
+ end
+
+ def deployment_platform_cluster
+ deployment.environment.deployment_platform&.cluster
+ end
+end