raygun-apm-sidekiq 1.0.11 → 1.0.16
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/.gitignore +1 -0
- data/CHANGELOG.rdoc +22 -0
- data/Gemfile.lock +5 -5
- data/lib/raygun/apm/sidekiq.rb +2 -2
- data/lib/raygun/apm/sidekiq/hook.rb +135 -0
- data/lib/raygun/apm/sidekiq/railtie.rb +7 -9
- data/lib/raygun/apm/sidekiq/version.rb +1 -1
- metadata +4 -4
- data/lib/raygun/apm/sidekiq/middleware.rb +0 -127
- data/raygun-apm-sidekiq-1.0.0.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8b45cd686413df0cefdc5546fbf08a31e36060b7393e828bd83c19239ad43c0
|
4
|
+
data.tar.gz: 1b3662d09b9d64a04539c9f5fceba35d73c34ec1847c492688170ee66de3ff85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dce241ad3576c65f8943d666b22db69b715fb1baa898a44f68ea16a03cb8e2ab35615cba1c47b61f5e05072a5a06f9458c871c3cede06683b88c383f51f49677
|
7
|
+
data.tar.gz: 2263c613a2deefeab136f326cf5a7cc2500975a587a4be6f9754fdc21688730312fcdece83c66c242cb827c90085539c1e28d502eee4f7cbe35664b73f668b1a
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,27 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== 1.0.16 (June 8, 2020)
|
4
|
+
|
5
|
+
* Integrate exception correlation with rayrun4ruby
|
6
|
+
* Move raygun4ruby whitelisting and blacklisting out to profiler core
|
7
|
+
|
8
|
+
== 1.0.15 (May 17, 2020)
|
9
|
+
|
10
|
+
* Remove the Tracer#process_started callback (set on begin transaction command now)
|
11
|
+
|
12
|
+
== 1.0.14 (May 15, 2020)
|
13
|
+
|
14
|
+
* Introduce support for Redis as client adapter
|
15
|
+
* Prefer hooking Sidekiq::Processor as Middleware does not wrap enough to intercept the raygun4ruby error handler as an HTTP OUT event
|
16
|
+
|
17
|
+
== 1.0.13 (April 2, 2020)
|
18
|
+
|
19
|
+
* Prefer hooking Sidekiq::Processor as Middleware does not wrap enough to intercept the raygun4ruby error handler as an HTTP OUT event
|
20
|
+
|
21
|
+
== 1.0.12 (March 25, 2020)
|
22
|
+
|
23
|
+
* Do not cache PID on HTTP OUT and SQL events
|
24
|
+
|
3
25
|
== 1.0.11 (March 15, 2020)
|
4
26
|
|
5
27
|
* Emit the happy path and error state HTTP IN events for Sidekiq jobs WITHIN the entrypoint function for the agent to pick it up
|
data/Gemfile.lock
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
raygun-apm-
|
5
|
-
raygun-apm (~>
|
4
|
+
raygun-apm-sidekiq (1.0.16)
|
5
|
+
raygun-apm (~> 1.0.15)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
minitest (5.13.0)
|
11
11
|
rake (10.5.0)
|
12
|
-
raygun-apm (
|
12
|
+
raygun-apm (1.0.43-universal-darwin)
|
13
13
|
|
14
14
|
PLATFORMS
|
15
15
|
ruby
|
16
16
|
|
17
17
|
DEPENDENCIES
|
18
|
-
bundler
|
18
|
+
bundler
|
19
19
|
minitest (~> 5.0)
|
20
20
|
rake (~> 10.0)
|
21
|
-
raygun-apm-
|
21
|
+
raygun-apm-sidekiq!
|
22
22
|
|
23
23
|
BUNDLED WITH
|
24
24
|
1.17.3
|
data/lib/raygun/apm/sidekiq.rb
CHANGED
@@ -0,0 +1,135 @@
|
|
1
|
+
require "sidekiq"
|
2
|
+
require 'sidekiq/processor'
|
3
|
+
|
4
|
+
module Raygun
|
5
|
+
module Apm
|
6
|
+
module Sidekiq
|
7
|
+
module Hook
|
8
|
+
def self.finalize(tracer)
|
9
|
+
proc {tracer.process_ended}
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(mgr)
|
13
|
+
super
|
14
|
+
@tracer = Raygun::Apm::Tracer.instance || init_tracer
|
15
|
+
end
|
16
|
+
|
17
|
+
def process(work)
|
18
|
+
job_hash = ::Sidekiq.load_json(work.job)
|
19
|
+
queue = work.queue_name
|
20
|
+
# Can be nil if we had a fatal error
|
21
|
+
if @tracer
|
22
|
+
@worker_started = @tracer.now
|
23
|
+
@tracer.start_trace
|
24
|
+
end
|
25
|
+
exception = nil
|
26
|
+
Ruby_APM_profiler_trace do
|
27
|
+
begin
|
28
|
+
super
|
29
|
+
fake_http_in_handler(@tracer, @worker_started, job_hash, queue, nil) if @tracer
|
30
|
+
rescue => e
|
31
|
+
fake_http_in_handler(@tracer, @worker_started, job_hash, queue, e) if @tracer
|
32
|
+
exception = e
|
33
|
+
end
|
34
|
+
end
|
35
|
+
# Can be nil if we had a fatal error
|
36
|
+
@tracer.end_trace if @tracer
|
37
|
+
raise exception if exception
|
38
|
+
rescue Raygun::Apm::FatalError => e
|
39
|
+
raygun_shutdown_handler(e)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def init_tracer
|
45
|
+
tracer = Raygun::Apm::Tracer.new
|
46
|
+
tracer.udp_sink!
|
47
|
+
ObjectSpace.define_finalizer(self, Hook.finalize(tracer))
|
48
|
+
|
49
|
+
ActiveSupport::Notifications.unsubscribe(@sql_subscriber) if @sql_subscriber
|
50
|
+
@sql_subscriber = ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
|
51
|
+
sql_handler(tracer, args)
|
52
|
+
end
|
53
|
+
|
54
|
+
GC.stress = true if ENV['RAYGUN_STRESS_GC']
|
55
|
+
Raygun::Apm::Tracer.instance = tracer
|
56
|
+
# If any fatal errors on init, shutdown the tracer
|
57
|
+
rescue Raygun::Apm::FatalError => e
|
58
|
+
raygun_shutdown_handler(e)
|
59
|
+
end
|
60
|
+
|
61
|
+
def raygun_shutdown_handler(exception)
|
62
|
+
warn "[Raygun APM] shutting down due to error - #{exception.message} #{exception.backtrace.join("\n")}"
|
63
|
+
# Kill extended event subcriptions
|
64
|
+
ActiveSupport::Notifications.unsubscribe(@sql_subscriber)
|
65
|
+
warn "[Raygun APM] notification hooks unsubscribed"
|
66
|
+
# Let the GC clean up the sink thread through the finalizer below
|
67
|
+
@tracer = nil
|
68
|
+
Raygun::Apm::Tracer.instance = nil
|
69
|
+
raise(exception) unless (Raygun::Apm::FatalError === exception)
|
70
|
+
end
|
71
|
+
|
72
|
+
def fake_http_in_handler(tracer, started, msg, queue, exception)
|
73
|
+
ended = tracer.now
|
74
|
+
event = http_in_event
|
75
|
+
event[:pid] = Process.pid
|
76
|
+
event[:url] = "sidekiq://#{queue}/#{msg["class"]}?#{msg["jid"]}"
|
77
|
+
event[:status] = exception ? 500 : 200
|
78
|
+
event[:duration] = ended - started
|
79
|
+
event[:timestamp] = tracer.now
|
80
|
+
event[:tid] = tracer.get_thread_id(Thread.current)
|
81
|
+
tracer.emit(event)
|
82
|
+
rescue => e
|
83
|
+
warn "[Raygun APM] error reporting HTTP IN event #{e.class} #{e.backtrace.join("\n")}"
|
84
|
+
raygun_shutdown_handler(e)
|
85
|
+
end
|
86
|
+
|
87
|
+
def http_in_event
|
88
|
+
@http_in_event ||= begin
|
89
|
+
event = Raygun::Apm::Event::HttpIn.new
|
90
|
+
event[:verb] = "POST"
|
91
|
+
event
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def sql_handler(tracer, args)
|
96
|
+
notification = ActiveSupport::Notifications::Event.new *args
|
97
|
+
connection = if notification.payload[:connection]
|
98
|
+
notification.payload[:connection]
|
99
|
+
else
|
100
|
+
ObjectSpace._id2ref(notification.payload[:connection_id])
|
101
|
+
end
|
102
|
+
event = sql_event
|
103
|
+
event[:pid] = Process.pid
|
104
|
+
event[:query] = notification.payload[:sql]
|
105
|
+
|
106
|
+
# XXX this is hacky
|
107
|
+
if config = connection.instance_variable_get('@config')
|
108
|
+
event[:provider] = config[:adapter]
|
109
|
+
event[:host] = config[:host]
|
110
|
+
event[:database] = config[:database]
|
111
|
+
end
|
112
|
+
|
113
|
+
# XXX constant milliseconds to microseconds
|
114
|
+
event[:duration] = notification.duration * 1000
|
115
|
+
event[:timestamp] = notification.time.to_f * 1000000
|
116
|
+
event[:tid] = tracer.get_thread_id(Thread.current)
|
117
|
+
tracer.emit(event)
|
118
|
+
rescue => e
|
119
|
+
warn "[Raygun APM] error reporting SQL event"
|
120
|
+
raygun_shutdown_handler(e)
|
121
|
+
end
|
122
|
+
|
123
|
+
def sql_event
|
124
|
+
@sql_event ||= Raygun::Apm::Event::Sql.new
|
125
|
+
end
|
126
|
+
|
127
|
+
def Ruby_APM_profiler_trace
|
128
|
+
yield
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
Sidekiq::Processor.prepend Raygun::Apm::Sidekiq::Hook
|
@@ -4,18 +4,16 @@ module Raygun
|
|
4
4
|
class Railtie < ::Rails::Railtie
|
5
5
|
initializer "raygun.apm.sidekiq" do |app|
|
6
6
|
require "raygun/apm"
|
7
|
-
require "raygun/apm/sidekiq/
|
8
|
-
require "sidekiq"
|
7
|
+
require "raygun/apm/sidekiq/hook"
|
9
8
|
Raygun::Apm::Blacklist.extend_with Raygun::Apm::Sidekiq::BLACKLIST
|
10
|
-
|
11
|
-
::Sidekiq.configure_server do |config|
|
12
|
-
config.server_middleware do |chain|
|
13
|
-
chain.prepend Raygun::Apm::Sidekiq::Middleware
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
9
|
# Explictly enable instrumenting HTTP until a good control API is figured out
|
18
10
|
require "raygun/apm/hooks/net_http"
|
11
|
+
require "raygun/apm/hooks/redis" if defined?(Redis::Client)
|
12
|
+
# Attempt to explicitly require the raygun4ruby sidekiq integration
|
13
|
+
begin
|
14
|
+
require "raygun/sidekiq"
|
15
|
+
rescue LoadError
|
16
|
+
end
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raygun-apm-sidekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raygun
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-06-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: raygun-apm
|
@@ -75,6 +75,7 @@ executables: []
|
|
75
75
|
extensions: []
|
76
76
|
extra_rdoc_files: []
|
77
77
|
files:
|
78
|
+
- ".gitignore"
|
78
79
|
- CHANGELOG.rdoc
|
79
80
|
- Gemfile
|
80
81
|
- Gemfile.lock
|
@@ -83,10 +84,9 @@ files:
|
|
83
84
|
- bin/console
|
84
85
|
- bin/setup
|
85
86
|
- lib/raygun/apm/sidekiq.rb
|
86
|
-
- lib/raygun/apm/sidekiq/
|
87
|
+
- lib/raygun/apm/sidekiq/hook.rb
|
87
88
|
- lib/raygun/apm/sidekiq/railtie.rb
|
88
89
|
- lib/raygun/apm/sidekiq/version.rb
|
89
|
-
- raygun-apm-sidekiq-1.0.0.gem
|
90
90
|
- raygun-apm-sidekiq.gemspec
|
91
91
|
homepage: https://raygun.com/platform/apm
|
92
92
|
licenses: []
|
@@ -1,127 +0,0 @@
|
|
1
|
-
module Raygun
|
2
|
-
module Apm
|
3
|
-
module Sidekiq
|
4
|
-
class Middleware
|
5
|
-
def initialize
|
6
|
-
@tracer = Raygun::Apm::Tracer.instance || self.class.init_tracer
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(worker_instance, msg, queue)
|
10
|
-
# Can be nil if we had a fatal error
|
11
|
-
if @tracer
|
12
|
-
started = @tracer.now
|
13
|
-
@tracer.start_trace
|
14
|
-
end
|
15
|
-
exception = nil
|
16
|
-
Ruby_APM_profiler_trace do
|
17
|
-
yield
|
18
|
-
self.class.fake_http_in_handler(@tracer, started, worker_instance, msg, queue, nil) if @tracer
|
19
|
-
rescue => e
|
20
|
-
self.class.fake_http_in_handler(@tracer, started, worker_instance, msg, queue, exception) if @tracer
|
21
|
-
end
|
22
|
-
# Can be nil if we had a fatal error
|
23
|
-
@tracer.end_trace if @tracer
|
24
|
-
rescue Raygun::Apm::FatalError => e
|
25
|
-
self.class.raygun_shutdown_handler(e)
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def self.init_tracer
|
31
|
-
tracer = Raygun::Apm::Tracer.new
|
32
|
-
tracer.udp_sink!
|
33
|
-
tracer.process_started
|
34
|
-
ObjectSpace.define_finalizer(self, self.finalize(tracer))
|
35
|
-
|
36
|
-
@sql_subscriber = ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
|
37
|
-
sql_handler(tracer, args)
|
38
|
-
end
|
39
|
-
|
40
|
-
GC.stress = true if ENV['RAYGUN_STRESS_GC']
|
41
|
-
Raygun::Apm::Tracer.instance = tracer
|
42
|
-
# If any fatal errors on init, shutdown the tracer
|
43
|
-
rescue Raygun::Apm::FatalError => e
|
44
|
-
raygun_shutdown_handler(e)
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.raygun_shutdown_handler(exception)
|
48
|
-
warn "Raygun APM shutting down due to error - %s", exception.message
|
49
|
-
# Kill extended event subcriptions
|
50
|
-
ActiveSupport::Notifications.unsubscribe(@sql_subscriber)
|
51
|
-
warn "[Raygun APM] notification hooks unsubscribed"
|
52
|
-
# Let the GC clean up the sink thread through the finalizer below
|
53
|
-
@tracer = nil
|
54
|
-
Raygun::Apm::Tracer.instance = nil
|
55
|
-
raise(exception) unless (Raygun::Apm::FatalError === exception)
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.fake_http_in_handler(tracer, started, worker_instance, msg, queue, exception)
|
59
|
-
ended = tracer.now
|
60
|
-
event = http_in_event
|
61
|
-
event[:url] = "sidekiq://#{queue}/#{msg["class"]}?#{msg["jid"]}"
|
62
|
-
event[:status] = exception ? 500 : 200
|
63
|
-
event[:duration] = ended - started
|
64
|
-
event[:timestamp] = tracer.now
|
65
|
-
event[:tid] = tracer.get_thread_id(Thread.current)
|
66
|
-
tracer.emit(event)
|
67
|
-
raise(exception) if exception
|
68
|
-
rescue => e
|
69
|
-
warn "[Raygun APM] error reporting HTTP IN event"
|
70
|
-
raygun_shutdown_handler(e)
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.http_in_event
|
74
|
-
@http_in_event ||= begin
|
75
|
-
event = Raygun::Apm::Event::HttpIn.new
|
76
|
-
event[:pid] = Process.pid
|
77
|
-
event[:verb] = "POST"
|
78
|
-
event
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.sql_handler(tracer, args)
|
83
|
-
notification = ActiveSupport::Notifications::Event.new *args
|
84
|
-
connection = if notification.payload[:connection]
|
85
|
-
notification.payload[:connection]
|
86
|
-
else
|
87
|
-
ObjectSpace._id2ref(notification.payload[:connection_id])
|
88
|
-
end
|
89
|
-
event = sql_event
|
90
|
-
event[:query] = notification.payload[:sql]
|
91
|
-
|
92
|
-
# XXX this is hacky
|
93
|
-
if config = connection.instance_variable_get('@config')
|
94
|
-
event[:provider] = config[:adapter]
|
95
|
-
event[:host] = config[:host]
|
96
|
-
event[:database] = config[:database]
|
97
|
-
end
|
98
|
-
|
99
|
-
# XXX constant milliseconds to microseconds
|
100
|
-
event[:duration] = notification.duration * 1000
|
101
|
-
event[:timestamp] = notification.time.to_f * 1000000
|
102
|
-
event[:tid] = tracer.get_thread_id(Thread.current)
|
103
|
-
tracer.emit(event)
|
104
|
-
rescue => e
|
105
|
-
warn "[Raygun APM] error reporting SQL event"
|
106
|
-
raygun_shutdown_handler(e)
|
107
|
-
end
|
108
|
-
|
109
|
-
def self.sql_event
|
110
|
-
@sql_event ||= begin
|
111
|
-
event = Raygun::Apm::Event::Sql.new
|
112
|
-
event[:pid] = Process.pid
|
113
|
-
event
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def Ruby_APM_profiler_trace
|
118
|
-
yield
|
119
|
-
end
|
120
|
-
|
121
|
-
def self.finalize(tracer)
|
122
|
-
proc {tracer.process_ended}
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
Binary file
|