sentry-ruby 5.26.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/Gemfile +2 -4
 - data/lib/sentry/background_worker.rb +1 -4
 - data/lib/sentry/breadcrumb.rb +1 -1
 - data/lib/sentry/breadcrumb_buffer.rb +2 -2
 - data/lib/sentry/check_in_event.rb +2 -2
 - data/lib/sentry/client.rb +29 -89
 - data/lib/sentry/configuration.rb +125 -78
 - data/lib/sentry/cron/monitor_check_ins.rb +3 -3
 - data/lib/sentry/cron/monitor_config.rb +2 -2
 - data/lib/sentry/cron/monitor_schedule.rb +2 -2
 - data/lib/sentry/debug_structured_logger.rb +94 -0
 - data/lib/sentry/dsn.rb +32 -0
 - data/lib/sentry/envelope/item.rb +1 -2
 - data/lib/sentry/error_event.rb +3 -3
 - data/lib/sentry/event.rb +4 -10
 - data/lib/sentry/graphql.rb +1 -1
 - data/lib/sentry/hub.rb +6 -5
 - data/lib/sentry/interface.rb +1 -1
 - data/lib/sentry/interfaces/exception.rb +2 -2
 - data/lib/sentry/interfaces/request.rb +2 -0
 - data/lib/sentry/interfaces/single_exception.rb +3 -3
 - data/lib/sentry/interfaces/stacktrace.rb +3 -3
 - data/lib/sentry/interfaces/stacktrace_builder.rb +0 -8
 - data/lib/sentry/interfaces/threads.rb +2 -2
 - data/lib/sentry/log_event.rb +19 -6
 - data/lib/sentry/profiler.rb +4 -5
 - data/lib/sentry/propagation_context.rb +55 -18
 - data/lib/sentry/rspec.rb +1 -1
 - data/lib/sentry/span.rb +2 -17
 - data/lib/sentry/std_lib_logger.rb +6 -1
 - data/lib/sentry/test_helper.rb +23 -0
 - data/lib/sentry/transaction.rb +72 -95
 - data/lib/sentry/transaction_event.rb +4 -9
 - data/lib/sentry/transport/debug_transport.rb +70 -0
 - data/lib/sentry/transport/dummy_transport.rb +1 -0
 - data/lib/sentry/transport/http_transport.rb +9 -5
 - data/lib/sentry/transport.rb +3 -5
 - data/lib/sentry/utils/logging_helper.rb +8 -6
 - data/lib/sentry/utils/sample_rand.rb +97 -0
 - data/lib/sentry/vernier/profiler.rb +4 -3
 - data/lib/sentry/version.rb +1 -1
 - data/lib/sentry-ruby.rb +6 -30
 - data/sentry-ruby-core.gemspec +1 -1
 - data/sentry-ruby.gemspec +1 -1
 - metadata +11 -18
 - data/lib/sentry/metrics/aggregator.rb +0 -248
 - data/lib/sentry/metrics/configuration.rb +0 -47
 - data/lib/sentry/metrics/counter_metric.rb +0 -25
 - data/lib/sentry/metrics/distribution_metric.rb +0 -25
 - data/lib/sentry/metrics/gauge_metric.rb +0 -35
 - data/lib/sentry/metrics/local_aggregator.rb +0 -53
 - data/lib/sentry/metrics/metric.rb +0 -19
 - data/lib/sentry/metrics/set_metric.rb +0 -28
 - data/lib/sentry/metrics/timing.rb +0 -51
 - data/lib/sentry/metrics.rb +0 -56
 
| 
         @@ -1,35 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Sentry
         
     | 
| 
       4 
     | 
    
         
            -
              module Metrics
         
     | 
| 
       5 
     | 
    
         
            -
                class GaugeMetric < Metric
         
     | 
| 
       6 
     | 
    
         
            -
                  attr_reader :last, :min, :max, :sum, :count
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                  def initialize(value)
         
     | 
| 
       9 
     | 
    
         
            -
                    value = value.to_f
         
     | 
| 
       10 
     | 
    
         
            -
                    @last = value
         
     | 
| 
       11 
     | 
    
         
            -
                    @min = value
         
     | 
| 
       12 
     | 
    
         
            -
                    @max = value
         
     | 
| 
       13 
     | 
    
         
            -
                    @sum = value
         
     | 
| 
       14 
     | 
    
         
            -
                    @count = 1
         
     | 
