appsignal 2.8.4 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.rubocop_todo.yml +7 -16
- data/.travis.yml +4 -1
- data/CHANGELOG.md +16 -0
- data/README.md +23 -0
- data/Rakefile +10 -7
- data/appsignal.gemspec +3 -0
- data/build_matrix.yml +5 -1
- data/ext/Rakefile +23 -16
- data/ext/agent.yml +37 -37
- data/ext/base.rb +86 -24
- data/ext/extconf.rb +33 -26
- data/gemfiles/rails-6.0.gemfile +5 -0
- data/lib/appsignal.rb +14 -489
- data/lib/appsignal/cli/diagnose.rb +84 -4
- data/lib/appsignal/cli/diagnose/paths.rb +0 -5
- data/lib/appsignal/cli/diagnose/utils.rb +17 -0
- data/lib/appsignal/cli/helpers.rb +6 -0
- data/lib/appsignal/cli/install.rb +13 -7
- data/lib/appsignal/config.rb +1 -2
- data/lib/appsignal/event_formatter.rb +4 -5
- data/lib/appsignal/event_formatter/moped/query_formatter.rb +60 -59
- data/lib/appsignal/extension.rb +2 -2
- data/lib/appsignal/helpers/instrumentation.rb +485 -0
- data/lib/appsignal/helpers/metrics.rb +55 -0
- data/lib/appsignal/hooks.rb +9 -8
- data/lib/appsignal/hooks/puma.rb +65 -9
- data/lib/appsignal/hooks/sidekiq.rb +90 -0
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +7 -0
- data/lib/appsignal/integrations/railtie.rb +2 -1
- data/lib/appsignal/marker.rb +2 -3
- data/lib/appsignal/minutely.rb +164 -14
- data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -1
- data/lib/appsignal/system.rb +16 -18
- data/lib/appsignal/utils/rails_helper.rb +16 -0
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/cli/diagnose_spec.rb +129 -22
- data/spec/lib/appsignal/cli/install_spec.rb +6 -1
- data/spec/lib/appsignal/config_spec.rb +3 -3
- data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +6 -0
- data/spec/lib/appsignal/event_formatter_spec.rb +168 -69
- data/spec/lib/appsignal/hooks/puma_spec.rb +129 -0
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +147 -0
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +24 -1
- data/spec/lib/appsignal/minutely_spec.rb +251 -21
- data/spec/lib/appsignal/system_spec.rb +0 -35
- data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +39 -31
- data/spec/lib/appsignal/utils/json_spec.rb +7 -3
- data/spec/lib/appsignal_spec.rb +27 -2
- data/spec/spec_helper.rb +13 -0
- data/spec/support/helpers/log_helpers.rb +6 -0
- data/spec/support/project_fixture/config/appsignal.yml +1 -0
- data/spec/support/stubs/sidekiq/api.rb +4 -0
- metadata +8 -2
@@ -19,41 +19,6 @@ describe Appsignal::System do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe ".installed_agent_architecture" do
|
23
|
-
let(:const_name) { "GEM_EXT_PATH".freeze }
|
24
|
-
let(:tmp_ext_dir) { File.join(tmp_dir, "ext") }
|
25
|
-
let(:architecture_file) { File.join(Appsignal::System::GEM_EXT_PATH, "appsignal.architecture") }
|
26
|
-
around do |example|
|
27
|
-
original_gem_ext_path = Appsignal::System.const_get(const_name)
|
28
|
-
Appsignal::System.send(:remove_const, const_name)
|
29
|
-
Appsignal::System.const_set(const_name, tmp_ext_dir)
|
30
|
-
example.run
|
31
|
-
Appsignal::System.send(:remove_const, const_name)
|
32
|
-
Appsignal::System.const_set(const_name, original_gem_ext_path)
|
33
|
-
end
|
34
|
-
after { FileUtils.rm_rf(tmp_ext_dir) }
|
35
|
-
subject { described_class.installed_agent_architecture }
|
36
|
-
|
37
|
-
context "with an ext/appsignal.architecture file" do
|
38
|
-
before do
|
39
|
-
FileUtils.mkdir_p(Appsignal::System::GEM_EXT_PATH)
|
40
|
-
File.open(architecture_file, "w") do |file|
|
41
|
-
file.write "foo"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
it "returns the contents of the file" do
|
46
|
-
expect(subject).to eq("foo")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context "without an ext/appsignal.architecture file" do
|
51
|
-
it "returns nil" do
|
52
|
-
expect(subject).to be_nil
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
22
|
describe ".agent_platform" do
|
58
23
|
let(:os) { "linux-gnu" }
|
59
24
|
let(:ldd_output) { "" }
|
@@ -30,19 +30,20 @@ describe Appsignal::Utils::HashSanitizer do
|
|
30
30
|
let(:sanitized_params) { described_class.sanitize(params) }
|
31
31
|
subject { sanitized_params }
|
32
32
|
|
33
|
-
it
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
it "returns a sanitized Hash" do
|
34
|
+
expect(subject).to_not eq(params)
|
35
|
+
is_expected.to be_instance_of Hash
|
36
|
+
expect(subject[:text]).to eq("string")
|
37
|
+
expect(subject["string"]).to eq("string key value")
|
37
38
|
expect(subject[:file]).to be_instance_of String
|
38
39
|
expect(subject[:file]).to include "::UploadedFile"
|
40
|
+
expect(subject[:float]).to eq(0.0)
|
41
|
+
expect(subject[:bool_true]).to be(true)
|
42
|
+
expect(subject[:bool_false]).to be(false)
|
43
|
+
expect(subject[:nil]).to be_nil
|
44
|
+
expect(subject[:int]).to eq(1)
|
45
|
+
expect(subject[:int64]).to eq(1 << 64)
|
39
46
|
end
|
40
|
-
it { expect(subject[:float]).to eq(0.0) }
|
41
|
-
it { expect(subject[:bool_true]).to be(true) }
|
42
|
-
it { expect(subject[:bool_false]).to be(false) }
|
43
|
-
it { expect(subject[:nil]).to be_nil }
|
44
|
-
it { expect(subject[:int]).to eq(1) }
|
45
|
-
it { expect(subject[:int64]).to eq(1 << 64) }
|
46
47
|
|
47
48
|
it "does not change the original params" do
|
48
49
|
subject
|
@@ -50,29 +51,34 @@ describe Appsignal::Utils::HashSanitizer do
|
|
50
51
|
expect(params[:hash][:nested_array][2]).to eq(file)
|
51
52
|
end
|
52
53
|
|
53
|
-
describe ":hash" do
|
54
|
+
describe ":hash key" do
|
54
55
|
subject { sanitized_params[:hash] }
|
55
56
|
|
56
|
-
it
|
57
|
-
|
57
|
+
it "returns a sanitized Hash" do
|
58
|
+
expect(subject).to_not eq(params[:hash])
|
59
|
+
is_expected.to be_instance_of Hash
|
60
|
+
expect(subject[:nested_text]).to eq("string")
|
61
|
+
end
|
58
62
|
|
59
|
-
describe ":nested_array" do
|
63
|
+
describe ":nested_array key" do
|
60
64
|
subject { sanitized_params[:hash][:nested_array] }
|
61
65
|
|
62
|
-
it
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
+
it "returns a sanitized Array" do
|
67
|
+
expect(subject).to_not eq(params[:hash][:nested_array])
|
68
|
+
is_expected.to be_instance_of Array
|
69
|
+
expect(subject[0]).to eq("something")
|
70
|
+
expect(subject[1]).to eq("else")
|
66
71
|
expect(subject[2]).to be_instance_of String
|
67
72
|
expect(subject[2]).to include "::UploadedFile"
|
68
73
|
end
|
69
74
|
|
70
|
-
describe ":nested_hash" do
|
75
|
+
describe ":nested_hash key" do
|
71
76
|
subject { sanitized_params[:hash][:nested_array][3] }
|
72
77
|
|
73
|
-
it
|
74
|
-
|
75
|
-
|
78
|
+
it "returns a sanitized Hash" do
|
79
|
+
expect(subject).to_not eq(params[:hash][:nested_array][3])
|
80
|
+
is_expected.to be_instance_of Hash
|
81
|
+
expect(subject[:key]).to eq("value")
|
76
82
|
expect(subject[:file]).to be_instance_of String
|
77
83
|
expect(subject[:file]).to include "::UploadedFile"
|
78
84
|
end
|
@@ -86,17 +92,19 @@ describe Appsignal::Utils::HashSanitizer do
|
|
86
92
|
end
|
87
93
|
subject { sanitized_params }
|
88
94
|
|
89
|
-
it
|
90
|
-
|
91
|
-
|
95
|
+
it "returns a sanitized Hash with the given keys filtered out" do
|
96
|
+
expect(subject).to_not eq(params)
|
97
|
+
expect(subject[:text]).to eq(described_class::FILTERED)
|
98
|
+
expect(subject[:hash]).to eq(described_class::FILTERED)
|
99
|
+
|
92
100
|
expect(subject[:file]).to be_instance_of String
|
93
101
|
expect(subject[:file]).to include "::UploadedFile"
|
102
|
+
expect(subject[:float]).to eq(0.0)
|
103
|
+
expect(subject[:bool_true]).to be(true)
|
104
|
+
expect(subject[:bool_false]).to be(false)
|
105
|
+
expect(subject[:nil]).to be_nil
|
106
|
+
expect(subject[:int]).to eq(1)
|
94
107
|
end
|
95
|
-
it { expect(subject[:float]).to eq(0.0) }
|
96
|
-
it { expect(subject[:bool_true]).to be(true) }
|
97
|
-
it { expect(subject[:bool_false]).to be(false) }
|
98
|
-
it { expect(subject[:nil]).to be_nil }
|
99
|
-
it { expect(subject[:int]).to eq(1) }
|
100
108
|
|
101
109
|
context "with strings as key filter values" do
|
102
110
|
let(:sanitized_params) do
|
@@ -108,7 +116,7 @@ describe Appsignal::Utils::HashSanitizer do
|
|
108
116
|
end
|
109
117
|
end
|
110
118
|
|
111
|
-
describe ":hash" do
|
119
|
+
describe ":hash key" do
|
112
120
|
let(:sanitized_params) do
|
113
121
|
described_class.sanitize(params, %w[nested_text])
|
114
122
|
end
|
@@ -16,10 +16,12 @@ describe Appsignal::Utils::JSON do
|
|
16
16
|
}
|
17
17
|
end
|
18
18
|
|
19
|
-
it
|
19
|
+
it "returns a JSON string" do
|
20
|
+
is_expected.to eq %({"the":"payload","1":true,"":"test","foo":[1,2,"three"],"bar":null,"baz":{"foo":"bar"}})
|
21
|
+
end
|
20
22
|
end
|
21
23
|
|
22
|
-
context "with a body that contains strings with invalid
|
24
|
+
context "with a body that contains strings with invalid UTF-8 content" do
|
23
25
|
let(:string_with_invalid_utf8) { [0x61, 0x61, 0x85].pack("c*") }
|
24
26
|
let(:body) do
|
25
27
|
{
|
@@ -34,7 +36,9 @@ describe Appsignal::Utils::JSON do
|
|
34
36
|
}
|
35
37
|
end
|
36
38
|
|
37
|
-
it
|
39
|
+
it "returns a JSON string with invalid UTF-8 content" do
|
40
|
+
is_expected.to eq %({"field_one":"aa","field_two":"aa�","field_three":["one","aa�"],"field_four":{"one":"aa�"}})
|
41
|
+
end
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
data/spec/lib/appsignal_spec.rb
CHANGED
@@ -90,12 +90,14 @@ describe Appsignal do
|
|
90
90
|
unless Appsignal::System.jruby?
|
91
91
|
it "installs the allocation event hook" do
|
92
92
|
expect(Appsignal::Extension).to receive(:install_allocation_event_hook)
|
93
|
+
.and_call_original
|
93
94
|
Appsignal.start
|
94
95
|
end
|
95
96
|
end
|
96
97
|
|
97
98
|
it "should add the gc probe to minutely" do
|
98
|
-
expect(Appsignal::Minutely).to receive(:
|
99
|
+
expect(Appsignal::Minutely).to receive(:register_garbage_collection_probe)
|
100
|
+
.and_call_original
|
99
101
|
Appsignal.start
|
100
102
|
end
|
101
103
|
end
|
@@ -117,7 +119,7 @@ describe Appsignal do
|
|
117
119
|
end
|
118
120
|
|
119
121
|
it "should not add the gc probe to minutely" do
|
120
|
-
expect(Appsignal::Minutely).not_to receive(:
|
122
|
+
expect(Appsignal::Minutely).not_to receive(:register_garbage_collection_probe)
|
121
123
|
Appsignal.start
|
122
124
|
end
|
123
125
|
end
|
@@ -650,6 +652,29 @@ describe Appsignal do
|
|
650
652
|
|
651
653
|
after { Appsignal.send_error(error, nil, namespace) }
|
652
654
|
end
|
655
|
+
|
656
|
+
context "when given a block" do
|
657
|
+
it "yields the transaction and allows additional metadata to be set" do
|
658
|
+
captured_transaction = nil
|
659
|
+
Appsignal.send_error(StandardError.new("my_error")) do |transaction|
|
660
|
+
captured_transaction = transaction
|
661
|
+
transaction.set_action("my_action")
|
662
|
+
transaction.set_namespace("my_namespace")
|
663
|
+
|
664
|
+
# Don't flush the transaction, so we can inspect it
|
665
|
+
expect(transaction).to receive(:complete)
|
666
|
+
end
|
667
|
+
expect(captured_transaction.to_h).to include(
|
668
|
+
"namespace" => "my_namespace",
|
669
|
+
"action" => "my_action",
|
670
|
+
"error" => {
|
671
|
+
"name" => "StandardError",
|
672
|
+
"message" => "my_error",
|
673
|
+
"backtrace" => kind_of(String) # TODO: should be Array
|
674
|
+
}
|
675
|
+
)
|
676
|
+
end
|
677
|
+
end
|
653
678
|
end
|
654
679
|
|
655
680
|
describe ".listen_for_error" do
|
data/spec/spec_helper.rb
CHANGED
@@ -83,6 +83,7 @@ RSpec.configure do |config|
|
|
83
83
|
end
|
84
84
|
|
85
85
|
config.before do
|
86
|
+
stop_minutely_probes
|
86
87
|
ENV["RAILS_ENV"] ||= "test"
|
87
88
|
ENV["RACK_ENV"] ||= "test"
|
88
89
|
ENV["PADRINO_ENV"] ||= "test"
|
@@ -114,6 +115,7 @@ RSpec.configure do |config|
|
|
114
115
|
|
115
116
|
config.after do
|
116
117
|
Thread.current[:appsignal_transaction] = nil
|
118
|
+
stop_minutely_probes
|
117
119
|
end
|
118
120
|
|
119
121
|
config.after :context do
|
@@ -121,4 +123,15 @@ RSpec.configure do |config|
|
|
121
123
|
Appsignal.config = nil
|
122
124
|
Appsignal.logger = nil
|
123
125
|
end
|
126
|
+
|
127
|
+
def stop_minutely_probes
|
128
|
+
thread =
|
129
|
+
begin
|
130
|
+
Appsignal::Minutely.class_variable_get(:@@thread) # Fetch old thread
|
131
|
+
rescue NameError
|
132
|
+
nil
|
133
|
+
end
|
134
|
+
Appsignal::Minutely.stop
|
135
|
+
thread && thread.join # Wait for old thread to exit
|
136
|
+
end
|
124
137
|
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: 2.
|
4
|
+
version: 2.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Beekman
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-03-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -166,6 +166,7 @@ files:
|
|
166
166
|
- gemfiles/rails-5.0.gemfile
|
167
167
|
- gemfiles/rails-5.1.gemfile
|
168
168
|
- gemfiles/rails-5.2.gemfile
|
169
|
+
- gemfiles/rails-6.0.gemfile
|
169
170
|
- gemfiles/resque.gemfile
|
170
171
|
- gemfiles/sequel-435.gemfile
|
171
172
|
- gemfiles/sequel.gemfile
|
@@ -195,6 +196,8 @@ files:
|
|
195
196
|
- lib/appsignal/extension.rb
|
196
197
|
- lib/appsignal/extension/jruby.rb
|
197
198
|
- lib/appsignal/garbage_collection_profiler.rb
|
199
|
+
- lib/appsignal/helpers/instrumentation.rb
|
200
|
+
- lib/appsignal/helpers/metrics.rb
|
198
201
|
- lib/appsignal/hooks.rb
|
199
202
|
- lib/appsignal/hooks/action_cable.rb
|
200
203
|
- lib/appsignal/hooks/active_support_notifications.rb
|
@@ -245,6 +248,7 @@ files:
|
|
245
248
|
- lib/appsignal/utils/hash_sanitizer.rb
|
246
249
|
- lib/appsignal/utils/json.rb
|
247
250
|
- lib/appsignal/utils/query_params_sanitizer.rb
|
251
|
+
- lib/appsignal/utils/rails_helper.rb
|
248
252
|
- lib/appsignal/version.rb
|
249
253
|
- lib/sequel/extensions/appsignal_integration.rb
|
250
254
|
- resources/appsignal.yml.erb
|
@@ -352,6 +356,7 @@ files:
|
|
352
356
|
- spec/support/rails/my_app.rb
|
353
357
|
- spec/support/shared_examples/instrument.rb
|
354
358
|
- spec/support/stubs/delayed_job.rb
|
359
|
+
- spec/support/stubs/sidekiq/api.rb
|
355
360
|
- support/bundler_wrapper
|
356
361
|
- support/install_deps
|
357
362
|
homepage: https://github.com/appsignal/appsignal-ruby
|
@@ -482,3 +487,4 @@ test_files:
|
|
482
487
|
- spec/support/rails/my_app.rb
|
483
488
|
- spec/support/shared_examples/instrument.rb
|
484
489
|
- spec/support/stubs/delayed_job.rb
|
490
|
+
- spec/support/stubs/sidekiq/api.rb
|