scout_apm 2.4.17 → 2.4.18

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
  SHA1:
3
- metadata.gz: ed58dbdb3101d5cdc2b60a89a65e4c32b6917ca8
4
- data.tar.gz: 7f9b855b1ccfb592f6b86c912a32d9ef22d64eba
3
+ metadata.gz: ad3c97e9c1dd1cad2376178ad19f534cf41e53d7
4
+ data.tar.gz: 8af7268cc654088d6bd1440c693e990e4d3d2c45
5
5
  SHA512:
6
- metadata.gz: 782a5955c3cea0f7a8004d7cded41421463fc61d68dfcba15ea814be6f5b8dd9ba092e8ced672457a572bc841cdc97682f51739a27d5896177ce0da9caf7938a
7
- data.tar.gz: dee4aba092de66d99fc91e9507568f2037352b3c2362a936404949f306296b0616e087a8f6b1b13d072b1ad77a47e49f139d577400450747d8f15c5186114b0d
6
+ metadata.gz: 620703274624cc21f1e4712b425a68abfde46fe80172e8e457f8b57ec95d6c53980dc9d1ad71b69defb610d43f6be4ad60652d30e08f15d9c1cd7761c60e4e93
7
+ data.tar.gz: 11aeff7c54b15e754c2ed425233a552a2065559b3f9d6c0402e7207e54db4cdfbe47aad9d32f8465c5cf378d5e45f543a2376591a22844b26869d607218694b9
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,8 @@
1
+ # 2.4.18
2
+
3
+ * Add Shoryuken Support (#215)
4
+ * Add Sneakers Support (#216)
5
+
1
6
  # 2.4.17
2
7
 
3
8
  * Renames SQL `BEGIN` and `COMMIT` statements from `SQL#other` to `SQL#begin` and `SQL#commit`, respectively.
data/lib/scout_apm.rb CHANGED
@@ -58,6 +58,8 @@ require 'scout_apm/server_integrations/null'
58
58
  require 'scout_apm/background_job_integrations/sidekiq'
59
59
  require 'scout_apm/background_job_integrations/delayed_job'
60
60
  require 'scout_apm/background_job_integrations/resque'
61
+ require 'scout_apm/background_job_integrations/shoryuken'
62
+ require 'scout_apm/background_job_integrations/sneakers'
61
63
 
62
64
  require 'scout_apm/framework_integrations/rails_2'
63
65
  require 'scout_apm/framework_integrations/rails_3_or_4'
@@ -0,0 +1,124 @@
1
+ module ScoutApm
2
+ module BackgroundJobIntegrations
3
+ class Shoryuken
4
+ attr_reader :logger
5
+
6
+ def name
7
+ :shoryuken
8
+ end
9
+
10
+ def present?
11
+ defined?(::Shoryuken) && File.basename($PROGRAM_NAME).start_with?('shoryuken')
12
+ end
13
+
14
+ def forking?
15
+ false
16
+ end
17
+
18
+ def install
19
+ install_tracer
20
+ add_middleware
21
+ install_processor
22
+ end
23
+
24
+ def install_tracer
25
+ # ScoutApm::Tracer is not available when this class is defined
26
+ ShoryukenMiddleware.class_eval do
27
+ include ScoutApm::Tracer
28
+ end
29
+ end
30
+
31
+ def add_middleware
32
+ ::Shoryuken.configure_server do |config|
33
+ config.server_middleware do |chain|
34
+ chain.add ShoryukenMiddleware
35
+ end
36
+ end
37
+ end
38
+
39
+ def install_processor
40
+ require 'shoryuken/processor' # sidekiq v4 has not loaded this file by this point
41
+
42
+ ::Shoryuken::Processor.class_eval do
43
+ def initialize_with_scout(*args)
44
+ agent = ::ScoutApm::Agent.instance
45
+ agent.start
46
+ initialize_without_scout(*args)
47
+ end
48
+
49
+ alias_method :initialize_without_scout, :initialize
50
+ alias_method :initialize, :initialize_with_scout
51
+ end
52
+ end
53
+ end
54
+
55
+ # We insert this middleware into the Shoryuken stack, to capture each job,
56
+ # and time them.
57
+ class ShoryukenMiddleware
58
+ def call(worker_instance, queue, msg, body)
59
+ job_class =
60
+ begin
61
+ if worker_instance.class.to_s == ACTIVE_JOB_KLASS
62
+ body["job_class"]
63
+ else
64
+ worker_instance.class.to_s
65
+ end
66
+ rescue
67
+ UNKNOWN_CLASS_PLACEHOLDER
68
+ end
69
+
70
+ req = ScoutApm::RequestManager.lookup
71
+ req.annotate_request(:queue_latency => latency(msg))
72
+
73
+ begin
74
+ req.start_layer(ScoutApm::Layer.new('Queue', queue))
75
+ started_queue = true
76
+ req.start_layer(ScoutApm::Layer.new('Job', job_class))
77
+ started_job = true
78
+
79
+ yield
80
+ rescue Exception => e
81
+ req.error!
82
+ raise
83
+ ensure
84
+ req.stop_layer if started_job
85
+ req.stop_layer if started_queue
86
+ end
87
+ end
88
+
89
+ UNKNOWN_CLASS_PLACEHOLDER = 'UnknownJob'.freeze
90
+ ACTIVE_JOB_KLASS = 'ActiveJob::QueueAdapters::ShoryukenAdapter::JobWrapper'.freeze
91
+
92
+ def latency(msg, time = Time.now.to_f)
93
+ ms_since_epoch_str = msg.attributes.fetch('SentTimestamp', 0)
94
+ return 0 if ms_since_epoch_str.nil?
95
+
96
+ # Convert from ms to seconds as a float
97
+ created_at = ms_since_epoch_str.to_i / 1000.0
98
+
99
+ time - created_at
100
+ rescue => e
101
+ 0
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ # MSG: #<Shoryuken::Message:0x007fb742a96950 @client=#<Aws::SQS::Client>
108
+ # @data=#<struct Aws::SQS::Types::Message message_id="7a2ef0af-2bbd-4368-9c39-34cc89e4da15"
109
+ # receipt_handle="AQEB8YK4+TCyvCM3p0EanmhZiTbBCM6uMeyCn7zibNn+XZcMnjZp2Z8D8yoUs4mMX9vJqlQvaS8gRUGBYG7ciq+BthmEqDWfxbcJ8jN+Vp/PXIyyTgYL3vvlnHcQajDz3H7Bd30UmLu80sqeLSjXXNEiKolcIxdGuIsIdSM4aUEPXsecr5eH7o8pZHcDV+bGcLuE7VbvKRZT3A2HeezW7wWwkYve/wt6asS1bYB+VJurAORY0y26xgCooEMNbs5yqxcnSD/CiNT822hkmw0eHNpTHOjF9WLgxLbkpITnQl1lsfK5TsM/ukE1oB1F9nN5ZkCBVCDeFYJDBAo81VvVV9G16knxyCYzjnmpwhvHg2BqTA56iV6r9KZYbiwOaMPdH5ealKLRnWhFoLOEPNA4yjG1yw=="
110
+ # md5_of_body="8b3be018857a74f9e46b4c6ef3c3f515"
111
+ # body="Unique Person #7532"
112
+ # attributes={"SenderId"=>"AIDAJZXBVF26MLZPE6FOO"
113
+ # "ApproximateFirstReceiveTimestamp"=>"1534873932213"
114
+ # "ApproximateReceiveCount"=>"1"
115
+ # "SentTimestamp"=>"1534873927868"}
116
+ # md5_of_message_attributes="c70f52a6566cf42ec5e61e81877132dd"
117
+ # message_attributes={"shoryuken_class"=>#<struct Aws::SQS::Types::MessageAttributeValue string_value="DummyWorker"
118
+ # binary_value=nil
119
+ # string_list_values=[]
120
+ # binary_list_values=[]
121
+ # data_type="String">}>
122
+ # @queue_url="https://sqs.us-west-2.amazonaws.com/023109228371/shoryuken_test"
123
+ # @queue_name="shoryuken_test">
124
+
@@ -0,0 +1,87 @@
1
+ module ScoutApm
2
+ module BackgroundJobIntegrations
3
+ class Sneakers
4
+ attr_reader :logger
5
+
6
+ def name
7
+ :sneakers
8
+ end
9
+
10
+ def present?
11
+ defined?(::Sneakers)
12
+ end
13
+
14
+ def forking?
15
+ false
16
+ end
17
+
18
+ def install
19
+ install_worker_override
20
+ end
21
+
22
+ def install_worker_override
23
+ ::Sneakers::Worker.module_eval do
24
+ def initialize_with_scout(*args)
25
+ agent = ::ScoutApm::Agent.instance
26
+ agent.start
27
+ initialize_without_scout(*args)
28
+ end
29
+
30
+ alias_method :initialize_without_scout, :initialize
31
+ alias_method :initialize, :initialize_with_scout
32
+
33
+ def process_work_with_scout(*args)
34
+ delivery_info, _metadata, msg, _handler = args
35
+
36
+ queue = delivery_info[:routing_key] || UNKNOWN_QUEUE_PLACEHOLDER
37
+
38
+ job_class = begin
39
+ if self.class == ActiveJob::QueueAdapters::SneakersAdapter::JobWrapper
40
+ msg["job_class"] || UNKNOWN_CLASS_PLACEHOLDER
41
+ else
42
+ self.class.name
43
+ end
44
+ rescue => e
45
+ UNKNOWN_CLASS_PLACEHOLDER
46
+ end
47
+
48
+ req = ScoutApm::RequestManager.lookup
49
+
50
+ # RabbitMQ does not store a created-at timestamp
51
+ # req.annotate_request(:queue_latency => latency(msg))
52
+
53
+ begin
54
+ req.start_layer(ScoutApm::Layer.new('Queue', queue))
55
+ started_queue = true
56
+ req.start_layer(ScoutApm::Layer.new('Job', job_class))
57
+ started_job = true
58
+
59
+ process_work_without_scout(*args)
60
+ rescue Exception => e
61
+ req.error!
62
+ raise
63
+ ensure
64
+ req.stop_layer if started_job
65
+ req.stop_layer if started_queue
66
+ end
67
+ end
68
+
69
+ alias_method :process_work_without_scout, :process_work
70
+ alias_method :process_work, :process_work_with_scout
71
+ end
72
+
73
+ # msg = {
74
+ # "job_class":"DummyWorker",
75
+ # "job_id":"ea23ba1c-3022-4e05-870b-c3bcb1c4f328",
76
+ # "queue_name":"default",
77
+ # "arguments":["fjdkl"],
78
+ # "locale":"en"
79
+ # }
80
+ end
81
+
82
+ ACTIVE_JOB_KLASS = 'ActiveJob::QueueAdapters::SneakersAdapter::JobWrapper'.freeze
83
+ UNKNOWN_CLASS_PLACEHOLDER = 'UnknownJob'.freeze
84
+ UNKNOWN_QUEUE_PLACEHOLDER = 'default'.freeze
85
+ end
86
+ end
87
+ end
@@ -26,6 +26,8 @@ module ScoutApm
26
26
  BACKGROUND_JOB_INTEGRATIONS = [
27
27
  ScoutApm::BackgroundJobIntegrations::Resque.new,
28
28
  ScoutApm::BackgroundJobIntegrations::Sidekiq.new,
29
+ ScoutApm::BackgroundJobIntegrations::Shoryuken.new,
30
+ ScoutApm::BackgroundJobIntegrations::Sneakers.new,
29
31
  ScoutApm::BackgroundJobIntegrations::DelayedJob.new,
30
32
  ]
31
33
 
@@ -1,4 +1,4 @@
1
1
  module ScoutApm
2
- VERSION = "2.4.17"
2
+ VERSION = "2.4.18"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout_apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.17
4
+ version: 2.4.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derek Haynes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-20 00:00:00.000000000 Z
12
+ date: 2018-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -198,7 +198,9 @@ files:
198
198
  - lib/scout_apm/attribute_arranger.rb
199
199
  - lib/scout_apm/background_job_integrations/delayed_job.rb
200
200
  - lib/scout_apm/background_job_integrations/resque.rb
201
+ - lib/scout_apm/background_job_integrations/shoryuken.rb
201
202
  - lib/scout_apm/background_job_integrations/sidekiq.rb
203
+ - lib/scout_apm/background_job_integrations/sneakers.rb
202
204
  - lib/scout_apm/background_recorder.rb
203
205
  - lib/scout_apm/background_worker.rb
204
206
  - lib/scout_apm/bucket_name_splitter.rb
@@ -390,7 +392,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
390
392
  version: '0'
391
393
  requirements: []
392
394
  rubyforge_project: scout_apm
393
- rubygems_version: 2.4.6
395
+ rubygems_version: 2.4.5.2
394
396
  signing_key:
395
397
  specification_version: 4
396
398
  summary: Ruby application performance monitoring