query_additional_metrics.rb 2.8 KB
Newer Older
1 2
# frozen_string_literal: true

3 4 5 6
module Gitlab
  module Prometheus
    module Queries
      module QueryAdditionalMetrics
7
        def query_metrics(project, environment, query_context)
8 9 10 11 12 13 14
          matched_metrics(project).map(&query_group(query_context))
            .select(&method(:group_with_any_metrics))
        end

        protected

        def query_group(query_context)
15 16
          query_processor = method(:process_query).curry[query_context]

17
          lambda do |group|
18
            metrics = group.metrics.map do |metric|
T
Tiago Botelho 已提交
19
              metric_hsh = {
20 21 22 23 24
                title: metric.title,
                weight: metric.weight,
                y_label: metric.y_label,
                queries: metric.queries.map(&query_processor).select(&method(:query_with_result))
              }
T
Tiago Botelho 已提交
25 26 27 28

              metric_hsh[:id] = metric.id if metric.id

              metric_hsh
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
            end

            {
              group: group.name,
              priority: group.priority,
              metrics: metrics.select(&method(:metric_with_any_queries))
            }
          end
        end

        private

        def metric_with_any_queries(metric)
          metric[:queries]&.count&.> 0
        end

        def group_with_any_metrics(group)
          group[:metrics]&.count&.> 0
        end

        def query_with_result(query)
          query[:result]&.any? do |item|
51
            item&.[](:values)&.any? || item&.[](:value)&.any?
52 53 54 55
          end
        end

        def process_query(context, query)
56
          query = query.dup
57
          result =
58
            if query.key?(:query_range)
59 60
              query[:query_range] %= context
              client_query_range(query[:query_range], start: context[:timeframe_start], stop: context[:timeframe_end])
61
            else
62 63
              query[:query] %= context
              client_query(query[:query], time: context[:timeframe_end])
64
            end
65

66 67
          query[:result] = result&.map(&:deep_symbolize_keys)
          query
68 69 70 71 72 73
        end

        def available_metrics
          @available_metrics ||= client_label_values || []
        end

74 75
        def matched_metrics(project)
          result = Gitlab::Prometheus::MetricGroup.for_project(project).map do |group|
76 77 78 79 80 81 82 83
            group.metrics.select! do |metric|
              metric.required_metrics.all?(&available_metrics.method(:include?))
            end
            group
          end

          result.select { |group| group.metrics.any? }
        end
84

85
        def common_query_context(environment, timeframe_start:, timeframe_end:)
86 87
          base_query_context(timeframe_start, timeframe_end)
            .merge(QueryVariables.call(environment))
88 89 90 91 92 93
        end

        def base_query_context(timeframe_start, timeframe_end)
          {
            timeframe_start: timeframe_start,
            timeframe_end: timeframe_end
94 95
          }
        end
96 97 98 99
      end
    end
  end
end