2019-12-04 20:38:33 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-07-28 23:09:34 +05:30
|
|
|
RSpec.describe Gitlab::Prometheus::AdditionalMetricsParser do
|
2017-09-10 17:25:29 +05:30
|
|
|
include Prometheus::MetricBuilders
|
|
|
|
|
|
|
|
let(:parser_error_class) { Gitlab::Prometheus::ParsingError }
|
|
|
|
|
|
|
|
describe '#load_groups_from_yaml' do
|
2018-11-20 20:47:30 +05:30
|
|
|
subject { described_class.load_groups_from_yaml('dummy.yaml') }
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
describe 'parsing sample yaml' do
|
|
|
|
let(:sample_yaml) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: "title"
|
|
|
|
required_metrics: [ metric_a, metric_b ]
|
|
|
|
weight: 1
|
|
|
|
queries: [{ query_range: 'query_range_a', label: label, unit: unit }]
|
|
|
|
- title: "title"
|
|
|
|
required_metrics: [metric_a]
|
|
|
|
weight: 1
|
|
|
|
queries: [{ query_range: 'query_range_empty' }]
|
|
|
|
- group: group_b
|
|
|
|
priority: 1
|
2018-03-17 18:26:18 +05:30
|
|
|
metrics:
|
2017-09-10 17:25:29 +05:30
|
|
|
- title: title
|
|
|
|
required_metrics: ['metric_a']
|
|
|
|
weight: 1
|
|
|
|
queries: [{query_range: query_range_a}]
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
before do
|
2021-06-08 01:23:25 +05:30
|
|
|
allow(described_class).to receive(:load_yaml_file) { YAML.safe_load(sample_yaml) }
|
2017-09-10 17:25:29 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'parses to two metric groups with 2 and 1 metric respectively' do
|
|
|
|
expect(subject.count).to eq(2)
|
|
|
|
expect(subject[0].metrics.count).to eq(2)
|
|
|
|
expect(subject[1].metrics.count).to eq(1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'provide group data' do
|
|
|
|
expect(subject[0]).to have_attributes(name: 'group_a', priority: 1)
|
|
|
|
expect(subject[1]).to have_attributes(name: 'group_b', priority: 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'provides metrics data' do
|
|
|
|
metrics = subject.flat_map(&:metrics)
|
|
|
|
|
|
|
|
expect(metrics.count).to eq(3)
|
|
|
|
expect(metrics[0]).to have_attributes(title: 'title', required_metrics: %w(metric_a metric_b), weight: 1)
|
|
|
|
expect(metrics[1]).to have_attributes(title: 'title', required_metrics: %w(metric_a), weight: 1)
|
|
|
|
expect(metrics[2]).to have_attributes(title: 'title', required_metrics: %w{metric_a}, weight: 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'provides query data' do
|
|
|
|
queries = subject.flat_map(&:metrics).flat_map(&:queries)
|
|
|
|
|
|
|
|
expect(queries.count).to eq(3)
|
|
|
|
expect(queries[0]).to eq(query_range: 'query_range_a', label: 'label', unit: 'unit')
|
|
|
|
expect(queries[1]).to eq(query_range: 'query_range_empty')
|
|
|
|
expect(queries[2]).to eq(query_range: 'query_range_a')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples 'required field' do |field_name|
|
|
|
|
context "when #{field_name} is nil" do
|
|
|
|
before do
|
2021-06-08 01:23:25 +05:30
|
|
|
allow(described_class).to receive(:load_yaml_file) { YAML.safe_load(field_missing) }
|
2017-09-10 17:25:29 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'throws parsing error' do
|
|
|
|
expect { subject }.to raise_error(parser_error_class, /#{field_name} can't be blank/i)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when #{field_name} are not specified" do
|
|
|
|
before do
|
2021-06-08 01:23:25 +05:30
|
|
|
allow(described_class).to receive(:load_yaml_file) { YAML.safe_load(field_nil) }
|
2017-09-10 17:25:29 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'throws parsing error' do
|
|
|
|
expect { subject }.to raise_error(parser_error_class, /#{field_name} can't be blank/i)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'group required fields' do
|
|
|
|
it_behaves_like 'required field', 'metrics' do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'required field', 'name' do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group:
|
|
|
|
priority: 1
|
|
|
|
metrics: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- priority: 1
|
|
|
|
metrics: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'required field', 'priority' do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority:
|
|
|
|
metrics: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
metrics: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'metrics fields parsing' do
|
|
|
|
it_behaves_like 'required field', 'title' do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
2018-03-17 18:26:18 +05:30
|
|
|
- title:
|
2017-09-10 17:25:29 +05:30
|
|
|
required_metrics: []
|
|
|
|
weight: 1
|
|
|
|
queries: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- required_metrics: []
|
|
|
|
weight: 1
|
|
|
|
queries: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'required field', 'required metrics' do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: title
|
|
|
|
required_metrics:
|
|
|
|
weight: 1
|
|
|
|
queries: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: title
|
|
|
|
weight: 1
|
|
|
|
queries: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'required field', 'weight' do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: title
|
|
|
|
required_metrics: []
|
|
|
|
weight:
|
|
|
|
queries: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: title
|
|
|
|
required_metrics: []
|
|
|
|
queries: []
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'required field', :queries do
|
|
|
|
let(:field_nil) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: title
|
|
|
|
required_metrics: []
|
|
|
|
weight: 1
|
|
|
|
queries:
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:field_missing) do
|
|
|
|
<<-EOF.strip_heredoc
|
|
|
|
- group: group_a
|
|
|
|
priority: 1
|
|
|
|
metrics:
|
|
|
|
- title: title
|
|
|
|
required_metrics: []
|
|
|
|
weight: 1
|
|
|
|
EOF
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|