sentry-ruby-core 4.4.2 → 4.5.0.pre.beta.1

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: 46eeab9b7fdc33dd16bbcdd3c7623dcffdc2e70d1c9af0016c4584a08bf743dd
4
- data.tar.gz: 0ebfed842099817048aeb8754f27dfd7e637a66d8b9f64267bd1953cbd1f9645
3
+ metadata.gz: 39b0d720876099298375f0ea0130ced0effa7fe7cb3c153d5075cff400788d7a
4
+ data.tar.gz: 3e89ef0214a1b632274605984514aa4703d6aea3bcc6c625d8f32eaa2f552203
5
5
  SHA512:
6
- metadata.gz: 76284658bda5c4856caf4017046d7f1d6481a11d9287ab0b9ac8363248d1606c7b7a274c9018b56db33062682ceac0f090d614b154048d9e17da4b0a11c98de1
7
- data.tar.gz: 3462df382685823d4cd77ac0278644144b0570c04f15db4b2a58d591de8cb25fe3762f222adaf4bb990934c476bfc49b18dfc072021e96bb3f50943caa3dceca
6
+ metadata.gz: 263a733c7d5c2ca356a1de8f5b75b7ec1266e1ea6abe57b20db0a4789a2bd7bb1444dababc06a1291089c009dbcae05b8ded8a11bcd21f721ece3df454e1fb8b
7
+ data.tar.gz: b256b35de1a11df8e0b3468d47365fec0646da828f05e3161cd4b0374a5b7fda4586d911146895d04bb6574306688b587012c6b85d3b09baf096771efb3d1e49
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ### Features
6
+
7
+ - Implement sentry-trace propagation [#1446](https://github.com/getsentry/sentry-ruby/pull/1446)
8
+
9
+ The SDK will insert the `sentry-trace` to outgoing requests made with `Net::HTTP`. Its value would look like `d827317d25d5420aa3aa97a0257db998-57757614642bdff5-1`.
10
+
11
+ If the receiver service also uses Sentry and the SDK supports performance monitoring, its tracing event will be connected with the sender application's.
12
+
13
+ Example:
14
+
15
+ <img width="1283" alt="connect sentry trace" src="https://user-images.githubusercontent.com/5079556/118963250-d7b40980-b998-11eb-9de4-598d1b220137.png">
16
+
17
+ This feature is activated by default. But users can use the new `config.propagate_traces` config option to disable it.
18
+
19
+ ### Bug Fixes
20
+
21
+ - Allow toggling background sending on the fly [#1447](https://github.com/getsentry/sentry-ruby/pull/1447)
22
+
3
23
  ## 4.4.2
4
24
 
5
25
  - Fix NoMethodError when SDK's dsn is nil [#1433](https://github.com/getsentry/sentry-ruby/pull/1433)
data/lib/sentry-ruby.rb CHANGED
@@ -32,6 +32,8 @@ module Sentry
32
32
 
33
33
  LOGGER_PROGNAME = "sentry".freeze
34
34
 
35
+ SENTRY_TRACE_HEADER_NAME = "sentry-trace".freeze
36
+
35
37
  THREAD_LOCAL = :sentry_hub
36
38
 
37
39
  def self.sdk_meta
data/lib/sentry/client.rb CHANGED
@@ -30,7 +30,7 @@ module Sentry
30
30
 
31
31
  if async_block = configuration.async
32
32
  dispatch_async_event(async_block, event, hint)
33
- elsif hint.fetch(:background, true)
33
+ elsif configuration.background_worker_threads != 0 && hint.fetch(:background, true)
34
34
  dispatch_background_event(event, hint)
35
35
  else
36
36
  send_event(event, hint)
@@ -95,6 +95,14 @@ module Sentry
95
95
  raise
96
96
  end
97
97
 
98
+ def generate_sentry_trace(span)
99
+ return unless configuration.propagate_traces
100
+
101
+ trace = span.to_sentry_trace
102
+ log_debug("[Tracing] Adding #{SENTRY_TRACE_HEADER_NAME} header to outgoing request: #{trace}")
103
+ trace
104
+ end
105
+
98
106
  private
99
107
 
100
108
  def dispatch_background_event(event, hint)
@@ -106,6 +106,9 @@ module Sentry
106
106
  # Set automatically for Rails.
107
107
  attr_reader :project_root
108
108
 
109
+ # Insert sentry-trace to outgoing requests' headers
110
+ attr_accessor :propagate_traces
111
+
109
112
  # Array of rack env parameters to be included in the event sent to sentry.
110
113
  attr_accessor :rack_env_whitelist
111
114
 
@@ -190,6 +193,7 @@ module Sentry
190
193
  self.linecache = ::Sentry::LineCache.new
191
194
  self.logger = ::Sentry::Logger.new(STDOUT)
192
195
  self.project_root = Dir.pwd
196
+ self.propagate_traces = true
193
197
 
194
198
  self.release = detect_release
195
199
  self.sample_rate = 1.0
@@ -5,7 +5,36 @@ module Sentry
5
5
  module HTTP
6
6
  OP_NAME = "net.http"
7
7
 
8
+ # To explain how the entire thing works, we need to know how the original Net::HTTP#request works
9
+ # Here's part of its definition. As you can see, it usually calls itself inside a #start block
10
+ #
11
+ # ```
12
+ # def request(req, body = nil, &block)
13
+ # unless started?
14
+ # start {
15
+ # req['connection'] ||= 'close'
16
+ # return request(req, body, &block) # <- request will be called for the second time from the first call
17
+ # }
18
+ # end
19
+ # # .....
20
+ # end
21
+ # ```
22
+ #
23
+ # So when the entire flow looks like this:
24
+ #
25
+ # 1. #request is called.
26
+ # - But because the request hasn't started yet, it calls #start (which then calls #do_start)
27
+ # - At this moment @sentry_span is still nil, so #set_sentry_trace_header returns early
28
+ # 2. #do_start then creates a new Span and assigns it to @sentry_span
29
+ # 3. #request is called for the second time.
30
+ # - This time @sentry_span should present. So #set_sentry_trace_header will set the sentry-trace header on the request object
31
+ # 4. Once the request finished, it
32
+ # - Records a breadcrumb if http_logger is set
33
+ # - Finishes the Span inside @sentry_span and clears the instance variable
34
+ #
8
35
  def request(req, body = nil, &block)
36
+ set_sentry_trace_header(req)
37
+
9
38
  super.tap do |res|
10
39
  record_sentry_breadcrumb(req, res)
11
40
  record_sentry_span(req, res)
@@ -26,6 +55,13 @@ module Sentry
26
55
 
27
56
  private
28
57
 
58
+ def set_sentry_trace_header(req)
59
+ return unless @sentry_span
60
+
61
+ trace = Sentry.get_current_client.generate_sentry_trace(@sentry_span)
62
+ req[SENTRY_TRACE_HEADER_NAME] = trace if trace
63
+ end
64
+
29
65
  def record_sentry_breadcrumb(req, res)
30
66
  if Sentry.initialized? && Sentry.configuration.breadcrumbs_logger.include?(:http_logger)
31
67
  return if from_sentry_sdk?
@@ -1,3 +1,3 @@
1
1
  module Sentry
2
- VERSION = "4.4.2"
2
+ VERSION = "4.5.0-beta.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-ruby-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.2
4
+ version: 4.5.0.pre.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-11 00:00:00.000000000 Z
11
+ date: 2021-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -122,11 +122,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
122
  version: '2.4'
123
123
  required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  requirements:
125
- - - ">="
125
+ - - ">"
126
126
  - !ruby/object:Gem::Version
127
- version: '0'
127
+ version: 1.3.1
128
128
  requirements: []
129
- rubygems_version: 3.0.3.1
129
+ rubygems_version: 3.1.6
130
130
  signing_key:
131
131
  specification_version: 4
132
132
  summary: A gem that provides a client interface for the Sentry error logger