newrelic-slack-ruby-bot 0.2.0 → 0.2.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 +4 -4
- data/CHANGELOG.md +6 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile.lock +8 -7
- data/README.md +28 -1
- data/lib/newrelic-slack-ruby-bot/instrumentation.rb +36 -2
- data/lib/newrelic-slack-ruby-bot/version.rb +2 -1
- data/newrelic-slack-ruby-bot.gemspec +1 -1
- data/pkg/newrelic-slack-ruby-bot-0.2.0.gem +0 -0
- data/screenshots/newrelic_calculate_breakdown.png +0 -0
- data/screenshots/newrelic_transactions.png +0 -0
- data/spec/newrelic-slack-ruby-bot/instrumentation_spec.rb +126 -1
- metadata +7 -5
- data/screenshots/breakdown.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93eb40878e93b48b07f21362a982459d05b7e676
|
4
|
+
data.tar.gz: 9e3c8a237a1200ffbc76f1aa257800bb671e81e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65c659cd156786c01e79638898ac9695a1a5be8e8348122d52c1b56ff66fd92a9de519bdcbf69d5285a21fde5785aca487504503a403f43fe36f6ca019ea810c
|
7
|
+
data.tar.gz: f090f404c0a52570d5dc4927c470989e62ea11a1966065ef8b16a6cc5fa7718ce41f7a4fd1fe86df76792ae73f34efb6e909ef0411857713fe46da549f3de9a9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
### 0.2.1 (11/10/2017)
|
2
|
+
|
3
|
+
* [#6](https://github.com/slack-ruby/newrelic-slack-ruby-bot/pull/6): Add team, channel, and user attributes to New Relic traces - [@kstole](https://github.com/kstole).
|
4
|
+
* [#8](https://github.com/slack-ruby/newrelic-slack-ruby-bot/pull/8): Name New Relic transactions according to command called - [@kstole](https://github.com/kstole).
|
5
|
+
* [#10](https://github.com/slack-ruby/newrelic-slack-ruby-bot/pull/10): Fix occasional infinite loop caused by Instrumentation - [@kstole](https://github.com/kstole).
|
6
|
+
|
1
7
|
### 0.2.0 (9/26/2017)
|
2
8
|
|
3
9
|
* [#4](https://github.com/slack-ruby/newrelic-slack-ruby-bot/pull/4): Revise New Relic log messages - [@kstole](https://github.com/kstole).
|
data/CONTRIBUTING.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
newrelic-slack-ruby-bot (0.2.
|
4
|
+
newrelic-slack-ruby-bot (0.2.1)
|
5
5
|
newrelic_rpm
|
6
|
-
slack-ruby-bot (>= 0.
|
6
|
+
slack-ruby-bot (>= 0.10.5)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: http://rubygems.org/
|
@@ -43,14 +43,15 @@ GEM
|
|
43
43
|
multipart-post (>= 1.2, < 3)
|
44
44
|
faraday_middleware (0.12.2)
|
45
45
|
faraday (>= 0.7.4, < 1.0)
|
46
|
-
gli (2.
|
46
|
+
gli (2.17.0)
|
47
47
|
hashie (3.5.6)
|
48
48
|
hitimes (1.2.6)
|
49
|
-
i18n (0.
|
49
|
+
i18n (0.9.1)
|
50
|
+
concurrent-ruby (~> 1.0)
|
50
51
|
json (2.1.0)
|
51
52
|
minitest (5.10.3)
|
52
53
|
multipart-post (2.0.0)
|
53
|
-
newrelic_rpm (4.
|
54
|
+
newrelic_rpm (4.5.0.337)
|
54
55
|
nio4r (2.1.0)
|
55
56
|
parser (2.4.0.0)
|
56
57
|
ast (~> 2.2)
|
@@ -79,7 +80,7 @@ GEM
|
|
79
80
|
ruby-progressbar (~> 1.7)
|
80
81
|
tins (<= 1.6.0)
|
81
82
|
ruby-progressbar (1.8.3)
|
82
|
-
slack-ruby-bot (0.10.
|
83
|
+
slack-ruby-bot (0.10.5)
|
83
84
|
hashie
|
84
85
|
slack-ruby-client (>= 0.6.0)
|
85
86
|
slack-ruby-client (0.10.0)
|
@@ -94,7 +95,7 @@ GEM
|
|
94
95
|
timers (4.1.2)
|
95
96
|
hitimes
|
96
97
|
tins (1.6.0)
|
97
|
-
tzinfo (1.2.
|
98
|
+
tzinfo (1.2.4)
|
98
99
|
thread_safe (~> 0.1)
|
99
100
|
websocket-driver (0.7.0)
|
100
101
|
websocket-extensions (>= 0.1.0)
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ NewRelic Instrumentation for SlackRubyBot
|
|
7
7
|
|
8
8
|
NewRelic instrumentation for [slack-ruby-bot](https://github.com/slack-ruby/slack-ruby-bot).
|
9
9
|
|
10
|
-

|
11
11
|
|
12
12
|
## Install
|
13
13
|
|
@@ -17,6 +17,33 @@ Add to Gemfile.
|
|
17
17
|
gem 'newrelic-slack-ruby-bot'
|
18
18
|
```
|
19
19
|
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
This gem adds New Relic tracing to the Slack message hook, which is the start of all messages coming in from Slack.
|
23
|
+
New Relic will automatically record any external requests made through supported libraries (such as `Net::HTTP`) and database queries for supported databases (such as `MongoDB` and `Redis`).
|
24
|
+
This gem also adds the team, channel, user, and match data from each message, which can be seen in New Relic transaction traces and Insights.
|
25
|
+
|
26
|
+

|
27
|
+
|
28
|
+
### Renaming transactions
|
29
|
+
|
30
|
+
By default, `newrelic-slack-ruby-bot` names New Relic transactions according to the operator, command, match, or scan route that was called.
|
31
|
+
To rename a New Relic transaction, make a call directly to the New Relic agent.
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
::NewRelic::Agent.set_transaction_name('new name')
|
35
|
+
```
|
36
|
+
|
37
|
+
The typical format for transaction names is `ClassName/method`.
|
38
|
+
|
39
|
+
### Adding custom attributes
|
40
|
+
|
41
|
+
You can add additional custom attributes via the New Relic agent.
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
::NewRelic::Agent.add_custom_attributes(key: value)
|
45
|
+
```
|
46
|
+
|
20
47
|
## Contributing
|
21
48
|
|
22
49
|
You're encouraged to contribute to this gem. See [CONTRIBUTING](CONTRIBUTING.md) for details.
|
@@ -11,15 +11,17 @@ DependencyDetection.defer do
|
|
11
11
|
|
12
12
|
executes do
|
13
13
|
NewRelic::Agent.logger.info 'Installing SlackRubyBot instrumentation'
|
14
|
-
instrument_call
|
15
14
|
end
|
16
15
|
|
17
|
-
|
16
|
+
executes do
|
18
17
|
::SlackRubyBot::Hooks::Message.class_eval do
|
19
18
|
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
20
19
|
|
21
20
|
def message_with_new_relic(client, data)
|
22
21
|
perform_action_with_newrelic_trace(name: 'call', category: 'OtherTransaction/Slack') do
|
22
|
+
::NewRelic::Agent.add_custom_attributes(team: data.team,
|
23
|
+
channel: data.channel,
|
24
|
+
user: data.user)
|
23
25
|
message_without_new_relic(client, data)
|
24
26
|
end
|
25
27
|
end
|
@@ -28,4 +30,36 @@ DependencyDetection.defer do
|
|
28
30
|
alias_method :call, :message_with_new_relic
|
29
31
|
end
|
30
32
|
end
|
33
|
+
|
34
|
+
executes do
|
35
|
+
::SlackRubyBot::Commands::Base.class_eval do
|
36
|
+
class << self
|
37
|
+
def command_name(match)
|
38
|
+
if match.is_a? MatchData
|
39
|
+
if match.names.include? 'command'
|
40
|
+
match[:command].downcase
|
41
|
+
elsif match.names.include? 'operator'
|
42
|
+
match[:operator].downcase
|
43
|
+
else
|
44
|
+
'match'
|
45
|
+
end
|
46
|
+
else
|
47
|
+
'scan'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def call_command_with_new_relic(client, data, match, block)
|
52
|
+
::NewRelic::Agent.set_transaction_name("#{self}/#{command_name(match)}")
|
53
|
+
if match.is_a? MatchData
|
54
|
+
::NewRelic::Agent
|
55
|
+
.add_custom_attributes(Hash[match.names.map(&:to_sym).zip(match.captures)])
|
56
|
+
end
|
57
|
+
call_command_without_new_relic(client, data, match, block)
|
58
|
+
end
|
59
|
+
|
60
|
+
alias_method :call_command_without_new_relic, :call_command
|
61
|
+
alias_method :call_command, :call_command_with_new_relic
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
31
65
|
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe NewRelic::Agent::Instrumentation do
|
4
4
|
subject { SlackRubyBot::Hooks::Message.new }
|
5
5
|
let(:client) { SlackRubyBot::Client.new }
|
6
|
+
before(:all) { SlackRubyBot::Config.user = 'mybot' }
|
6
7
|
|
7
8
|
it 'perform_action_with_newrelic_trace' do
|
8
9
|
expect(subject)
|
@@ -10,6 +11,130 @@ describe NewRelic::Agent::Instrumentation do
|
|
10
11
|
.with(hash_including(name: 'call', category: 'OtherTransaction/Slack'))
|
11
12
|
.and_yield
|
12
13
|
|
13
|
-
subject.call(client,
|
14
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
15
|
+
text: 'hi',
|
16
|
+
team: 'TEAM',
|
17
|
+
channel: 'CHANNEL',
|
18
|
+
user: 'USER'))
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'operator' do
|
22
|
+
before(:all) do
|
23
|
+
MyOperatorClass = Class.new(SlackRubyBot::Commands::Base) do
|
24
|
+
operator('+') { |_client, _data, _match| }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
it 'adds team, channel, user, and match attributes' do
|
28
|
+
expect(::NewRelic::Agent)
|
29
|
+
.to receive(:add_custom_attributes)
|
30
|
+
.with(hash_including(team: 'TEAM', channel: 'CHANNEL', user: 'USER'))
|
31
|
+
expect(::NewRelic::Agent)
|
32
|
+
.to receive(:add_custom_attributes)
|
33
|
+
.with(hash_including(operator: '+', expression: '42'))
|
34
|
+
|
35
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
36
|
+
text: '+42',
|
37
|
+
team: 'TEAM',
|
38
|
+
channel: 'CHANNEL',
|
39
|
+
user: 'USER'))
|
40
|
+
end
|
41
|
+
it 'sets transaction name' do
|
42
|
+
expect(::NewRelic::Agent).to receive(:set_transaction_name).with('MyOperatorClass/+')
|
43
|
+
|
44
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
45
|
+
text: '+42',
|
46
|
+
team: 'TEAM',
|
47
|
+
channel: 'CHANNEL',
|
48
|
+
user: 'USER'))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'command' do
|
53
|
+
before(:all) do
|
54
|
+
MyCommandClass = Class.new(SlackRubyBot::Commands::Base) do
|
55
|
+
command('this') { |_client, _data, _match| }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
it 'adds team, channel, user, and match attributes' do
|
59
|
+
expect(::NewRelic::Agent)
|
60
|
+
.to receive(:add_custom_attributes)
|
61
|
+
.with(hash_including(team: 'TEAM', channel: 'CHANNEL', user: 'USER'))
|
62
|
+
expect(::NewRelic::Agent)
|
63
|
+
.to receive(:add_custom_attributes)
|
64
|
+
.with(hash_including(bot: 'mybot', command: 'this', expression: 'is the command'))
|
65
|
+
|
66
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
67
|
+
text: "#{client.name} this is the command",
|
68
|
+
team: 'TEAM',
|
69
|
+
channel: 'CHANNEL',
|
70
|
+
user: 'USER'))
|
71
|
+
end
|
72
|
+
it 'sets transaction name' do
|
73
|
+
expect(::NewRelic::Agent).to receive(:set_transaction_name).with('MyCommandClass/this')
|
74
|
+
|
75
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
76
|
+
text: "#{client.name} this is the command",
|
77
|
+
team: 'TEAM',
|
78
|
+
channel: 'CHANNEL',
|
79
|
+
user: 'USER'))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'match' do
|
84
|
+
before(:all) do
|
85
|
+
MyMatchClass = Class.new(SlackRubyBot::Commands::Base) do
|
86
|
+
match('read this') { |_client, _data, _match| }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
it 'adds team, channel, user, and match attributes' do
|
90
|
+
expect(::NewRelic::Agent)
|
91
|
+
.to receive(:add_custom_attributes)
|
92
|
+
.with(hash_including(team: 'TEAM', channel: 'CHANNEL', user: 'USER'))
|
93
|
+
expect(::NewRelic::Agent).to receive(:add_custom_attributes).with({})
|
94
|
+
|
95
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
96
|
+
text: 'read this',
|
97
|
+
team: 'TEAM',
|
98
|
+
channel: 'CHANNEL',
|
99
|
+
user: 'USER'))
|
100
|
+
end
|
101
|
+
it 'sets transaction name' do
|
102
|
+
expect(::NewRelic::Agent).to receive(:set_transaction_name).with('MyMatchClass/match')
|
103
|
+
|
104
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
105
|
+
text: 'read this',
|
106
|
+
team: 'TEAM',
|
107
|
+
channel: 'CHANNEL',
|
108
|
+
user: 'USER'))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'scan' do
|
113
|
+
before(:all) do
|
114
|
+
MyScanClass = Class.new(SlackRubyBot::Commands::Base) do
|
115
|
+
scan('scanned') { |_client, _data, _match| }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
it 'adds team, channel, user, and match attributes' do
|
119
|
+
expect(::NewRelic::Agent)
|
120
|
+
.to receive(:add_custom_attributes)
|
121
|
+
.with(hash_including(team: 'TEAM', channel: 'CHANNEL', user: 'USER'))
|
122
|
+
expect(::NewRelic::Agent).not_to receive(:add_custom_attributes)
|
123
|
+
|
124
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
125
|
+
text: 'I scanned this',
|
126
|
+
team: 'TEAM',
|
127
|
+
channel: 'CHANNEL',
|
128
|
+
user: 'USER'))
|
129
|
+
end
|
130
|
+
it 'sets transaction name' do
|
131
|
+
expect(::NewRelic::Agent).to receive(:set_transaction_name).with('MyScanClass/scan')
|
132
|
+
|
133
|
+
subject.call(client, Slack::Messages::Message.new(message: 'message',
|
134
|
+
text: 'I scanned this',
|
135
|
+
team: 'TEAM',
|
136
|
+
channel: 'CHANNEL',
|
137
|
+
user: 'USER'))
|
138
|
+
end
|
14
139
|
end
|
15
140
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: newrelic-slack-ruby-bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: newrelic_rpm
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.10.5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.10.5
|
41
41
|
description:
|
42
42
|
email: dblock@dblock.org
|
43
43
|
executables: []
|
@@ -57,7 +57,9 @@ files:
|
|
57
57
|
- lib/newrelic-slack-ruby-bot/version.rb
|
58
58
|
- newrelic-slack-ruby-bot.gemspec
|
59
59
|
- pkg/newrelic-slack-ruby-bot-0.1.1.gem
|
60
|
-
-
|
60
|
+
- pkg/newrelic-slack-ruby-bot-0.2.0.gem
|
61
|
+
- screenshots/newrelic_calculate_breakdown.png
|
62
|
+
- screenshots/newrelic_transactions.png
|
61
63
|
- spec/newrelic-slack-ruby-bot/instrumentation_spec.rb
|
62
64
|
- spec/newrelic-slack-ruby-bot/version_spec.rb
|
63
65
|
- spec/spec_helper.rb
|
data/screenshots/breakdown.png
DELETED
Binary file
|