gitlab-org--gitlab-foss/lib/gitlab/alert_management/payload.rb

52 lines
1.6 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module AlertManagement
module Payload
MONITORING_TOOLS = {
prometheus: 'Prometheus',
cilium: 'Cilium'
}.freeze
class << self
# Instantiates an instance of a subclass of
# Gitlab::AlertManagement::Payload::Base. This can
# be used to create new alerts or read content from
# the payload of an existing AlertManagement::Alert
#
# @param project [Project]
# @param payload [Hash]
# @param monitoring_tool [String]
# @param integration [AlertManagement::HttpIntegration]
def parse(project, payload, monitoring_tool: nil, integration: nil)
payload_class = payload_class_for(
monitoring_tool: monitoring_tool || payload&.dig('monitoring_tool'),
payload: payload
)
payload_class.new(project: project, payload: payload, integration: integration)
end
private
def payload_class_for(monitoring_tool:, payload:)
if monitoring_tool == MONITORING_TOOLS[:prometheus]
if gitlab_managed_prometheus?(payload)
::Gitlab::AlertManagement::Payload::ManagedPrometheus
else
::Gitlab::AlertManagement::Payload::Prometheus
end
else
::Gitlab::AlertManagement::Payload::Generic
end
end
def gitlab_managed_prometheus?(payload)
payload&.dig('labels', 'gitlab_alert_id').present?
end
end
end
end
end
Gitlab::AlertManagement::Payload.prepend_mod_with('Gitlab::AlertManagement::Payload')