sentry-ruby 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f8f89cd1b0354cede1b5aab23b0b8652fed01bcebc3af7f0cb45a13d0f1d99ba
4
- data.tar.gz: 38fa765f4acb958b8170a31017028a45cce342667bd8dee7dbff07c4e097ffc5
3
+ metadata.gz: de5539f70eb6f49164765e4e13416bef15f8b697349f2d2e71f63ac57916f325
4
+ data.tar.gz: 89121fce3fb31be7fe783599ee204ab86354f70a870ce775c79e4a33f6141e13
5
5
  SHA512:
6
- metadata.gz: be0a56af7629bf528be987f62bcb0a4fd12430d75b7541acc6d946314306ab4968c214eb7a533695dcd8aa3b3f434225f8dffceecee4bc39a8b5bd45e168e3d1
7
- data.tar.gz: 383d6e88932c6ff3f6e79ca3c35c05d7a23151dd85db057e45dc8577f88673e8195659df3a0c01d71b1e67a61e7f1008eb36ab294047fdeea5cedf2a7d02f92c
6
+ metadata.gz: ca35ae1d033f68fcebfe2c3e9e4b91fa2784a56261423a1bc5e5c7550b6304eb63963bf4273b22e924db27e1287f256e712b7e74781d866e71bae288308e13ae
7
+ data.tar.gz: e5853d409d5bbbb4b60ecee8c1edc3c6de91971b39938c03a19895ce790246cc234e5441d848aaba745ccc90cc4bbd3f1df4eb3108c18ea68736dab41f2ca93f
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0
4
+
5
+ - Major API changes: [1123](https://github.com/getsentry/sentry-ruby/pull/1123)
6
+ - Support event hint: [1122](https://github.com/getsentry/sentry-ruby/pull/1122)
7
+ - Add request-id tag to events: [1120](https://github.com/getsentry/sentry-ruby/pull/1120) (by @tvec)
8
+
3
9
  ## 0.2.0
4
10
 
5
11
  - Multiple fixes and refactorings
@@ -1,3 +1,5 @@
1
+ require "forwardable"
2
+
1
3
  require "sentry/version"
2
4
  require "sentry/core_ext/object/deep_dup"
3
5
  require "sentry/configuration"
@@ -28,6 +30,10 @@ module Sentry
28
30
  end
29
31
 
30
32
  class << self
33
+ extend Forwardable
34
+
35
+ def_delegators :get_current_scope, :set_tags, :set_extras, :set_user
36
+
31
37
  def init(&block)
32
38
  config = Configuration.new
33
39
  yield(config)
@@ -46,8 +52,8 @@ module Sentry
46
52
  configuration.logger
47
53
  end
48
54
 
49
- def breadcrumbs
50
- get_current_scope.breadcrumbs
55
+ def add_breadcrumb(breadcrumb, &block)
56
+ get_current_scope.breadcrumbs.record(breadcrumb, &block)
51
57
  end
52
58
 
53
59
  def configuration
@@ -2,13 +2,13 @@ module Sentry
2
2
  class Breadcrumb
3
3
  attr_accessor :category, :data, :message, :level, :timestamp, :type
4
4
 
5
- def initialize
6
- @category = nil
7
- @data = {}
8
- @level = nil
9
- @message = nil
10
- @timestamp = Sentry.utc_now.to_i
11
- @type = nil
5
+ def initialize(category: nil, data: nil, message: nil, timestamp: nil, level: nil, type: nil)
6
+ @category = category
7
+ @data = data || {}
8
+ @level = level
9
+ @message = message
10
+ @timestamp = timestamp || Sentry.utc_now.to_i
11
+ @type = type
12
12
  end
13
13
 
14
14
  def to_hash
@@ -58,17 +58,15 @@ module Sentry
58
58
  last_crumb = current_breadcrumbs.peek
59
59
  # try to avoid dupes from logger broadcasts
60
60
  if last_crumb.nil? || last_crumb.message != message
61
- current_breadcrumbs.record do |crumb|
62
- crumb.level = Sentry::Breadcrumb::SentryLogger::LEVELS.fetch(severity, nil)
63
- crumb.category = category
64
- crumb.message = message
65
- crumb.type =
66
- if severity >= 3
67
- "error"
68
- else
69
- crumb.level
70
- end
71
- end
61
+ level = Sentry::Breadcrumb::SentryLogger::LEVELS.fetch(severity, nil)
62
+ crumb = Sentry::Breadcrumb.new(
63
+ level: level,
64
+ category: category,
65
+ message: message,
66
+ type: severity >= 3 ? "error" : level
67
+ )
68
+
69
+ Sentry.add_breadcrumb(crumb)
72
70
  end
73
71
  end
74
72
 
@@ -80,7 +78,7 @@ module Sentry
80
78
  end
81
79
 
82
80
  def current_breadcrumbs
83
- Sentry.breadcrumbs
81
+ Sentry.get_current_scope.breadcrumbs
84
82
  end
85
83
  end
86
84
  end
@@ -10,11 +10,8 @@ module Sentry
10
10
  @buffer = Array.new(size)
11
11
  end
12
12
 
13
- def record(crumb = nil)
14
- if block_given?
15
- crumb = Breadcrumb.new if crumb.nil?
16
- yield(crumb)
17
- end
13
+ def record(crumb)
14
+ yield(crumb) if block_given?
18
15
  @buffer.slice!(0)
19
16
  @buffer << crumb
20
17
  end
@@ -20,8 +20,8 @@ module Sentry
20
20
  end
21
21
  end
22
22
 
23
- def capture_event(event, scope)
24
- scope.apply_to_event(event)
23
+ def capture_event(event, scope, hint = nil)
24
+ scope.apply_to_event(event, hint)
25
25
 
26
26
  if configuration.async?
27
27
  begin
@@ -30,10 +30,10 @@ module Sentry
30
30
  configuration.async.call(event.to_json_compatible)
31
31
  rescue => e
32
32
  configuration.logger.error(LOGGER_PROGNAME) { "async event sending failed: #{e.message}" }
33
- send_event(event)
33
+ send_event(event, hint)
34
34
  end
35
35
  else
36
- send_event(event)
36
+ send_event(event, hint)
37
37
  end
38
38
 
39
39
  event
@@ -63,10 +63,10 @@ module Sentry
63
63
  end
64
64
  end
65
65
 
66
- def send_event(event)
67
- return false unless configuration.sending_allowed?(event)
66
+ def send_event(event, hint = nil)
67
+ return false unless configuration.sending_allowed?
68
68
 
69
- event = configuration.before_send.call(event) if configuration.before_send
69
+ event = configuration.before_send.call(event, hint) if configuration.before_send
70
70
  if event.nil?
71
71
  configuration.logger.info(LOGGER_PROGNAME) { "Discarded event because before_send returned nil" }
72
72
  return
@@ -46,13 +46,13 @@ module Sentry
46
46
  attr_accessor :context_lines
47
47
 
48
48
  # RACK_ENV by default.
49
- attr_reader :current_environment
49
+ attr_reader :environment
50
50
 
51
51
  # the dsn value, whether it's set via `config.dsn=` or `ENV["SENTRY_DSN"]`
52
52
  attr_reader :dsn
53
53
 
54
- # Whitelist of environments that will send notifications to Sentry. Array of Strings.
55
- attr_accessor :environments
54
+ # Whitelist of enabled_environments that will send notifications to Sentry. Array of Strings.
55
+ attr_accessor :enabled_environments
56
56
 
57
57
  # Logger 'progname's to exclude from breadcrumbs
58
58
  attr_accessor :exclude_loggers
@@ -101,12 +101,6 @@ module Sentry
101
101
 
102
102
  attr_accessor :server_name
103
103
 
104
- # Provide a configurable callback to determine event capture.
105
- # Note that the object passed into the block will be a String (messages) or
106
- # an exception.
107
- # e.g. lambda { |exc_or_msg| exc_or_msg.some_attr == false }
108
- attr_reader :should_capture
109
-
110
104
  # Return a Transport::Configuration object for transport-related configurations.
111
105
  attr_reader :transport
112
106
 
@@ -154,8 +148,8 @@ module Sentry
154
148
  self.async = false
155
149
  self.breadcrumbs_logger = []
156
150
  self.context_lines = 3
157
- self.current_environment = current_environment_from_env
158
- self.environments = []
151
+ self.environment = environment_from_env
152
+ self.enabled_environments = []
159
153
  self.exclude_loggers = []
160
154
  self.excluded_exceptions = IGNORE_DEFAULT.dup
161
155
  self.inspect_exception_causes_for_exclusion = false
@@ -169,7 +163,6 @@ module Sentry
169
163
  self.send_default_pii = false
170
164
  self.dsn = ENV['SENTRY_DSN']
171
165
  self.server_name = server_name_from_env
172
- self.should_capture = false
173
166
 
174
167
  self.before_send = false
175
168
  self.rack_env_whitelist = RACK_ENV_WHITELIST_DEFAULT
@@ -213,14 +206,6 @@ module Sentry
213
206
  @breadcrumbs_logger = logger
214
207
  end
215
208
 
216
- def should_capture=(value)
217
- unless value == false || value.respond_to?(:call)
218
- raise ArgumentError, "should_capture must be callable (or false to disable)"
219
- end
220
-
221
- @should_capture = value
222
- end
223
-
224
209
  def before_send=(value)
225
210
  unless value == false || value.respond_to?(:call)
226
211
  raise ArgumentError, "before_send must be callable (or false to disable)"
@@ -229,20 +214,17 @@ module Sentry
229
214
  @before_send = value
230
215
  end
231
216
 
232
- def current_environment=(environment)
233
- @current_environment = environment.to_s
217
+ def environment=(environment)
218
+ @environment = environment.to_s
234
219
  end
235
220
 
236
- def capture_allowed?(message_or_exc = nil)
221
+ def sending_allowed?
237
222
  @errors = []
238
223
 
239
224
  valid? &&
240
- capture_in_current_environment? &&
241
- capture_allowed_by_callback?(message_or_exc) &&
225
+ capture_in_environment? &&
242
226
  sample_allowed?
243
227
  end
244
- # If we cannot capture, we cannot send.
245
- alias sending_allowed? capture_allowed?
246
228
 
247
229
  def error_messages
248
230
  @errors = [@errors[0]] + @errors[1..-1].map(&:downcase) # fix case of all but first
@@ -267,7 +249,7 @@ module Sentry
267
249
  end
268
250
 
269
251
  def enabled_in_current_env?
270
- environments.empty? || environments.include?(current_environment)
252
+ enabled_environments.empty? || enabled_environments.include?(environment)
271
253
  end
272
254
 
273
255
  def tracing_enabled?
@@ -353,17 +335,10 @@ module Sentry
353
335
  ENV['SENTRY_RELEASE']
354
336
  end
355
337
 
356
- def capture_in_current_environment?
338
+ def capture_in_environment?
357
339
  return true if enabled_in_current_env?
358
340
 
359
- @errors << "Not configured to send/capture in environment '#{current_environment}'"
360
- false
361
- end
362
-
363
- def capture_allowed_by_callback?(message_or_exc)
364
- return true if !should_capture || message_or_exc.nil? || should_capture.call(message_or_exc)
365
-
366
- @errors << "should_capture returned false"
341
+ @errors << "Not configured to send/capture in environment '#{environment}'"
367
342
  false
368
343
  end
369
344
 
@@ -394,7 +369,7 @@ module Sentry
394
369
  Socket.gethostbyname(hostname).first rescue server_name
395
370
  end
396
371
 
397
- def current_environment_from_env
372
+ def environment_from_env
398
373
  ENV['SENTRY_CURRENT_ENV'] || ENV['SENTRY_ENVIRONMENT'] || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'default'
399
374
  end
400
375
 
@@ -5,6 +5,7 @@ require 'securerandom'
5
5
  require 'sentry/interface'
6
6
  require 'sentry/backtrace'
7
7
  require 'sentry/utils/real_ip'
8
+ require 'sentry/utils/request_id'
8
9
 
9
10
  module Sentry
10
11
  class Event
@@ -37,7 +38,7 @@ module Sentry
37
38
  @fingerprint = []
38
39
 
39
40
  @server_name = configuration.server_name
40
- @environment = configuration.current_environment
41
+ @environment = configuration.environment
41
42
  @release = configuration.release
42
43
  @modules = configuration.gem_specs if configuration.send_modules
43
44
 
@@ -82,6 +83,9 @@ module Sentry
82
83
  if configuration.send_default_pii && ip = calculate_real_ip_from_rack(env.dup)
83
84
  user[:ip_address] = ip
84
85
  end
86
+ if request_id = Utils::RequestId.read_from(env)
87
+ tags[:request_id] = request_id
88
+ end
85
89
  end
86
90
  end
87
91
 
@@ -80,12 +80,16 @@ module Sentry
80
80
 
81
81
  return unless event
82
82
 
83
+ options[:hint] ||= {}
84
+ options[:hint] = options[:hint].merge(exception: exception)
83
85
  capture_event(event, **options, &block)
84
86
  end
85
87
 
86
88
  def capture_message(message, **options, &block)
87
89
  return unless current_client
88
90
 
91
+ options[:hint] ||= {}
92
+ options[:hint] = options[:hint].merge(message: message)
89
93
  event = current_client.event_from_message(message)
90
94
  capture_event(event, **options, &block)
91
95
  end
@@ -93,6 +97,7 @@ module Sentry
93
97
  def capture_event(event, **options, &block)
94
98
  return unless current_client
95
99
 
100
+ hint = options.delete(:hint)
96
101
  scope = current_scope.dup
97
102
 
98
103
  if block
@@ -103,7 +108,7 @@ module Sentry
103
108
  scope.update_from_options(**options)
104
109
  end
105
110
 
106
- event = current_client.capture_event(event, scope)
111
+ event = current_client.capture_event(event, scope, hint)
107
112
 
108
113
  @last_event_id = event.event_id
109
114
  event
@@ -39,15 +39,6 @@ module Sentry
39
39
 
40
40
  private
41
41
 
42
- # Request ID based on ActionDispatch::RequestId
43
- def read_request_id_from(env_hash)
44
- REQUEST_ID_HEADERS.each do |key|
45
- request_id = env_hash[key]
46
- return request_id if request_id
47
- end
48
- nil
49
- end
50
-
51
42
  # See Sentry server default limits at
52
43
  # https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py
53
44
  def read_data_from(request)
@@ -67,7 +58,7 @@ module Sentry
67
58
  begin
68
59
  key = key.to_s # rack env can contain symbols
69
60
  value = value.to_s
70
- next memo['X-Request-Id'] ||= read_request_id_from(env_hash) if REQUEST_ID_HEADERS.include?(key)
61
+ next memo['X-Request-Id'] ||= Utils::RequestId.read_from(env_hash) if Utils::RequestId::REQUEST_ID_HEADERS.include?(key)
71
62
  next unless key.upcase == key # Non-upper case stuff isn't either
72
63
 
73
64
  # Rack adds in an incorrect HTTP_VERSION key, which causes downstream
@@ -15,7 +15,7 @@ module Sentry
15
15
  set_default_value
16
16
  end
17
17
 
18
- def apply_to_event(event)
18
+ def apply_to_event(event, hint = nil)
19
19
  event.tags = tags.merge(event.tags)
20
20
  event.user = user.merge(event.user)
21
21
  event.extra = extra.merge(event.extra)
@@ -26,14 +26,14 @@ module Sentry
26
26
  end
27
27
 
28
28
  event.fingerprint = fingerprint
29
- event.level ||= level
29
+ event.level = level
30
30
  event.transaction = transaction_names.last
31
31
  event.breadcrumbs = breadcrumbs
32
32
  event.rack_env = rack_env
33
33
 
34
34
  unless @event_processors.empty?
35
35
  @event_processors.each do |processor_block|
36
- event = processor_block.call(event)
36
+ event = processor_block.call(event, hint)
37
37
  end
38
38
  end
39
39
 
@@ -45,6 +45,7 @@ module Sentry
45
45
  return if @timestamp
46
46
 
47
47
  @timestamp = Sentry.utc_now.to_f
48
+ self
48
49
  end
49
50
 
50
51
  def to_sentry_trace
@@ -91,6 +92,14 @@ module Sentry
91
92
  child_span
92
93
  end
93
94
 
95
+ def with_child_span(**options, &block)
96
+ child_span = start_child(**options)
97
+
98
+ yield(child_span)
99
+
100
+ child_span.finish
101
+ end
102
+
94
103
  def set_op(op)
95
104
  @op = op
96
105
  end
@@ -0,0 +1,16 @@
1
+ module Sentry
2
+ module Utils
3
+ module RequestId
4
+ REQUEST_ID_HEADERS = %w(action_dispatch.request_id HTTP_X_REQUEST_ID).freeze
5
+
6
+ # Request ID based on ActionDispatch::RequestId
7
+ def self.read_from(env_hash)
8
+ REQUEST_ID_HEADERS.each do |key|
9
+ request_id = env_hash[key]
10
+ return request_id if request_id
11
+ end
12
+ nil
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Sentry
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-30 00:00:00.000000000 Z
11
+ date: 2020-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -78,6 +78,7 @@ files:
78
78
  - lib/sentry/transport/state.rb
79
79
  - lib/sentry/utils/exception_cause_chain.rb
80
80
  - lib/sentry/utils/real_ip.rb
81
+ - lib/sentry/utils/request_id.rb
81
82
  - lib/sentry/version.rb
82
83
  - sentry-ruby.gemspec
83
84
  homepage: https://github.com/getsentry/raven-ruby