diff options
author | Pawel Chojnacki <pawel@chojnacki.ws> | 2017-05-31 20:36:07 +0300 |
---|---|---|
committer | Pawel Chojnacki <pawel@chojnacki.ws> | 2017-06-05 12:36:56 +0300 |
commit | e74896df0c7d0d88958a3d35b3144361cfdd0594 (patch) | |
tree | 2680ad5f449c9b58c2fec935d51216ddd20d2884 /lib/gitlab/prometheus | |
parent | 7e17d763ac2669dd4fe10075d8ba07eb7e119aea (diff) |
Matched Metrics tests
Diffstat (limited to 'lib/gitlab/prometheus')
-rw-r--r-- | lib/gitlab/prometheus/metric.rb | 21 | ||||
-rw-r--r-- | lib/gitlab/prometheus/metric_group.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/prometheus/queries/matched_metrics_query.rb | 49 |
3 files changed, 37 insertions, 35 deletions
diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb index 777cf030ceb..d7cd4237a7b 100644 --- a/lib/gitlab/prometheus/metric.rb +++ b/lib/gitlab/prometheus/metric.rb @@ -1,29 +1,24 @@ module Gitlab::Prometheus class Metric - attr_reader :group, :title, :detect, :weight, :y_label, :queries + attr_reader :group, :title, :required_metrics, :weight, :y_label, :queries - def initialize(group, title, detect, weight, y_label, queries = []) - @group = group + def initialize(title, required_metrics, weight, y_label, queries = []) @title = title - @detect = detect + @required_metrics = required_metrics @weight = weight @y_label = y_label || 'Values' @queries = queries end - def self.metric_from_entry(group, entry) - missing_fields = [:title, :detect, :weight, :queries].select { |key| !entry.has_key?(key) } + def self.metric_from_entry(entry) + missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.has_key?(key) } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? - Metric.new(group, entry[:title], entry[:detect], entry[:weight], entry[:y_label],entry[:queries]) + Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) end - def self.metrics_from_list(group, list) - list.map { |entry| metric_from_entry(group, entry) } - end - - def self.additional_metrics_raw - @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).map(&:deep_symbolize_keys) + def self.metrics_from_list(list) + list.map { |entry| metric_from_entry(entry) } end end end diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index 9f95525bc0c..0dcd9dc0f36 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -22,7 +22,7 @@ module Gitlab::Prometheus raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? group = MetricGroup.new(entry[:group], entry[:priority]) - group.metrics = Metric.metrics_from_list(group, entry[:metrics]) + group.metrics = Metric.metrics_from_list(entry[:metrics]) group end diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metrics_query.rb index 5a8b0f6c701..a5e1f6a3fde 100644 --- a/lib/gitlab/prometheus/queries/matched_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/matched_metrics_query.rb @@ -16,31 +16,28 @@ module Gitlab::Prometheus::Queries private def groups_data - metrics_series = metrics_with_series(Gitlab::Prometheus::MetricGroup.all) - lookup = active_series_lookup(metrics_series) + metrics_groups = groups_with_active_metrics(Gitlab::Prometheus::MetricGroup.all) + lookup = active_series_lookup(metrics_groups) groups = {} - metrics_series.each do |metrics, series| - groups[metrics.group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } - group = groups[metrics.group] + metrics_groups.each do |group| + groups[group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } + metrics = group.metrics.flat_map(&:required_metrics) + active_metrics = metrics.count(&lookup.method(:has_key?)) - if series.all?(&lookup.method(:has_key?)) - group[:active_metrics] += 1 - else - group[:metrics_missing_requirements] += 1 - end - group + groups[group][:active_metrics] += active_metrics + groups[group][:metrics_missing_requirements] += metrics.count - active_metrics end groups end - def active_series_lookup(metrics) + def active_series_lookup(metric_groups) timeframe_start = 8.hours.ago timeframe_end = Time.now - series = metrics.flat_map { |metrics, series| series }.uniq + series = metric_groups.flat_map(&:metrics).flat_map(&:required_metrics).uniq lookup = series.each_slice(MAX_QUERY_ITEMS).flat_map do |batched_series| client_series(*batched_series, start: timeframe_start, stop: timeframe_end) @@ -54,17 +51,27 @@ module Gitlab::Prometheus::Queries series_info.has_key?('environment') end - def metrics_with_series(metric_groups) - label_values = client_label_values || [] + def available_metrics + @available_metrics ||= client_label_values || [] + end - metrics = metric_groups.flat_map do |group| - group.metrics.map do |metric| - matcher = Regexp.compile(metric.detect) - [metric, label_values.select(&matcher.method(:match))] - end + def filter_active_metrics(metric_group) + metric_group.metrics.select! do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) end + metric_group + end - metrics.select { |metric, labels| labels&.any? } + def groups_with_active_metrics(metric_groups) + metric_groups.map(&method(:filter_active_metrics)).select { |group| group.metrics.any? } + end + + def metrics_with_required_series(metric_groups) + metric_groups.flat_map do |group| + group.metrics.select do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) + end + end end end end |