diff --git a/sentry-ruby/lib/sentry/breadcrumb.rb b/sentry-ruby/lib/sentry/breadcrumb.rb index 4f2ed3dfe..c20f8cded 100644 --- a/sentry-ruby/lib/sentry/breadcrumb.rb +++ b/sentry-ruby/lib/sentry/breadcrumb.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'oj' + module Sentry class Breadcrumb DATA_SERIALIZATION_ERROR_MESSAGE = "[data were removed due to serialization issues]" @@ -54,7 +56,7 @@ def message=(message) def serialized_data begin - ::JSON.parse(::JSON.generate(@data)) + Oj.load(Oj.dump(@data, mode: :compat), mode: :compat) rescue Exception => e Sentry.logger.debug(LOGGER_PROGNAME) do <<~MSG diff --git a/sentry-ruby/lib/sentry/client.rb b/sentry-ruby/lib/sentry/client.rb index 80f1165c8..1d6183032 100644 --- a/sentry-ruby/lib/sentry/client.rb +++ b/sentry-ruby/lib/sentry/client.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "sentry/transport" +require 'oj' module Sentry class Client @@ -201,7 +202,7 @@ def dispatch_async_event(async_block, event, hint) end if async_block.arity == 2 - hint = JSON.parse(JSON.generate(hint)) + hint = Oj.load(Oj.dump(hint, mode: :compat), mode: :compat) async_block.call(event_hash, hint) else async_block.call(event_hash) diff --git a/sentry-ruby/lib/sentry/envelope.rb b/sentry-ruby/lib/sentry/envelope.rb index 54da999e1..be139f5fb 100644 --- a/sentry-ruby/lib/sentry/envelope.rb +++ b/sentry-ruby/lib/sentry/envelope.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'oj' + module Sentry # @api private class Envelope @@ -19,7 +21,7 @@ def type end def to_s - [JSON.generate(@headers), JSON.generate(@payload)].join("\n") + [Oj.dump(@headers, mode: :compat), Oj.dump(@payload, mode: :compat)].join("\n") end def serialize @@ -40,7 +42,7 @@ def serialize def size_breakdown payload.map do |key, value| - "#{key}: #{JSON.generate(value).bytesize}" + "#{key}: #{Oj.dump(value, mode: :compat).bytesize}" end.join(", ") end diff --git a/sentry-ruby/lib/sentry/event.rb b/sentry-ruby/lib/sentry/event.rb index b9f8a58e6..79f984bd0 100644 --- a/sentry-ruby/lib/sentry/event.rb +++ b/sentry-ruby/lib/sentry/event.rb @@ -7,6 +7,7 @@ require 'sentry/utils/real_ip' require 'sentry/utils/request_id' require 'sentry/utils/custom_inspection' +require 'oj' module Sentry # This is an abstract class that defines the shared attributes of an event. @@ -152,7 +153,7 @@ def to_hash # @return [Hash] def to_json_compatible - JSON.parse(JSON.generate(to_hash)) + Oj.load(Oj.dump(to_hash, mode: :compat), mode: :compat) end private diff --git a/sentry-ruby/lib/sentry/transport.rb b/sentry-ruby/lib/sentry/transport.rb index cdfc23359..82552c105 100644 --- a/sentry-ruby/lib/sentry/transport.rb +++ b/sentry-ruby/lib/sentry/transport.rb @@ -3,6 +3,7 @@ require "json" require "base64" require "sentry/envelope" +require 'oj' module Sentry class Transport @@ -82,7 +83,7 @@ def serialize_envelope(envelope) serialized_items << item end - data = [JSON.generate(envelope.headers), *serialized_results].join("\n") unless serialized_results.empty? + data = [Oj.dump(envelope.headers, mode: :compat), *serialized_results].join("\n") unless serialized_results.empty? [data, serialized_items] end diff --git a/sentry-ruby/sentry-ruby.gemspec b/sentry-ruby/sentry-ruby.gemspec index 154d7638c..678f72a65 100644 --- a/sentry-ruby/sentry-ruby.gemspec +++ b/sentry-ruby/sentry-ruby.gemspec @@ -21,4 +21,5 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "concurrent-ruby", '~> 1.0', '>= 1.0.2' + spec.add_dependency "oj" end