prometheus_metric_spec.rb 4.46 KB
Newer Older
1 2
# frozen_string_literal: true

3 4 5 6 7
require 'spec_helper'

describe PrometheusMetric do
  subject { build(:prometheus_metric) }

Shinya Maeda's avatar
Shinya Maeda committed
8 9
  it_behaves_like 'having unique enum values'

10 11 12 13 14 15 16 17
  it { is_expected.to belong_to(:project) }
  it { is_expected.to validate_presence_of(:title) }
  it { is_expected.to validate_presence_of(:query) }
  it { is_expected.to validate_presence_of(:group) }

  describe 'common metrics' do
    using RSpec::Parameterized::TableSyntax

18 19 20 21 22
    where(:common, :with_project, :result) do
      false | true | true
      false | false | false
      true  | true | false
      true  | false | true
23 24 25 26 27
    end

    with_them do
      before do
        subject.common = common
28
        subject.project = with_project ? build(:project) : nil
29 30 31 32 33 34 35 36 37 38 39
      end

      it { expect(subject.valid?).to eq(result) }
    end
  end

  describe '#query_series' do
    using RSpec::Parameterized::TableSyntax

    where(:legend, :type) do
      'Some other legend' | NilClass
40
      'Status Code'       | Array
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
    end

    with_them do
      before do
        subject.legend = legend
      end

      it { expect(subject.query_series).to be_a(type) }
    end
  end

  describe '#group_title' do
    shared_examples 'group_title' do |group, title|
      subject { build(:prometheus_metric, group: group).group_title }

      it "returns text #{title} for group #{group}" do
        expect(subject).to eq(title)
      end
    end

rpereira2's avatar
rpereira2 committed
61 62 63 64 65 66
    it_behaves_like 'group_title', :nginx_ingress_vts, 'Response metrics (NGINX Ingress VTS)'
    it_behaves_like 'group_title', :nginx_ingress, 'Response metrics (NGINX Ingress)'
    it_behaves_like 'group_title', :ha_proxy, 'Response metrics (HA Proxy)'
    it_behaves_like 'group_title', :aws_elb, 'Response metrics (AWS ELB)'
    it_behaves_like 'group_title', :nginx, 'Response metrics (NGINX)'
    it_behaves_like 'group_title', :kubernetes, 'System metrics (Kubernetes)'
67 68 69 70 71
    it_behaves_like 'group_title', :business, 'Business metrics (Custom)'
    it_behaves_like 'group_title', :response, 'Response metrics (Custom)'
    it_behaves_like 'group_title', :system, 'System metrics (Custom)'
  end

rpereira2's avatar
rpereira2 committed
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
  describe '#priority' do
    using RSpec::Parameterized::TableSyntax

    where(:group, :priority) do
      :nginx_ingress_vts | 10
      :nginx_ingress     | 10
      :ha_proxy          | 10
      :aws_elb           | 10
      :nginx             | 10
      :kubernetes        | 5
      :business          | 0
      :response          | -5
      :system            | -10
    end

    with_them do
      before do
        subject.group = group
      end

      it { expect(subject.priority).to eq(priority) }
    end
  end

  describe '#required_metrics' do
    using RSpec::Parameterized::TableSyntax

    where(:group, :required_metrics) do
      :nginx_ingress_vts | %w(nginx_upstream_responses_total nginx_upstream_response_msecs_avg)
      :nginx_ingress     | %w(nginx_ingress_controller_requests nginx_ingress_controller_ingress_upstream_latency_seconds_sum)
      :ha_proxy          | %w(haproxy_frontend_http_requests_total haproxy_frontend_http_responses_total)
      :aws_elb           | %w(aws_elb_request_count_sum aws_elb_latency_average aws_elb_httpcode_backend_5_xx_sum)
      :nginx             | %w(nginx_server_requests nginx_server_requestMsec)
      :kubernetes        | %w(container_memory_usage_bytes container_cpu_usage_seconds_total)
      :business          | %w()
      :response          | %w()
      :system            | %w()
    end

    with_them do
      before do
        subject.group = group
      end

      it { expect(subject.required_metrics).to eq(required_metrics) }
    end
  end

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
  describe '#to_query_metric' do
    it 'converts to queryable metric object' do
      expect(subject.to_query_metric).to be_instance_of(Gitlab::Prometheus::Metric)
    end

    it 'queryable metric object has title' do
      expect(subject.to_query_metric.title).to eq(subject.title)
    end

    it 'queryable metric object has y_label' do
      expect(subject.to_query_metric.y_label).to eq(subject.y_label)
    end

    it 'queryable metric has no required_metric' do
      expect(subject.to_query_metric.required_metrics).to eq([])
    end

    it 'queryable metric has weight 0' do
      expect(subject.to_query_metric.weight).to eq(0)
    end

    it 'queryable metrics has query description' do
      queries = [
        {
          query_range: subject.query,
          unit: subject.unit,
Kamil Trzciński's avatar
Kamil Trzciński committed
146
          label: subject.legend
147 148 149 150 151 152 153
        }
      ]

      expect(subject.to_query_metric.queries).to eq(queries)
    end
  end
end