appsignal 1.1.0.beta.6 → 1.1.0.beta.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/agent.yml +7 -7
- data/ext/appsignal_extension.c +7 -5
- data/ext/extconf.rb +9 -2
- data/lib/appsignal/config.rb +5 -2
- data/lib/appsignal/event_formatter.rb +2 -0
- data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +1 -47
- data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +88 -0
- data/lib/appsignal/event_formatter/moped/query_formatter.rb +6 -7
- data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +13 -0
- data/lib/appsignal/hooks/sequel.rb +4 -7
- data/lib/appsignal/integrations/capistrano/appsignal.cap +1 -1
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +9 -5
- data/lib/appsignal/js_exception_transaction.rb +2 -2
- data/lib/appsignal/subscriber.rb +3 -2
- data/lib/appsignal/transaction.rb +8 -2
- data/lib/appsignal/transmitter.rb +1 -1
- data/lib/appsignal/utils.rb +38 -4
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/capistrano3_spec.rb +21 -1
- data/spec/lib/appsignal/config_spec.rb +12 -0
- data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +1 -1
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +14 -186
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +115 -0
- data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +4 -4
- data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +22 -0
- data/spec/lib/appsignal/extension_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/sequel_spec.rb +1 -1
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +8 -5
- data/spec/lib/appsignal/subscriber_spec.rb +23 -5
- data/spec/lib/appsignal/transaction_spec.rb +21 -0
- data/spec/lib/appsignal/utils_spec.rb +48 -0
- data/spec/support/helpers/env_helpers.rb +1 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fa63ff273674425ef46e0f345a9952679404e3a
|
4
|
+
data.tar.gz: 1a2badc054342ffaa7bf111c839ef8c5b4c0c8d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 061ad6a3873066cca81ab131385357dc2811bac4854a51128a7c63a46023ff1f94075e5257514d7bea42fb734b05f3374a114149de3fdf46d781b7eb1063b6ea
|
7
|
+
data.tar.gz: 66ff54cd46e64294a8ba13d004c9b297a976b638aece34d98fc174eb7f00d9935caf13678b2843c7d930ed059ebf86600659b2b0061fade58d4c0cb446408196
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,16 @@
|
|
4
4
|
* Collect perams for Delayed Job and Sidekiq when using ActiveJob
|
5
5
|
* Official Grape support
|
6
6
|
|
7
|
+
# 1.0.5
|
8
|
+
* Improved sql sanitization
|
9
|
+
* Improved mongoid/mongodb sanitization
|
10
|
+
* Minor performance improvements
|
11
|
+
* Better handling for non-utf8 convertable strings
|
12
|
+
* Make gem installable (but not functional) on jRuby
|
13
|
+
|
14
|
+
# 1.0.4
|
15
|
+
* Make working dir configurable using `APPSIGNAL_WORKING_DIR_PATH` or `:working_dir_path`
|
16
|
+
|
7
17
|
# 1.0.3
|
8
18
|
* Fix bug in completing JS transactions
|
9
19
|
* Make Resque integration robust for bigger payloads
|
data/ext/agent.yml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
|
-
version:
|
2
|
+
version: d394e75
|
3
3
|
triples:
|
4
4
|
x86_64-linux:
|
5
|
-
checksum:
|
6
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
5
|
+
checksum: 20b198a1a8ab5dff24b1e205d98eb7aa90d469e2a9bf8d6c659c3fe4015400c3
|
6
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/d394e75/appsignal-agent-x86_64-linux-static.tar.gz
|
7
7
|
lib_filename: libappsignal.a
|
8
8
|
i686-linux:
|
9
|
-
checksum:
|
10
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
9
|
+
checksum: c39b3806e36d693a75854a865d7e836b84d9ce35d7522841e7d75aa75a7307e6
|
10
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/d394e75/appsignal-agent-i686-linux-static.tar.gz
|
11
11
|
lib_filename: libappsignal.a
|
12
12
|
x86_64-darwin:
|
13
|
-
checksum:
|
14
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
13
|
+
checksum: 5cf300f552712734b724a6103336353bb809ef246fc62230d6bfcfed7045eed5
|
14
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/d394e75/appsignal-agent-x86_64-darwin-static.tar.gz
|
15
15
|
lib_filename: libappsignal.a
|
data/ext/appsignal_extension.c
CHANGED
@@ -26,17 +26,19 @@ static VALUE start_event(VALUE self, VALUE transaction_index) {
|
|
26
26
|
return Qnil;
|
27
27
|
}
|
28
28
|
|
29
|
-
static VALUE finish_event(VALUE self, VALUE transaction_index, VALUE name, VALUE title, VALUE body) {
|
29
|
+
static VALUE finish_event(VALUE self, VALUE transaction_index, VALUE name, VALUE title, VALUE body, VALUE body_format) {
|
30
30
|
Check_Type(transaction_index, T_FIXNUM);
|
31
31
|
Check_Type(name, T_STRING);
|
32
32
|
Check_Type(title, T_STRING);
|
33
33
|
Check_Type(body, T_STRING);
|
34
|
+
Check_Type(body_format, T_FIXNUM);
|
34
35
|
|
35
36
|
appsignal_finish_event(
|
36
37
|
FIX2INT(transaction_index),
|
37
38
|
StringValueCStr(name),
|
38
39
|
StringValueCStr(title),
|
39
|
-
StringValueCStr(body)
|
40
|
+
StringValueCStr(body),
|
41
|
+
FIX2INT(body_format)
|
40
42
|
);
|
41
43
|
return Qnil;
|
42
44
|
}
|
@@ -187,10 +189,10 @@ static VALUE install_gc_event_hooks() {
|
|
187
189
|
Qnil
|
188
190
|
);
|
189
191
|
#endif
|
190
|
-
#if defined(
|
192
|
+
#if defined(RUBY_INTERNAL_EVENT_GC_END_SWEEP)
|
191
193
|
rb_add_event_hook(
|
192
194
|
track_gc_end,
|
193
|
-
RUBY_INTERNAL_EVENT_GC_END_MARK,
|
195
|
+
RUBY_INTERNAL_EVENT_GC_END_MARK | RUBY_INTERNAL_EVENT_GC_END_SWEEP,
|
194
196
|
Qnil
|
195
197
|
);
|
196
198
|
#endif
|
@@ -207,7 +209,7 @@ void Init_appsignal_extension(void) {
|
|
207
209
|
rb_define_singleton_method(Extension, "stop", stop, 0);
|
208
210
|
rb_define_singleton_method(Extension, "start_transaction", start_transaction, 2);
|
209
211
|
rb_define_singleton_method(Extension, "start_event", start_event, 1);
|
210
|
-
rb_define_singleton_method(Extension, "finish_event", finish_event,
|
212
|
+
rb_define_singleton_method(Extension, "finish_event", finish_event, 5);
|
211
213
|
rb_define_singleton_method(Extension, "set_transaction_error", set_transaction_error, 4);
|
212
214
|
rb_define_singleton_method(Extension, "set_transaction_sample_data", set_transaction_sample_data, 3);
|
213
215
|
rb_define_singleton_method(Extension, "set_transaction_action", set_transaction_action, 2);
|
data/ext/extconf.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'digest'
|
2
2
|
require 'logger'
|
3
|
-
require 'mkmf'
|
4
3
|
require 'fileutils'
|
5
4
|
require 'open-uri'
|
6
5
|
require 'zlib'
|
@@ -30,6 +29,13 @@ end
|
|
30
29
|
def install
|
31
30
|
logger.info "Installing appsignal agent #{Appsignal::VERSION} for Ruby #{RUBY_VERSION} on #{RUBY_PLATFORM}"
|
32
31
|
|
32
|
+
if RUBY_PLATFORM =~ /java/
|
33
|
+
installation_failed(
|
34
|
+
"We do not support jRuby at the moment, email support@appsignal.com if you want to join the beta"
|
35
|
+
)
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
33
39
|
unless AGENT_CONFIG['triples'].keys.include?(ARCH)
|
34
40
|
installation_failed(
|
35
41
|
"AppSignal currently does not support your system architecture (#{ARCH})." \
|
@@ -70,13 +76,14 @@ def install
|
|
70
76
|
end
|
71
77
|
|
72
78
|
logger.info "Creating makefile"
|
79
|
+
require 'mkmf'
|
73
80
|
if find_library('appsignal', 'appsignal_start', EXT_PATH) &&
|
74
81
|
find_executable('appsignal-agent', EXT_PATH) &&
|
75
82
|
find_header('appsignal_extension.h', EXT_PATH)
|
76
83
|
create_makefile 'appsignal_extension'
|
77
84
|
logger.info 'Successfully installed appsignal extension'
|
78
85
|
else
|
79
|
-
installation_failed "Aborting installation, extension files were not present"
|
86
|
+
installation_failed "Aborting installation, extension files were not present or could not be loaded"
|
80
87
|
end
|
81
88
|
rescue => ex
|
82
89
|
installation_failed "Exception while installing: #{ex}"
|
data/lib/appsignal/config.rb
CHANGED
@@ -42,7 +42,8 @@ module Appsignal
|
|
42
42
|
'APPSIGNAL_HTTP_PROXY' => :http_proxy,
|
43
43
|
'APPSIGNAL_ENABLE_ALLOCATION_TRACKING' => :enable_allocation_tracking,
|
44
44
|
'APPSIGNAL_ENABLE_GC_INSTRUMENTATION' => :enable_gc_instrumentation,
|
45
|
-
'APPSIGNAL_RUNNING_IN_CONTAINER' => :running_in_container
|
45
|
+
'APPSIGNAL_RUNNING_IN_CONTAINER' => :running_in_container,
|
46
|
+
'APPSIGNAL_WORKING_DIR_PATH' => :working_dir_path
|
46
47
|
}.freeze
|
47
48
|
|
48
49
|
attr_reader :root_path, :env, :initial_config, :config_hash
|
@@ -103,6 +104,7 @@ module Appsignal
|
|
103
104
|
ENV['APPSIGNAL_HTTP_PROXY'] = config_hash[:http_proxy]
|
104
105
|
ENV['APPSIGNAL_IGNORE_ACTIONS'] = config_hash[:ignore_actions].join(',')
|
105
106
|
ENV['APPSIGNAL_RUNNING_IN_CONTAINER'] = config_hash[:running_in_container].to_s
|
107
|
+
ENV['APPSIGNAL_WORKING_DIR_PATH'] = config_hash[:working_dir_path] if config_hash[:working_dir_path]
|
106
108
|
end
|
107
109
|
|
108
110
|
protected
|
@@ -150,7 +152,8 @@ module Appsignal
|
|
150
152
|
|
151
153
|
# Configuration with string type
|
152
154
|
%w(APPSIGNAL_PUSH_API_KEY APPSIGNAL_APP_NAME APPSIGNAL_PUSH_API_ENDPOINT
|
153
|
-
APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH APPSIGNAL_HTTP_PROXY APPSIGNAL_LOG_PATH
|
155
|
+
APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH APPSIGNAL_HTTP_PROXY APPSIGNAL_LOG_PATH
|
156
|
+
APPSIGNAL_WORKING_DIR_PATH).each do |var|
|
154
157
|
if env_var = ENV[var]
|
155
158
|
config[ENV_TO_KEY_MAPPING[var]] = env_var
|
156
159
|
end
|
@@ -4,55 +4,9 @@ module Appsignal
|
|
4
4
|
class SqlFormatter < Appsignal::EventFormatter
|
5
5
|
register 'sql.active_record'
|
6
6
|
|
7
|
-
SINGLE_QUOTED_STRING = /'(.?|[^']).*'/.freeze
|
8
|
-
DOUBLE_QUOTED_STRING = /"(.?|[^"]).*"/.freeze
|
9
|
-
IN_OPERATOR_CONTENT = /(IN \()[^SELECT][^\)]+(\))/.freeze
|
10
|
-
NUMERIC = /\d*\.?\d+/.freeze
|
11
|
-
REPLACEMENT = '?'.freeze
|
12
|
-
IN_REPLACEMENT = '\1?\2'.freeze
|
13
|
-
SCHEMA = 'SCHEMA'.freeze
|
14
|
-
|
15
|
-
attr_reader :adapter_uses_double_quoted_table_names
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
@connection_config = connection_config
|
19
|
-
@adapter_uses_double_quoted_table_names = adapter_uses_double_quoted_table_names?
|
20
|
-
rescue ::ActiveRecord::ConnectionNotEstablished
|
21
|
-
Appsignal::EventFormatter.unregister('sql.active_record', self.class)
|
22
|
-
Appsignal.logger.error('Error while getting ActiveRecord connection info, unregistering sql.active_record event formatter')
|
23
|
-
end
|
24
|
-
|
25
7
|
def format(payload)
|
26
|
-
|
27
|
-
sql_string = payload[:sql].dup
|
28
|
-
unless adapter_uses_double_quoted_table_names
|
29
|
-
sql_string.gsub!(DOUBLE_QUOTED_STRING, REPLACEMENT)
|
30
|
-
end
|
31
|
-
sql_string.gsub!(SINGLE_QUOTED_STRING, REPLACEMENT)
|
32
|
-
sql_string.gsub!(IN_OPERATOR_CONTENT, IN_REPLACEMENT)
|
33
|
-
sql_string.gsub!(NUMERIC, REPLACEMENT)
|
34
|
-
[payload[:name], sql_string]
|
8
|
+
[payload[:name], payload[:sql], SQL_BODY_FORMAT]
|
35
9
|
end
|
36
|
-
|
37
|
-
protected
|
38
|
-
|
39
|
-
def schema_query?(payload)
|
40
|
-
payload[:name] == SCHEMA
|
41
|
-
end
|
42
|
-
|
43
|
-
def connection_config
|
44
|
-
# TODO handle ActiveRecord::ConnectionNotEstablished
|
45
|
-
if ::ActiveRecord::Base.respond_to?(:connection_config)
|
46
|
-
::ActiveRecord::Base.connection_config
|
47
|
-
else
|
48
|
-
::ActiveRecord::Base.connection_pool.spec.config
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def adapter_uses_double_quoted_table_names?
|
53
|
-
adapter = @connection_config[:adapter]
|
54
|
-
adapter =~ /postgres/ || adapter =~ /sqlite/
|
55
|
-
end
|
56
10
|
end
|
57
11
|
end
|
58
12
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Appsignal
|
2
|
+
class EventFormatter
|
3
|
+
module MongoRubyDriver
|
4
|
+
class QueryFormatter
|
5
|
+
ALLOWED = {
|
6
|
+
"find" => {
|
7
|
+
"find" => :allow,
|
8
|
+
"filter" => :sanitize_document
|
9
|
+
},
|
10
|
+
"count" => {
|
11
|
+
"count" => :allow,
|
12
|
+
"query" => :sanitize_document
|
13
|
+
},
|
14
|
+
"distinct" => {
|
15
|
+
"distinct" => :allow,
|
16
|
+
"key" => :allow,
|
17
|
+
"query" => :sanitize_document
|
18
|
+
},
|
19
|
+
"insert" => {
|
20
|
+
"insert" => :allow,
|
21
|
+
"documents" => :deny_array,
|
22
|
+
"ordered" => :allow
|
23
|
+
},
|
24
|
+
"update" => {
|
25
|
+
"update" => :allow,
|
26
|
+
"updates" => :sanitize_bulk,
|
27
|
+
"ordered" => :allow
|
28
|
+
},
|
29
|
+
"findandmodify" => {
|
30
|
+
"findandmodify" => :allow,
|
31
|
+
"query" => :sanitize_document,
|
32
|
+
"update" => :deny_array,
|
33
|
+
"new" => :allow
|
34
|
+
},
|
35
|
+
"delete" => {
|
36
|
+
"delete" => :allow,
|
37
|
+
"deletes" => :sanitize_bulk,
|
38
|
+
"ordered" => :allow
|
39
|
+
},
|
40
|
+
"bulk" => {
|
41
|
+
"q" => :sanitize_document,
|
42
|
+
"u" => :deny_array,
|
43
|
+
"limit" => :allow,
|
44
|
+
"multi" => :allow,
|
45
|
+
"upsert" => :allow
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
# Format command based on given strategy
|
50
|
+
def self.format(strategy, command)
|
51
|
+
# Stop processing if command is not a hash
|
52
|
+
return {} unless command.is_a?(Hash)
|
53
|
+
|
54
|
+
# Get the strategy and stop if it's not present
|
55
|
+
strategies = ALLOWED[strategy.to_s]
|
56
|
+
return {} unless strategies
|
57
|
+
|
58
|
+
{}.tap do |hsh|
|
59
|
+
command.each do |key, val|
|
60
|
+
hsh[key] = self.apply_strategy(strategies[key], val)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Applies strategy on hash values based on keys
|
66
|
+
def self.apply_strategy(strategy, val)
|
67
|
+
case strategy
|
68
|
+
when :allow then val
|
69
|
+
when :deny then '?'
|
70
|
+
when :deny_array then '[?]'
|
71
|
+
when :sanitize_document
|
72
|
+
Appsignal::Utils.sanitize(val, true, :mongodb)
|
73
|
+
when :sanitize_bulk
|
74
|
+
if val.length > 1
|
75
|
+
[
|
76
|
+
self.format(:bulk, val.first),
|
77
|
+
"[...]"
|
78
|
+
]
|
79
|
+
else
|
80
|
+
val.map { |v| self.format(:bulk, v) }
|
81
|
+
end
|
82
|
+
else '?'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -11,12 +11,12 @@ module Appsignal
|
|
11
11
|
when 'Moped::Protocol::Command'
|
12
12
|
return ['Command', {
|
13
13
|
:database => op.full_collection_name,
|
14
|
-
:selector => Appsignal::Utils.sanitize(op.selector)
|
14
|
+
:selector => Appsignal::Utils.sanitize(op.selector, true, :mongodb)
|
15
15
|
}.inspect]
|
16
16
|
when 'Moped::Protocol::Query'
|
17
17
|
return ['Query', {
|
18
18
|
:database => op.full_collection_name,
|
19
|
-
:selector => Appsignal::Utils.sanitize(op.selector),
|
19
|
+
:selector => Appsignal::Utils.sanitize(op.selector, false, :mongodb),
|
20
20
|
:flags => op.flags,
|
21
21
|
:limit => op.limit,
|
22
22
|
:skip => op.skip,
|
@@ -25,21 +25,21 @@ module Appsignal
|
|
25
25
|
when 'Moped::Protocol::Delete'
|
26
26
|
return ['Delete', {
|
27
27
|
:database => op.full_collection_name,
|
28
|
-
:selector => Appsignal::Utils.sanitize(op.selector),
|
28
|
+
:selector => Appsignal::Utils.sanitize(op.selector, false, :mongodb),
|
29
29
|
:flags => op.flags,
|
30
30
|
}.inspect]
|
31
31
|
when 'Moped::Protocol::Insert'
|
32
32
|
return ['Insert', {
|
33
33
|
:database => op.full_collection_name,
|
34
|
-
:documents => Appsignal::Utils.sanitize(op.documents, true),
|
34
|
+
:documents => Appsignal::Utils.sanitize(op.documents, true, :mongodb),
|
35
35
|
:count => op.documents.count,
|
36
36
|
:flags => op.flags,
|
37
37
|
}.inspect]
|
38
38
|
when 'Moped::Protocol::Update'
|
39
39
|
return ['Update', {
|
40
40
|
:database => op.full_collection_name,
|
41
|
-
:selector => Appsignal::Utils.sanitize(op.selector),
|
42
|
-
:update => Appsignal::Utils.sanitize(op.update, true),
|
41
|
+
:selector => Appsignal::Utils.sanitize(op.selector, false, :mongodb),
|
42
|
+
:update => Appsignal::Utils.sanitize(op.update, true, :mongodb),
|
43
43
|
:flags => op.flags,
|
44
44
|
}.inspect]
|
45
45
|
when 'Moped::Protocol::KillCursors'
|
@@ -53,7 +53,6 @@ module Appsignal
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
57
56
|
end
|
58
57
|
end
|
59
58
|
end
|
@@ -3,13 +3,10 @@ module Appsignal
|
|
3
3
|
module SequelExtension
|
4
4
|
# Add query instrumentation
|
5
5
|
def log_yield(sql, args = nil)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# formatter.
|
11
|
-
|
12
|
-
ActiveSupport::Notifications.instrument('sql.sequel') do
|
6
|
+
ActiveSupport::Notifications.instrument(
|
7
|
+
'sql.sequel',
|
8
|
+
:sql => sql
|
9
|
+
) do
|
13
10
|
yield
|
14
11
|
end
|
15
12
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :appsignal do
|
2
2
|
task :deploy do
|
3
|
-
env = fetch(:rails_env, fetch(:rack_env, 'production'))
|
3
|
+
env = fetch(:stage, fetch(:rails_env, fetch(:rack_env, 'production')))
|
4
4
|
user = ENV['USER'] || ENV['USERNAME']
|
5
5
|
revision = fetch(:appsignal_revision, fetch(:current_revision))
|
6
6
|
logger = fetch(:logger, Logger.new($stdout))
|
@@ -1,16 +1,19 @@
|
|
1
1
|
module Appsignal
|
2
2
|
class Hooks
|
3
3
|
class MongoMonitorSubscriber
|
4
|
-
|
5
4
|
# Called by Mongo::Monitor when query starts
|
6
5
|
def started(event)
|
7
6
|
transaction = Appsignal::Transaction.current
|
8
7
|
return if transaction.nil_transaction?
|
9
8
|
return if transaction.paused?
|
10
9
|
|
10
|
+
# Format the command
|
11
|
+
command = Appsignal::EventFormatter::MongoRubyDriver::QueryFormatter
|
12
|
+
.format(event.command_name, event.command)
|
13
|
+
|
11
14
|
# Store the query on the transaction, we need it when the event finishes
|
12
15
|
store = transaction.store('mongo_driver')
|
13
|
-
store[event.request_id] =
|
16
|
+
store[event.request_id] = command
|
14
17
|
|
15
18
|
# Start this event
|
16
19
|
Appsignal::Extension.start_event(transaction.transaction_index)
|
@@ -36,14 +39,15 @@ module Appsignal
|
|
36
39
|
|
37
40
|
# Get the query from the transaction store
|
38
41
|
store = transaction.store('mongo_driver')
|
39
|
-
command = store
|
42
|
+
command = store.delete(event.request_id) || {}
|
40
43
|
|
41
44
|
# Finish the event in the extension.
|
42
45
|
Appsignal::Extension.finish_event(
|
43
46
|
transaction.transaction_index,
|
44
47
|
'query.mongodb',
|
45
|
-
event.command_name.to_s,
|
46
|
-
|
48
|
+
"#{event.command_name.to_s} | #{event.database_name} | #{result}",
|
49
|
+
Appsignal::Utils.json_generate(command),
|
50
|
+
0
|
47
51
|
)
|
48
52
|
end
|
49
53
|
end
|