61 lines
1.6 KiB
Ruby
61 lines
1.6 KiB
Ruby
# 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
|