appsignal 3.1.1-java → 3.1.4-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -0
- data/appsignal.gemspec +5 -1
- data/ext/agent.yml +32 -25
- data/lib/appsignal/config.rb +0 -3
- data/lib/appsignal/garbage_collection.rb +90 -0
- data/lib/appsignal/helpers/instrumentation.rb +8 -5
- data/lib/appsignal/hooks/active_job.rb +5 -5
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +4 -2
- data/lib/appsignal/integrations/sidekiq.rb +18 -15
- data/lib/appsignal/probes/helpers.rb +21 -8
- data/lib/appsignal/probes/mri.rb +18 -18
- data/lib/appsignal/probes/sidekiq.rb +7 -6
- data/lib/appsignal/rack/rails_instrumentation.rb +5 -1
- data/lib/appsignal/transaction.rb +19 -12
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +1 -6
- data/spec/lib/appsignal/config_spec.rb +0 -1
- data/spec/lib/appsignal/{garbage_collection_profiler_spec.rb → garbage_collection_spec.rb} +28 -6
- data/spec/lib/appsignal/probes/mri_spec.rb +66 -3
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +79 -35
- data/spec/lib/appsignal/transaction_spec.rb +19 -34
- data/spec/lib/appsignal_spec.rb +10 -23
- data/spec/support/helpers/env_helpers.rb +9 -1
- data/spec/support/helpers/transaction_helpers.rb +6 -0
- data/spec/support/testing.rb +11 -0
- metadata +12 -12
- data/lib/appsignal/garbage_collection_profiler.rb +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11a83cde5a5fd83b9e14f1429d5a9f695d080ffc2ac729a02f83f3b891b812c3
|
4
|
+
data.tar.gz: 53743646f5cf821ab45559817cf65c2bf9ed483184725fca2413b3606fad6e1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e56000d21fc9cb56edc28ef15ad22d8ab493d081e8e88d8e112c592b7a8bf93c3ac2d0a24b2ea97b7cc85f26fe2fdbdf751894c4fb156f3189bc962504f93d5
|
7
|
+
data.tar.gz: b03a309a6c8649397e6f5d9b62a65324e4b4e39a3a1eee77b6cb60280758838212e2de7ca3eb28c8f10b3b59cb5b02ca7d88347cc9f3995be0308bf5249cae70
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,45 @@
|
|
1
1
|
# AppSignal for Ruby gem Changelog
|
2
2
|
|
3
|
+
## 3.1.4
|
4
|
+
|
5
|
+
### Added
|
6
|
+
|
7
|
+
- [ffe49cfe](https://github.com/appsignal/appsignal-ruby/commit/ffe49cfe94f5269e59d6f168a73114f7a3914f79) patch - Support temporarily disabling GC profiling without reporting inaccurate `gc_time` metric durations. The MRI probe's `gc_time` will not report any value when the `GC::Profiler.enabled?` returns `false`.
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
- [af7e666c](https://github.com/appsignal/appsignal-ruby/commit/af7e666cf173ec1f42e9cf3fce2ab6c8e658440c) patch - Listen if the Ruby Garbage Collection profiler is enabled and collect how long the GC is running for the Ruby VM magic dashboard. An app will need to call `GC::Profiler.enable` to enable the GC profiler. Do not enable this in production environments, or at least not for long, because this can negatively impact performance of apps.
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
|
15
|
+
- [b3a163be](https://github.com/appsignal/appsignal-ruby/commit/b3a163be154796e1f358c5061eaee99845c960ee) patch - Fix the MRI probe using the Garbage Collection profiler instead of the NilProfiler when garbage collection instrumentation is not enabled for MRI probe. This caused unnecessary overhead.
|
16
|
+
|
17
|
+
## 3.1.3
|
18
|
+
|
19
|
+
### Added
|
20
|
+
|
21
|
+
- [811a1082](https://github.com/appsignal/appsignal-ruby/commit/811a10825043ed584f23d870e3a420ee409eb151) patch - Add the `Transaction.current?` helper to determine if any Transaction is currently active or not. AppSignal `NilTransaction`s are not considered active transactions.
|
22
|
+
|
23
|
+
### Changed
|
24
|
+
|
25
|
+
- [dc50d889](https://github.com/appsignal/appsignal-ruby/commit/dc50d8892699bf17b2399865ead8b27ce45b60ed) patch - Rename the (so far privately reported) `gc_total_time` metric to `gc_time`. It no longer reports the total time of Garbage Collection measured, but only the time between two (minutely) measurements.
|
26
|
+
|
27
|
+
### Fixed
|
28
|
+
|
29
|
+
- [7cfed987](https://github.com/appsignal/appsignal-ruby/commit/7cfed98761cf81d475261c553486b24843460cf3) patch - Fix error on unknown HTTP request method. When a request is made with an unknown request method, triggering and `ActionController::UnknownHttpMethod`, it will no longer break the AppSignal instrumentation but omit the request method in the sample data.
|
30
|
+
|
31
|
+
## 3.1.2
|
32
|
+
|
33
|
+
### Changed
|
34
|
+
|
35
|
+
- [1b95bb4c](https://github.com/appsignal/appsignal-ruby/commit/1b95bb4c8df08128cfa2db0d918ffcb909e5ee4c) patch - Report Garbage Collection total time metric as the delta between measurements. This reports a more user friendly metric that doesn't always goes up until the app restarts or gets a new deploy. This metric is reported 0 by default without `GC::Profiler.enable` having been called.
|
36
|
+
- [61a78fb0](https://github.com/appsignal/appsignal-ruby/commit/61a78fb028b04ae6f0a4ca1fc469d744f23c5029) patch - Bump agent to 06391fb
|
37
|
+
|
38
|
+
- Accept "warning" value for the `log_level` config option.
|
39
|
+
- Add aarch64 Linux musl build.
|
40
|
+
- Improve debug logging from the extension.
|
41
|
+
- Fix high CPU issue for appsignal-agent when nothing could be read from the socket.
|
42
|
+
|
3
43
|
## 3.1.1
|
4
44
|
|
5
45
|
### Changed
|
data/appsignal.gemspec
CHANGED
@@ -39,12 +39,16 @@ Gem::Specification.new do |gem| # rubocop:disable Metrics/BlockLength
|
|
39
39
|
gem.add_development_dependency "rake", ">= 12"
|
40
40
|
gem.add_development_dependency "rspec", "~> 3.8"
|
41
41
|
gem.add_development_dependency "timecop"
|
42
|
-
gem.add_development_dependency "webmock"
|
43
42
|
gem.add_development_dependency "yard", ">= 0.9.20"
|
44
43
|
gem.add_development_dependency "pry"
|
45
44
|
|
46
45
|
# Dependencies that need to be locked to a specific version in developement
|
47
46
|
ruby_version = Gem::Version.new(RUBY_VERSION)
|
47
|
+
if ruby_version < Gem::Version.new("2.3.0")
|
48
|
+
gem.add_development_dependency "webmock", "3.14.0"
|
49
|
+
else
|
50
|
+
gem.add_development_dependency "webmock"
|
51
|
+
end
|
48
52
|
if ruby_version > Gem::Version.new("2.5.0")
|
49
53
|
# RuboCop dependency parallel depends on Ruby > 2.4
|
50
54
|
gem.add_development_dependency "rubocop", "0.50.0"
|
data/ext/agent.yml
CHANGED
@@ -3,92 +3,99 @@
|
|
3
3
|
# appsignal-agent repository.
|
4
4
|
# Modifications to this file will be overwritten with the next agent release.
|
5
5
|
---
|
6
|
-
version:
|
6
|
+
version: '06391fb'
|
7
7
|
mirrors:
|
8
8
|
- https://appsignal-agent-releases.global.ssl.fastly.net
|
9
9
|
- https://d135dj0rjqvssy.cloudfront.net
|
10
10
|
triples:
|
11
11
|
x86_64-darwin:
|
12
12
|
static:
|
13
|
-
checksum:
|
13
|
+
checksum: 9bf41c183d94c80e980f57ea2e29d08bae97e8097b5284a2b91a5484bf866f8c
|
14
14
|
filename: appsignal-x86_64-darwin-all-static.tar.gz
|
15
15
|
dynamic:
|
16
|
-
checksum:
|
16
|
+
checksum: 4d3789e65cf00e446600e883d95d097323ebb3835703c67c8d09f434f09ab496
|
17
17
|
filename: appsignal-x86_64-darwin-all-dynamic.tar.gz
|
18
18
|
universal-darwin:
|
19
19
|
static:
|
20
|
-
checksum:
|
20
|
+
checksum: 9bf41c183d94c80e980f57ea2e29d08bae97e8097b5284a2b91a5484bf866f8c
|
21
21
|
filename: appsignal-x86_64-darwin-all-static.tar.gz
|
22
22
|
dynamic:
|
23
|
-
checksum:
|
23
|
+
checksum: 4d3789e65cf00e446600e883d95d097323ebb3835703c67c8d09f434f09ab496
|
24
24
|
filename: appsignal-x86_64-darwin-all-dynamic.tar.gz
|
25
25
|
aarch64-darwin:
|
26
26
|
static:
|
27
|
-
checksum:
|
27
|
+
checksum: 74edd7b97995f3314c10e3d84fc832c1b842c236c331ed4f2f77146ad004d179
|
28
28
|
filename: appsignal-aarch64-darwin-all-static.tar.gz
|
29
29
|
dynamic:
|
30
|
-
checksum:
|
30
|
+
checksum: 7165bb164a9cd7a2a5f97897d954390412f7034c667e5826b3307ffbd848bff9
|
31
31
|
filename: appsignal-aarch64-darwin-all-dynamic.tar.gz
|
32
32
|
arm64-darwin:
|
33
33
|
static:
|
34
|
-
checksum:
|
34
|
+
checksum: 74edd7b97995f3314c10e3d84fc832c1b842c236c331ed4f2f77146ad004d179
|
35
35
|
filename: appsignal-aarch64-darwin-all-static.tar.gz
|
36
36
|
dynamic:
|
37
|
-
checksum:
|
37
|
+
checksum: 7165bb164a9cd7a2a5f97897d954390412f7034c667e5826b3307ffbd848bff9
|
38
38
|
filename: appsignal-aarch64-darwin-all-dynamic.tar.gz
|
39
39
|
arm-darwin:
|
40
40
|
static:
|
41
|
-
checksum:
|
41
|
+
checksum: 74edd7b97995f3314c10e3d84fc832c1b842c236c331ed4f2f77146ad004d179
|
42
42
|
filename: appsignal-aarch64-darwin-all-static.tar.gz
|
43
43
|
dynamic:
|
44
|
-
checksum:
|
44
|
+
checksum: 7165bb164a9cd7a2a5f97897d954390412f7034c667e5826b3307ffbd848bff9
|
45
45
|
filename: appsignal-aarch64-darwin-all-dynamic.tar.gz
|
46
46
|
aarch64-linux:
|
47
47
|
static:
|
48
|
-
checksum:
|
48
|
+
checksum: 0f2430e637eb77ce2093f021777087e87cb1e7be7c86a53771172696791c4879
|
49
49
|
filename: appsignal-aarch64-linux-all-static.tar.gz
|
50
50
|
dynamic:
|
51
|
-
checksum:
|
51
|
+
checksum: 0e4f9305aeaaa2d7847e83be04227b865723a0591574108d78040b5921a677a7
|
52
52
|
filename: appsignal-aarch64-linux-all-dynamic.tar.gz
|
53
53
|
i686-linux:
|
54
54
|
static:
|
55
|
-
checksum:
|
55
|
+
checksum: 449ba623aaa1853c2d211bf1e2d3a14e5ae09225a62457cbdbcc0983a5713a52
|
56
56
|
filename: appsignal-i686-linux-all-static.tar.gz
|
57
57
|
dynamic:
|
58
|
-
checksum:
|
58
|
+
checksum: dae994292d602eaf0910bd2ce53f0163e19767a4cbb8e5d0db99c0010d6df486
|
59
59
|
filename: appsignal-i686-linux-all-dynamic.tar.gz
|
60
60
|
x86-linux:
|
61
61
|
static:
|
62
|
-
checksum:
|
62
|
+
checksum: 449ba623aaa1853c2d211bf1e2d3a14e5ae09225a62457cbdbcc0983a5713a52
|
63
63
|
filename: appsignal-i686-linux-all-static.tar.gz
|
64
64
|
dynamic:
|
65
|
-
checksum:
|
65
|
+
checksum: dae994292d602eaf0910bd2ce53f0163e19767a4cbb8e5d0db99c0010d6df486
|
66
66
|
filename: appsignal-i686-linux-all-dynamic.tar.gz
|
67
67
|
x86_64-linux:
|
68
68
|
static:
|
69
|
-
checksum:
|
69
|
+
checksum: 394796c0ddeb4881c9f2e6ce82f840e66bcb69e027324f6c04f6671067445fbb
|
70
70
|
filename: appsignal-x86_64-linux-all-static.tar.gz
|
71
71
|
dynamic:
|
72
|
-
checksum:
|
72
|
+
checksum: 9ca4762c464482b0a5a89898a839388597dd57a17a21527a67f3e3db0e540a03
|
73
73
|
filename: appsignal-x86_64-linux-all-dynamic.tar.gz
|
74
74
|
x86_64-linux-musl:
|
75
75
|
static:
|
76
|
-
checksum:
|
76
|
+
checksum: 673271c8c5fd55053d8a719bcd307f787db4ca4633baf8cf961c442bf1805614
|
77
77
|
filename: appsignal-x86_64-linux-musl-all-static.tar.gz
|
78
78
|
dynamic:
|
79
|
-
checksum:
|
79
|
+
checksum: 609d59376d6633652015e838eb649229fe2523d443a5471232b869f48eb99640
|
80
80
|
filename: appsignal-x86_64-linux-musl-all-dynamic.tar.gz
|
81
|
+
aarch64-linux-musl:
|
82
|
+
static:
|
83
|
+
checksum: e90ca19bf61596be022ba04897e8902b3401add58f351a40a3d3a7af241d0bbb
|
84
|
+
filename: appsignal-aarch64-linux-musl-all-static.tar.gz
|
85
|
+
dynamic:
|
86
|
+
checksum: afb66c65fb82b672887bc6b6e82d82f09d9855a5497a7abb06b438dadea97aca
|
87
|
+
filename: appsignal-aarch64-linux-musl-all-dynamic.tar.gz
|
81
88
|
x86_64-freebsd:
|
82
89
|
static:
|
83
|
-
checksum:
|
90
|
+
checksum: cb45da91c51123859e5ef5cea850460c28d6e77dfa08b90375178d9017162ba8
|
84
91
|
filename: appsignal-x86_64-freebsd-all-static.tar.gz
|
85
92
|
dynamic:
|
86
|
-
checksum:
|
93
|
+
checksum: 6a03e02c2526e05edaa7fa932b2e764318c63ec93d517c6c00f6b7541bfe71f3
|
87
94
|
filename: appsignal-x86_64-freebsd-all-dynamic.tar.gz
|
88
95
|
amd64-freebsd:
|
89
96
|
static:
|
90
|
-
checksum:
|
97
|
+
checksum: cb45da91c51123859e5ef5cea850460c28d6e77dfa08b90375178d9017162ba8
|
91
98
|
filename: appsignal-x86_64-freebsd-all-static.tar.gz
|
92
99
|
dynamic:
|
93
|
-
checksum:
|
100
|
+
checksum: 6a03e02c2526e05edaa7fa932b2e764318c63ec93d517c6c00f6b7541bfe71f3
|
94
101
|
filename: appsignal-x86_64-freebsd-all-dynamic.tar.gz
|
data/lib/appsignal/config.rb
CHANGED
@@ -15,7 +15,6 @@ module Appsignal
|
|
15
15
|
:debug => false,
|
16
16
|
:dns_servers => [],
|
17
17
|
:enable_allocation_tracking => true,
|
18
|
-
:enable_gc_instrumentation => false,
|
19
18
|
:enable_host_metrics => true,
|
20
19
|
:enable_minutely_probes => true,
|
21
20
|
:enable_statsd => true,
|
@@ -63,7 +62,6 @@ module Appsignal
|
|
63
62
|
"APPSIGNAL_DEBUG" => :debug,
|
64
63
|
"APPSIGNAL_DNS_SERVERS" => :dns_servers,
|
65
64
|
"APPSIGNAL_ENABLE_ALLOCATION_TRACKING" => :enable_allocation_tracking,
|
66
|
-
"APPSIGNAL_ENABLE_GC_INSTRUMENTATION" => :enable_gc_instrumentation,
|
67
65
|
"APPSIGNAL_ENABLE_HOST_METRICS" => :enable_host_metrics,
|
68
66
|
"APPSIGNAL_ENABLE_MINUTELY_PROBES" => :enable_minutely_probes,
|
69
67
|
"APPSIGNAL_ENABLE_STATSD" => :enable_statsd,
|
@@ -114,7 +112,6 @@ module Appsignal
|
|
114
112
|
APPSIGNAL_ACTIVE
|
115
113
|
APPSIGNAL_DEBUG
|
116
114
|
APPSIGNAL_ENABLE_ALLOCATION_TRACKING
|
117
|
-
APPSIGNAL_ENABLE_GC_INSTRUMENTATION
|
118
115
|
APPSIGNAL_ENABLE_HOST_METRICS
|
119
116
|
APPSIGNAL_ENABLE_MINUTELY_PROBES
|
120
117
|
APPSIGNAL_ENABLE_STATSD
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Appsignal
|
4
|
+
# @api private
|
5
|
+
module GarbageCollection
|
6
|
+
# Return the GC profiler wrapper.
|
7
|
+
#
|
8
|
+
# Returns {Profiler} if the Ruby Garbage Collection profiler is enabled.
|
9
|
+
# This is checked by calling `GC::Profiler.enabled?`.
|
10
|
+
#
|
11
|
+
# GC profiling is disabled by default due to the overhead it causes. Do not
|
12
|
+
# enable this in production for long periods of time.
|
13
|
+
def self.profiler
|
14
|
+
# Cached instances so it doesn't create a new object every time this
|
15
|
+
# method is called. Especially necessary for the {Profiler} because a new
|
16
|
+
# instance will have a new internal time counter.
|
17
|
+
@real_profiler ||= Profiler.new
|
18
|
+
@nil_profiler ||= NilProfiler.new
|
19
|
+
|
20
|
+
enabled? ? @real_profiler : @nil_profiler
|
21
|
+
end
|
22
|
+
|
23
|
+
# Check if Garbage Collection is enabled at the moment.
|
24
|
+
#
|
25
|
+
# @return [Boolean]
|
26
|
+
def self.enabled?
|
27
|
+
GC::Profiler.enabled?
|
28
|
+
end
|
29
|
+
|
30
|
+
# Unset the currently cached profilers.
|
31
|
+
#
|
32
|
+
# @return [void]
|
33
|
+
def self.clear_profiler!
|
34
|
+
@real_profiler = nil
|
35
|
+
@nil_profiler = nil
|
36
|
+
end
|
37
|
+
|
38
|
+
# A wrapper around Ruby's `GC::Profiler` that tracks garbage collection
|
39
|
+
# time, while clearing `GC::Profiler`'s total_time to make sure it doesn't
|
40
|
+
# leak memory by keeping garbage collection run samples in memory.
|
41
|
+
class Profiler
|
42
|
+
def self.lock
|
43
|
+
@lock ||= Mutex.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
@total_time = 0
|
48
|
+
end
|
49
|
+
|
50
|
+
# Whenever {#total_time} is called, the current `GC::Profiler#total_time`
|
51
|
+
# gets added to `@total_time`, after which `GC::Profiler.clear` is called
|
52
|
+
# to prevent it from leaking memory. A class-level lock is used to make
|
53
|
+
# sure garbage collection time is never counted more than once.
|
54
|
+
#
|
55
|
+
# Whenever `@total_time` gets above two billion milliseconds (about 23
|
56
|
+
# days), it's reset to make sure the result fits in a signed 32-bit
|
57
|
+
# integer.
|
58
|
+
#
|
59
|
+
# @return [Integer]
|
60
|
+
def total_time
|
61
|
+
lock.synchronize do
|
62
|
+
@total_time += (internal_profiler.total_time * 1000).round
|
63
|
+
internal_profiler.clear
|
64
|
+
end
|
65
|
+
|
66
|
+
@total_time = 0 if @total_time > 2_000_000_000
|
67
|
+
|
68
|
+
@total_time
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def internal_profiler
|
74
|
+
GC::Profiler
|
75
|
+
end
|
76
|
+
|
77
|
+
def lock
|
78
|
+
self.class.lock
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# A dummy profiler that always returns 0 as the total time. Used when GC
|
83
|
+
# profiler is disabled.
|
84
|
+
class NilProfiler
|
85
|
+
def total_time
|
86
|
+
0
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -325,7 +325,8 @@ module Appsignal
|
|
325
325
|
"value is not an exception: #{exception.inspect}"
|
326
326
|
return
|
327
327
|
end
|
328
|
-
return if !active? || Appsignal::Transaction.current
|
328
|
+
return if !active? || !Appsignal::Transaction.current?
|
329
|
+
|
329
330
|
transaction = Appsignal::Transaction.current
|
330
331
|
transaction.set_error(exception)
|
331
332
|
transaction.set_tags(tags) if tags
|
@@ -359,7 +360,7 @@ module Appsignal
|
|
359
360
|
# @since 2.2.0
|
360
361
|
def set_action(action)
|
361
362
|
return if !active? ||
|
362
|
-
Appsignal::Transaction.current
|
363
|
+
!Appsignal::Transaction.current? ||
|
363
364
|
action.nil?
|
364
365
|
Appsignal::Transaction.current.set_action(action)
|
365
366
|
end
|
@@ -398,7 +399,7 @@ module Appsignal
|
|
398
399
|
# @since 2.2.0
|
399
400
|
def set_namespace(namespace)
|
400
401
|
return if !active? ||
|
401
|
-
Appsignal::Transaction.current
|
402
|
+
!Appsignal::Transaction.current? ||
|
402
403
|
namespace.nil?
|
403
404
|
Appsignal::Transaction.current.set_namespace(namespace)
|
404
405
|
end
|
@@ -438,8 +439,9 @@ module Appsignal
|
|
438
439
|
# Tagging guide
|
439
440
|
def tag_request(tags = {})
|
440
441
|
return unless active?
|
442
|
+
return unless Appsignal::Transaction.current?
|
443
|
+
|
441
444
|
transaction = Appsignal::Transaction.current
|
442
|
-
return false unless transaction
|
443
445
|
transaction.set_tags(tags)
|
444
446
|
end
|
445
447
|
alias :tag_job :tag_request
|
@@ -471,8 +473,9 @@ module Appsignal
|
|
471
473
|
# @since 2.12.0
|
472
474
|
def add_breadcrumb(category, action, message = "", metadata = {}, time = Time.now.utc)
|
473
475
|
return unless active?
|
476
|
+
return unless Appsignal::Transaction.current?
|
477
|
+
|
474
478
|
transaction = Appsignal::Transaction.current
|
475
|
-
return false unless transaction
|
476
479
|
transaction.add_breadcrumb(category, action, message, metadata, time)
|
477
480
|
end
|
478
481
|
|
@@ -20,9 +20,11 @@ module Appsignal
|
|
20
20
|
module ActiveJobClassInstrumentation
|
21
21
|
def execute(job)
|
22
22
|
job_status = nil
|
23
|
-
|
23
|
+
has_wrapper_transaction = Appsignal::Transaction.current?
|
24
24
|
transaction =
|
25
|
-
if
|
25
|
+
if has_wrapper_transaction
|
26
|
+
Appsignal::Transaction.current
|
27
|
+
else
|
26
28
|
# No standalone integration started before ActiveJob integration.
|
27
29
|
# We don't have a separate integration for this QueueAdapter like
|
28
30
|
# we do for Sidekiq.
|
@@ -33,8 +35,6 @@ module Appsignal
|
|
33
35
|
Appsignal::Transaction::BACKGROUND_JOB,
|
34
36
|
Appsignal::Transaction::GenericRequest.new({})
|
35
37
|
)
|
36
|
-
else
|
37
|
-
current_transaction
|
38
38
|
end
|
39
39
|
|
40
40
|
super
|
@@ -64,7 +64,7 @@ module Appsignal
|
|
64
64
|
transaction.set_queue_start((Time.parse(enqueued_at).to_f * 1_000).to_i)
|
65
65
|
end
|
66
66
|
|
67
|
-
|
67
|
+
unless has_wrapper_transaction
|
68
68
|
# Only complete transaction if ActiveJob is not wrapped in
|
69
69
|
# another supported integration, such as Sidekiq.
|
70
70
|
Appsignal::Transaction.complete_current!
|
@@ -6,8 +6,9 @@ module Appsignal
|
|
6
6
|
class MongoMonitorSubscriber
|
7
7
|
# Called by Mongo::Monitor when query starts
|
8
8
|
def started(event)
|
9
|
+
return unless Appsignal::Transaction.current?
|
10
|
+
|
9
11
|
transaction = Appsignal::Transaction.current
|
10
|
-
return if transaction.nil_transaction?
|
11
12
|
return if transaction.paused?
|
12
13
|
|
13
14
|
# Format the command
|
@@ -36,8 +37,9 @@ module Appsignal
|
|
36
37
|
|
37
38
|
# Finishes the event in the AppSignal extension
|
38
39
|
def finish(result, event)
|
40
|
+
return unless Appsignal::Transaction.current?
|
41
|
+
|
39
42
|
transaction = Appsignal::Transaction.current
|
40
|
-
return if transaction.nil_transaction?
|
41
43
|
return if transaction.paused?
|
42
44
|
|
43
45
|
# Get the query from the transaction store
|
@@ -10,21 +10,24 @@ module Appsignal
|
|
10
10
|
# @api private
|
11
11
|
class SidekiqErrorHandler
|
12
12
|
def call(exception, sidekiq_context)
|
13
|
-
transaction =
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
13
|
+
transaction =
|
14
|
+
if Appsignal::Transaction.current?
|
15
|
+
Appsignal::Transaction.current
|
16
|
+
else
|
17
|
+
# Sidekiq error outside of the middleware scope.
|
18
|
+
# Can be a job JSON parse error or some other error happening in
|
19
|
+
# Sidekiq.
|
20
|
+
transaction =
|
21
|
+
Appsignal::Transaction.create(
|
22
|
+
SecureRandom.uuid, # Newly generated job id
|
23
|
+
Appsignal::Transaction::BACKGROUND_JOB,
|
24
|
+
Appsignal::Transaction::GenericRequest.new({})
|
25
|
+
)
|
26
|
+
transaction.set_action_if_nil("SidekiqInternal")
|
27
|
+
transaction.set_metadata("sidekiq_error", sidekiq_context[:context])
|
28
|
+
transaction.params = { :jobstr => sidekiq_context[:jobstr] }
|
29
|
+
transaction
|
30
|
+
end
|
28
31
|
|
29
32
|
transaction.set_error(exception)
|
30
33
|
Appsignal::Transaction.complete_current!
|
@@ -7,22 +7,35 @@ module Appsignal
|
|
7
7
|
@gauge_delta_cache ||= {}
|
8
8
|
end
|
9
9
|
|
10
|
-
# Calculate the delta of two values for a gauge metric
|
10
|
+
# Calculate the delta of two values for a gauge metric.
|
11
11
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
12
|
+
# When this method is called, the given value is stored in a cache
|
13
|
+
# under the given cache key.
|
14
|
+
#
|
15
|
+
# A block must be passed to this method. The first time the method
|
16
|
+
# is called for a given cache key, the block will not be yielded to.
|
17
|
+
# In subsequent calls, the delta between the previously stored value
|
18
|
+
# in the cache for that key and the value given in this invocation
|
19
|
+
# will be yielded to the block.
|
20
|
+
#
|
21
|
+
# This is used for absolute counter values which we want to track as
|
22
|
+
# gauges.
|
15
23
|
#
|
16
24
|
# @example
|
17
|
-
# gauge_delta :
|
18
|
-
#
|
19
|
-
#
|
25
|
+
# gauge_delta :with_block, 10 do |delta|
|
26
|
+
# puts "this block will not be yielded to"
|
27
|
+
# end
|
28
|
+
# gauge_delta :with_block, 15 do |delta|
|
29
|
+
# # `delta` has a value of `5`
|
30
|
+
# puts "this block will be yielded to with delta = #{delta}"
|
31
|
+
# end
|
32
|
+
#
|
20
33
|
def gauge_delta(cache_key, value)
|
21
34
|
previous_value = gauge_delta_cache[cache_key]
|
22
35
|
gauge_delta_cache[cache_key] = value
|
23
36
|
return unless previous_value
|
24
37
|
|
25
|
-
value - previous_value
|
38
|
+
yield value - previous_value
|
26
39
|
end
|
27
40
|
end
|
28
41
|
end
|
data/lib/appsignal/probes/mri.rb
CHANGED
@@ -8,13 +8,10 @@ module Appsignal
|
|
8
8
|
defined?(::RubyVM) && ::RubyVM.respond_to?(:stat)
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
@garbage_collection_profiler ||= Appsignal::GarbageCollectionProfiler.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def initialize(appsignal = Appsignal)
|
11
|
+
def initialize(appsignal: Appsignal, gc_profiler: Appsignal::GarbageCollection.profiler)
|
16
12
|
Appsignal.logger.debug("Initializing VM probe")
|
17
13
|
@appsignal = appsignal
|
14
|
+
@gc_profiler = gc_profiler
|
18
15
|
end
|
19
16
|
|
20
17
|
# @api private
|
@@ -34,24 +31,27 @@ module Appsignal
|
|
34
31
|
)
|
35
32
|
|
36
33
|
set_gauge("thread_count", Thread.list.size)
|
37
|
-
|
34
|
+
if Appsignal::GarbageCollection.enabled?
|
35
|
+
gauge_delta(:gc_time, @gc_profiler.total_time) do |gc_time|
|
36
|
+
set_gauge("gc_time", gc_time) if gc_time > 0
|
37
|
+
end
|
38
|
+
end
|
38
39
|
|
39
40
|
gc_stats = GC.stat
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
)
|
45
|
-
|
41
|
+
gauge_delta(
|
42
|
+
:allocated_objects,
|
43
|
+
gc_stats[:total_allocated_objects] || gc_stats[:total_allocated_object]
|
44
|
+
) do |allocated_objects|
|
45
|
+
set_gauge("allocated_objects", allocated_objects)
|
46
|
+
end
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
gauge_delta(:gc_count, GC.count) do |gc_count|
|
49
|
+
set_gauge("gc_count", gc_count, :metric => :gc_count)
|
50
|
+
end
|
51
|
+
gauge_delta(:minor_gc_count, gc_stats[:minor_gc_count]) do |minor_gc_count|
|
51
52
|
set_gauge("gc_count", minor_gc_count, :metric => :minor_gc_count)
|
52
53
|
end
|
53
|
-
|
54
|
-
if major_gc_count
|
54
|
+
gauge_delta(:major_gc_count, gc_stats[:major_gc_count]) do |major_gc_count|
|
55
55
|
set_gauge("gc_count", major_gc_count, :metric => :major_gc_count)
|
56
56
|
end
|
57
57
|
|
@@ -44,15 +44,16 @@ module Appsignal
|
|
44
44
|
|
45
45
|
gauge "worker_count", stats.workers_size
|
46
46
|
gauge "process_count", stats.processes_size
|
47
|
-
|
48
|
-
if jobs_processed
|
47
|
+
gauge_delta :jobs_processed, stats.processed do |jobs_processed|
|
49
48
|
gauge "job_count", jobs_processed, :status => :processed
|
50
49
|
end
|
51
|
-
|
52
|
-
|
50
|
+
gauge_delta :jobs_failed, stats.failed do |jobs_failed|
|
51
|
+
gauge "job_count", jobs_failed, :status => :failed
|
52
|
+
end
|
53
53
|
gauge "job_count", stats.retry_size, :status => :retry_queue
|
54
|
-
|
55
|
-
|
54
|
+
gauge_delta :jobs_dead, stats.dead_size do |jobs_dead|
|
55
|
+
gauge "job_count", jobs_dead, :status => :died
|
56
|
+
end
|
56
57
|
gauge "job_count", stats.scheduled_size, :status => :scheduled
|
57
58
|
gauge "job_count", stats.enqueued, :status => :enqueued
|
58
59
|
end
|
@@ -40,7 +40,11 @@ module Appsignal
|
|
40
40
|
end
|
41
41
|
transaction.set_http_or_background_queue_start
|
42
42
|
transaction.set_metadata("path", request.path)
|
43
|
-
|
43
|
+
begin
|
44
|
+
transaction.set_metadata("method", request.request_method)
|
45
|
+
rescue => error
|
46
|
+
Appsignal.logger.error("Unable to report HTTP request method: '#{error}'")
|
47
|
+
end
|
44
48
|
Appsignal::Transaction.complete_current!
|
45
49
|
end
|
46
50
|
end
|