prometheus_exporter/test/metric/histogram_test.rb

184 lines
6.3 KiB
Ruby

# frozen_string_literal: true
require_relative '../test_helper'
require 'prometheus_exporter/metric'
module PrometheusExporter::Metric
describe Histogram do
let :histogram do
Histogram.new("a_histogram", "my amazing histogram")
end
before do
Base.default_prefix = ''
end
it "can correctly gather a histogram" do
histogram.observe(0.1)
histogram.observe(0.2)
histogram.observe(0.610001)
histogram.observe(0.610001)
histogram.observe(0.610001)
histogram.observe(0.910001)
histogram.observe(0.1)
expected = <<~TEXT
# HELP a_histogram my amazing histogram
# TYPE a_histogram histogram
a_histogram_bucket{le="0.005"} 0
a_histogram_bucket{le="0.01"} 0
a_histogram_bucket{le="0.025"} 0
a_histogram_bucket{le="0.05"} 0
a_histogram_bucket{le="0.1"} 2
a_histogram_bucket{le="0.25"} 3
a_histogram_bucket{le="0.5"} 3
a_histogram_bucket{le="1"} 7
a_histogram_bucket{le="2.5"} 7
a_histogram_bucket{le="5.0"} 7
a_histogram_bucket{le="10.0"} 7
a_histogram_bucket{le="+Inf"} 7
a_histogram_count 7
a_histogram_sum 3.1400040000000002
TEXT
assert_equal(histogram.to_prometheus_text, expected)
end
it "can correctly gather a histogram over multiple labels" do
histogram.observe(0.1, nil)
histogram.observe(0.2)
histogram.observe(0.610001)
histogram.observe(0.610001)
histogram.observe(0.1, name: "bob", family: "skywalker")
histogram.observe(0.7, name: "bob", family: "skywalker")
histogram.observe(0.99, name: "bob", family: "skywalker")
expected = <<~TEXT
# HELP a_histogram my amazing histogram
# TYPE a_histogram histogram
a_histogram_bucket{le="0.005"} 0
a_histogram_bucket{le="0.01"} 0
a_histogram_bucket{le="0.025"} 0
a_histogram_bucket{le="0.05"} 0
a_histogram_bucket{le="0.1"} 1
a_histogram_bucket{le="0.25"} 2
a_histogram_bucket{le="0.5"} 2
a_histogram_bucket{le="1"} 4
a_histogram_bucket{le="2.5"} 4
a_histogram_bucket{le="5.0"} 4
a_histogram_bucket{le="10.0"} 4
a_histogram_bucket{le="+Inf"} 4
a_histogram_count 4
a_histogram_sum 1.520002
a_histogram_bucket{name="bob",family="skywalker",le="0.005"} 0
a_histogram_bucket{name="bob",family="skywalker",le="0.01"} 0
a_histogram_bucket{name="bob",family="skywalker",le="0.025"} 0
a_histogram_bucket{name="bob",family="skywalker",le="0.05"} 0
a_histogram_bucket{name="bob",family="skywalker",le="0.1"} 1
a_histogram_bucket{name="bob",family="skywalker",le="0.25"} 1
a_histogram_bucket{name="bob",family="skywalker",le="0.5"} 1
a_histogram_bucket{name="bob",family="skywalker",le="1"} 3
a_histogram_bucket{name="bob",family="skywalker",le="2.5"} 3
a_histogram_bucket{name="bob",family="skywalker",le="5.0"} 3
a_histogram_bucket{name="bob",family="skywalker",le="10.0"} 3
a_histogram_bucket{name="bob",family="skywalker",le="+Inf"} 3
a_histogram_count{name="bob",family="skywalker"} 3
a_histogram_sum{name="bob",family="skywalker"} 1.79
TEXT
assert_equal(histogram.to_prometheus_text, expected)
end
it "can correctly gather a histogram using custom buckets" do
histogram = Histogram.new("a_histogram", "my amazing histogram", buckets: [2, 1, 3])
histogram.observe(0.5)
histogram.observe(1.5)
histogram.observe(4)
histogram.observe(2, name: "gargamel")
expected = <<~TEXT
# HELP a_histogram my amazing histogram
# TYPE a_histogram histogram
a_histogram_bucket{le="1"} 1
a_histogram_bucket{le="2"} 2
a_histogram_bucket{le="3"} 2
a_histogram_bucket{le="+Inf"} 3
a_histogram_count 3
a_histogram_sum 6.0
a_histogram_bucket{name="gargamel",le="1"} 0
a_histogram_bucket{name="gargamel",le="2"} 1
a_histogram_bucket{name="gargamel",le="3"} 1
a_histogram_bucket{name="gargamel",le="+Inf"} 1
a_histogram_count{name="gargamel"} 1
a_histogram_sum{name="gargamel"} 2.0
TEXT
assert_equal(histogram.to_prometheus_text, expected)
end
it "can correctly return data set" do
histogram.observe(0.1, name: "bob", family: "skywalker")
histogram.observe(0.7, name: "bob", family: "skywalker")
histogram.observe(0.99, name: "bob", family: "skywalker")
key = { name: "bob", family: "skywalker" }
val = { "count" => 3, "sum" => 1.79 }
assert_equal(histogram.to_h, key => val)
end
it "can correctly remove histograms" do
histogram.observe(0.1, name: "bob", family: "skywalker")
histogram.observe(0.7, name: "bob", family: "skywalker")
histogram.observe(0.99, name: "bob", family: "skywalker")
histogram.observe(0.6, name: "gandalf", family: "skywalker")
histogram.remove(name: "gandalf", family: "skywalker")
histogram.remove(name: "jane", family: "skywalker")
key = { name: "bob", family: "skywalker" }
val = { "count" => 3, "sum" => 1.79 }
assert_equal(histogram.to_h, key => val)
end
it 'supports default buckets' do
assert_equal(Histogram::DEFAULT_BUCKETS, [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5.0, 10.0])
assert_equal(Histogram::DEFAULT_BUCKETS, Histogram.default_buckets)
end
it 'allows to change default buckets' do
custom_buckets = [0.005, 0.1, 1, 2, 5, 10]
Histogram.default_buckets = custom_buckets
assert_equal(Histogram.default_buckets, custom_buckets)
Histogram.default_buckets = Histogram::DEFAULT_BUCKETS
end
it 'uses the default buckets for instance' do
assert_equal(histogram.buckets, Histogram::DEFAULT_BUCKETS)
end
it 'uses the the custom default buckets for instance' do
custom_buckets = [0.005, 0.1, 1, 2, 5, 10]
Histogram.default_buckets = custom_buckets
assert_equal(histogram.buckets, custom_buckets)
Histogram.default_buckets = Histogram::DEFAULT_BUCKETS
end
it 'uses the specified buckets' do
buckets = [0.1, 0.2, 0.3]
histogram = Histogram.new('test_bucktets', 'I have specified buckets', buckets: buckets)
assert_equal(histogram.buckets, buckets)
end
end
end