diff --git a/app/controllers/traces_controller.rb b/app/controllers/traces_controller.rb index 3ce790bd..ca9b3978 100644 --- a/app/controllers/traces_controller.rb +++ b/app/controllers/traces_controller.rb @@ -70,11 +70,11 @@ class TracesController < ApplicationController end has_scope :ls do |_, scope, value| - scope.where("(stop - start) >= interval ?", ::ActiveSupport::Duration.parse_string(value).iso8601) + scope.latency_above(value) end has_scope :le do |_, scope, value| - scope.where("(stop - start) < interval ?", ::ActiveSupport::Duration.parse_string(value).iso8601) + scope.latency_below(value) end has_scope :meta, type: :hash do |_, scope, value| diff --git a/app/models/trace.rb b/app/models/trace.rb index a547b3e5..059cf4cd 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -31,6 +31,16 @@ def retention(period, time = Time.zone.now) where t[:stop].lt(tlimit).and(t[:store].eq(false)) end + def latency_above(value) + duration = ::ActiveSupport::Duration.parse_string(value) + where("(stop - start) >= ?", duration.iso8601) + end + + def latency_below(value) + duration = ::ActiveSupport::Duration.parse_string(value) + where("(stop - start) < ?", duration.iso8601) + end + alias t arel_table end end diff --git a/spec/models/trace_spec.rb b/spec/models/trace_spec.rb index e89eda6c..2edd8090 100644 --- a/spec/models/trace_spec.rb +++ b/spec/models/trace_spec.rb @@ -104,5 +104,47 @@ end end end + + describe ".latency_above" do + subject(:traces) { described_class.latency_above(value) } + + let(:value) { "5s" } + + let!(:expected) do + create(:trace, :w_spans, start: Time.zone.now, stop: Time.zone.now + 10) + end + + before do + create(:trace, :w_spans, start: Time.zone.now, stop: Time.zone.now + 4) + create(:trace, :w_spans, start: Time.zone.now, stop: Time.zone.now + 2) + end + + it "returns only traces above 5 seconds in length" do + expect(described_class.count).to eq 3 + + expect(traces).to contain_exactly(expected) + end + end + + describe ".latency_below" do + subject(:traces) { described_class.latency_below(value) } + + let(:value) { "5s" } + + let!(:expected) do + create(:trace, :w_spans, start: Time.zone.now, stop: Time.zone.now + 4) + end + + before do + create(:trace, :w_spans, start: Time.zone.now, stop: Time.zone.now + 6) + create(:trace, :w_spans, start: Time.zone.now, stop: Time.zone.now + 10) + end + + it "returns only traces above 5 seconds in length" do + expect(described_class.count).to eq 3 + + expect(traces).to contain_exactly(expected) + end + end end end