| 
       15 
     | 
    
         
            -
                  end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                  def add(value)
         
     | 
| 
       18 
     | 
    
         
            -
                    value = value.to_f
         
     | 
| 
       19 
     | 
    
         
            -
                    @last = value
         
     | 
| 
       20 
     | 
    
         
            -
                    @min = [@min, value].min
         
     | 
| 
       21 
     | 
    
         
            -
                    @max = [@max, value].max
         
     | 
| 
       22 
     | 
    
         
            -
                    @sum += value
         
     | 
| 
       23 
     | 
    
         
            -
                    @count += 1
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  def serialize
         
     | 
| 
       27 
     | 
    
         
            -
                    [last, min, max, sum, count]
         
     | 
| 
       28 
     | 
    
         
            -
                  end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                  def weight
         
     | 
| 
       31 
     | 
    
         
            -
                    5
         
     | 
| 
       32 
     | 
    
         
            -
                  end
         
     | 
| 
       33 
     | 
    
         
            -
                end
         
     | 
| 
       34 
     | 
    
         
            -
              end
         
     | 
| 
       35 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,53 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Sentry
         
     | 
| 
       4 
     | 
    
         
            -
              module Metrics
         
     | 
| 
       5 
     | 
    
         
            -
                class LocalAggregator
         
     | 
| 
       6 
     | 
    
         
            -
                  # exposed only for testing
         
     | 
| 
       7 
     | 
    
         
            -
                  attr_reader :buckets
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                  def initialize
         
     | 
| 
       10 
     | 
    
         
            -
                    @buckets = {}
         
     | 
| 
       11 
     | 
    
         
            -
                  end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                  def add(key, value)
         
     | 
| 
       14 
     | 
    
         
            -
                    if @buckets[key]
         
     | 
| 
       15 
     | 
    
         
            -
                      @buckets[key].add(value)
         
     | 
| 
       16 
     | 
    
         
            -
                    else
         
     | 
| 
       17 
     | 
    
         
            -
                      @buckets[key] = GaugeMetric.new(value)
         
     | 
| 
       18 
     | 
    
         
            -
                    end
         
     | 
| 
       19 
     | 
    
         
            -
                  end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                  def to_hash
         
     | 
| 
       22 
     | 
    
         
            -
                    return nil if @buckets.empty?
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                    @buckets.map do |bucket_key, metric|
         
     | 
| 
       25 
     | 
    
         
            -
                      type, key, unit, tags = bucket_key
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                      payload_key = "#{type}:#{key}@#{unit}"
         
     | 
| 
       28 
     | 
    
         
            -
                      payload_value = {
         
     | 
| 
       29 
     | 
    
         
            -
                        tags: deserialize_tags(tags),
         
     | 
| 
       30 
     | 
    
         
            -
                        min: metric.min,
         
     | 
| 
       31 
     | 
    
         
            -
                        max: metric.max,
         
     | 
| 
       32 
     | 
    
         
            -
                        count: metric.count,
         
     | 
| 
       33 
     | 
    
         
            -
                        sum: metric.sum
         
     | 
| 
       34 
     | 
    
         
            -
                      }
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                      [payload_key, payload_value]
         
     | 
| 
       37 
     | 
    
         
            -
                    end.to_h
         
     | 
| 
       38 
     | 
    
         
            -
                  end
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                  private
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                  def deserialize_tags(tags)
         
     | 
| 
       43 
     | 
    
         
            -
                    tags.inject({}) do |h, tag|
         
     | 
| 
       44 
     | 
    
         
            -
                      k, v = tag
         
     | 
| 
       45 
     | 
    
         
            -
                      old = h[k]
         
     | 
| 
       46 
     | 
    
         
            -
                      # make it an array if key repeats
         
     | 
| 
       47 
     | 
    
         
            -
                      h[k] = old ? (old.is_a?(Array) ? old << v : [old, v]) : v
         
     | 
| 
       48 
     | 
    
         
            -
                      h
         
     | 
| 
       49 
     | 
    
         
            -
                    end
         
     | 
| 
       50 
     | 
    
         
            -
                  end
         
     | 
| 
       51 
     | 
    
         
            -
                end
         
     | 
| 
       52 
     | 
    
         
            -
              end
         
     | 
| 
       53 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,19 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Sentry
         
     | 
| 
       4 
     | 
    
         
            -
              module Metrics
         
     | 
