fastly_nsq 1.12.0 → 1.13.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: 4b3aa79b5a426f1f7fa76eb8e255d54aaa30d638d20e6d097fa964533411412d
4
- data.tar.gz: c10d1e27b816a461a44240a334cd0e301e8286d7048e146fa2349d28d8b2c82a
3
+ metadata.gz: 8a96d39aaf8bfa8168a11523a097d7b06231d38f46f152d2b2432e07f51e7f69
4
+ data.tar.gz: 5107261e47c9c8786a86aff6369868acd98895e0e04b0745e6f31da1ac85f42b
5
5
  SHA512:
6
- metadata.gz: e29c14106a807b2f956bddee68bd9befa466b3ef2cb0dd18d67d4dfad073a4ecc7f21e46347fd57b01ea46b15591c63a69c043d543fd8bdea3d074ad21862187
7
- data.tar.gz: f1cbba992974f48cc0694decb443fd3e16b9465d8bcedc72afb5b6668a42f9e5cde8212e8eafac6dbe1876f074a94604e0681c54fe55c5773804a5631935111e
6
+ metadata.gz: e4d4bd99d0789eafcc85826942b564d541ad760c9d7c64892cb7627a38984493b5812e02d73fe93b8ce9580a28c9f5f4abf6ac9e86f5e87823d349af87e4d493
7
+ data.tar.gz: 25c21fcee5324ca0cb16be4fde1dd4cc434d90c7d0dc9da6fdb5158ced9b2d6e978b33799aff3aecb52fad67b84686637309b543f787adf7625ad7f984931931
@@ -1,7 +1,14 @@
1
1
  # Change Log
2
2
 
3
- ## [v1.12.0](https://github.com/fastly/fastly_nsq/tree/v1.12.0)
3
+ ## [v1.13.0](https://github.com/fastly/fastly_nsq/tree/v1.13.0)
4
4
 
