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

prometheus.rb « payload « alert_management « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e64fb52c0cfe6a246f288d37307d34a72bc7b97e (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# frozen_string_literal: true

module Gitlab
  module AlertManagement
    module Payload
      # Attribute mapping for alerts via prometheus alerting integration.
      class Prometheus < Base
        extend Gitlab::Utils::Override

        attribute :alert_markdown, paths: %w[annotations gitlab_incident_markdown]
        attribute :annotations, paths: 'annotations'
        attribute :description, paths: %w[annotations description]
        attribute :ends_at, paths: 'endsAt', type: :time
        attribute :environment_name, paths: %w[labels gitlab_environment_name]
        attribute :generator_url, paths: %w[generatorURL]
        attribute :gitlab_y_label,
                  paths: [%w[annotations gitlab_y_label],
                          %w[annotations title],
                          %w[annotations summary],
                          %w[labels alertname]]
        attribute :runbook, paths: %w[annotations runbook]
        attribute :starts_at,
                  paths: 'startsAt',
                  type: :time,
                  fallback: -> { Time.current.utc }
        attribute :status, paths: 'status'
        attribute :title,
                  paths: [%w[annotations title],
                          %w[annotations summary],
                          %w[labels alertname]]
        attribute :starts_at_raw,
                  paths: [%w[startsAt]]
        private :starts_at_raw

        attribute :severity_raw, paths: %w[labels severity]
        private :severity_raw

        METRIC_TIME_WINDOW = 30.minutes

        ADDITIONAL_SEVERITY_MAPPING = {
          's1' => :critical,
          's2' => :high,
          's3' => :medium,
          's4' => :low,
          's5' => :info,
          'p1' => :critical,
          'p2' => :high,
          'p3' => :medium,
          'p4' => :low,
          'p5' => :info,
          'debug' => :info,
          'information' => :info,
          'notice' => :info,
          'warn' => :low,
          'warning' => :low,
          'minor' => :low,
          'error' => :medium,
          'major' => :high,
          'emergency' => :critical,
          'fatal' => :critical,
          'alert' => :medium,
          'page' => :high
        }.freeze

        def monitoring_tool
          Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
        end

        # Parses `g0.expr` from `generatorURL`.
        #
        # Example: http://localhost:9090/graph?g0.expr=vector%281%29&g0.tab=1
        def full_query
          return unless generator_url

          uri = URI(generator_url)

          Rack::Utils.parse_query(uri.query).fetch('g0.expr')
        rescue URI::InvalidURIError, KeyError
        end

        def has_required_attributes?
          project && title && starts_at_raw
        end

        def source
          integration&.name || monitoring_tool
        end

        private

        override :severity_mapping
        def severity_mapping
          super.merge(ADDITIONAL_SEVERITY_MAPPING)
        end

        def plain_gitlab_fingerprint
          [starts_at_raw, title, full_query].join('/')
        end
      end
    end
  end
end

Gitlab::AlertManagement::Payload::Prometheus.prepend_mod