appsignal 1.4.0.alpha.2 → 1.4.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +3 -1
- data/.travis.yml +3 -1
- data/CHANGELOG.md +38 -1
- data/Rakefile +29 -12
- data/benchmark.rake +3 -7
- data/ext/agent.yml +11 -11
- data/ext/appsignal_extension.c +364 -72
- data/ext/extconf.rb +2 -4
- data/gemfiles/resque.gemfile +1 -0
- data/lib/appsignal.rb +40 -30
- data/lib/appsignal/auth_check.rb +1 -1
- data/lib/appsignal/cli/diagnose.rb +4 -3
- data/lib/appsignal/cli/install.rb +16 -15
- data/lib/appsignal/config.rb +31 -31
- data/lib/appsignal/event_formatter.rb +1 -1
- data/lib/appsignal/extension.rb +6 -0
- data/lib/appsignal/garbage_collection_profiler.rb +47 -0
- data/lib/appsignal/hooks.rb +1 -0
- data/lib/appsignal/hooks/active_support_notifications.rb +43 -0
- data/lib/appsignal/integrations/capistrano/appsignal.cap +1 -1
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +2 -2
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +1 -1
- data/lib/appsignal/integrations/object.rb +4 -4
- data/lib/appsignal/integrations/padrino.rb +1 -1
- data/lib/appsignal/integrations/sinatra.rb +1 -1
- data/lib/appsignal/integrations/webmachine.rb +2 -2
- data/lib/appsignal/js_exception_transaction.rb +7 -10
- data/lib/appsignal/marker.rb +3 -2
- data/lib/appsignal/rack/generic_instrumentation.rb +1 -1
- data/lib/appsignal/rack/sinatra_instrumentation.rb +13 -6
- data/lib/appsignal/rack/streaming_listener.rb +5 -3
- data/lib/appsignal/system.rb +36 -0
- data/lib/appsignal/transaction.rb +20 -20
- data/lib/appsignal/transmitter.rb +11 -7
- data/lib/appsignal/utils.rb +76 -2
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/auth_check_spec.rb +0 -2
- data/spec/lib/appsignal/capistrano2_spec.rb +99 -79
- data/spec/lib/appsignal/capistrano3_spec.rb +57 -78
- data/spec/lib/appsignal/cli/diagnose_spec.rb +17 -15
- data/spec/lib/appsignal/cli/install_spec.rb +38 -20
- data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +2 -5
- data/spec/lib/appsignal/cli_spec.rb +2 -5
- data/spec/lib/appsignal/config_spec.rb +385 -158
- data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +1 -3
- data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/event_formatter_spec.rb +0 -2
- data/spec/lib/appsignal/extension_spec.rb +7 -8
- data/spec/lib/appsignal/garbage_collection_profiler_spec.rb +71 -0
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +42 -0
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/puma_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/rake_spec.rb +1 -2
- data/spec/lib/appsignal/hooks/redis_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/sequel_spec.rb +19 -21
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +1 -4
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +2 -3
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -2
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +4 -11
- data/spec/lib/appsignal/hooks_spec.rb +0 -2
- data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -1
- data/spec/lib/appsignal/integrations/grape_spec.rb +1 -3
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +1 -2
- data/spec/lib/appsignal/integrations/object_spec.rb +32 -3
- data/spec/lib/appsignal/integrations/padrino_spec.rb +4 -11
- data/spec/lib/appsignal/integrations/railtie_spec.rb +1 -3
- data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +1 -3
- data/spec/lib/appsignal/integrations/resque_spec.rb +2 -4
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +33 -8
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +6 -15
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +3 -5
- data/spec/lib/appsignal/marker_spec.rb +35 -48
- data/spec/lib/appsignal/minutely_spec.rb +0 -2
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +0 -2
- data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +0 -2
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +3 -5
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +47 -11
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +6 -7
- data/spec/lib/appsignal/system/container_spec.rb +67 -0
- data/spec/lib/appsignal/system_spec.rb +49 -0
- data/spec/lib/appsignal/transaction_spec.rb +30 -13
- data/spec/lib/appsignal/transmitter_spec.rb +53 -20
- data/spec/lib/appsignal/utils/gzip_spec.rb +10 -0
- data/spec/lib/appsignal/utils/params_sanitizer_spec.rb +0 -2
- data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -2
- data/spec/lib/appsignal/utils_spec.rb +59 -3
- data/spec/lib/appsignal_spec.rb +132 -58
- data/spec/spec_helper.rb +24 -116
- data/spec/support/fixtures/containers/cgroups/docker +14 -0
- data/spec/support/fixtures/containers/cgroups/docker_systemd +8 -0
- data/spec/support/fixtures/containers/cgroups/lxc +10 -0
- data/spec/support/fixtures/containers/cgroups/no_permission +0 -0
- data/spec/support/fixtures/containers/cgroups/none +1 -0
- data/spec/support/helpers/api_request_helper.rb +22 -0
- data/spec/support/helpers/dependency_helper.rb +61 -0
- data/spec/support/helpers/directory_helper.rb +27 -0
- data/spec/support/helpers/std_streams_helper.rb +35 -0
- data/spec/support/helpers/system_helpers.rb +24 -0
- data/spec/support/helpers/transaction_helpers.rb +7 -64
- data/spec/support/helpers/very_specific_error.rb +8 -0
- data/spec/support/mocks/fake_gc_profiler.rb +19 -0
- data/spec/support/project_fixture/config/appsignal.yml +10 -1
- metadata +60 -35
- data/circle.yml +0 -12
- data/lib/appsignal/subscriber.rb +0 -55
- data/lib/appsignal/update_active_support.rb +0 -20
- data/lib/vendor/active_support/notifications.rb +0 -212
- data/lib/vendor/active_support/notifications/fanout.rb +0 -157
- data/lib/vendor/active_support/notifications/instrumenter.rb +0 -73
- data/lib/vendor/active_support/per_thread_registry.rb +0 -53
- data/spec/lib/appsignal/subscriber_spec.rb +0 -160
- data/spec/lib/appsignal/update_active_support_spec.rb +0 -17
- data/spec/support/helpers/notification_helpers.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 596cead7e715bf92192c49a6a74a452836a72d2e
|
4
|
+
data.tar.gz: 08bbd29e1f602c14aaaf934284ab37f084d0879e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 303d79b2ba2a59165230a1462c53bc2e259438055319ce505d3b007a3825d8ddbcc2d9a78a3d1d77631e35ef425916fb412df085296cfe1ed22eb609444665d2
|
7
|
+
data.tar.gz: d95b49731fe7838487773f772b02a2c8da3d687df4be19e95b4c52d19c36090afba4c3b85bf7a4fd21ccd10f3ee1ddcfc2a7fd9cf10b301626463881ade5a0f6
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,40 @@
|
|
1
1
|
# 1.4.0
|
2
|
-
*
|
2
|
+
* Add Appsignal.instrument_sql convenience methods
|
3
|
+
* Use Appsignal.instrument internally instead of AS instrument
|
4
|
+
* Override AS instrument instead of subscribing
|
5
|
+
* Use have_library to link libappsignal
|
6
|
+
* Refactor rescueing of exceptions
|
7
|
+
* Use GC::Profiler to track garbage collection time
|
8
|
+
* Recognize wether we're running in container
|
9
|
+
* Change load order to set system config first
|
10
|
+
* Remove unused config method
|
11
|
+
|
12
|
+
# 1.3.6
|
13
|
+
* Support blocks arguments on method instrumentation
|
14
|
+
* Support `APPSIGNAL_APP_ENV` for Sinatra
|
15
|
+
* Minor improvements to installer
|
16
|
+
* More robust handing of non-writable log files
|
17
|
+
* Cleaner internal exception handling
|
18
|
+
* Support for mixed case keywords in sql lexing
|
19
|
+
* Support for inserting multiple rows in sql lexing
|
20
|
+
|
21
|
+
# 1.3.5
|
22
|
+
|
23
|
+
* Fix SSL certificate config in appsignal-agent. PR #151
|
24
|
+
* Remove mounted_at Sinatra middleware option. Now detected by default. PR #146
|
25
|
+
* Sinatra applications with middleware loading before AppSignal's middleware
|
26
|
+
would crash a request. Fixed in PR #156
|
27
|
+
|
28
|
+
# 1.3.4
|
29
|
+
|
30
|
+
* Fix argument order for `record_event` in the AppSignal extension
|
31
|
+
|
32
|
+
# 1.3.3
|
33
|
+
|
34
|
+
* Output AppSignal environment on `appsignal diagnose`
|
35
|
+
* Prevent transaction crashes on Sinatra routes with optional parameters
|
36
|
+
* Listen to `stage` option to Capistrano 2 for automatic environment detection
|
37
|
+
* Add `appsignal_env` option to Capistrano 2 to set a custom environment
|
3
38
|
|
4
39
|
# 1.3.2
|
5
40
|
* Add method to discard a transaction
|
@@ -26,6 +61,8 @@
|
|
26
61
|
* Allow overriding Padrino environment with APPSIGNAL_APP_ENV
|
27
62
|
* Add mkmf.log to diagnose command
|
28
63
|
* Allow for local install with bundler `bundle exec rake install`
|
64
|
+
* Listen to `stage` option to Capistrano 3 for automatic environment detection
|
65
|
+
* Add `appsignal_env` option to Capistrano 3 to set a custom environment
|
29
66
|
|
30
67
|
# 1.2.5
|
31
68
|
* Bugfix in CPU utilization calculation for host metrics
|
data/Rakefile
CHANGED
@@ -103,8 +103,8 @@ task :publish do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
|
107
|
-
|
106
|
+
desc 'Install the AppSignal gem, extension and all possible dependencies.'
|
107
|
+
task :install => "extension:install" do
|
108
108
|
Bundler.with_clean_env do
|
109
109
|
GEMFILES.each do |gemfile|
|
110
110
|
system "bundle --gemfile gemfiles/#{gemfile}.gemfile"
|
@@ -114,8 +114,10 @@ end
|
|
114
114
|
|
115
115
|
task :spec_all_gemfiles do
|
116
116
|
GEMFILES.each do |gemfile|
|
117
|
-
puts "Running #{gemfile}"
|
118
|
-
|
117
|
+
puts "Running tests for #{gemfile}"
|
118
|
+
unless system("env BUNDLE_GEMFILE=gemfiles/#{gemfile}.gemfile bundle exec rspec")
|
119
|
+
raise 'Not successful'
|
120
|
+
end
|
119
121
|
end
|
120
122
|
end
|
121
123
|
|
@@ -135,7 +137,7 @@ task :generate_bundle_and_spec_all do
|
|
135
137
|
out << "#{switch_command.call(version)} || { echo 'Switching Ruby failed'; exit 1; }"
|
136
138
|
out << "ruby -v"
|
137
139
|
out << "echo 'Compiling extension'"
|
138
|
-
out << 'cd ext && rm -f appsignal-agent appsignal_extension.bundle appsignal.h libappsignal.a Makefile && ruby extconf.rb
|
140
|
+
out << 'cd ext && rm -f appsignal-agent appsignal_extension.bundle appsignal.h libappsignal.a Makefile && ruby extconf.rb && make && cd ..'
|
139
141
|
GEMFILES.each do |gemfile|
|
140
142
|
unless EXCLUSIONS[gemfile] && EXCLUSIONS[gemfile].include?(short_version)
|
141
143
|
out << "echo 'Bundling #{gemfile} in #{short_version}'"
|
@@ -169,19 +171,34 @@ task :console do
|
|
169
171
|
IRB.start
|
170
172
|
end
|
171
173
|
|
172
|
-
|
173
|
-
|
174
|
+
namespace :extension do
|
175
|
+
desc 'Install the AppSignal gem extension'
|
176
|
+
task :install => :clean do
|
177
|
+
system 'cd ext && ruby extconf.rb && make clean && make'
|
178
|
+
end
|
179
|
+
|
180
|
+
desc 'Clean the AppSignal gem extension directory of installation artifacts'
|
181
|
+
task :clean do
|
182
|
+
system <<-COMMAND
|
183
|
+
cd ext &&
|
184
|
+
rm -f appsignal.bundle \
|
185
|
+
appsignal-agent \
|
186
|
+
appsignal.h \
|
187
|
+
appsignal_extension.o \
|
188
|
+
install.log \
|
189
|
+
libappsignal.a \
|
190
|
+
Makefile \
|
191
|
+
mkmf.log
|
192
|
+
COMMAND
|
193
|
+
end
|
174
194
|
end
|
175
195
|
|
176
196
|
begin
|
177
197
|
require 'rspec/core/rake_task'
|
178
|
-
|
179
|
-
|
180
|
-
end
|
198
|
+
desc 'Run the AppSignal gem test suite.'
|
199
|
+
RSpec::Core::RakeTask.new :test
|
181
200
|
rescue LoadError
|
182
201
|
# When running rake install, there is no RSpec yet.
|
183
202
|
end
|
184
203
|
|
185
|
-
task :travis => [:install_extension, :rspec]
|
186
|
-
|
187
204
|
task :default => [:generate_bundle_and_spec_all, :spec_all_gemfiles]
|
data/benchmark.rake
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
+
require 'active_support'
|
1
2
|
require 'appsignal'
|
2
3
|
require 'benchmark'
|
3
4
|
|
4
|
-
class ::Appsignal::EventFormatter::ActiveRecord::SqlFormatter
|
5
|
-
def connection_config; {:adapter => 'mysql'}; end
|
6
|
-
end
|
7
|
-
|
8
5
|
GC.disable
|
9
6
|
|
10
7
|
task :default => :'benchmark:all'
|
@@ -46,9 +43,8 @@ def run_benchmark
|
|
46
43
|
)
|
47
44
|
Appsignal::Transaction.create("transaction_#{i}", Appsignal::Transaction::HTTP_REQUEST, request)
|
48
45
|
|
49
|
-
|
50
|
-
ActiveSupport::Notifications.instrument('sql.active_record', :sql => 'SELECT `users`.* FROM `users`
|
51
|
-
WHERE `users`.`id` = ?')
|
46
|
+
Appsignal.instrument('process_action.action_controller') do
|
47
|
+
ActiveSupport::Notifications.instrument('sql.active_record', :sql => 'SELECT `users`.* FROM `users` WHERE `users`.`id` = ?')
|
52
48
|
10.times do
|
53
49
|
ActiveSupport::Notifications.instrument('sql.active_record', :sql => 'SELECT `todos`.* FROM `todos` WHERE `todos`.`id` = ?')
|
54
50
|
end
|
data/ext/agent.yml
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
---
|
2
|
-
version:
|
2
|
+
version: 61c23ea
|
3
3
|
triples:
|
4
4
|
x86_64-linux:
|
5
|
-
checksum:
|
6
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
5
|
+
checksum: 6a0a1ebf6a1a9c7d2ac939f9077fd279155359ed72c74284d70daf0f53b27b10
|
6
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/61c23ea/appsignal-x86_64-linux-all-static.tar.gz
|
7
7
|
i686-linux:
|
8
|
-
checksum:
|
9
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
8
|
+
checksum: 498e11631eae3418a55a733ac13b993c35afb782be9fb5c4e5b6be0f52f4f76c
|
9
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/61c23ea/appsignal-i686-linux-all-static.tar.gz
|
10
10
|
x86-linux:
|
11
|
-
checksum:
|
12
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
11
|
+
checksum: 498e11631eae3418a55a733ac13b993c35afb782be9fb5c4e5b6be0f52f4f76c
|
12
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/61c23ea/appsignal-i686-linux-all-static.tar.gz
|
13
13
|
x86_64-darwin:
|
14
|
-
checksum:
|
15
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
14
|
+
checksum: 62a6ffc8d379bcba0cf7e48f92690b62ffacee81f3e996ace215f56eb03d2be6
|
15
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/61c23ea/appsignal-x86_64-darwin-all-static.tar.gz
|
16
16
|
universal-darwin:
|
17
|
-
checksum:
|
18
|
-
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/
|
17
|
+
checksum: 62a6ffc8d379bcba0cf7e48f92690b62ffacee81f3e996ace215f56eb03d2be6
|
18
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/61c23ea/appsignal-x86_64-darwin-all-static.tar.gz
|
data/ext/appsignal_extension.c
CHANGED
@@ -17,7 +17,8 @@ static inline VALUE make_ruby_string(appsignal_string_t string) {
|
|
17
17
|
|
18
18
|
VALUE Appsignal;
|
19
19
|
VALUE Extension;
|
20
|
-
VALUE
|
20
|
+
VALUE Transaction;
|
21
|
+
VALUE Data;
|
21
22
|
|
22
23
|
static VALUE start(VALUE self) {
|
23
24
|
appsignal_start();
|
@@ -44,106 +45,155 @@ static VALUE get_server_state(VALUE self, VALUE key) {
|
|
44
45
|
}
|
45
46
|
}
|
46
47
|
|
47
|
-
static VALUE start_transaction(VALUE self, VALUE transaction_id, VALUE namespace) {
|
48
|
+
static VALUE start_transaction(VALUE self, VALUE transaction_id, VALUE namespace, VALUE gc_duration_ms) {
|
48
49
|
appsignal_transaction_t* transaction;
|
49
50
|
|
50
51
|
Check_Type(transaction_id, T_STRING);
|
51
52
|
Check_Type(namespace, T_STRING);
|
53
|
+
Check_Type(gc_duration_ms, T_FIXNUM);
|
52
54
|
|
53
55
|
transaction = appsignal_start_transaction(
|
54
56
|
make_appsignal_string(transaction_id),
|
55
|
-
make_appsignal_string(namespace)
|
57
|
+
make_appsignal_string(namespace),
|
58
|
+
NUM2LONG(gc_duration_ms)
|
56
59
|
);
|
57
60
|
|
58
61
|
if (transaction) {
|
59
|
-
return Data_Wrap_Struct(
|
62
|
+
return Data_Wrap_Struct(Transaction, NULL, appsignal_free_transaction, transaction);
|
60
63
|
} else {
|
61
64
|
return Qnil;
|
62
65
|
}
|
63
66
|
}
|
64
67
|
|
65
|
-
static VALUE start_event(VALUE self) {
|
68
|
+
static VALUE start_event(VALUE self, VALUE gc_duration_ms) {
|
66
69
|
appsignal_transaction_t* transaction;
|
67
70
|
|
71
|
+
Check_Type(gc_duration_ms, T_FIXNUM);
|
72
|
+
|
68
73
|
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
69
74
|
|
70
|
-
appsignal_start_event(transaction);
|
75
|
+
appsignal_start_event(transaction, NUM2LONG(gc_duration_ms));
|
71
76
|
|
72
77
|
return Qnil;
|
73
78
|
}
|
74
79
|
|
75
|
-
static VALUE finish_event(VALUE self, VALUE name, VALUE title, VALUE body, VALUE body_format) {
|
80
|
+
static VALUE finish_event(VALUE self, VALUE name, VALUE title, VALUE body, VALUE body_format, VALUE gc_duration_ms) {
|
76
81
|
appsignal_transaction_t* transaction;
|
82
|
+
appsignal_data_t* body_data;
|
83
|
+
int body_type;
|
77
84
|
|
78
85
|
Check_Type(name, T_STRING);
|
79
86
|
Check_Type(title, T_STRING);
|
80
|
-
Check_Type(body, T_STRING);
|
81
87
|
Check_Type(body_format, T_FIXNUM);
|
88
|
+
|
82
89
|
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
83
90
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
+
body_type = TYPE(body);
|
92
|
+
if (body_type == T_STRING) {
|
93
|
+
appsignal_finish_event(
|
94
|
+
transaction,
|
95
|
+
make_appsignal_string(name),
|
96
|
+
make_appsignal_string(title),
|
97
|
+
make_appsignal_string(body),
|
98
|
+
FIX2INT(body_format),
|
99
|
+
FIX2LONG(gc_duration_ms)
|
100
|
+
);
|
101
|
+
} else if (body_type == RUBY_T_DATA) {
|
102
|
+
Data_Get_Struct(body, appsignal_data_t, body_data);
|
103
|
+
appsignal_finish_event_data(
|
104
|
+
transaction,
|
105
|
+
make_appsignal_string(name),
|
106
|
+
make_appsignal_string(title),
|
107
|
+
body_data,
|
108
|
+
FIX2INT(body_format),
|
109
|
+
FIX2LONG(gc_duration_ms)
|
110
|
+
);
|
111
|
+
} else {
|
112
|
+
rb_raise(rb_eTypeError, "body should be a String or Appsignal::Extension::Data");
|
113
|
+
}
|
114
|
+
|
91
115
|
return Qnil;
|
92
116
|
}
|
93
117
|
|
94
|
-
static VALUE record_event(VALUE self, VALUE name, VALUE title, VALUE body, VALUE duration, VALUE body_format) {
|
118
|
+
static VALUE record_event(VALUE self, VALUE name, VALUE title, VALUE body, VALUE duration, VALUE body_format, VALUE gc_duration_ms) {
|
95
119
|
appsignal_transaction_t* transaction;
|
120
|
+
appsignal_data_t* body_data;
|
121
|
+
int body_type;
|
96
122
|
int duration_type;
|
97
123
|
|
98
124
|
Check_Type(name, T_STRING);
|
99
125
|
Check_Type(title, T_STRING);
|
100
|
-
Check_Type(body, T_STRING);
|
101
126
|
duration_type = TYPE(duration);
|
102
127
|
if (duration_type != T_FIXNUM && duration_type != T_BIGNUM) {
|
103
128
|
rb_raise(rb_eTypeError, "duration should be a Fixnum or Bignum");
|
104
129
|
}
|
105
130
|
Check_Type(body_format, T_FIXNUM);
|
131
|
+
|
106
132
|
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
107
133
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
134
|
+
body_type = TYPE(body);
|
135
|
+
if (body_type == T_STRING) {
|
136
|
+
appsignal_record_event(
|
137
|
+
transaction,
|
138
|
+
make_appsignal_string(name),
|
139
|
+
make_appsignal_string(title),
|
140
|
+
make_appsignal_string(body),
|
141
|
+
FIX2INT(body_format),
|
142
|
+
NUM2LONG(duration),
|
143
|
+
NUM2LONG(gc_duration_ms)
|
144
|
+
);
|
145
|
+
} else if (body_type == RUBY_T_DATA) {
|
146
|
+
Data_Get_Struct(body, appsignal_data_t, body_data);
|
147
|
+
appsignal_record_event_data(
|
148
|
+
transaction,
|
149
|
+
make_appsignal_string(name),
|
150
|
+
make_appsignal_string(title),
|
151
|
+
body_data,
|
152
|
+
FIX2INT(body_format),
|
153
|
+
NUM2LONG(duration),
|
154
|
+
NUM2LONG(gc_duration_ms)
|
155
|
+
);
|
156
|
+
} else {
|
157
|
+
rb_raise(rb_eTypeError, "body should be a String or Appsignal::Extension::Data");
|
158
|
+
}
|
159
|
+
|
116
160
|
return Qnil;
|
117
161
|
}
|
118
162
|
|
119
163
|
static VALUE set_transaction_error(VALUE self, VALUE name, VALUE message, VALUE backtrace) {
|
120
164
|
appsignal_transaction_t* transaction;
|
165
|
+
appsignal_data_t* backtrace_data;
|
121
166
|
|
122
167
|
Check_Type(name, T_STRING);
|
123
168
|
Check_Type(message, T_STRING);
|
124
|
-
Check_Type(backtrace,
|
169
|
+
Check_Type(backtrace, RUBY_T_DATA);
|
170
|
+
|
125
171
|
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
172
|
+
Data_Get_Struct(backtrace, appsignal_data_t, backtrace_data);
|
126
173
|
|
127
174
|
appsignal_set_transaction_error(
|
128
175
|
transaction,
|
129
176
|
make_appsignal_string(name),
|
130
177
|
make_appsignal_string(message),
|
131
|
-
|
178
|
+
backtrace_data
|
132
179
|
);
|
133
180
|
return Qnil;
|
134
181
|
}
|
135
182
|
|
136
183
|
static VALUE set_transaction_sample_data(VALUE self, VALUE key, VALUE payload) {
|
137
184
|
appsignal_transaction_t* transaction;
|
185
|
+
appsignal_data_t* payload_data;
|
138
186
|
|
139
187
|
Check_Type(key, T_STRING);
|
140
|
-
Check_Type(payload,
|
188
|
+
Check_Type(payload, RUBY_T_DATA);
|
189
|
+
|
141
190
|
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
191
|
+
Data_Get_Struct(payload, appsignal_data_t, payload_data);
|
142
192
|
|
143
193
|
appsignal_set_transaction_sample_data(
|
144
194
|
transaction,
|
145
195
|
make_appsignal_string(key),
|
146
|
-
|
196
|
+
payload_data
|
147
197
|
);
|
148
198
|
return Qnil;
|
149
199
|
}
|
@@ -194,13 +244,14 @@ static VALUE set_transaction_metadata(VALUE self, VALUE key, VALUE value) {
|
|
194
244
|
return Qnil;
|
195
245
|
}
|
196
246
|
|
197
|
-
static VALUE finish_transaction(VALUE self) {
|
247
|
+
static VALUE finish_transaction(VALUE self, VALUE gc_duration_ms) {
|
198
248
|
appsignal_transaction_t* transaction;
|
199
249
|
int sample;
|
200
250
|
|
251
|
+
Check_Type(gc_duration_ms, T_FIXNUM);
|
201
252
|
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
202
253
|
|
203
|
-
sample = appsignal_finish_transaction(transaction);
|
254
|
+
sample = appsignal_finish_transaction(transaction, NUM2LONG(gc_duration_ms));
|
204
255
|
return sample == 1 ? Qtrue : Qfalse;
|
205
256
|
}
|
206
257
|
|
@@ -213,6 +264,249 @@ static VALUE complete_transaction(VALUE self) {
|
|
213
264
|
return Qnil;
|
214
265
|
}
|
215
266
|
|
267
|
+
static VALUE data_map_new(VALUE self) {
|
268
|
+
appsignal_data_t* data;
|
269
|
+
|
270
|
+
data = appsignal_data_map_new();
|
271
|
+
|
272
|
+
if (data) {
|
273
|
+
return Data_Wrap_Struct(Data, NULL, appsignal_free_data, data);
|
274
|
+
} else {
|
275
|
+
return Qnil;
|
276
|
+
}
|
277
|
+
}
|
278
|
+
|
279
|
+
static VALUE data_array_new(VALUE self) {
|
280
|
+
appsignal_data_t* data;
|
281
|
+
|
282
|
+
data = appsignal_data_array_new();
|
283
|
+
|
284
|
+
if (data) {
|
285
|
+
return Data_Wrap_Struct(Data, NULL, appsignal_free_data, data);
|
286
|
+
} else {
|
287
|
+
return Qnil;
|
288
|
+
}
|
289
|
+
}
|
290
|
+
|
291
|
+
static VALUE data_set_string(VALUE self, VALUE key, VALUE value) {
|
292
|
+
appsignal_data_t* data;
|
293
|
+
|
294
|
+
Check_Type(key, T_STRING);
|
295
|
+
Check_Type(value, T_STRING);
|
296
|
+
|
297
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
298
|
+
|
299
|
+
appsignal_data_map_set_string(
|
300
|
+
data,
|
301
|
+
make_appsignal_string(key),
|
302
|
+
make_appsignal_string(value)
|
303
|
+
);
|
304
|
+
|
305
|
+
return Qnil;
|
306
|
+
}
|
307
|
+
|
308
|
+
static VALUE data_set_fixnum(VALUE self, VALUE key, VALUE value) {
|
309
|
+
appsignal_data_t* data;
|
310
|
+
|
311
|
+
Check_Type(key, T_STRING);
|
312
|
+
Check_Type(value, T_FIXNUM);
|
313
|
+
|
314
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
315
|
+
|
316
|
+
appsignal_data_map_set_integer(
|
317
|
+
data,
|
318
|
+
make_appsignal_string(key),
|
319
|
+
FIX2LONG(value)
|
320
|
+
);
|
321
|
+
|
322
|
+
return Qnil;
|
323
|
+
}
|
324
|
+
|
325
|
+
static VALUE data_set_float(VALUE self, VALUE key, VALUE value) {
|
326
|
+
appsignal_data_t* data;
|
327
|
+
|
328
|
+
Check_Type(key, T_STRING);
|
329
|
+
Check_Type(value, T_FLOAT);
|
330
|
+
|
331
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
332
|
+
|
333
|
+
appsignal_data_map_set_float(
|
334
|
+
data,
|
335
|
+
make_appsignal_string(key),
|
336
|
+
NUM2DBL(value)
|
337
|
+
);
|
338
|
+
|
339
|
+
return Qnil;
|
340
|
+
}
|
341
|
+
|
342
|
+
static VALUE data_set_boolean(VALUE self, VALUE key, VALUE value) {
|
343
|
+
appsignal_data_t* data;
|
344
|
+
|
345
|
+
Check_Type(key, T_STRING);
|
346
|
+
|
347
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
348
|
+
|
349
|
+
appsignal_data_map_set_boolean(
|
350
|
+
data,
|
351
|
+
make_appsignal_string(key),
|
352
|
+
RTEST(value)
|
353
|
+
);
|
354
|
+
|
355
|
+
return Qnil;
|
356
|
+
}
|
357
|
+
|
358
|
+
static VALUE data_set_nil(VALUE self, VALUE key) {
|
359
|
+
appsignal_data_t* data;
|
360
|
+
|
361
|
+
Check_Type(key, T_STRING);
|
362
|
+
|
363
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
364
|
+
|
365
|
+
appsignal_data_map_set_null(
|
366
|
+
data,
|
367
|
+
make_appsignal_string(key)
|
368
|
+
);
|
369
|
+
|
370
|
+
return Qnil;
|
371
|
+
}
|
372
|
+
|
373
|
+
static VALUE data_set_data(VALUE self, VALUE key, VALUE value) {
|
374
|
+
appsignal_data_t* data;
|
375
|
+
appsignal_data_t* value_data;
|
376
|
+
|
377
|
+
Check_Type(key, T_STRING);
|
378
|
+
Check_Type(value, RUBY_T_DATA);
|
379
|
+
|
380
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
381
|
+
Data_Get_Struct(value, appsignal_data_t, value_data);
|
382
|
+
|
383
|
+
appsignal_data_map_set_data(
|
384
|
+
data,
|
385
|
+
make_appsignal_string(key),
|
386
|
+
value_data
|
387
|
+
);
|
388
|
+
|
389
|
+
return Qnil;
|
390
|
+
}
|
391
|
+
|
392
|
+
static VALUE data_append_string(VALUE self, VALUE value) {
|
393
|
+
appsignal_data_t* data;
|
394
|
+
|
395
|
+
Check_Type(value, T_STRING);
|
396
|
+
|
397
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
398
|
+
|
399
|
+
appsignal_data_array_append_string(
|
400
|
+
data,
|
401
|
+
make_appsignal_string(value)
|
402
|
+
);
|
403
|
+
|
404
|
+
return Qnil;
|
405
|
+
}
|
406
|
+
|
407
|
+
static VALUE data_append_fixnum(VALUE self, VALUE value) {
|
408
|
+
appsignal_data_t* data;
|
409
|
+
|
410
|
+
Check_Type(value, T_FIXNUM);
|
411
|
+
|
412
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
413
|
+
|
414
|
+
appsignal_data_array_append_integer(
|
415
|
+
data,
|
416
|
+
FIX2LONG(value)
|
417
|
+
);
|
418
|
+
|
419
|
+
return Qnil;
|
420
|
+
}
|
421
|
+
|
422
|
+
static VALUE data_append_float(VALUE self, VALUE value) {
|
423
|
+
appsignal_data_t* data;
|
424
|
+
|
425
|
+
Check_Type(value, T_FLOAT);
|
426
|
+
|
427
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
428
|
+
|
429
|
+
appsignal_data_array_append_float(
|
430
|
+
data,
|
431
|
+
NUM2DBL(value)
|
432
|
+
);
|
433
|
+
|
434
|
+
return Qnil;
|
435
|
+
}
|
436
|
+
|
437
|
+
static VALUE data_append_boolean(VALUE self, VALUE value) {
|
438
|
+
appsignal_data_t* data;
|
439
|
+
|
440
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
441
|
+
|
442
|
+
appsignal_data_array_append_boolean(
|
443
|
+
data,
|
444
|
+
RTEST(value)
|
445
|
+
);
|
446
|
+
|
447
|
+
return Qnil;
|
448
|
+
}
|
449
|
+
|
450
|
+
static VALUE data_append_nil(VALUE self, VALUE value) {
|
451
|
+
appsignal_data_t* data;
|
452
|
+
|
453
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
454
|
+
|
455
|
+
appsignal_data_array_append_null(data);
|
456
|
+
|
457
|
+
return Qnil;
|
458
|
+
}
|
459
|
+
|
460
|
+
static VALUE data_append_data(VALUE self, VALUE value) {
|
461
|
+
appsignal_data_t* data;
|
462
|
+
appsignal_data_t* value_data;
|
463
|
+
|
464
|
+
Check_Type(value, RUBY_T_DATA);
|
465
|
+
|
466
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
467
|
+
Data_Get_Struct(value, appsignal_data_t, value_data);
|
468
|
+
|
469
|
+
appsignal_data_array_append_data(
|
470
|
+
data,
|
471
|
+
value_data
|
472
|
+
);
|
473
|
+
|
474
|
+
return Qnil;
|
475
|
+
}
|
476
|
+
|
477
|
+
static VALUE data_equal(VALUE self, VALUE other) {
|
478
|
+
appsignal_data_t* data;
|
479
|
+
appsignal_data_t* other_data;
|
480
|
+
|
481
|
+
if (TYPE(other) != RUBY_T_DATA) {
|
482
|
+
return Qfalse;
|
483
|
+
}
|
484
|
+
|
485
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
486
|
+
Data_Get_Struct(other, appsignal_data_t, other_data);
|
487
|
+
|
488
|
+
if (appsignal_data_equal(data, other_data) == 1) {
|
489
|
+
return Qtrue;
|
490
|
+
} else {
|
491
|
+
return Qfalse;
|
492
|
+
}
|
493
|
+
}
|
494
|
+
|
495
|
+
static VALUE data_to_s(VALUE self) {
|
496
|
+
appsignal_data_t* data;
|
497
|
+
appsignal_string_t json;
|
498
|
+
|
499
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
500
|
+
|
501
|
+
json = appsignal_data_to_json(data);
|
502
|
+
|
503
|
+
if (json.len == 0) {
|
504
|
+
return Qnil;
|
505
|
+
} else {
|
506
|
+
return make_ruby_string(json);
|
507
|
+
}
|
508
|
+
}
|
509
|
+
|
216
510
|
static VALUE set_gauge(VALUE self, VALUE key, VALUE value) {
|
217
511
|
Check_Type(key, T_STRING);
|
218
512
|
Check_Type(value, T_FLOAT);
|
@@ -272,14 +566,6 @@ static void track_allocation(rb_event_flag_t flag, VALUE arg1, VALUE arg2, ID ar
|
|
272
566
|
appsignal_track_allocation();
|
273
567
|
}
|
274
568
|
|
275
|
-
static void track_gc_start(rb_event_flag_t flag, VALUE arg1, VALUE arg2, ID arg3, VALUE arg4) {
|
276
|
-
appsignal_track_gc_start();
|
277
|
-
}
|
278
|
-
|
279
|
-
static void track_gc_end(rb_event_flag_t flag, VALUE arg1, VALUE arg2, ID arg3, VALUE arg4) {
|
280
|
-
appsignal_track_gc_end();
|
281
|
-
}
|
282
|
-
|
283
569
|
static VALUE install_allocation_event_hook() {
|
284
570
|
// This event hook is only available on Ruby 2.1 and 2.2
|
285
571
|
#if defined(RUBY_INTERNAL_EVENT_NEWOBJ)
|
@@ -293,30 +579,11 @@ static VALUE install_allocation_event_hook() {
|
|
293
579
|
return Qnil;
|
294
580
|
}
|
295
581
|
|
296
|
-
static VALUE install_gc_event_hooks() {
|
297
|
-
// These event hooks are only available on Ruby 2.1 and 2.2
|
298
|
-
#if defined(RUBY_INTERNAL_EVENT_GC_START)
|
299
|
-
rb_add_event_hook(
|
300
|
-
track_gc_start,
|
301
|
-
RUBY_INTERNAL_EVENT_GC_START,
|
302
|
-
Qnil
|
303
|
-
);
|
304
|
-
#endif
|
305
|
-
#if defined(RUBY_INTERNAL_EVENT_GC_END_MARK)
|
306
|
-
rb_add_event_hook(
|
307
|
-
track_gc_end,
|
308
|
-
RUBY_INTERNAL_EVENT_GC_END_MARK,
|
309
|
-
Qnil
|
310
|
-
);
|
311
|
-
#endif
|
312
|
-
|
313
|
-
return Qnil;
|
314
|
-
}
|
315
|
-
|
316
582
|
void Init_appsignal_extension(void) {
|
317
583
|
Appsignal = rb_define_module("Appsignal");
|
318
584
|
Extension = rb_define_class_under(Appsignal, "Extension", rb_cObject);
|
319
|
-
|
585
|
+
Transaction = rb_define_class_under(Extension, "Transaction", rb_cObject);
|
586
|
+
Data = rb_define_class_under(Extension, "Data", rb_cObject);
|
320
587
|
|
321
588
|
// Starting and stopping
|
322
589
|
rb_define_singleton_method(Extension, "start", start, 0);
|
@@ -326,23 +593,48 @@ void Init_appsignal_extension(void) {
|
|
326
593
|
rb_define_singleton_method(Extension, "get_server_state", get_server_state, 1);
|
327
594
|
|
328
595
|
// Start transaction
|
329
|
-
rb_define_singleton_method(Extension, "start_transaction", start_transaction,
|
596
|
+
rb_define_singleton_method(Extension, "start_transaction", start_transaction, 3);
|
330
597
|
|
331
598
|
// Transaction instance methods
|
332
|
-
rb_define_method(
|
333
|
-
rb_define_method(
|
334
|
-
rb_define_method(
|
335
|
-
rb_define_method(
|
336
|
-
rb_define_method(
|
337
|
-
rb_define_method(
|
338
|
-
rb_define_method(
|
339
|
-
rb_define_method(
|
340
|
-
rb_define_method(
|
341
|
-
rb_define_method(
|
599
|
+
rb_define_method(Transaction, "start_event", start_event, 1);
|
600
|
+
rb_define_method(Transaction, "finish_event", finish_event, 5);
|
601
|
+
rb_define_method(Transaction, "record_event", record_event, 6);
|
602
|
+
rb_define_method(Transaction, "set_error", set_transaction_error, 3);
|
603
|
+
rb_define_method(Transaction, "set_sample_data", set_transaction_sample_data, 2);
|
604
|
+
rb_define_method(Transaction, "set_action", set_transaction_action, 1);
|
605
|
+
rb_define_method(Transaction, "set_queue_start", set_transaction_queue_start, 1);
|
606
|
+
rb_define_method(Transaction, "set_metadata", set_transaction_metadata, 2);
|
607
|
+
rb_define_method(Transaction, "finish", finish_transaction, 1);
|
608
|
+
rb_define_method(Transaction, "complete", complete_transaction, 0);
|
609
|
+
|
610
|
+
// Create a data map or array
|
611
|
+
rb_define_singleton_method(Extension, "data_map_new", data_map_new, 0);
|
612
|
+
rb_define_singleton_method(Extension, "data_array_new", data_array_new, 0);
|
613
|
+
|
614
|
+
// Add content to a data map
|
615
|
+
rb_define_method(Data, "set_string", data_set_string, 2);
|
616
|
+
rb_define_method(Data, "set_fixnum", data_set_fixnum, 2);
|
617
|
+
rb_define_method(Data, "set_float", data_set_float, 2);
|
618
|
+
rb_define_method(Data, "set_boolean", data_set_boolean, 2);
|
619
|
+
rb_define_method(Data, "set_nil", data_set_nil, 1);
|
620
|
+
rb_define_method(Data, "set_data", data_set_data, 2);
|
621
|
+
|
622
|
+
// Add content to a data array
|
623
|
+
rb_define_method(Data, "append_string", data_append_string, 1);
|
624
|
+
rb_define_method(Data, "append_fixnum", data_append_fixnum, 1);
|
625
|
+
rb_define_method(Data, "append_float", data_append_float, 1);
|
626
|
+
rb_define_method(Data, "append_boolean", data_append_boolean, 1);
|
627
|
+
rb_define_method(Data, "append_nil", data_append_nil, 0);
|
628
|
+
rb_define_method(Data, "append_data", data_append_data, 1);
|
629
|
+
|
630
|
+
// Data equality
|
631
|
+
rb_define_method(Data, "==", data_equal, 1);
|
632
|
+
|
633
|
+
// Get Json content of a data
|
634
|
+
rb_define_method(Data, "to_s", data_to_s, 0);
|
342
635
|
|
343
636
|
// Event hook installation
|
344
637
|
rb_define_singleton_method(Extension, "install_allocation_event_hook", install_allocation_event_hook, 0);
|
345
|
-
rb_define_singleton_method(Extension, "install_gc_event_hooks", install_gc_event_hooks, 0);
|
346
638
|
|
347
639
|
// Metrics
|
348
640
|
rb_define_singleton_method(Extension, "set_gauge", set_gauge, 2);
|