summaryrefslogtreecommitdiff
path: root/lib/gitlab/prometheus/queries/additional_metrics_query.rb
blob: 001701383c354043edfbeca21ad4b4fb31e2449c (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
module Gitlab::Prometheus::Queries
  class AdditionalMetricsQuery < BaseQuery
    def self.metrics
      @metrics ||= YAML.load_file(Rails.root.join('config/custom_metrics.yml')).freeze
    end

    def query(environment_id)
      environment = Environment.find_by(id: environment_id)

      context = {
        environment_slug: environment.slug,
        environment_filter: %{container_name!="POD",environment="#{environment.slug}"}
      }

      timeframe_start = 8.hours.ago.to_f
      timeframe_end = Time.now.to_f

      matched_metrics.map do |group|
        group[:metrics].map! do |metric|
          metric[:queries].map! do |query|
            query = query.symbolize_keys
            query[:result] =
              if query.has_key?(:query_range)
                client_query_range(query[:query_range] % context, start: timeframe_start, stop: timeframe_end)
              else
                client_query(query[:query] % context, time: timeframe_end)
              end
            query
          end
          metric
        end
        group
      end
    end

    def process_query(group, query)
      result = if query.has_key?(:query_range)
                 client_query_range(query[:query_range] % context, start: timeframe_start, stop: timeframe_end)
               else
                 client_query(query[:query] % context, time: timeframe_end)
               end
      contains_metrics = result.all? do |item|
        item&.[](:values)&.any? || item&.[](:value)&.any?
      end
    end

    def process_result(query_result)
      contains_metrics = query_result.all? do |item|
        item&.[](:values)&.any? || item&.[](:value)&.any?
      end

      contains_metrics
    end

    def matched_metrics
      label_values = client_label_values || []

      result = Gitlab::Prometheus::MetricsSources.additional_metrics.map do |group|
        group[:metrics].map!(&:symbolize_keys)
        group[:metrics].select! do |metric|
          matcher = Regexp.compile(metric[:detect])
          label_values.any? &matcher.method(:match)
        end
        group
      end

      result.select {|group| !group[:metrics].empty?}
    end
  end
end