diff options
Diffstat (limited to 'lib/gitlab/alert_management/payload.rb')
-rw-r--r-- | lib/gitlab/alert_management/payload.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/gitlab/alert_management/payload.rb b/lib/gitlab/alert_management/payload.rb new file mode 100644 index 00000000000..177d544d720 --- /dev/null +++ b/lib/gitlab/alert_management/payload.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Gitlab + module AlertManagement + module Payload + MONITORING_TOOLS = { + prometheus: 'Prometheus' + }.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] + def parse(project, payload, monitoring_tool: nil) + payload_class = payload_class_for( + monitoring_tool: monitoring_tool || payload&.dig('monitoring_tool'), + payload: payload + ) + + payload_class.new(project: project, payload: payload) + 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 |