appsignal 1.0.7 → 1.1.0.beta.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/.travis.yml +1 -0
- data/CHANGELOG.md +5 -21
- data/Rakefile +2 -0
- data/circle.yml +2 -1
- data/ext/agent.yml +7 -7
- data/ext/appsignal_extension.c +3 -5
- data/ext/extconf.rb +6 -15
- data/gemfiles/grape.gemfile +7 -0
- data/lib/appsignal/config.rb +2 -5
- data/lib/appsignal/event_formatter.rb +0 -2
- data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +47 -1
- data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +29 -0
- data/lib/appsignal/event_formatter/moped/query_formatter.rb +7 -6
- data/lib/appsignal/hooks.rb +33 -0
- data/lib/appsignal/hooks/net_http.rb +1 -1
- data/lib/appsignal/hooks/sequel.rb +7 -4
- data/lib/appsignal/hooks/sidekiq.rb +10 -19
- data/lib/appsignal/integrations/capistrano/appsignal.cap +1 -1
- data/lib/appsignal/integrations/delayed_job_plugin.rb +20 -11
- data/lib/appsignal/integrations/grape.rb +44 -0
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +5 -9
- data/lib/appsignal/integrations/railtie.rb +4 -0
- data/lib/appsignal/integrations/resque.rb +1 -1
- data/lib/appsignal/js_exception_transaction.rb +2 -3
- data/lib/appsignal/subscriber.rb +2 -3
- data/lib/appsignal/transaction.rb +2 -8
- data/lib/appsignal/transmitter.rb +1 -1
- data/lib/appsignal/utils.rb +7 -43
- data/lib/appsignal/version.rb +1 -1
- data/lib/tasks/diag.rake +75 -0
- data/spec/lib/appsignal/capistrano3_spec.rb +1 -21
- data/spec/lib/appsignal/config_spec.rb +0 -12
- 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 +186 -14
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +54 -0
- data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +4 -4
- data/spec/lib/appsignal/extension_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +49 -14
- data/spec/lib/appsignal/hooks/sequel_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +29 -62
- data/spec/lib/appsignal/hooks_spec.rb +115 -0
- data/spec/lib/appsignal/integrations/grape_spec.rb +94 -0
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +5 -8
- data/spec/lib/appsignal/integrations/resque_spec.rb +0 -1
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +0 -1
- data/spec/lib/appsignal/subscriber_spec.rb +5 -23
- data/spec/lib/appsignal/transaction_spec.rb +0 -21
- data/spec/lib/appsignal/utils_spec.rb +1 -68
- data/spec/spec_helper.rb +16 -0
- data/spec/support/helpers/env_helpers.rb +0 -1
- data/spec/support/stubs/delayed_job.rb +0 -0
- metadata +15 -11
- data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +0 -88
- data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +0 -13
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -115
- data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b6829aaec5b482bbbce36c10e90369dc1d62c37
|
4
|
+
data.tar.gz: 4d339b3c07c604583c235f2d395812752c251073
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8006649237b5e0e6d1c99ab039d90fe159f26c9e0dc7ff3c002f6cf778226ed6fab7eaabcb485073bf68bfdae793a5f7d5f4053248b2e8bec928045b553e699d
|
7
|
+
data.tar.gz: 6821cc4959da10f3f78bff97592cca2e9978b025e9ee4ef363b94476ce9936f7fd052f73d21c001b0b255457f05fa066011c5ff0abf556eb13478ac2b5911505
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,24 +1,8 @@
|
|
1
|
-
# 1.
|
2
|
-
*
|
3
|
-
|
4
|
-
|
5
|
-
*
|
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
|
-
|
17
|
-
# 1.0.3
|
18
|
-
* Fix bug in completing JS transactions
|
19
|
-
* Make Resque integration robust for bigger payloads
|
20
|
-
* Message in logs if agent logging cannot initialize
|
21
|
-
* Call `to_s` on DJ id to see the id when using MongoDB
|
1
|
+
# 1.1
|
2
|
+
* Collect global metrics for GC durations
|
3
|
+
* Collect params from Delayed Job in a reliable way
|
4
|
+
* Collect perams for Delayed Job and Sidekiq when using ActiveJob
|
5
|
+
* Official Grape support
|
22
6
|
|
23
7
|
# 1.0.2
|
24
8
|
* Bug fix in format of process memory measurements
|
data/Rakefile
CHANGED
data/circle.yml
CHANGED
data/ext/agent.yml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
|
-
version:
|
2
|
+
version: 77ab5fd
|
3
3
|
triples:
|
4
4
|
x86_64-linux:
|
5
|
-
checksum:
|
6
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
5
|
+
checksum: e8c9a38957a6d630b89f5588c256a160fd5be0b461a78bdca7d7d1f8b7b464ad
|
6
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/77ab5fd/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: 0d1c14a89eddcf99e64dbda02863939f98b7be4d7c53aab4717fd0c08131edac
|
10
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/77ab5fd/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: 5f6c0056465a2c0a818d37326e1fe577618ae9dae2218d17496463dd6f176d37
|
14
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/77ab5fd/appsignal-agent-x86_64-darwin-static.tar.gz
|
15
15
|
lib_filename: libappsignal.a
|
data/ext/appsignal_extension.c
CHANGED
@@ -26,19 +26,17 @@ 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) {
|
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);
|
35
34
|
|
36
35
|
appsignal_finish_event(
|
37
36
|
FIX2INT(transaction_index),
|
38
37
|
StringValueCStr(name),
|
39
38
|
StringValueCStr(title),
|
40
|
-
StringValueCStr(body)
|
41
|
-
FIX2INT(body_format)
|
39
|
+
StringValueCStr(body)
|
42
40
|
);
|
43
41
|
return Qnil;
|
44
42
|
}
|
@@ -218,7 +216,7 @@ void Init_appsignal_extension(void) {
|
|
218
216
|
rb_define_singleton_method(Extension, "stop", stop, 0);
|
219
217
|
rb_define_singleton_method(Extension, "start_transaction", start_transaction, 2);
|
220
218
|
rb_define_singleton_method(Extension, "start_event", start_event, 1);
|
221
|
-
rb_define_singleton_method(Extension, "finish_event", finish_event,
|
219
|
+
rb_define_singleton_method(Extension, "finish_event", finish_event, 4);
|
222
220
|
rb_define_singleton_method(Extension, "set_transaction_error", set_transaction_error, 4);
|
223
221
|
rb_define_singleton_method(Extension, "set_transaction_sample_data", set_transaction_sample_data, 3);
|
224
222
|
rb_define_singleton_method(Extension, "set_transaction_action", set_transaction_action, 2);
|
data/ext/extconf.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'digest'
|
2
2
|
require 'logger'
|
3
|
+
require 'mkmf'
|
3
4
|
require 'fileutils'
|
4
5
|
require 'open-uri'
|
5
6
|
require 'zlib'
|
@@ -29,13 +30,6 @@ end
|
|
29
30
|
def install
|
30
31
|
logger.info "Installing appsignal agent #{Appsignal::VERSION} for Ruby #{RUBY_VERSION} on #{RUBY_PLATFORM}"
|
31
32
|
|
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
|
-
|
39
33
|
unless AGENT_CONFIG['triples'].keys.include?(ARCH)
|
40
34
|
installation_failed(
|
41
35
|
"AppSignal currently does not support your system architecture (#{ARCH})." \
|
@@ -76,16 +70,13 @@ def install
|
|
76
70
|
end
|
77
71
|
|
78
72
|
logger.info "Creating makefile"
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
elsif !find_executable('appsignal-agent', EXT_PATH)
|
83
|
-
installation_failed 'Aborting installation, appsignal-agent not found'
|
84
|
-
elsif !find_header('appsignal_extension.h', EXT_PATH)
|
85
|
-
installation_failed 'Aborting installation, appsignal_extension.h not found'
|
86
|
-
else
|
73
|
+
if find_library('appsignal', 'appsignal_start', EXT_PATH) &&
|
74
|
+
find_executable('appsignal-agent', EXT_PATH) &&
|
75
|
+
find_header('appsignal_extension.h', EXT_PATH)
|
87
76
|
create_makefile 'appsignal_extension'
|
88
77
|
logger.info 'Successfully installed appsignal extension'
|
78
|
+
else
|
79
|
+
installation_failed "Aborting installation, extension files were not present"
|
89
80
|
end
|
90
81
|
rescue => ex
|
91
82
|
installation_failed "Exception while installing: #{ex}"
|
data/lib/appsignal/config.rb
CHANGED
@@ -42,8 +42,7 @@ 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
|
46
|
-
'APPSIGNAL_WORKING_DIR_PATH' => :working_dir_path
|
45
|
+
'APPSIGNAL_RUNNING_IN_CONTAINER' => :running_in_container
|
47
46
|
}.freeze
|
48
47
|
|
49
48
|
attr_reader :root_path, :env, :initial_config, :config_hash
|
@@ -104,7 +103,6 @@ module Appsignal
|
|
104
103
|
ENV['APPSIGNAL_HTTP_PROXY'] = config_hash[:http_proxy]
|
105
104
|
ENV['APPSIGNAL_IGNORE_ACTIONS'] = config_hash[:ignore_actions].join(',')
|
106
105
|
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]
|
108
106
|
end
|
109
107
|
|
110
108
|
protected
|
@@ -152,8 +150,7 @@ module Appsignal
|
|
152
150
|
|
153
151
|
# Configuration with string type
|
154
152
|
%w(APPSIGNAL_PUSH_API_KEY APPSIGNAL_APP_NAME APPSIGNAL_PUSH_API_ENDPOINT
|
155
|
-
APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH APPSIGNAL_HTTP_PROXY APPSIGNAL_LOG_PATH
|
156
|
-
APPSIGNAL_WORKING_DIR_PATH).each do |var|
|
153
|
+
APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH APPSIGNAL_HTTP_PROXY APPSIGNAL_LOG_PATH).each do |var|
|
157
154
|
if env_var = ENV[var]
|
158
155
|
config[ENV_TO_KEY_MAPPING[var]] = env_var
|
159
156
|
end
|
@@ -4,9 +4,55 @@ 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
|
+
|
7
25
|
def format(payload)
|
8
|
-
|
26
|
+
return nil if schema_query?(payload) || !payload[:sql]
|
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]
|
9
35
|
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
|
10
56
|
end
|
11
57
|
end
|
12
58
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Appsignal
|
2
|
+
class EventFormatter
|
3
|
+
module ElasticSearch
|
4
|
+
class SearchFormatter < Appsignal::EventFormatter
|
5
|
+
register 'search.elasticsearch'
|
6
|
+
|
7
|
+
def format(payload)
|
8
|
+
[
|
9
|
+
"#{payload[:name]}: #{payload[:klass]}",
|
10
|
+
sanitized_search(payload[:search]).inspect
|
11
|
+
]
|
12
|
+
end
|
13
|
+
|
14
|
+
def sanitized_search(search)
|
15
|
+
return nil unless search.is_a?(Hash)
|
16
|
+
{}.tap do |hsh|
|
17
|
+
search.each do |key, val|
|
18
|
+
if [:index, :type].include?(key)
|
19
|
+
hsh[key] = val
|
20
|
+
else
|
21
|
+
hsh[key] = Appsignal::Utils.sanitize(val)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
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)
|
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),
|
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),
|
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),
|
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),
|
42
|
+
:update => Appsignal::Utils.sanitize(op.update, true),
|
43
43
|
:flags => op.flags,
|
44
44
|
}.inspect]
|
45
45
|
when 'Moped::Protocol::KillCursors'
|
@@ -53,6 +53,7 @@ module Appsignal
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
+
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
data/lib/appsignal/hooks.rb
CHANGED
@@ -45,6 +45,39 @@ module Appsignal
|
|
45
45
|
raise NotImplementedError
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
module Helpers
|
50
|
+
def string_or_inspect(string_or_other)
|
51
|
+
if string_or_other.is_a?(String)
|
52
|
+
string_or_other
|
53
|
+
else
|
54
|
+
string_or_other.inspect
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def truncate(text)
|
59
|
+
text.size > 200 ? "#{text[0...197]}..." : text
|
60
|
+
end
|
61
|
+
|
62
|
+
def extract_value(object_or_hash, field, default_value=nil, convert_to_s=false)
|
63
|
+
value = if object_or_hash.respond_to?(:[])
|
64
|
+
object_or_hash[field]
|
65
|
+
elsif object_or_hash.respond_to?(field)
|
66
|
+
object_or_hash.send(field)
|
67
|
+
end || default_value
|
68
|
+
if convert_to_s
|
69
|
+
value.to_s
|
70
|
+
else
|
71
|
+
value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def format_args(args)
|
76
|
+
args.map do |arg|
|
77
|
+
truncate(string_or_inspect(arg))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
48
81
|
end
|
49
82
|
end
|
50
83
|
|
@@ -3,10 +3,13 @@ module Appsignal
|
|
3
3
|
module SequelExtension
|
4
4
|
# Add query instrumentation
|
5
5
|
def log_yield(sql, args = nil)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
|
7
|
+
# We'd like to get full sql queries in the payloads as well. To do
|
8
|
+
# that we need to find out a way to ask Sequel which quoting strategy
|
9
|
+
# is used by the adapter. We can then do something similar to the AR
|
10
|
+
# formatter.
|
11
|
+
|
12
|
+
ActiveSupport::Notifications.instrument('sql.sequel') do
|
10
13
|
yield
|
11
14
|
end
|
12
15
|
end
|
@@ -1,21 +1,30 @@
|
|
1
1
|
module Appsignal
|
2
2
|
class Hooks
|
3
3
|
class SidekiqPlugin
|
4
|
+
include Appsignal::Hooks::Helpers
|
5
|
+
|
4
6
|
def job_keys
|
5
7
|
@job_keys ||= Set.new(%w(
|
6
8
|
class args retried_at failed_at
|
7
9
|
error_message error_class backtrace
|
8
10
|
error_backtrace enqueued_at retry
|
11
|
+
jid retry created_at wrapped
|
9
12
|
))
|
10
13
|
end
|
11
14
|
|
12
15
|
def call(worker, item, queue)
|
16
|
+
if item['class'] == 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper'
|
17
|
+
params = format_args(item['args'].first['arguments'])
|
18
|
+
else
|
19
|
+
params = format_args(item['args'])
|
20
|
+
end
|
21
|
+
|
13
22
|
Appsignal.monitor_transaction(
|
14
23
|
'perform_job.sidekiq',
|
15
24
|
:class => item['wrapped'] || item['class'],
|
16
25
|
:method => 'perform',
|
17
26
|
:metadata => formatted_metadata(item),
|
18
|
-
:params =>
|
27
|
+
:params => params,
|
19
28
|
:queue_start => item['enqueued_at']
|
20
29
|
) do
|
21
30
|
yield
|
@@ -29,24 +38,6 @@ module Appsignal
|
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
32
|
-
|
33
|
-
def string_or_inspect(string_or_other)
|
34
|
-
if string_or_other.is_a?(String)
|
35
|
-
string_or_other
|
36
|
-
else
|
37
|
-
string_or_other.inspect
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def format_args(args)
|
42
|
-
args.map do |arg|
|
43
|
-
truncate(string_or_inspect(arg))
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def truncate(text)
|
48
|
-
text.size > 200 ? "#{text[0...197]}..." : text
|
49
|
-
end
|
50
41
|
end
|
51
42
|
|
52
43
|
class SidekiqHook < Appsignal::Hooks::Hook
|