Skip to content

Commit ae5268c

Browse files
committed
Additional Metrics tests
1 parent 6a70509 commit ae5268c

File tree

6 files changed

+126
-18
lines changed

6 files changed

+126
-18
lines changed

config/additional_metrics.yml

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
queries:
1010
- query_range: 'avg(container_memory_usage_bytes{%{environment_filter}}) / 2^20'
1111
label: Container memory
12-
display_empty: true
1312
unit: MiB
1413
- title: "Current memory usage"
1514
required_metrics:

lib/gitlab/prometheus/queries/additional_metrics_query.rb

+22-13
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,42 @@ def query(environment_id)
1717
def query_metrics(query_context)
1818
query_processor = method(:process_query).curry[query_context]
1919

20-
matched_metrics.map do |group|
20+
groups = matched_metrics.map do |group|
2121
metrics = group.metrics.map do |metric|
2222
{
2323
title: metric.title,
2424
weight: metric.weight,
2525
y_label: metric.y_label,
26-
queries: metric.queries.map(&query_processor)
26+
queries: metric.queries.map(&query_processor).select(&method(:query_with_result))
2727
}
2828
end
2929

3030
{
3131
group: group.name,
3232
priority: group.priority,
33-
metrics: metrics
33+
metrics: metrics.select(&method(:metric_with_any_queries))
3434
}
3535
end
36+
37+
groups.select(&method(:group_with_any_metrics))
3638
end
3739

3840
private
3941

42+
def metric_with_any_queries(metric)
43+
metric[:queries]&.count > 0
44+
end
45+
46+
def group_with_any_metrics(group)
47+
group[:metrics]&.count > 0
48+
end
49+
50+
def query_with_result(query)
51+
query[:result]&.any? do |item|
52+
item&.[](:values)&.any? || item&.[](:value)&.any?
53+
end
54+
end
55+
4056
def process_query(context, query)
4157
query_with_result = query.dup
4258
query_with_result[:result] =
@@ -48,22 +64,15 @@ def process_query(context, query)
4864
query_with_result
4965
end
5066

51-
def process_result(query_result)
52-
contains_metrics = query_result.all? do |item|
53-
item&.[](:values)&.any? || item&.[](:value)&.any?
54-
end
5567

56-
contains_metrics
68+
def available_metrics
69+
@available_metrics ||= client_label_values || []
5770
end
5871

5972
def matched_metrics
60-
label_values = client_label_values || []
61-
Gitlab::Prometheus::MetricGroup.all
62-
6373
result = Gitlab::Prometheus::MetricGroup.all.map do |group|
6474
group.metrics.select! do |metric|
65-
matcher = Regexp.compile(metric.detect)
66-
label_values.any? &matcher.method(:match)
75+
metric.required_metrics.all?(&available_metrics.method(:include?))
6776
end
6877
group
6978
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
require 'spec_helper'
2+
3+
describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do
4+
include Prometheus::AdditionalMetricsQueryHelper
5+
6+
let(:metric_group_class) { Gitlab::Prometheus::MetricGroup }
7+
let(:metric_class) { Gitlab::Prometheus::Metric }
8+
9+
let(:client) { double('prometheus_client') }
10+
let(:environment) { create(:environment, slug: 'environment-slug') }
11+
12+
subject(:query_result) { described_class.new(client).query(environment.id) }
13+
14+
15+
context 'with one group where two metrics is found' do
16+
before do
17+
allow(metric_group_class).to receive(:all).and_return([simple_metric_group])
18+
allow(client).to receive(:label_values).and_return(metric_names)
19+
end
20+
21+
context 'some querie return results' do
22+
before do
23+
expect(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result)
24+
expect(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result)
25+
expect(client).to receive(:query_range).with('query_range_empty', any_args).and_return([])
26+
end
27+
28+
it 'return results only for queries with results' do
29+
puts query_result
30+
expected = {
31+
group: 'name',
32+
priority: 1,
33+
metrics:
34+
[
35+
{
36+
title: 'title', weight: nil, y_label: 'Values', queries:
37+
[
38+
{ query_range: 'query_range_a', result: query_range_result },
39+
{ query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result }
40+
]
41+
}
42+
]
43+
}
44+
45+
expect(query_result).to eq([expected])
46+
end
47+
end
48+
end
49+
end

spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
subject { described_class.new(client) }
1212

13-
context 'with one group where two metrics are found' do
13+
context 'with one group where two metrics is found' do
1414
before do
1515
allow(metric_group_class).to receive(:all).and_return([simple_metric_group])
1616
allow(client).to receive(:label_values).and_return(metric_names)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
module Prometheus
2+
module AdditionalMetricsQueryHelper
3+
def metric_names
4+
%w{metric_a metric_b}
5+
end
6+
7+
def simple_queries
8+
[{ query_range: 'query_range_a' }, { query_range: 'query_range_b', label: 'label', unit: 'unit' }]
9+
end
10+
11+
def simple_query(suffix = 'a')
12+
[{ query_range: "query_range_#{suffix}" }]
13+
end
14+
15+
def simple_metrics
16+
[
17+
Gitlab::Prometheus::Metric.new('title', %w(metric_a metric_b), nil, nil, simple_queries),
18+
Gitlab::Prometheus::Metric.new('title', %w{metric_a}, nil, nil, simple_query('empty')),
19+
Gitlab::Prometheus::Metric.new('title', %w{metric_c}, nil, nil)
20+
]
21+
end
22+
23+
def simple_metric_group(name = 'name', metrics = simple_metrics)
24+
Gitlab::Prometheus::MetricGroup.new(name, 1, metrics)
25+
end
26+
27+
def query_result
28+
[
29+
{
30+
'metric': {},
31+
'value': [
32+
1488772511.004,
33+
'0.000041021495238095323'
34+
]
35+
}
36+
]
37+
end
38+
39+
def query_range_result
40+
[
41+
{
42+
'metric': {},
43+
'values': [
44+
[1488758662.506, '0.00002996364761904785'],
45+
[1488758722.506, '0.00003090239047619091']
46+
]
47+
}
48+
]
49+
end
50+
end
51+
end

spec/support/prometheus/matched_metrics_query_helper.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ def metric_names
55
end
66

77
def simple_metrics(metric_name = 'metric_a')
8-
[metric_class.new('title', %W(#{metric_name} metric_b), nil, nil),
9-
metric_class.new('title', [metric_name], nil, nil)]
8+
[Gitlab::Prometheus::Metric.new('title', %W(#{metric_name} metric_b), nil, nil),
9+
Gitlab::Prometheus::Metric.new('title', [metric_name], nil, nil)]
1010
end
1111

1212
def simple_metric_group(name = 'name', metrics = simple_metrics)
13-
metric_group_class.new(name, 1, metrics)
13+
Gitlab::Prometheus::MetricGroup.new(name, 1, metrics)
1414
end
1515

1616
def series_info_with_environment(*more_metrics)

0 commit comments

Comments
 (0)