diff --git a/sentry-ruby/CHANGELOG.md b/sentry-ruby/CHANGELOG.md index 219bb1ce1..f2ba584d0 100644 --- a/sentry-ruby/CHANGELOG.md +++ b/sentry-ruby/CHANGELOG.md @@ -8,6 +8,7 @@ - Ignore sentry-trace when tracing is not enabled [#1308](https://github.com/getsentry/sentry-ruby/pull/1308) - Fixes [#1307](https://github.com/getsentry/sentry-ruby/issues/1307) - Refactor tracing implementation [#1309](https://github.com/getsentry/sentry-ruby/pull/1309) +- Allow configuring BreadcrumbBuffer's size limit [#1310](https://github.com/getsentry/sentry-ruby/pull/1310) ## 4.2.2 diff --git a/sentry-ruby/lib/sentry-ruby.rb b/sentry-ruby/lib/sentry-ruby.rb index c84acbf8d..24c6caa0f 100644 --- a/sentry-ruby/lib/sentry-ruby.rb +++ b/sentry-ruby/lib/sentry-ruby.rb @@ -68,7 +68,7 @@ def init(&block) config = Configuration.new yield(config) if block_given? client = Client.new(config) - scope = Scope.new + scope = Scope.new(breadcrumb_buffer_limit: config.breadcrumb_buffer_limit) hub = Hub.new(client, scope) Thread.current[THREAD_LOCAL] = hub @main_hub = hub diff --git a/sentry-ruby/lib/sentry/breadcrumb_buffer.rb b/sentry-ruby/lib/sentry/breadcrumb_buffer.rb index 8a864f109..3476bc062 100644 --- a/sentry-ruby/lib/sentry/breadcrumb_buffer.rb +++ b/sentry-ruby/lib/sentry/breadcrumb_buffer.rb @@ -2,12 +2,13 @@ module Sentry class BreadcrumbBuffer + DEFAULT_SIZE = 100 include Enumerable attr_accessor :buffer - def initialize(size = 100) - @buffer = Array.new(size) + def initialize(size = nil) + @buffer = Array.new(size || DEFAULT_SIZE) end def record(crumb) diff --git a/sentry-ruby/lib/sentry/configuration.rb b/sentry-ruby/lib/sentry/configuration.rb index 0e833ffaa..44237815a 100644 --- a/sentry-ruby/lib/sentry/configuration.rb +++ b/sentry-ruby/lib/sentry/configuration.rb @@ -62,6 +62,9 @@ class Configuration # - :active_support_logger attr_reader :breadcrumbs_logger + # Max number of breadcrumbs a breadcrumb buffer can hold + attr_accessor :breadcrumb_buffer_limit + # Number of lines of code context to capture, or nil for none attr_accessor :context_lines @@ -172,6 +175,7 @@ class Configuration def initialize self.background_worker_threads = Concurrent.processor_count + self.breadcrumb_buffer_limit = BreadcrumbBuffer::DEFAULT_SIZE self.breadcrumbs_logger = [] self.context_lines = 3 self.environment = environment_from_env diff --git a/sentry-ruby/lib/sentry/scope.rb b/sentry-ruby/lib/sentry/scope.rb index 7a38ef2e3..bde101597 100644 --- a/sentry-ruby/lib/sentry/scope.rb +++ b/sentry-ruby/lib/sentry/scope.rb @@ -9,7 +9,8 @@ class Scope attr_reader(*ATTRIBUTES) - def initialize + def initialize(breadcrumb_buffer_limit: nil) + @breadcrumb_buffer_limit = breadcrumb_buffer_limit set_default_value end @@ -47,7 +48,7 @@ def add_breadcrumb(breadcrumb) end def clear_breadcrumbs - @breadcrumbs = BreadcrumbBuffer.new + set_new_breadcrumb_buffer end def dup @@ -171,7 +172,6 @@ def add_event_processor(&block) private def set_default_value - @breadcrumbs = BreadcrumbBuffer.new @contexts = { :os => self.class.os_context, :runtime => self.class.runtime_context } @extra = {} @tags = {} @@ -182,8 +182,14 @@ def set_default_value @event_processors = [] @rack_env = {} @span = nil + set_new_breadcrumb_buffer end + def set_new_breadcrumb_buffer + @breadcrumbs = BreadcrumbBuffer.new(@breadcrumb_buffer_limit) + end + + class << self def os_context @os_context ||= diff --git a/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb b/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb index 8230172f6..04a76fe3c 100644 --- a/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb +++ b/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb @@ -37,6 +37,24 @@ ) end + describe "#record" do + subject do + described_class.new(1) + end + + it "doesn't exceed the size limit" do + subject.record(crumb_1) + + expect(subject.buffer.size).to eq(1) + + subject.record(crumb_2) + + expect(subject.buffer.size).to eq(1) + + expect(subject.peek).to eq(crumb_2) + end + end + describe "#to_hash" do it "doesn't break because of 1 problematic crumb" do subject.record(crumb_1) diff --git a/sentry-ruby/spec/sentry/scope_spec.rb b/sentry-ruby/spec/sentry/scope_spec.rb index fad2a5e66..894515d24 100644 --- a/sentry-ruby/spec/sentry/scope_spec.rb +++ b/sentry-ruby/spec/sentry/scope_spec.rb @@ -18,6 +18,11 @@ expect(subject.fingerprint).to eq([]) expect(subject.transaction_names).to eq([]) end + + it "allows setting breadcrumb buffer's size limit" do + scope = described_class.new(breadcrumb_buffer_limit: 10) + expect(scope.breadcrumbs.buffer.count).to eq(10) + end end describe "#dup" do @@ -65,6 +70,10 @@ end describe "#clear_breadcrumbs" do + subject do + described_class.new(breadcrumb_buffer_limit: 10) + end + before do subject.add_breadcrumb(new_breadcrumb) @@ -75,6 +84,7 @@ subject.clear_breadcrumbs expect(subject.breadcrumbs.empty?).to eq(true) + expect(subject.breadcrumbs.buffer.size).to eq(10) end end diff --git a/sentry-ruby/spec/sentry_spec.rb b/sentry-ruby/spec/sentry_spec.rb index 482c2fe72..5b94f4089 100644 --- a/sentry-ruby/spec/sentry_spec.rb +++ b/sentry-ruby/spec/sentry_spec.rb @@ -37,6 +37,15 @@ expect(subject.get_main_hub).to eq(current_hub) end end + + it "initializes Scope with correct breadcrumb_buffer_limit" do + described_class.init do |config| + config.breadcrumb_buffer_limit = 1 + end + + current_scope = described_class.get_current_scope + expect(current_scope.breadcrumbs.buffer.size).to eq(1) + end end describe "#clone_hub_to_current_thread" do