Welcome to mirror list, hosted at ThFree Co, Russian Federation.

create_events_service.rb « alerts « prometheus « projects « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a29240947ffa08a2930a72b507a85c17588c0505 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# frozen_string_literal: true

module Projects
  module Prometheus
    module Alerts
      # Persists a series of Prometheus alert events as list of PrometheusAlertEvent.
      class CreateEventsService < BaseService
        def execute
          create_events_from(alerts)
        end

        private

        def create_events_from(alerts)
          Array.wrap(alerts).map { |alert| create_event(alert) }.compact
        end

        def create_event(payload)
          parsed_alert = Gitlab::Alerting::Alert.new(project: project, payload: payload)

          return unless parsed_alert.valid?

          if parsed_alert.gitlab_managed?
            create_managed_prometheus_alert_event(parsed_alert)
          else
            create_self_managed_prometheus_alert_event(parsed_alert)
          end
        end

        def alerts
          params['alerts']
        end

        def find_alert(metric)
          Projects::Prometheus::AlertsFinder
            .new(project: project, metric: metric)
            .execute
            .first
        end

        def create_managed_prometheus_alert_event(parsed_alert)
          alert = find_alert(parsed_alert.metric_id)
          payload_key = PrometheusAlertEvent.payload_key_for(parsed_alert.metric_id, parsed_alert.starts_at_raw)

          event = PrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, alert, payload_key)

          set_status(parsed_alert, event)
        end

        def create_self_managed_prometheus_alert_event(parsed_alert)
          payload_key = SelfManagedPrometheusAlertEvent.payload_key_for(parsed_alert.starts_at_raw, parsed_alert.title, parsed_alert.full_query)

          event = SelfManagedPrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, payload_key) do |event|
            event.environment      = parsed_alert.environment
            event.title            = parsed_alert.title
            event.query_expression = parsed_alert.full_query
          end

          set_status(parsed_alert, event)
        end

        def set_status(parsed_alert, event)
          persisted = case parsed_alert.status
                      when 'firing'
                        event.fire(parsed_alert.starts_at)
                      when 'resolved'
                        event.resolve(parsed_alert.ends_at)
                      end

          event if persisted
        end
      end
    end
  end
end