summaryrefslogtreecommitdiff
path: root/app/models/deployment_metrics.rb
blob: cfe762ca25e5327329abf50cc403e4d8913130b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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