|
| 1 | +module Gitlab::Prometheus::Queries |
| 2 | + class MatchedMetricsQuery < BaseQuery |
| 3 | + MAX_QUERY_ITEMS = 40.freeze |
| 4 | + |
| 5 | + def self.metrics |
| 6 | + @metrics ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).map(&:deep_symbolize_keys) |
| 7 | + end |
| 8 | + |
| 9 | + def query |
| 10 | + groups_data.map do |group, data| |
| 11 | + { |
| 12 | + group: group.name, |
| 13 | + priority: group.priority, |
| 14 | + active_metrics: data[:active_metrics], |
| 15 | + metrics_missing_requirements: data[:metrics_missing_requirements] |
| 16 | + } |
| 17 | + end |
| 18 | + end |
| 19 | + |
| 20 | + def groups_data |
| 21 | + metrics_series = metrics_with_series(Gitlab::Prometheus::MetricGroup.all) |
| 22 | + lookup = active_series_lookup(metrics_series) |
| 23 | + |
| 24 | + groups = {} |
| 25 | + |
| 26 | + metrics_series.each do |metrics, series| |
| 27 | + groups[metrics.group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } |
| 28 | + group = groups[metrics.group] |
| 29 | + |
| 30 | + if series.all?(&lookup.method(:has_key?)) |
| 31 | + group[:active_metrics] += 1 |
| 32 | + else |
| 33 | + group[:metrics_missing_requirements] += 1 |
| 34 | + end |
| 35 | + group |
| 36 | + end |
| 37 | + |
| 38 | + groups |
| 39 | + end |
| 40 | + |
| 41 | + def active_series_lookup(metrics) |
| 42 | + timeframe_start = 8.hours.ago |
| 43 | + timeframe_end = Time.now |
| 44 | + |
| 45 | + series = metrics.flat_map { |metrics, series| series }.uniq |
| 46 | + |
| 47 | + lookup = series.each_slice(MAX_QUERY_ITEMS).flat_map do |batched_series| |
| 48 | + client_series(*batched_series, start: timeframe_start, stop: timeframe_end) |
| 49 | + .select(&method(:has_matching_label)) |
| 50 | + .map { |series_info| [series_info['__name__'], true] } |
| 51 | + end |
| 52 | + lookup.to_h |
| 53 | + end |
| 54 | + |
| 55 | + def has_matching_label(series_info) |
| 56 | + series_info.has_key?('environment') |
| 57 | + end |
| 58 | + |
| 59 | + def metrics_with_series(metric_groups) |
| 60 | + label_values = client_label_values || [] |
| 61 | + |
| 62 | + metrics = metric_groups.flat_map do |group| |
| 63 | + group.metrics.map do |metric| |
| 64 | + matcher = Regexp.compile(metric.detect) |
| 65 | + [metric, label_values.select(&matcher.method(:match))] |
| 66 | + end |
| 67 | + end |
| 68 | + |
| 69 | + metrics.select { |metric, labels| labels&.any? } |
| 70 | + end |
| 71 | + end |
| 72 | +end |
0 commit comments