5
+ [Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.12.0...v1.13.0)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Add NewRelic support [\#90](https://github.com/fastly/fastly_nsq/pull/90) ([leklund](https://github.com/leklund))
10
+
11
+ ## [v1.12.0](https://github.com/fastly/fastly_nsq/tree/v1.12.0) (2018-07-25)
5
12
  [Full Changelog](https://github.com/fastly/fastly_nsq/compare/v1.11.0...v1.12.0)
6
13
 
7
14
  **Merged pull requests:**
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  gem 'bundler-audit', '~> 0.5.0'
8
+ gem 'newrelic_rpm', require: false
8
9
  gem 'overcommit', '~> 0.32.0'
9
10
  gem 'rake', '~> 11.1.2'
10
11
  gem 'rdoc', '~> 4.2.2'
@@ -138,6 +138,13 @@ module FastlyNsq
138
138
  end
139
139
  end
140
140
  end
141
+
142
+ # Instance of FastlyNsq::NewRelic
143
+ #
144
+ # @return [FastlyNsq::NewRelic]
145
+ def tracer
146
+ @tracer ||= FastlyNsq::NewRelic.new
147
+ end
141
148
  end
142
149
  end
143
150
 
@@ -148,6 +155,7 @@ require 'fastly_nsq/listener'
148
155
  require 'fastly_nsq/manager'
149
156
  require 'fastly_nsq/message'
150
157
  require 'fastly_nsq/messenger'
158
+ require 'fastly_nsq/new_relic'
151
159
  require 'fastly_nsq/priority_queue'
152
160
  require 'fastly_nsq/priority_thread_pool'
153
161
  require 'fastly_nsq/producer'
@@ -40,6 +40,7 @@ class FastlyNsq::Feeder
40
40
  processor.call(message)
41
41
  rescue => ex
42
42
  FastlyNsq.logger.error ex
43
+ FastlyNsq.tracer.notice_error ex
43
44
  raise ex
44
45
  end
45
46
  end
@@ -113,21 +113,28 @@ class FastlyNsq::Listener
113
113
  def call(nsq_message)
114
114
  message = FastlyNsq::Message.new(nsq_message)
115
115
 
116
+ msg_info = {
117
+ channel: channel,
118
+ topic: topic,
119
+ attempts: nsq_message.attempts,
120
+ id: Digest::MD5.hexdigest(nsq_message.body.to_s),
121
+ metadata: message.meta,
122
+ }
123
+
116
124
  logger.info do
117
- {
118
- channel: channel,
119
- topic: topic,
120
- attempts: nsq_message.attempts,
121
- id: Digest::MD5.hexdigest(nsq_message.body.to_s),
122
- metadata: message.meta,
123
- }.tap do |l|
124
- l[:data] = message.body if logger.level == Logger::DEBUG
125
+ if logger.level == Logger::DEBUG
126
+ msg_info.merge(data: message.body)
127
+ else
128
+ msg_info
125
129
  end
126
130
  end
127
131
 
128
- preprocessor&.call(message)
129
- result = processor.call(message)
130
- message.finish if result
132
+ FastlyNsq.tracer.trace_with_newrelic(params: msg_info, class_name: processor.class.to_s) do
133
+ preprocessor&.call(message)
134
+ result = processor.call(message)
135
+ message.finish if result
136
+ end
137
+
131
138
  message
132
139
  end
133
140
 
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require 'newrelic_rpm'
5
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
6
+ end
7
+
8
+ ##
9
+ # FastlyNsq::NewRelic supports tracing methods with NewRelic
10
+ # if the +newrelic_rpm+ is enabled
11
+ class FastlyNsq::NewRelic
12
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation if defined?(::NewRelic)
13
+
14
+ CATEGORY = 'OtherTransaction/FastlyNsqProcessor'
15
+
16
+ attr_reader :agent
17
+
18
+ ##
19
+ # Create a FastlyNsq::NewRelic instance
20
+ # @param agent [#notice_error] optional and should only be used if you need to override the default +NewRelic::Agent+
21
+ # @example
22
+ # tracer = FastlyNsq::NewRelic.new
23
+ # tracer.notice_error(exception)
24
+ def initialize(agent = nil)
25
+ @agent = agent || (Object.const_defined?('NewRelic') ? NewRelic::Agent : nil)
26
+ end
27
+
28
+ ##
29
+ # Returns true if NewRelic is loaded and available.
30
+ # @return [Boolean]
31
+ def enabled?
32
+ @enabled ||= Object.const_defined?('NewRelic')
33
+ end
34
+
35
+ ##
36
+ # Notify NewRelic of an exception only if `enabled? == true`
37
+ # and an +agent+ is defined
38
+ # @param exception [Exception]
39
+ def notice_error(exception)
40
+ return unless enabled? && agent
41
+
42
+ agent.notice_error(exception)
43
+ end
44
+
45
+ ##
46
+ # Trace passed block with new relic if `enabled? == true`
47
+ # @param trace_args [Hash] tracing parameters passed to NewRelic
48
+ #
49
+ # @see {https://www.rubydoc.info/github/newrelic/rpm/NewRelic%2FAgent%2FInstrumentation%2FControllerInstrumentation:perform_action_with_newrelic_trace}
50
+ def trace_with_newrelic(**args)
51
+ if enabled?
52
+ perform_action_with_newrelic_trace(trace_args(args)) do
53
+ yield
54
+ end
55
+ else
56
+ yield
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def trace_args(**args)
63
+ {
64
+ name: 'call',
65
+ category: CATEGORY,
66
+ }.merge(args)
67
+ end
68
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FastlyNsq
4
- VERSION = '1.12.0'
4
+ VERSION = '1.13.0'
5
5
  end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe FastlyNsq::NewRelic do
6
+ let(:agent) { double 'NewRelic::Agent', notice_error: true }
7
+ let(:tracer) { FastlyNsq::NewRelic.new(agent) }
8
+
9
+ describe '#enabled?' do
10
+ it 'returns false unless NewRelic is loaded' do
11
+ allow(Object).to receive(:const_defined?).with('NewRelic').and_return(false)
12
+ expect(tracer.enabled?).to be false
13
+ end
14
+
15
+ it 'returns true id NewRelic is loaded' do
16
+ expect(tracer.enabled?).to be true
17
+ end
18
+ end
19
+
20
+ context 'enabled' do
21
+ before do
22
+ allow(Object).to receive(:const_defined?).with('NewRelic').and_return(true)
23
+ end
24
+
25
+ describe '#notice_error' do
26
+ it 'call agent.notice_error' do
27
+ ex = Exception.new
28
+
29
+ tracer.notice_error(ex)
30
+ expect(agent).to have_received(:notice_error).with(ex)
31
+ end
32
+ end
33
+
34
+ describe '#trace_with_newrelic' do
35
+ it 'calls perform_action_with_newrelic_trace and yields' do
36
+ allow(tracer).to receive(:perform_action_with_newrelic_trace).and_yield
37
+
38
+ expect { |b| tracer.trace_with_newrelic({}, &b) }.to yield_control
39
+ expect(tracer).to have_received(:perform_action_with_newrelic_trace)
40
+ end
41
+
42
+ it 'calls perform_action_with_newrelic_trace with trace_args' do
43
+ params = { id: 1, vp: 'joe biden' }
44
+
45
+ expected = {
46
+ name: 'call',
47
+ category: FastlyNsq::NewRelic::CATEGORY,
48
+ params: params,
49
+ class_name: 'SomeClass',
50
+ }
51
+
52
+ allow(tracer).to receive(:perform_action_with_newrelic_trace).and_yield
53
+ expect { |b| tracer.trace_with_newrelic(params: params, class_name: 'SomeClass', &b) }.to yield_control
54
+
55
+ expect(tracer).to have_received(:perform_action_with_newrelic_trace).with(expected)
56
+ end
57
+
58
+ it 'always sends the default trace args' do
59
+ expected = {
60
+ name: 'call',
61
+ category: FastlyNsq::NewRelic::CATEGORY,
62
+ }
63
+ allow(tracer).to receive(:perform_action_with_newrelic_trace).and_yield
64
+
65
+ expect { |b| tracer.trace_with_newrelic(&b) }.to yield_control
66
+
67
+ expect(tracer).to have_received(:perform_action_with_newrelic_trace).with(expected)
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'disabled' do
73
+ before do
74
+ allow(Object).to receive(:const_defined?).with('NewRelic').and_return(false)
75
+ end
76
+
77
+ describe '#notice_error' do
78
+ it 'returns nil' do
79
+ expect(tracer.notice_error('ex')).to be nil
80
+ end
81
+ end
82
+
83
+ describe '#trace_with_newrelic' do
84
+ it 'yields' do
85
+ allow(tracer).to receive(:perform_action_with_newrelic_trace)
86
+
87
+ expect { |b| tracer.trace_with_newrelic({}, &b) }.to yield_control
88
+ expect(tracer).not_to have_received(:perform_action_with_newrelic_trace)
89
+ end
90
+ end
91
+ end
92
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastly_nsq
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.0
4
+ version: 1.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tommy O'Neil
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2018-07-25 00:00:00.000000000 Z
16
+ date: 2018-07-27 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: awesome_print
@@ -220,6 +220,7 @@ files:
220
220
  - lib/fastly_nsq/manager.rb
221
221
  - lib/fastly_nsq/message.rb
222
222
  - lib/fastly_nsq/messenger.rb
223
+ - lib/fastly_nsq/new_relic.rb
223
224
  - lib/fastly_nsq/priority_queue.rb
224
225
  - lib/fastly_nsq/priority_thread_pool.rb
225
226
  - lib/fastly_nsq/producer.rb
@@ -241,6 +242,7 @@ files:
241
242
  - spec/matchers/delegate.rb
242
243
  - spec/message_spec.rb
243
244
  - spec/messenger_spec.rb
245
+ - spec/new_relic.rb
244
246
  - spec/priority_thread_pool_spec.rb
245
247
  - spec/producer_spec.rb
246
248
  - spec/spec_helper.rb