| 
       5 
     | 
    
         
            -
                class Metric
         
     | 
| 
       6 
     | 
    
         
            -
                  def add(value)
         
     | 
| 
       7 
     | 
    
         
            -
                    raise NotImplementedError
         
     | 
| 
       8 
     | 
    
         
            -
                  end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                  def serialize
         
     | 
| 
       11 
     | 
    
         
            -
                    raise NotImplementedError
         
     | 
| 
       12 
     | 
    
         
            -
                  end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  def weight
         
     | 
| 
       15 
     | 
    
         
            -
                    raise NotImplementedError
         
     | 
| 
       16 
     | 
    
         
            -
                  end
         
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
     | 
    
         
            -
              end
         
     | 
| 
       19 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,28 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require "set"
         
     | 
| 
       4 
     | 
    
         
            -
            require "zlib"
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            module Sentry
         
     | 
| 
       7 
     | 
    
         
            -
              module Metrics
         
     | 
| 
       8 
     | 
    
         
            -
                class SetMetric < Metric
         
     | 
| 
       9 
     | 
    
         
            -
                  attr_reader :value
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                  def initialize(value)
         
     | 
| 
       12 
     | 
    
         
            -
                    @value = Set[value]
         
     | 
| 
       13 
     | 
    
         
            -
                  end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                  def add(value)
         
     | 
| 
       16 
     | 
    
         
            -
                    @value << value
         
     | 
| 
       17 
     | 
    
         
            -
                  end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                  def serialize
         
     | 
| 
       20 
     | 
    
         
            -
                    value.map { |x| x.is_a?(String) ? Zlib.crc32(x) : x.to_i }
         
     | 
| 
       21 
     | 
    
         
            -
                  end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                  def weight
         
     | 
| 
       24 
     | 
    
         
            -
                    value.size
         
     | 
| 
       25 
     | 
    
         
            -
                  end
         
     | 
| 
       26 
     | 
    
         
            -
                end
         
     | 
| 
       27 
     | 
    
         
            -
              end
         
     | 
| 
       28 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,51 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module Sentry
         
     | 
| 
       4 
     | 
    
         
            -
              module Metrics
         
     | 
| 
       5 
     | 
    
         
            -
                module Timing
         
     | 
| 
       6 
     | 
    
         
            -
                  class << self
         
     | 
| 
       7 
     | 
    
         
            -
                    def nanosecond
         
     | 
| 
       8 
     | 
    
         
            -
                      time = Sentry.utc_now
         
     | 
| 
       9 
     | 
    
         
            -
                      time.to_i * (10 ** 9) + time.nsec
         
     | 
| 
       10 
     | 
    
         
            -
                    end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                    def microsecond
         
     | 
| 
       13 
     | 
    
         
            -
                      time = Sentry.utc_now
         
     | 
| 
       14 
     | 
    
         
            -
                      time.to_i * (10 ** 6) + time.usec
         
     | 
| 
       15 
     | 
    
         
            -
                    end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                    def millisecond
         
     | 
| 
       18 
     | 
    
         
            -
                      Sentry.utc_now.to_i * (10 ** 3)
         
     | 
| 
       19 
     | 
    
         
            -
                    end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                    def second
         
     | 
| 
       22 
     | 
    
         
            -
                      Sentry.utc_now.to_i
         
     | 
| 
       23 
     | 
    
         
            -
                    end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                    def minute
         
     | 
| 
       26 
     | 
    
         
            -
                      Sentry.utc_now.to_i / 60.0
         
     | 
| 
       27 
     | 
    
         
            -
                    end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                    def hour
         
     | 
| 
       30 
     | 
    
         
            -
                      Sentry.utc_now.to_i / 3600.0
         
     | 
| 
       31 
     | 
    
         
            -
                    end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                    def day
         
     | 
| 
       34 
     | 
    
         
            -
                      Sentry.utc_now.to_i / (3600.0 * 24.0)
         
     | 
| 
       35 
     | 
    
         
            -
                    end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                    def week
         
     | 
| 
       38 
     | 
    
         
            -
                      Sentry.utc_now.to_i / (3600.0 * 24.0 * 7.0)
         
     | 
| 
       39 
     | 
    
         
            -
                    end
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                    def duration_start
         
     | 
| 
       42 
     | 
    
         
            -
                      Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
       43 
     | 
    
         
            -
                    end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                    def duration_end(start)
         
     | 
