appsignal 3.3.7-java → 3.3.8-java

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf316d2ff99ac803b94b624dc081c41a6c8d84d5ee659e3029870d7ed4d212ba
4
- data.tar.gz: 77177fc406fe073de5917b1829bc88f820ebfe941af8e1183be083d99d1735d6
3
+ metadata.gz: 35ea1bb6c0b8149bf0ec44f55a8ab59655ea4149e40656122d39ede681bf4776
4
+ data.tar.gz: 6b8e85945c4517cedff96f03d304e945f70dbc5f0ee53afb153fe0ed35a8bcdd
5
5
  SHA512:
6
- metadata.gz: 66082238307235ccfeabf9a3b60c8f2b5702a4cb715cbd6dc260d786fde00032add30e6a44993a862f7bba8ef5a2698aa5d581adfc9c54ce9448816692b09add
7
- data.tar.gz: 79e3ead1f689f0f9dd1a2b207b5051ec92fffbbd270349aa407d56a0c69669e48f3a1fc681f59ee93d445d92224129e207981a1e84d019f44b7df8b425c8c673
6
+ metadata.gz: aca3054a5bc035c77d1d7c935988f0fc989482d74242d55f9f3879fbeba1ee037faa9644060c17bf09f36fab61f4aa25955e58d18f4846448ac436499216e9f1
7
+ data.tar.gz: 0b50957a4ba08682831a8f21c7b589f0a2658ed388b17fb6b9980802a8c83f181b8464976cc8a64ab16648a2d776dfe8c723f2cda227dc6c7d954eacd75ab09d
data/CHANGELOG.md CHANGED
@@ -1,10 +1,22 @@
1
1
  # AppSignal for Ruby gem Changelog
2
2
 
