appsignal 3.3.7 → 3.3.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.semaphore/semaphore.yml +105 -15
- data/CHANGELOG.md +18 -0
- data/build_matrix.yml +2 -1
- data/gemfiles/{webmachine.gemfile → webmachine1.gemfile} +1 -1
- data/gemfiles/webmachine2.gemfile +6 -0
- data/lib/appsignal/config.rb +7 -0
- data/lib/appsignal/hooks/gvl.rb +22 -0
- data/lib/appsignal/hooks.rb +1 -0
- data/lib/appsignal/logger.rb +16 -22
- data/lib/appsignal/probes/gvl.rb +47 -0
- data/lib/appsignal/probes/helpers.rb +21 -0
- data/lib/appsignal/probes/mri.rb +12 -35
- data/lib/appsignal/probes.rb +1 -0
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +2 -0
- data/spec/lib/appsignal/hooks/gvl_spec.rb +140 -0
- data/spec/lib/appsignal/logger_spec.rb +18 -3
- data/spec/lib/appsignal/probes/gvl_spec.rb +39 -0
- data/spec/lib/appsignal/probes/mri_spec.rb +0 -19
- data/spec/support/mocks/appsignal_mock.rb +18 -0
- data/spec/support/mocks/fake_gvl_tools.rb +36 -0
- metadata +18 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 762febba3d00911209c9fd4d6d7c1f55aa89ad38437df3da0fa5b36a00008c7b
|
4
|
+
data.tar.gz: 5cccb7e02b50707e3093025679cd48168379ed2300d855e851eb71d62095f4ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb3286752fa4a191175612ebb66ea1c8333c29ac74548d510a857aa1bce668d678a255bc995ac979e3f5fff424e9f39fb3883c0e9a835a496b15416b1d3efd5a
|
7
|
+
data.tar.gz: bb15b922ac0460bd0d58d7c5dcf50e95665be21bfc35af5d1a2d8ca400f78c2857fcc0d78f806568927607f55edffc5891c7b536c0554e48abbf90b41a7cc5fd
|
data/.semaphore/semaphore.yml
CHANGED
@@ -846,7 +846,7 @@ blocks:
|
|
846
846
|
value: latest
|
847
847
|
commands:
|
848
848
|
- "./support/bundler_wrapper exec rake test"
|
849
|
-
- name: Ruby 2.6.9 for
|
849
|
+
- name: Ruby 2.6.9 for webmachine1
|
850
850
|
env_vars:
|
851
851
|
- *2
|
852
852
|
- *3
|
@@ -855,9 +855,27 @@ blocks:
|
|
855
855
|
- name: RUBY_VERSION
|
856
856
|
value: 2.6.9
|
857
857
|
- name: GEMSET
|
858
|
-
value:
|
858
|
+
value: webmachine1
|
859
859
|
- name: BUNDLE_GEMFILE
|
860
|
-
value: gemfiles/
|
860
|
+
value: gemfiles/webmachine1.gemfile
|
861
|
+
- name: _RUBYGEMS_VERSION
|
862
|
+
value: latest
|
863
|
+
- name: _BUNDLER_VERSION
|
864
|
+
value: latest
|
865
|
+
commands:
|
866
|
+
- "./support/bundler_wrapper exec rake test"
|
867
|
+
- name: Ruby 2.6.9 for webmachine2
|
868
|
+
env_vars:
|
869
|
+
- *2
|
870
|
+
- *3
|
871
|
+
- *4
|
872
|
+
- *5
|
873
|
+
- name: RUBY_VERSION
|
874
|
+
value: 2.6.9
|
875
|
+
- name: GEMSET
|
876
|
+
value: webmachine2
|
877
|
+
- name: BUNDLE_GEMFILE
|
878
|
+
value: gemfiles/webmachine2.gemfile
|
861
879
|
- name: _RUBYGEMS_VERSION
|
862
880
|
value: latest
|
863
881
|
- name: _BUNDLER_VERSION
|
@@ -1239,7 +1257,25 @@ blocks:
|
|
1239
1257
|
value: latest
|
1240
1258
|
commands:
|
1241
1259
|
- "./support/bundler_wrapper exec rake test"
|
1242
|
-
- name: Ruby 2.7.7 for
|
1260
|
+
- name: Ruby 2.7.7 for webmachine1
|
1261
|
+
env_vars:
|
1262
|
+
- *2
|
1263
|
+
- *3
|
1264
|
+
- *4
|
1265
|
+
- *5
|
1266
|
+
- name: RUBY_VERSION
|
1267
|
+
value: 2.7.7
|
1268
|
+
- name: GEMSET
|
1269
|
+
value: webmachine1
|
1270
|
+
- name: BUNDLE_GEMFILE
|
1271
|
+
value: gemfiles/webmachine1.gemfile
|
1272
|
+
- name: _RUBYGEMS_VERSION
|
1273
|
+
value: latest
|
1274
|
+
- name: _BUNDLER_VERSION
|
1275
|
+
value: latest
|
1276
|
+
commands:
|
1277
|
+
- "./support/bundler_wrapper exec rake test"
|
1278
|
+
- name: Ruby 2.7.7 for webmachine2
|
1243
1279
|
env_vars:
|
1244
1280
|
- *2
|
1245
1281
|
- *3
|
@@ -1248,9 +1284,9 @@ blocks:
|
|
1248
1284
|
- name: RUBY_VERSION
|
1249
1285
|
value: 2.7.7
|
1250
1286
|
- name: GEMSET
|
1251
|
-
value:
|
1287
|
+
value: webmachine2
|
1252
1288
|
- name: BUNDLE_GEMFILE
|
1253
|
-
value: gemfiles/
|
1289
|
+
value: gemfiles/webmachine2.gemfile
|
1254
1290
|
- name: _RUBYGEMS_VERSION
|
1255
1291
|
value: latest
|
1256
1292
|
- name: _BUNDLER_VERSION
|
@@ -1596,7 +1632,7 @@ blocks:
|
|
1596
1632
|
value: latest
|
1597
1633
|
commands:
|
1598
1634
|
- "./support/bundler_wrapper exec rake test"
|
1599
|
-
- name: Ruby 3.0.5 for
|
1635
|
+
- name: Ruby 3.0.5 for webmachine1
|
1600
1636
|
env_vars:
|
1601
1637
|
- *2
|
1602
1638
|
- *3
|
@@ -1605,9 +1641,27 @@ blocks:
|
|
1605
1641
|
- name: RUBY_VERSION
|
1606
1642
|
value: 3.0.5
|
1607
1643
|
- name: GEMSET
|
1608
|
-
value:
|
1644
|
+
value: webmachine1
|
1609
1645
|
- name: BUNDLE_GEMFILE
|
1610
|
-
value: gemfiles/
|
1646
|
+
value: gemfiles/webmachine1.gemfile
|
1647
|
+
- name: _RUBYGEMS_VERSION
|
1648
|
+
value: latest
|
1649
|
+
- name: _BUNDLER_VERSION
|
1650
|
+
value: latest
|
1651
|
+
commands:
|
1652
|
+
- "./support/bundler_wrapper exec rake test"
|
1653
|
+
- name: Ruby 3.0.5 for webmachine2
|
1654
|
+
env_vars:
|
1655
|
+
- *2
|
1656
|
+
- *3
|
1657
|
+
- *4
|
1658
|
+
- *5
|
1659
|
+
- name: RUBY_VERSION
|
1660
|
+
value: 3.0.5
|
1661
|
+
- name: GEMSET
|
1662
|
+
value: webmachine2
|
1663
|
+
- name: BUNDLE_GEMFILE
|
1664
|
+
value: gemfiles/webmachine2.gemfile
|
1611
1665
|
- name: _RUBYGEMS_VERSION
|
1612
1666
|
value: latest
|
1613
1667
|
- name: _BUNDLER_VERSION
|
@@ -1935,7 +1989,7 @@ blocks:
|
|
1935
1989
|
value: latest
|
1936
1990
|
commands:
|
1937
1991
|
- "./support/bundler_wrapper exec rake test"
|
1938
|
-
- name: Ruby 3.1.3 for
|
1992
|
+
- name: Ruby 3.1.3 for webmachine1
|
1939
1993
|
env_vars:
|
1940
1994
|
- *2
|
1941
1995
|
- *3
|
@@ -1944,9 +1998,27 @@ blocks:
|
|
1944
1998
|
- name: RUBY_VERSION
|
1945
1999
|
value: 3.1.3
|
1946
2000
|
- name: GEMSET
|
1947
|
-
value:
|
2001
|
+
value: webmachine1
|
1948
2002
|
- name: BUNDLE_GEMFILE
|
1949
|
-
value: gemfiles/
|
2003
|
+
value: gemfiles/webmachine1.gemfile
|
2004
|
+
- name: _RUBYGEMS_VERSION
|
2005
|
+
value: latest
|
2006
|
+
- name: _BUNDLER_VERSION
|
2007
|
+
value: latest
|
2008
|
+
commands:
|
2009
|
+
- "./support/bundler_wrapper exec rake test"
|
2010
|
+
- name: Ruby 3.1.3 for webmachine2
|
2011
|
+
env_vars:
|
2012
|
+
- *2
|
2013
|
+
- *3
|
2014
|
+
- *4
|
2015
|
+
- *5
|
2016
|
+
- name: RUBY_VERSION
|
2017
|
+
value: 3.1.3
|
2018
|
+
- name: GEMSET
|
2019
|
+
value: webmachine2
|
2020
|
+
- name: BUNDLE_GEMFILE
|
2021
|
+
value: gemfiles/webmachine2.gemfile
|
1950
2022
|
- name: _RUBYGEMS_VERSION
|
1951
2023
|
value: latest
|
1952
2024
|
- name: _BUNDLER_VERSION
|
@@ -2274,7 +2346,25 @@ blocks:
|
|
2274
2346
|
value: latest
|
2275
2347
|
commands:
|
2276
2348
|
- "./support/bundler_wrapper exec rake test"
|
2277
|
-
- name: Ruby 3.2.1 for
|
2349
|
+
- name: Ruby 3.2.1 for webmachine1
|
2350
|
+
env_vars:
|
2351
|
+
- *2
|
2352
|
+
- *3
|
2353
|
+
- *4
|
2354
|
+
- *5
|
2355
|
+
- name: RUBY_VERSION
|
2356
|
+
value: 3.2.1
|
2357
|
+
- name: GEMSET
|
2358
|
+
value: webmachine1
|
2359
|
+
- name: BUNDLE_GEMFILE
|
2360
|
+
value: gemfiles/webmachine1.gemfile
|
2361
|
+
- name: _RUBYGEMS_VERSION
|
2362
|
+
value: latest
|
2363
|
+
- name: _BUNDLER_VERSION
|
2364
|
+
value: latest
|
2365
|
+
commands:
|
2366
|
+
- "./support/bundler_wrapper exec rake test"
|
2367
|
+
- name: Ruby 3.2.1 for webmachine2
|
2278
2368
|
env_vars:
|
2279
2369
|
- *2
|
2280
2370
|
- *3
|
@@ -2283,9 +2373,9 @@ blocks:
|
|
2283
2373
|
- name: RUBY_VERSION
|
2284
2374
|
value: 3.2.1
|
2285
2375
|
- name: GEMSET
|
2286
|
-
value:
|
2376
|
+
value: webmachine2
|
2287
2377
|
- name: BUNDLE_GEMFILE
|
2288
|
-
value: gemfiles/
|
2378
|
+
value: gemfiles/webmachine2.gemfile
|
2289
2379
|
- name: _RUBYGEMS_VERSION
|
2290
2380
|
value: latest
|
2291
2381
|
- name: _BUNDLER_VERSION
|
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,28 @@
|
|
1
1
|
# AppSignal for Ruby gem Changelog
|
2
2
|
|
3
|
+
## 3.3.9
|
4
|
+
|
5
|
+
### Fixed
|
6
|
+
|
7
|
+
- [a6db61b9](https://github.com/appsignal/appsignal-ruby/commit/a6db61b9a14a5a3b4ba89c99d35229bcdee98f94) patch - Fixed an error when using our Logging feature with Ruby's default logger formatter.
|
8
|
+
|
9
|
+
## 3.3.8
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
- [2fc6ba85](https://github.com/appsignal/appsignal-ruby/commit/2fc6ba85be1e0cabc2bb8fb26469ad47d1c60243) patch - Support "warning" value for `log_level` config option. This option was documented, but wasn't accepted and fell back on the "info" log level if used. Now it works to configure it to the "warn"/"warning" log level.
|
14
|
+
- [c04f7783](https://github.com/appsignal/appsignal-ruby/commit/c04f778332048aeaad9f75c131247caa29e504fa) patch - Add global VM lock metrics. If the `gvltools` library is installed, AppSignal for Ruby will report metrics on the global VM lock and the number of waiting threads in your application.
|
15
|
+
|
3
16
|
## 3.3.7
|
4
17
|
|
18
|
+
### Added
|
19
|
+
|
20
|
+
- [a815b298](https://github.com/appsignal/appsignal-ruby/commit/a815b29826a84f430384e7e735f79c8c312f1abf) patch - Support cgroups v2. Used by newer Docker engines to report host metrics. Upgrade if you receive no host metrics for Docker containers.
|
21
|
+
|
5
22
|
### Changed
|
6
23
|
|
7
24
|
- [8e67159e](https://github.com/appsignal/appsignal-ruby/commit/8e67159e2a57d3b697a07fadd8eb0e0234db9124) patch - Configure AppSignal with the RACK_ENV or RAILS_ENV environment variable in diagnose CLI, if present. Makes it easier to run the diagnose CLI in production, without having to always specify the environment with the `--environment` CLI option.
|
25
|
+
- [a815b298](https://github.com/appsignal/appsignal-ruby/commit/a815b29826a84f430384e7e735f79c8c312f1abf) patch - Allow transaction events to have a duration up to 48 hours before being discarded.
|
8
26
|
|
9
27
|
### Fixed
|
10
28
|
|
data/build_matrix.yml
CHANGED
data/lib/appsignal/config.rb
CHANGED
@@ -19,6 +19,8 @@ module Appsignal
|
|
19
19
|
:enable_minutely_probes => true,
|
20
20
|
:enable_statsd => true,
|
21
21
|
:enable_nginx_metrics => false,
|
22
|
+
:enable_gvl_global_timer => true,
|
23
|
+
:enable_gvl_waiting_threads => true,
|
22
24
|
:endpoint => "https://push.appsignal.com",
|
23
25
|
:files_world_accessible => true,
|
24
26
|
:filter_parameters => [],
|
@@ -53,6 +55,7 @@ module Appsignal
|
|
53
55
|
LOG_LEVEL_MAP = {
|
54
56
|
"error" => ::Logger::ERROR,
|
55
57
|
"warn" => ::Logger::WARN,
|
58
|
+
"warning" => ::Logger::WARN,
|
56
59
|
"info" => ::Logger::INFO,
|
57
60
|
"debug" => ::Logger::DEBUG,
|
58
61
|
"trace" => ::Logger::DEBUG
|
@@ -69,6 +72,8 @@ module Appsignal
|
|
69
72
|
"APPSIGNAL_ENABLE_MINUTELY_PROBES" => :enable_minutely_probes,
|
70
73
|
"APPSIGNAL_ENABLE_STATSD" => :enable_statsd,
|
71
74
|
"APPSIGNAL_ENABLE_NGINX_METRICS" => :enable_nginx_metrics,
|
75
|
+
"APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER" => :enable_gvl_global_timer,
|
76
|
+
"APPSIGNAL_ENABLE_GVL_WAITING_THREADS" => :enable_gvl_waiting_threads,
|
72
77
|
"APPSIGNAL_FILES_WORLD_ACCESSIBLE" => :files_world_accessible,
|
73
78
|
"APPSIGNAL_FILTER_PARAMETERS" => :filter_parameters,
|
74
79
|
"APPSIGNAL_FILTER_SESSION_DATA" => :filter_session_data,
|
@@ -123,6 +128,8 @@ module Appsignal
|
|
123
128
|
APPSIGNAL_ENABLE_MINUTELY_PROBES
|
124
129
|
APPSIGNAL_ENABLE_STATSD
|
125
130
|
APPSIGNAL_ENABLE_NGINX_METRICS
|
131
|
+
APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER
|
132
|
+
APPSIGNAL_ENABLE_GVL_WAITING_THREADS
|
126
133
|
APPSIGNAL_FILES_WORLD_ACCESSIBLE
|
127
134
|
APPSIGNAL_INSTRUMENT_HTTP_RB
|
128
135
|
APPSIGNAL_INSTRUMENT_NET_HTTP
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Appsignal
|
2
|
+
class Hooks
|
3
|
+
# @api private
|
4
|
+
class GvlHook < Appsignal::Hooks::Hook
|
5
|
+
register :gvl
|
6
|
+
|
7
|
+
def dependencies_present?
|
8
|
+
return false if Appsignal::System.jruby?
|
9
|
+
require "gvltools"
|
10
|
+
Appsignal.config && Appsignal::Probes::GvlProbe.dependencies_present?
|
11
|
+
rescue LoadError
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def install
|
16
|
+
Appsignal::Minutely.probes.register :gvl, Appsignal::Probes::GvlProbe
|
17
|
+
::GVLTools::GlobalTimer.enable if Appsignal.config[:enable_gvl_global_timer]
|
18
|
+
::GVLTools::WaitingThreads.enable if Appsignal.config[:enable_gvl_waiting_threads]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/appsignal/hooks.rb
CHANGED
@@ -94,6 +94,7 @@ require "appsignal/hooks/active_job"
|
|
94
94
|
require "appsignal/hooks/active_support_notifications"
|
95
95
|
require "appsignal/hooks/celluloid"
|
96
96
|
require "appsignal/hooks/delayed_job"
|
97
|
+
require "appsignal/hooks/gvl"
|
97
98
|
require "appsignal/hooks/http"
|
98
99
|
require "appsignal/hooks/mri"
|
99
100
|
require "appsignal/hooks/net_http"
|
data/lib/appsignal/logger.rb
CHANGED
@@ -9,6 +9,13 @@ module Appsignal
|
|
9
9
|
PLAINTEXT = 0
|
10
10
|
LOGFMT = 1
|
11
11
|
JSON = 2
|
12
|
+
SEVERITY_MAP = {
|
13
|
+
DEBUG => 2,
|
14
|
+
INFO => 3,
|
15
|
+
WARN => 5,
|
16
|
+
ERROR => 6,
|
17
|
+
FATAL => 7
|
18
|
+
}.freeze
|
12
19
|
|
13
20
|
# Create a new logger instance
|
14
21
|
#
|
@@ -25,7 +32,7 @@ module Appsignal
|
|
25
32
|
# We support the various methods in the Ruby
|
26
33
|
# logger class by supplying this method.
|
27
34
|
# @api private
|
28
|
-
def add(severity, message = nil, group = nil)
|
35
|
+
def add(severity, message = nil, group = nil)
|
29
36
|
severity ||= UNKNOWN
|
30
37
|
return true if severity < level
|
31
38
|
group = @group if group.nil?
|
@@ -38,24 +45,11 @@ module Appsignal
|
|
38
45
|
end
|
39
46
|
end
|
40
47
|
return if message.nil?
|
41
|
-
message = formatter.call(severity,
|
42
|
-
|
43
|
-
when DEBUG
|
44
|
-
2
|
45
|
-
when INFO
|
46
|
-
3
|
47
|
-
when WARN
|
48
|
-
5
|
49
|
-
when ERROR
|
50
|
-
6
|
51
|
-
when FATAL
|
52
|
-
7
|
53
|
-
else
|
54
|
-
0
|
55
|
-
end
|
48
|
+
message = formatter.call(severity, Time.now, group, message) if formatter
|
49
|
+
|
56
50
|
Appsignal::Extension.log(
|
57
51
|
group,
|
58
|
-
|
52
|
+
SEVERITY_MAP.fetch(severity, 0),
|
59
53
|
@format,
|
60
54
|
message,
|
61
55
|
Appsignal::Utils::Data.generate({})
|
@@ -71,7 +65,7 @@ module Appsignal
|
|
71
65
|
return if DEBUG < level
|
72
66
|
message = yield if message.nil? && block_given?
|
73
67
|
return if message.nil?
|
74
|
-
message = formatter.call(DEBUG,
|
68
|
+
message = formatter.call(DEBUG, Time.now, @group, message) if formatter
|
75
69
|
Appsignal::Extension.log(
|
76
70
|
@group,
|
77
71
|
2,
|
@@ -89,7 +83,7 @@ module Appsignal
|
|
89
83
|
return if INFO < level
|
90
84
|
message = yield if message.nil? && block_given?
|
91
85
|
return if message.nil?
|
92
|
-
message = formatter.call(INFO,
|
86
|
+
message = formatter.call(INFO, Time.now, @group, message) if formatter
|
93
87
|
Appsignal::Extension.log(
|
94
88
|
@group,
|
95
89
|
3,
|
@@ -107,7 +101,7 @@ module Appsignal
|
|
107
101
|
return if WARN < level
|
108
102
|
message = yield if message.nil? && block_given?
|
109
103
|
return if message.nil?
|
110
|
-
message = formatter.call(WARN,
|
104
|
+
message = formatter.call(WARN, Time.now, @group, message) if formatter
|
111
105
|
Appsignal::Extension.log(
|
112
106
|
@group,
|
113
107
|
5,
|
@@ -125,7 +119,7 @@ module Appsignal
|
|
125
119
|
return if ERROR < level
|
126
120
|
message = yield if message.nil? && block_given?
|
127
121
|
return if message.nil?
|
128
|
-
message = formatter.call(ERROR,
|
122
|
+
message = formatter.call(ERROR, Time.now, @group, message) if formatter
|
129
123
|
Appsignal::Extension.log(
|
130
124
|
@group,
|
131
125
|
6,
|
@@ -143,7 +137,7 @@ module Appsignal
|
|
143
137
|
return if FATAL < level
|
144
138
|
message = yield if message.nil? && block_given?
|
145
139
|
return if message.nil?
|
146
|
-
message = formatter.call(FATAL,
|
140
|
+
message = formatter.call(FATAL, Time.now, @group, message) if formatter
|
147
141
|
Appsignal::Extension.log(
|
148
142
|
@group,
|
149
143
|
7,
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Appsignal
|
2
|
+
module Probes
|
3
|
+
class GvlProbe
|
4
|
+
include Helpers
|
5
|
+
|
6
|
+
# @api private
|
7
|
+
def self.dependencies_present?
|
8
|
+
defined?(::GVLTools) && gvltools_0_2_or_newer? && ruby_3_2_or_newer? && !Appsignal::System.jruby?
|
9
|
+
end
|
10
|
+
|
11
|
+
# @api private
|
12
|
+
def self.gvltools_0_2_or_newer?
|
13
|
+
Gem::Version.new(::GVLTools::VERSION) >= Gem::Version.new("0.2.0")
|
14
|
+
end
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
def self.ruby_3_2_or_newer?
|
18
|
+
Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.2.0")
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(appsignal: Appsignal, gvl_tools: ::GVLTools)
|
22
|
+
Appsignal.logger.debug("Initializing GVL probe")
|
23
|
+
@appsignal = appsignal
|
24
|
+
@gvl_tools = gvl_tools
|
25
|
+
end
|
26
|
+
|
27
|
+
def call
|
28
|
+
probe_global_timer if @gvl_tools::GlobalTimer.enabled?
|
29
|
+
probe_waiting_threads if @gvl_tools::WaitingThreads.enabled?
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def probe_global_timer
|
35
|
+
monotonic_time_ns = @gvl_tools::GlobalTimer.monotonic_time
|
36
|
+
gauge_delta :gvl_global_timer, monotonic_time_ns do |time_delta_ns|
|
37
|
+
time_delta_ms = time_delta_ns / 1_000_000
|
38
|
+
set_gauge_with_hostname("gvl_global_timer", time_delta_ms)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def probe_waiting_threads
|
43
|
+
set_gauge_with_hostname("gvl_waiting_threads", @gvl_tools::WaitingThreads.count)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -37,6 +37,27 @@ module Appsignal
|
|
37
37
|
|
38
38
|
yield value - previous_value
|
39
39
|
end
|
40
|
+
|
41
|
+
def hostname
|
42
|
+
return @hostname if defined?(@hostname)
|
43
|
+
|
44
|
+
config = @appsignal.config
|
45
|
+
@hostname =
|
46
|
+
if config[:hostname]
|
47
|
+
config[:hostname]
|
48
|
+
else
|
49
|
+
# Auto detect hostname as fallback. May be inaccurate.
|
50
|
+
Socket.gethostname
|
51
|
+
end
|
52
|
+
Appsignal.logger.debug "Probe helper: Using hostname config " \
|
53
|
+
"option '#{@hostname.inspect}' as hostname"
|
54
|
+
|
55
|
+
@hostname
|
56
|
+
end
|
57
|
+
|
58
|
+
def set_gauge_with_hostname(metric, value, tags = {})
|
59
|
+
@appsignal.set_gauge(metric, value, { :hostname => hostname }.merge(tags))
|
60
|
+
end
|
40
61
|
end
|
41
62
|
end
|
42
63
|
end
|
data/lib/appsignal/probes/mri.rb
CHANGED
@@ -20,7 +20,7 @@ module Appsignal
|
|
20
20
|
|
21
21
|
constant_cache_invalidations = stat[:constant_cache_invalidations]
|
22
22
|
if constant_cache_invalidations
|
23
|
-
|
23
|
+
set_gauge_with_hostname(
|
24
24
|
"ruby_vm",
|
25
25
|
constant_cache_invalidations,
|
26
26
|
:metric => :constant_cache_invalidations
|
@@ -29,7 +29,7 @@ module Appsignal
|
|
29
29
|
|
30
30
|
constant_cache_misses = stat[:constant_cache_misses]
|
31
31
|
if constant_cache_misses
|
32
|
-
|
32
|
+
set_gauge_with_hostname(
|
33
33
|
"ruby_vm",
|
34
34
|
constant_cache_misses,
|
35
35
|
:metric => :constant_cache_misses
|
@@ -38,23 +38,23 @@ module Appsignal
|
|
38
38
|
|
39
39
|
class_serial = stat[:class_serial]
|
40
40
|
if class_serial
|
41
|
-
|
41
|
+
set_gauge_with_hostname("ruby_vm", class_serial, :metric => :class_serial)
|
42
42
|
end
|
43
43
|
|
44
44
|
global_constant_state =
|
45
45
|
stat[:constant_cache] ? stat[:constant_cache].values.sum : stat[:global_constant_state]
|
46
46
|
if global_constant_state
|
47
|
-
|
47
|
+
set_gauge_with_hostname(
|
48
48
|
"ruby_vm",
|
49
49
|
global_constant_state,
|
50
50
|
:metric => :global_constant_state
|
51
51
|
)
|
52
52
|
end
|
53
53
|
|
54
|
-
|
54
|
+
set_gauge_with_hostname("thread_count", Thread.list.size)
|
55
55
|
if Appsignal::GarbageCollection.enabled?
|
56
56
|
gauge_delta(:gc_time, @gc_profiler.total_time) do |gc_time|
|
57
|
-
|
57
|
+
set_gauge_with_hostname("gc_time", gc_time) if gc_time > 0
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -63,44 +63,21 @@ module Appsignal
|
|
63
63
|
:allocated_objects,
|
64
64
|
gc_stats[:total_allocated_objects] || gc_stats[:total_allocated_object]
|
65
65
|
) do |allocated_objects|
|
66
|
-
|
66
|
+
set_gauge_with_hostname("allocated_objects", allocated_objects)
|
67
67
|
end
|
68
68
|
|
69
69
|
gauge_delta(:gc_count, GC.count) do |gc_count|
|
70
|
-
|
70
|
+
set_gauge_with_hostname("gc_count", gc_count, :metric => :gc_count)
|
71
71
|
end
|
72
72
|
gauge_delta(:minor_gc_count, gc_stats[:minor_gc_count]) do |minor_gc_count|
|
73
|
-
|
73
|
+
set_gauge_with_hostname("gc_count", minor_gc_count, :metric => :minor_gc_count)
|
74
74
|
end
|
75
75
|
gauge_delta(:major_gc_count, gc_stats[:major_gc_count]) do |major_gc_count|
|
76
|
-
|
76
|
+
set_gauge_with_hostname("gc_count", major_gc_count, :metric => :major_gc_count)
|
77
77
|
end
|
78
78
|
|
79
|
-
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
def set_gauge(metric, value, tags = {})
|
86
|
-
@appsignal.set_gauge(metric, value, { :hostname => hostname }.merge(tags))
|
87
|
-
end
|
88
|
-
|
89
|
-
def hostname
|
90
|
-
return @hostname if defined?(@hostname)
|
91
|
-
|
92
|
-
config = @appsignal.config
|
93
|
-
@hostname =
|
94
|
-
if config[:hostname]
|
95
|
-
config[:hostname]
|
96
|
-
else
|
97
|
-
# Auto detect hostname as fallback. May be inaccurate.
|
98
|
-
Socket.gethostname
|
99
|
-
end
|
100
|
-
Appsignal.logger.debug "MRI probe: Using hostname config " \
|
101
|
-
"option '#{@hostname.inspect}' as hostname"
|
102
|
-
|
103
|
-
@hostname
|
79
|
+
set_gauge_with_hostname("heap_slots", gc_stats[:heap_live_slots] || gc_stats[:heap_live_slot], :metric => :heap_live)
|
80
|
+
set_gauge_with_hostname("heap_slots", gc_stats[:heap_free_slots] || gc_stats[:heap_free_slot], :metric => :heap_free)
|
104
81
|
end
|
105
82
|
end
|
106
83
|
end
|
data/lib/appsignal/probes.rb
CHANGED
data/lib/appsignal/version.rb
CHANGED
@@ -156,6 +156,8 @@ describe Appsignal::Config do
|
|
156
156
|
:debug => false,
|
157
157
|
:dns_servers => [],
|
158
158
|
:enable_allocation_tracking => true,
|
159
|
+
:enable_gvl_global_timer => true,
|
160
|
+
:enable_gvl_waiting_threads => true,
|
159
161
|
:enable_host_metrics => true,
|
160
162
|
:enable_minutely_probes => true,
|
161
163
|
:enable_statsd => true,
|
@@ -0,0 +1,140 @@
|
|
1
|
+
describe Appsignal::Hooks::GvlHook do
|
2
|
+
if DependencyHelper.running_jruby?
|
3
|
+
context "running JRuby" do
|
4
|
+
it "does not attempt to require GVLTools" do
|
5
|
+
expect_any_instance_of(described_class).not_to receive(:require).with("gvltools")
|
6
|
+
expect(described_class.new.dependencies_present?).to be_falsy
|
7
|
+
end
|
8
|
+
end
|
9
|
+
else
|
10
|
+
before(:context) do
|
11
|
+
Appsignal.config = project_fixture_config
|
12
|
+
end
|
13
|
+
|
14
|
+
def expect_gvltools_require
|
15
|
+
expect_any_instance_of(described_class).to receive(:require).with("gvltools").and_return(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
context "without GVLTools" do
|
19
|
+
describe "#dependencies_present?" do
|
20
|
+
context "if requiring gvltools fails" do
|
21
|
+
it "is false" do
|
22
|
+
expect(described_class.new.dependencies_present?).to be_falsy
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "is false" do
|
27
|
+
expect_gvltools_require
|
28
|
+
expect(described_class.new.dependencies_present?).to be_falsy
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with old versions of GVLTools" do
|
34
|
+
before(:context) do
|
35
|
+
module GVLTools
|
36
|
+
VERSION = "0.1.0".freeze
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
after(:context) { Object.send(:remove_const, :GVLTools) }
|
41
|
+
|
42
|
+
before(:each) { expect_gvltools_require }
|
43
|
+
|
44
|
+
describe "#dependencies_present?" do
|
45
|
+
it "is false" do
|
46
|
+
expect(described_class.new.dependencies_present?).to be_falsy
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with new versions of GVLTools" do
|
52
|
+
before(:context) do
|
53
|
+
module GVLTools
|
54
|
+
VERSION = "0.2.0".freeze
|
55
|
+
|
56
|
+
module GlobalTimer
|
57
|
+
def self.enable
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
module WaitingThreads
|
62
|
+
def self.enable
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
after(:context) { Object.send(:remove_const, :GVLTools) }
|
69
|
+
|
70
|
+
describe "#dependencies_present?" do
|
71
|
+
before(:each) { expect_gvltools_require }
|
72
|
+
|
73
|
+
if DependencyHelper.ruby_3_2_or_newer?
|
74
|
+
it "is true" do
|
75
|
+
expect(described_class.new.dependencies_present?).to be_truthy
|
76
|
+
end
|
77
|
+
else
|
78
|
+
it "is false" do
|
79
|
+
expect(described_class.new.dependencies_present?).to be_falsy
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if DependencyHelper.ruby_3_2_or_newer?
|
85
|
+
describe "Appsignal::Hooks.load_hooks" do
|
86
|
+
before(:each) { expect_gvltools_require }
|
87
|
+
|
88
|
+
# After installing a hook once, it is marked as already installed,
|
89
|
+
# and subsequent calls to `load_hooks` silently do nothing.
|
90
|
+
# Because of this, only one of the tests for the installation uses
|
91
|
+
# `load_hooks`, while the rest call the `install` method directly.
|
92
|
+
|
93
|
+
it "is added to minutely probes" do
|
94
|
+
Appsignal::Hooks.load_hooks
|
95
|
+
|
96
|
+
expect(Appsignal::Minutely.probes[:gvl]).to be Appsignal::Probes::GvlProbe
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "#install" do
|
102
|
+
context "with enable_gvl_global_timer" do
|
103
|
+
it "enables the GVL global timer" do
|
104
|
+
Appsignal.config[:enable_gvl_global_timer] = true
|
105
|
+
expect(::GVLTools::GlobalTimer).to receive(:enable)
|
106
|
+
|
107
|
+
described_class.new.install
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "without enable_gvl_global_timer" do
|
112
|
+
it "does not enable the GVL global timer" do
|
113
|
+
Appsignal.config[:enable_gvl_global_timer] = false
|
114
|
+
expect(::GVLTools::GlobalTimer).not_to receive(:enable)
|
115
|
+
|
116
|
+
described_class.new.install
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "with enable_gvl_waiting_threads" do
|
121
|
+
it "enables the GVL waiting threads" do
|
122
|
+
Appsignal.config[:enable_gvl_global_timer] = true
|
123
|
+
expect(::GVLTools::WaitingThreads).to receive(:enable)
|
124
|
+
|
125
|
+
described_class.new.install
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context "without enable_gvl_waiting_threads" do
|
130
|
+
it "does not enable the GVL waiting threads" do
|
131
|
+
Appsignal.config[:enable_gvl_waiting_threads] = false
|
132
|
+
expect(::GVLTools::WaitingThreads).not_to receive(:enable)
|
133
|
+
|
134
|
+
described_class.new.install
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -115,14 +115,29 @@ describe Appsignal::Logger do
|
|
115
115
|
|
116
116
|
context "with a formatter set" do
|
117
117
|
before do
|
118
|
-
|
119
|
-
|
118
|
+
Timecop.freeze(Time.local(2023))
|
119
|
+
logger.formatter = logger.formatter = proc do |_level, timestamp, _appname, message|
|
120
|
+
# This line replicates the behaviour of the Ruby default Logger::Formatter
|
121
|
+
# which expects a timestamp object as a second argument
|
122
|
+
# https://github.com/ruby/ruby/blob/master/lib/logger/formatter.rb#L15-L17
|
123
|
+
time = timestamp.strftime("%Y-%m-%dT%H:%M:%S.%6N")
|
124
|
+
"formatted: #{time} '#{message}'"
|
120
125
|
end
|
121
126
|
end
|
122
127
|
|
128
|
+
after do
|
129
|
+
Timecop.return
|
130
|
+
end
|
131
|
+
|
123
132
|
it "should log with a level, message and group" do
|
124
133
|
expect(Appsignal::Extension).to receive(:log)
|
125
|
-
.with(
|
134
|
+
.with(
|
135
|
+
"group",
|
136
|
+
method[1],
|
137
|
+
0,
|
138
|
+
"formatted: 2023-01-01T00:00:00.000000 'Log message'",
|
139
|
+
instance_of(Appsignal::Extension::Data)
|
140
|
+
)
|
126
141
|
logger.send(method[0], "Log message")
|
127
142
|
end
|
128
143
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
describe Appsignal::Probes::GvlProbe do
|
2
|
+
let(:appsignal_mock) { AppsignalMock.new(:hostname => hostname) }
|
3
|
+
let(:probe) { described_class.new(:appsignal => appsignal_mock, :gvl_tools => FakeGVLTools) }
|
4
|
+
|
5
|
+
let(:hostname) { "some-host" }
|
6
|
+
|
7
|
+
after(:each) { FakeGVLTools.reset }
|
8
|
+
|
9
|
+
context "with global timer enabled" do
|
10
|
+
before(:each) { FakeGVLTools::GlobalTimer.enabled = true }
|
11
|
+
|
12
|
+
it "gauges the global timer delta" do
|
13
|
+
FakeGVLTools::GlobalTimer.monotonic_time = 100_000_000
|
14
|
+
probe.call
|
15
|
+
|
16
|
+
expect(appsignal_mock.gauges).to be_empty
|
17
|
+
|
18
|
+
FakeGVLTools::GlobalTimer.monotonic_time = 300_000_000
|
19
|
+
probe.call
|
20
|
+
|
21
|
+
expect(appsignal_mock.gauges).to eq [
|
22
|
+
["gvl_global_timer", 200, { :hostname => hostname }]
|
23
|
+
]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with waiting threads enabled" do
|
28
|
+
before(:each) { FakeGVLTools::WaitingThreads.enabled = true }
|
29
|
+
|
30
|
+
it "gauges the waiting threads count" do
|
31
|
+
FakeGVLTools::WaitingThreads.count = 3
|
32
|
+
probe.call
|
33
|
+
|
34
|
+
expect(appsignal_mock.gauges).to eq [
|
35
|
+
["gvl_waiting_threads", 3, { :hostname => hostname }]
|
36
|
+
]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,22 +1,3 @@
|
|
1
|
-
class AppsignalMock
|
2
|
-
attr_reader :gauges
|
3
|
-
|
4
|
-
def initialize(hostname: nil)
|
5
|
-
@hostname = hostname
|
6
|
-
@gauges = []
|
7
|
-
end
|
8
|
-
|
9
|
-
def config
|
10
|
-
ConfigHelpers.project_fixture_config.tap do |conf|
|
11
|
-
conf[:hostname] = @hostname if @hostname
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def set_gauge(*args) # rubocop:disable Naming/AccessorMethodName
|
16
|
-
@gauges << args
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
1
|
describe Appsignal::Probes::MriProbe do
|
21
2
|
let(:appsignal_mock) { AppsignalMock.new(:hostname => hostname) }
|
22
3
|
let(:gc_profiler_mock) { instance_double("Appsignal::GarbageCollectionProfiler") }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class AppsignalMock
|
2
|
+
attr_reader :gauges
|
3
|
+
|
4
|
+
def initialize(hostname: nil)
|
5
|
+
@hostname = hostname
|
6
|
+
@gauges = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def config
|
10
|
+
ConfigHelpers.project_fixture_config.tap do |conf|
|
11
|
+
conf[:hostname] = @hostname if @hostname
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_gauge(*args) # rubocop:disable Naming/AccessorMethodName
|
16
|
+
@gauges << args
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module FakeGVLTools
|
2
|
+
def self.reset
|
3
|
+
self::GlobalTimer.enabled = false
|
4
|
+
self::GlobalTimer.monotonic_time = 0
|
5
|
+
self::WaitingThreads.enabled = false
|
6
|
+
self::WaitingThreads.count = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
module GlobalTimer
|
10
|
+
@enabled = false
|
11
|
+
@monotonic_time = 0
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_writer :enabled
|
15
|
+
attr_accessor :monotonic_time
|
16
|
+
|
17
|
+
def enabled?
|
18
|
+
@enabled
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module WaitingThreads
|
24
|
+
@enabled = false
|
25
|
+
@count = 0
|
26
|
+
|
27
|
+
class << self
|
28
|
+
attr_writer :enabled
|
29
|
+
attr_accessor :count
|
30
|
+
|
31
|
+
def enabled?
|
32
|
+
@enabled
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appsignal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Beekman
|
8
8
|
- Thijs Cadier
|
9
9
|
- Tom de Bruijn
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-03-
|
13
|
+
date: 2023-03-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -182,7 +182,8 @@ files:
|
|
182
182
|
- gemfiles/sequel-435.gemfile
|
183
183
|
- gemfiles/sequel.gemfile
|
184
184
|
- gemfiles/sinatra.gemfile
|
185
|
-
- gemfiles/
|
185
|
+
- gemfiles/webmachine1.gemfile
|
186
|
+
- gemfiles/webmachine2.gemfile
|
186
187
|
- lib/appsignal.rb
|
187
188
|
- lib/appsignal/auth_check.rb
|
188
189
|
- lib/appsignal/capistrano.rb
|
@@ -218,6 +219,7 @@ files:
|
|
218
219
|
- lib/appsignal/hooks/data_mapper.rb
|
219
220
|
- lib/appsignal/hooks/delayed_job.rb
|
220
221
|
- lib/appsignal/hooks/excon.rb
|
222
|
+
- lib/appsignal/hooks/gvl.rb
|
221
223
|
- lib/appsignal/hooks/http.rb
|
222
224
|
- lib/appsignal/hooks/mongo_ruby_driver.rb
|
223
225
|
- lib/appsignal/hooks/mri.rb
|
@@ -260,6 +262,7 @@ files:
|
|
260
262
|
- lib/appsignal/marker.rb
|
261
263
|
- lib/appsignal/minutely.rb
|
262
264
|
- lib/appsignal/probes.rb
|
265
|
+
- lib/appsignal/probes/gvl.rb
|
263
266
|
- lib/appsignal/probes/helpers.rb
|
264
267
|
- lib/appsignal/probes/mri.rb
|
265
268
|
- lib/appsignal/probes/sidekiq.rb
|
@@ -323,6 +326,7 @@ files:
|
|
323
326
|
- spec/lib/appsignal/hooks/data_mapper_spec.rb
|
324
327
|
- spec/lib/appsignal/hooks/delayed_job_spec.rb
|
325
328
|
- spec/lib/appsignal/hooks/excon_spec.rb
|
329
|
+
- spec/lib/appsignal/hooks/gvl_spec.rb
|
326
330
|
- spec/lib/appsignal/hooks/http_spec.rb
|
327
331
|
- spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb
|
328
332
|
- spec/lib/appsignal/hooks/mri_spec.rb
|
@@ -354,6 +358,7 @@ files:
|
|
354
358
|
- spec/lib/appsignal/logger_spec.rb
|
355
359
|
- spec/lib/appsignal/marker_spec.rb
|
356
360
|
- spec/lib/appsignal/minutely_spec.rb
|
361
|
+
- spec/lib/appsignal/probes/gvl_spec.rb
|
357
362
|
- spec/lib/appsignal/probes/mri_spec.rb
|
358
363
|
- spec/lib/appsignal/probes/sidekiq_spec.rb
|
359
364
|
- spec/lib/appsignal/rack/generic_instrumentation_spec.rb
|
@@ -402,7 +407,9 @@ files:
|
|
402
407
|
- spec/support/matchers/be_completed.rb
|
403
408
|
- spec/support/matchers/contains_log.rb
|
404
409
|
- spec/support/matchers/have_colorized_text.rb
|
410
|
+
- spec/support/mocks/appsignal_mock.rb
|
405
411
|
- spec/support/mocks/fake_gc_profiler.rb
|
412
|
+
- spec/support/mocks/fake_gvl_tools.rb
|
406
413
|
- spec/support/mocks/mock_probe.rb
|
407
414
|
- spec/support/rails/my_app.rb
|
408
415
|
- spec/support/shared_examples/instrument.rb
|
@@ -422,7 +429,7 @@ metadata:
|
|
422
429
|
documentation_uri: https://docs.appsignal.com/ruby/
|
423
430
|
homepage_uri: https://docs.appsignal.com/ruby/
|
424
431
|
source_code_uri: https://github.com/appsignal/appsignal-ruby
|
425
|
-
post_install_message:
|
432
|
+
post_install_message:
|
426
433
|
rdoc_options: []
|
427
434
|
require_paths:
|
428
435
|
- lib
|
@@ -438,8 +445,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
438
445
|
- !ruby/object:Gem::Version
|
439
446
|
version: '0'
|
440
447
|
requirements: []
|
441
|
-
rubygems_version: 3.1.
|
442
|
-
signing_key:
|
448
|
+
rubygems_version: 3.1.4
|
449
|
+
signing_key:
|
443
450
|
specification_version: 4
|
444
451
|
summary: Logs performance and exception data from your app to appsignal.com
|
445
452
|
test_files:
|
@@ -480,6 +487,7 @@ test_files:
|
|
480
487
|
- spec/lib/appsignal/hooks/data_mapper_spec.rb
|
481
488
|
- spec/lib/appsignal/hooks/delayed_job_spec.rb
|
482
489
|
- spec/lib/appsignal/hooks/excon_spec.rb
|
490
|
+
- spec/lib/appsignal/hooks/gvl_spec.rb
|
483
491
|
- spec/lib/appsignal/hooks/http_spec.rb
|
484
492
|
- spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb
|
485
493
|
- spec/lib/appsignal/hooks/mri_spec.rb
|
@@ -511,6 +519,7 @@ test_files:
|
|
511
519
|
- spec/lib/appsignal/logger_spec.rb
|
512
520
|
- spec/lib/appsignal/marker_spec.rb
|
513
521
|
- spec/lib/appsignal/minutely_spec.rb
|
522
|
+
- spec/lib/appsignal/probes/gvl_spec.rb
|
514
523
|
- spec/lib/appsignal/probes/mri_spec.rb
|
515
524
|
- spec/lib/appsignal/probes/sidekiq_spec.rb
|
516
525
|
- spec/lib/appsignal/rack/generic_instrumentation_spec.rb
|
@@ -559,7 +568,9 @@ test_files:
|
|
559
568
|
- spec/support/matchers/be_completed.rb
|
560
569
|
- spec/support/matchers/contains_log.rb
|
561
570
|
- spec/support/matchers/have_colorized_text.rb
|
571
|
+
- spec/support/mocks/appsignal_mock.rb
|
562
572
|
- spec/support/mocks/fake_gc_profiler.rb
|
573
|
+
- spec/support/mocks/fake_gvl_tools.rb
|
563
574
|
- spec/support/mocks/mock_probe.rb
|
564
575
|
- spec/support/rails/my_app.rb
|
565
576
|
- spec/support/shared_examples/instrument.rb
|