| 
       46 
     | 
    
         
            -
                      Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
         
     | 
| 
       47 
     | 
    
         
            -
                    end
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
              end
         
     | 
| 
       51 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/sentry/metrics.rb
    DELETED
    
    | 
         @@ -1,56 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require "sentry/metrics/metric"
         
     | 
| 
       4 
     | 
    
         
            -
            require "sentry/metrics/counter_metric"
         
     | 
| 
       5 
     | 
    
         
            -
            require "sentry/metrics/distribution_metric"
         
     | 
| 
       6 
     | 
    
         
            -
            require "sentry/metrics/gauge_metric"
         
     | 
| 
       7 
     | 
    
         
            -
            require "sentry/metrics/set_metric"
         
     | 
| 
       8 
     | 
    
         
            -
            require "sentry/metrics/timing"
         
     | 
| 
       9 
     | 
    
         
            -
            require "sentry/metrics/aggregator"
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            module Sentry
         
     | 
| 
       12 
     | 
    
         
            -
              module Metrics
         
     | 
| 
       13 
     | 
    
         
            -
                DURATION_UNITS = %w[nanosecond microsecond millisecond second minute hour day week]
         
     | 
| 
       14 
     | 
    
         
            -
                INFORMATION_UNITS = %w[bit byte kilobyte kibibyte megabyte mebibyte gigabyte gibibyte terabyte tebibyte petabyte pebibyte exabyte exbibyte]
         
     | 
| 
       15 
     | 
    
         
            -
                FRACTIONAL_UNITS = %w[ratio percent]
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                OP_NAME = "metric.timing"
         
     | 
| 
       18 
     | 
    
         
            -
                SPAN_ORIGIN = "auto.metric.timing"
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                class << self
         
     | 
| 
       21 
     | 
    
         
            -
                  def increment(key, value = 1.0, unit: "none", tags: {}, timestamp: nil)
         
     | 
| 
       22 
     | 
    
         
            -
                    Sentry.metrics_aggregator&.add(:c, key, value, unit: unit, tags: tags, timestamp: timestamp)
         
     | 
| 
       23 
     | 
    
         
            -
                  end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  def distribution(key, value, unit: "none", tags: {}, timestamp: nil)
         
     | 
| 
       26 
     | 
    
         
            -
                    Sentry.metrics_aggregator&.add(:d, key, value, unit: unit, tags: tags, timestamp: timestamp)
         
     | 
| 
       27 
     | 
    
         
            -
                  end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                  def set(key, value, unit: "none", tags: {}, timestamp: nil)
         
     | 
| 
       30 
     | 
    
         
            -
                    Sentry.metrics_aggregator&.add(:s, key, value, unit: unit, tags: tags, timestamp: timestamp)
         
     | 
| 
       31 
     | 
    
         
            -
                  end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                  def gauge(key, value, unit: "none", tags: {}, timestamp: nil)
         
     | 
| 
       34 
     | 
    
         
            -
                    Sentry.metrics_aggregator&.add(:g, key, value, unit: unit, tags: tags, timestamp: timestamp)
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                  def timing(key, unit: "second", tags: {}, timestamp: nil, &block)
         
     | 
| 
       38 
     | 
    
         
            -
                    return unless block_given?
         
     | 
| 
       39 
     | 
    
         
            -
                    return yield unless DURATION_UNITS.include?(unit)
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                    result, value = Sentry.with_child_span(op: OP_NAME, description: key, origin: SPAN_ORIGIN) do |span|
         
     | 
| 
       42 
     | 
    
         
            -
                      tags.each { |k, v| span.set_tag(k, v.is_a?(Array) ? v.join(", ") : v.to_s) } if span
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                      start = Timing.send(unit.to_sym)
         
     | 
| 
       45 
     | 
    
         
            -
                      result = yield
         
     | 
| 
       46 
     | 
    
         
            -
                      value = Timing.send(unit.to_sym) - start
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                      [result, value]
         
     | 
| 
       49 
     | 
    
         
            -
                    end
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
                    Sentry.metrics_aggregator&.add(:d, key, value, unit: unit, tags: tags, timestamp: timestamp)
         
     | 
| 
       52 
     | 
    
         
            -
                    result
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
                end
         
     | 
| 
       55 
     | 
    
         
            -
              end
         
     | 
| 
       56 
     | 
    
         
            -
            end
         
     |