3
+ ## 3.3.8
4
+
5
+ ### Added
6
+
7
+ - [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.
8
+ - [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.
9
+
3
10
  ## 3.3.7
4
11
 
12
+ ### Added
13
+
14
+ - [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.
15
+
5
16
  ### Changed
6
17
 
7
18
  - [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.
19
+ - [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
20
 
9
21
  ### Fixed
10
22
 
@@ -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
@@ -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"
@@ -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
@@ -20,7 +20,7 @@ module Appsignal
20
20
 
21
21
  constant_cache_invalidations = stat[:constant_cache_invalidations]
22
22
  if constant_cache_invalidations
23
- set_gauge(
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
- set_gauge(
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
- set_gauge("ruby_vm", class_serial, :metric => :class_serial)
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
- set_gauge(
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
- set_gauge("thread_count", Thread.list.size)
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
- set_gauge("gc_time", gc_time) if gc_time > 0
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
- set_gauge("allocated_objects", allocated_objects)
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
- set_gauge("gc_count", gc_count, :metric => :gc_count)
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
- set_gauge("gc_count", minor_gc_count, :metric => :minor_gc_count)
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
- set_gauge("gc_count", major_gc_count, :metric => :major_gc_count)
76
+ set_gauge_with_hostname("gc_count", major_gc_count, :metric => :major_gc_count)
77
77
  end
78
78
 
79
- set_gauge("heap_slots", gc_stats[:heap_live_slots] || gc_stats[:heap_live_slot], :metric => :heap_live)
80
- set_gauge("heap_slots", gc_stats[:heap_free_slots] || gc_stats[:heap_free_slot], :metric => :heap_free)
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
@@ -4,5 +4,6 @@ module Appsignal
4
4
  end
5
5
 
6
6
  require "appsignal/probes/helpers"
7
+ require "appsignal/probes/gvl"
7
8
  require "appsignal/probes/mri"
8
9
  require "appsignal/probes/sidekiq"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.3.7".freeze
4
+ VERSION = "3.3.8".freeze
5
5
  end
@@ -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
@@ -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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.7
4
+ version: 3.3.8
5
5
  platform: java
6
6
  authors:
7
7
  - Robert Beekman
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-03-09 00:00:00.000000000 Z
13
+ date: 2023-03-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -232,6 +232,7 @@ files:
232
232
  - lib/appsignal/hooks/data_mapper.rb
233
233
  - lib/appsignal/hooks/delayed_job.rb
234
234
  - lib/appsignal/hooks/excon.rb
235
+ - lib/appsignal/hooks/gvl.rb
235
236
  - lib/appsignal/hooks/http.rb
236
237
  - lib/appsignal/hooks/mongo_ruby_driver.rb
237
238
  - lib/appsignal/hooks/mri.rb
@@ -274,6 +275,7 @@ files:
274
275
  - lib/appsignal/marker.rb
275
276
  - lib/appsignal/minutely.rb
276
277
  - lib/appsignal/probes.rb
278
+ - lib/appsignal/probes/gvl.rb
277
279
  - lib/appsignal/probes/helpers.rb
278
280
  - lib/appsignal/probes/mri.rb
279
281
  - lib/appsignal/probes/sidekiq.rb
@@ -337,6 +339,7 @@ files:
337
339
  - spec/lib/appsignal/hooks/data_mapper_spec.rb
338
340
  - spec/lib/appsignal/hooks/delayed_job_spec.rb
339
341
  - spec/lib/appsignal/hooks/excon_spec.rb
342
+ - spec/lib/appsignal/hooks/gvl_spec.rb
340
343
  - spec/lib/appsignal/hooks/http_spec.rb
341
344
  - spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb
342
345
  - spec/lib/appsignal/hooks/mri_spec.rb
@@ -368,6 +371,7 @@ files:
368
371
  - spec/lib/appsignal/logger_spec.rb
369
372
  - spec/lib/appsignal/marker_spec.rb
370
373
  - spec/lib/appsignal/minutely_spec.rb
374
+ - spec/lib/appsignal/probes/gvl_spec.rb
371
375
  - spec/lib/appsignal/probes/mri_spec.rb
372
376
  - spec/lib/appsignal/probes/sidekiq_spec.rb
373
377
  - spec/lib/appsignal/rack/generic_instrumentation_spec.rb
@@ -416,7 +420,9 @@ files:
416
420
  - spec/support/matchers/be_completed.rb
417
421
  - spec/support/matchers/contains_log.rb
418
422
  - spec/support/matchers/have_colorized_text.rb
423
+ - spec/support/mocks/appsignal_mock.rb
419
424
  - spec/support/mocks/fake_gc_profiler.rb
425
+ - spec/support/mocks/fake_gvl_tools.rb
420
426
  - spec/support/mocks/mock_probe.rb
421
427
  - spec/support/rails/my_app.rb
422
428
  - spec/support/shared_examples/instrument.rb
@@ -494,6 +500,7 @@ test_files:
494
500
  - spec/lib/appsignal/hooks/data_mapper_spec.rb
495
501
  - spec/lib/appsignal/hooks/delayed_job_spec.rb
496
502
  - spec/lib/appsignal/hooks/excon_spec.rb
503
+ - spec/lib/appsignal/hooks/gvl_spec.rb
497
504
  - spec/lib/appsignal/hooks/http_spec.rb
498
505
  - spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb
499
506
  - spec/lib/appsignal/hooks/mri_spec.rb
@@ -525,6 +532,7 @@ test_files:
525
532
  - spec/lib/appsignal/logger_spec.rb
526
533
  - spec/lib/appsignal/marker_spec.rb
527
534
  - spec/lib/appsignal/minutely_spec.rb
535
+ - spec/lib/appsignal/probes/gvl_spec.rb
528
536
  - spec/lib/appsignal/probes/mri_spec.rb
529
537
  - spec/lib/appsignal/probes/sidekiq_spec.rb
530
538
  - spec/lib/appsignal/rack/generic_instrumentation_spec.rb
@@ -573,7 +581,9 @@ test_files:
573
581
  - spec/support/matchers/be_completed.rb
574
582
  - spec/support/matchers/contains_log.rb
575
583
  - spec/support/matchers/have_colorized_text.rb
584
+ - spec/support/mocks/appsignal_mock.rb
576
585
  - spec/support/mocks/fake_gc_profiler.rb
586
+ - spec/support/mocks/fake_gvl_tools.rb
577
587
  - spec/support/mocks/mock_probe.rb
578
588
  - spec/support/rails/my_app.rb
579
589
  - spec/support/shared_examples/instrument.rb