appsignal 2.5.0.alpha.1-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 +7 -0
- data/.gitignore +33 -0
- data/.rspec +4 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +124 -0
- data/.travis.yml +72 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +639 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +264 -0
- data/Rakefile +214 -0
- data/appsignal.gemspec +42 -0
- data/benchmark.rake +77 -0
- data/bin/appsignal +13 -0
- data/ext/Rakefile +27 -0
- data/ext/agent.yml +64 -0
- data/ext/appsignal_extension.c +692 -0
- data/ext/base.rb +79 -0
- data/ext/extconf.rb +35 -0
- data/gemfiles/capistrano2.gemfile +7 -0
- data/gemfiles/capistrano3.gemfile +7 -0
- data/gemfiles/grape.gemfile +7 -0
- data/gemfiles/no_dependencies.gemfile +5 -0
- data/gemfiles/padrino.gemfile +7 -0
- data/gemfiles/que.gemfile +5 -0
- data/gemfiles/rails-3.2.gemfile +6 -0
- data/gemfiles/rails-4.0.gemfile +6 -0
- data/gemfiles/rails-4.1.gemfile +6 -0
- data/gemfiles/rails-4.2.gemfile +10 -0
- data/gemfiles/rails-5.0.gemfile +5 -0
- data/gemfiles/rails-5.1.gemfile +5 -0
- data/gemfiles/resque.gemfile +12 -0
- data/gemfiles/sequel-435.gemfile +11 -0
- data/gemfiles/sequel.gemfile +11 -0
- data/gemfiles/sinatra.gemfile +6 -0
- data/gemfiles/webmachine.gemfile +5 -0
- data/lib/appsignal.rb +804 -0
- data/lib/appsignal/auth_check.rb +65 -0
- data/lib/appsignal/capistrano.rb +10 -0
- data/lib/appsignal/cli.rb +108 -0
- data/lib/appsignal/cli/demo.rb +63 -0
- data/lib/appsignal/cli/diagnose.rb +500 -0
- data/lib/appsignal/cli/helpers.rb +72 -0
- data/lib/appsignal/cli/install.rb +277 -0
- data/lib/appsignal/cli/notify_of_deploy.rb +113 -0
- data/lib/appsignal/config.rb +287 -0
- data/lib/appsignal/demo.rb +107 -0
- data/lib/appsignal/event_formatter.rb +74 -0
- data/lib/appsignal/event_formatter/action_view/render_formatter.rb +24 -0
- data/lib/appsignal/event_formatter/active_record/instantiation_formatter.rb +14 -0
- data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +14 -0
- data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +32 -0
- data/lib/appsignal/event_formatter/faraday/request_formatter.rb +19 -0
- data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +89 -0
- data/lib/appsignal/event_formatter/moped/query_formatter.rb +80 -0
- data/lib/appsignal/extension.rb +63 -0
- data/lib/appsignal/extension/jruby.rb +460 -0
- data/lib/appsignal/garbage_collection_profiler.rb +48 -0
- data/lib/appsignal/hooks.rb +105 -0
- data/lib/appsignal/hooks/action_cable.rb +113 -0
- data/lib/appsignal/hooks/active_support_notifications.rb +52 -0
- data/lib/appsignal/hooks/celluloid.rb +30 -0
- data/lib/appsignal/hooks/data_mapper.rb +18 -0
- data/lib/appsignal/hooks/delayed_job.rb +19 -0
- data/lib/appsignal/hooks/mongo_ruby_driver.rb +21 -0
- data/lib/appsignal/hooks/net_http.rb +29 -0
- data/lib/appsignal/hooks/passenger.rb +22 -0
- data/lib/appsignal/hooks/puma.rb +35 -0
- data/lib/appsignal/hooks/que.rb +21 -0
- data/lib/appsignal/hooks/rake.rb +39 -0
- data/lib/appsignal/hooks/redis.rb +30 -0
- data/lib/appsignal/hooks/sequel.rb +60 -0
- data/lib/appsignal/hooks/shoryuken.rb +43 -0
- data/lib/appsignal/hooks/sidekiq.rb +144 -0
- data/lib/appsignal/hooks/unicorn.rb +40 -0
- data/lib/appsignal/hooks/webmachine.rb +23 -0
- data/lib/appsignal/integrations/capistrano/appsignal.cap +39 -0
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +52 -0
- data/lib/appsignal/integrations/data_mapper.rb +33 -0
- data/lib/appsignal/integrations/delayed_job_plugin.rb +54 -0
- data/lib/appsignal/integrations/grape.rb +53 -0
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +55 -0
- data/lib/appsignal/integrations/object.rb +35 -0
- data/lib/appsignal/integrations/padrino.rb +84 -0
- data/lib/appsignal/integrations/que.rb +43 -0
- data/lib/appsignal/integrations/railtie.rb +41 -0
- data/lib/appsignal/integrations/rake.rb +2 -0
- data/lib/appsignal/integrations/resque.rb +20 -0
- data/lib/appsignal/integrations/resque_active_job.rb +30 -0
- data/lib/appsignal/integrations/sinatra.rb +17 -0
- data/lib/appsignal/integrations/webmachine.rb +38 -0
- data/lib/appsignal/js_exception_transaction.rb +54 -0
- data/lib/appsignal/marker.rb +63 -0
- data/lib/appsignal/minutely.rb +42 -0
- data/lib/appsignal/rack/generic_instrumentation.rb +49 -0
- data/lib/appsignal/rack/js_exception_catcher.rb +70 -0
- data/lib/appsignal/rack/rails_instrumentation.rb +51 -0
- data/lib/appsignal/rack/sinatra_instrumentation.rb +99 -0
- data/lib/appsignal/rack/streaming_listener.rb +73 -0
- data/lib/appsignal/system.rb +81 -0
- data/lib/appsignal/transaction.rb +498 -0
- data/lib/appsignal/transmitter.rb +107 -0
- data/lib/appsignal/utils.rb +127 -0
- data/lib/appsignal/utils/params_sanitizer.rb +59 -0
- data/lib/appsignal/utils/query_params_sanitizer.rb +55 -0
- data/lib/appsignal/version.rb +3 -0
- data/lib/sequel/extensions/appsignal_integration.rb +3 -0
- data/resources/appsignal.yml.erb +39 -0
- data/resources/cacert.pem +3866 -0
- data/spec/.rubocop.yml +7 -0
- data/spec/lib/appsignal/auth_check_spec.rb +80 -0
- data/spec/lib/appsignal/capistrano2_spec.rb +224 -0
- data/spec/lib/appsignal/capistrano3_spec.rb +237 -0
- data/spec/lib/appsignal/cli/demo_spec.rb +67 -0
- data/spec/lib/appsignal/cli/diagnose_spec.rb +988 -0
- data/spec/lib/appsignal/cli/helpers_spec.rb +171 -0
- data/spec/lib/appsignal/cli/install_spec.rb +632 -0
- data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +168 -0
- data/spec/lib/appsignal/cli_spec.rb +56 -0
- data/spec/lib/appsignal/config_spec.rb +637 -0
- data/spec/lib/appsignal/demo_spec.rb +87 -0
- data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +44 -0
- data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +21 -0
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +21 -0
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +52 -0
- data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +21 -0
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +113 -0
- data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +112 -0
- data/spec/lib/appsignal/event_formatter_spec.rb +100 -0
- data/spec/lib/appsignal/extension/jruby_spec.rb +43 -0
- data/spec/lib/appsignal/extension_spec.rb +137 -0
- data/spec/lib/appsignal/garbage_collection_profiler_spec.rb +66 -0
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +370 -0
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +92 -0
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +35 -0
- data/spec/lib/appsignal/hooks/data_mapper_spec.rb +39 -0
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +358 -0
- data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +44 -0
- data/spec/lib/appsignal/hooks/net_http_spec.rb +53 -0
- data/spec/lib/appsignal/hooks/passenger_spec.rb +30 -0
- data/spec/lib/appsignal/hooks/puma_spec.rb +80 -0
- data/spec/lib/appsignal/hooks/que_spec.rb +19 -0
- data/spec/lib/appsignal/hooks/rake_spec.rb +73 -0
- data/spec/lib/appsignal/hooks/redis_spec.rb +55 -0
- data/spec/lib/appsignal/hooks/sequel_spec.rb +46 -0
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +192 -0
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +419 -0
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +52 -0
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +35 -0
- data/spec/lib/appsignal/hooks_spec.rb +195 -0
- data/spec/lib/appsignal/integrations/data_mapper_spec.rb +65 -0
- data/spec/lib/appsignal/integrations/grape_spec.rb +225 -0
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +127 -0
- data/spec/lib/appsignal/integrations/object_spec.rb +249 -0
- data/spec/lib/appsignal/integrations/padrino_spec.rb +323 -0
- data/spec/lib/appsignal/integrations/que_spec.rb +174 -0
- data/spec/lib/appsignal/integrations/railtie_spec.rb +129 -0
- data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +83 -0
- data/spec/lib/appsignal/integrations/resque_spec.rb +92 -0
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +73 -0
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +69 -0
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +128 -0
- data/spec/lib/appsignal/marker_spec.rb +51 -0
- data/spec/lib/appsignal/minutely_spec.rb +50 -0
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +90 -0
- data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +147 -0
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +117 -0
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +213 -0
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +161 -0
- data/spec/lib/appsignal/system_spec.rb +131 -0
- data/spec/lib/appsignal/transaction_spec.rb +1146 -0
- data/spec/lib/appsignal/transmitter_spec.rb +152 -0
- data/spec/lib/appsignal/utils/params_sanitizer_spec.rb +136 -0
- data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +192 -0
- data/spec/lib/appsignal/utils_spec.rb +150 -0
- data/spec/lib/appsignal_spec.rb +1049 -0
- data/spec/spec_helper.rb +116 -0
- 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/fixtures/generated_config.yml +24 -0
- data/spec/support/fixtures/uploaded_file.txt +0 -0
- data/spec/support/helpers/api_request_helper.rb +19 -0
- data/spec/support/helpers/cli_helpers.rb +26 -0
- data/spec/support/helpers/config_helpers.rb +21 -0
- data/spec/support/helpers/dependency_helper.rb +73 -0
- data/spec/support/helpers/directory_helper.rb +27 -0
- data/spec/support/helpers/env_helpers.rb +33 -0
- data/spec/support/helpers/example_exception.rb +13 -0
- data/spec/support/helpers/example_standard_error.rb +13 -0
- data/spec/support/helpers/log_helpers.rb +22 -0
- data/spec/support/helpers/std_streams_helper.rb +66 -0
- data/spec/support/helpers/system_helpers.rb +8 -0
- data/spec/support/helpers/time_helpers.rb +11 -0
- data/spec/support/helpers/transaction_helpers.rb +37 -0
- data/spec/support/matchers/contains_log.rb +7 -0
- data/spec/support/mocks/fake_gc_profiler.rb +19 -0
- data/spec/support/mocks/mock_extension.rb +6 -0
- data/spec/support/project_fixture/config/application.rb +0 -0
- data/spec/support/project_fixture/config/appsignal.yml +32 -0
- data/spec/support/project_fixture/config/environments/development.rb +0 -0
- data/spec/support/project_fixture/config/environments/production.rb +0 -0
- data/spec/support/project_fixture/config/environments/test.rb +0 -0
- data/spec/support/project_fixture/log/.gitkeep +0 -0
- data/spec/support/rails/my_app.rb +6 -0
- data/spec/support/shared_examples/instrument.rb +43 -0
- data/spec/support/stubs/delayed_job.rb +0 -0
- metadata +483 -0
data/appsignal.gemspec
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require File.expand_path("../lib/appsignal/version", __FILE__)
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |gem| # rubocop:disable Metrics/BlockLength
|
|
6
|
+
gem.authors = [
|
|
7
|
+
"Robert Beekman",
|
|
8
|
+
"Thijs Cadier"
|
|
9
|
+
]
|
|
10
|
+
gem.email = ["support@appsignal.com"]
|
|
11
|
+
gem.description = "The official appsignal.com gem"
|
|
12
|
+
gem.summary = "Logs performance and exception data from your app to "\
|
|
13
|
+
"appsignal.com"
|
|
14
|
+
gem.homepage = "https://github.com/appsignal/appsignal-ruby"
|
|
15
|
+
gem.license = "MIT"
|
|
16
|
+
|
|
17
|
+
gem.files = `git ls-files`.split($\) # rubocop:disable Style/SpecialGlobalVars
|
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
20
|
+
gem.name = "appsignal"
|
|
21
|
+
gem.require_paths = %w[lib ext]
|
|
22
|
+
gem.version = Appsignal::VERSION
|
|
23
|
+
gem.required_ruby_version = ">= 1.9"
|
|
24
|
+
|
|
25
|
+
if RUBY_PLATFORM == "java" || ENV["APPSIGNAL_PUSH_JAVA_GEM"]
|
|
26
|
+
gem.platform = "java"
|
|
27
|
+
gem.extensions = %w[ext/Rakefile]
|
|
28
|
+
gem.add_dependency "ffi"
|
|
29
|
+
else
|
|
30
|
+
gem.extensions = %w[ext/extconf.rb]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
gem.add_dependency "rack"
|
|
34
|
+
|
|
35
|
+
gem.add_development_dependency "rake", "~> 11"
|
|
36
|
+
gem.add_development_dependency "rspec", "~> 3.6"
|
|
37
|
+
gem.add_development_dependency "pry"
|
|
38
|
+
gem.add_development_dependency "timecop"
|
|
39
|
+
gem.add_development_dependency "webmock"
|
|
40
|
+
gem.add_development_dependency "rubocop", "0.49.0"
|
|
41
|
+
gem.add_development_dependency "yard"
|
|
42
|
+
end
|
data/benchmark.rake
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'appsignal'
|
|
2
|
+
require 'benchmark'
|
|
3
|
+
|
|
4
|
+
GC.disable
|
|
5
|
+
|
|
6
|
+
task :default => :'benchmark:all'
|
|
7
|
+
|
|
8
|
+
namespace :benchmark do
|
|
9
|
+
task :all => [:run_inactive, :run_active]
|
|
10
|
+
|
|
11
|
+
task :run_inactive do
|
|
12
|
+
puts 'Running with appsignal off'
|
|
13
|
+
ENV['APPSIGNAL_PUSH_API_KEY'] = nil
|
|
14
|
+
run_benchmark
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
task :run_active do
|
|
18
|
+
puts 'Running with appsignal on'
|
|
19
|
+
ENV['APPSIGNAL_PUSH_API_KEY'] = 'something'
|
|
20
|
+
run_benchmark
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def run_benchmark
|
|
25
|
+
no_transactions = (ENV['NO_TRANSACTIONS'] || 100_000).to_i
|
|
26
|
+
no_threads = (ENV['NO_THREADS'] || 1).to_i
|
|
27
|
+
|
|
28
|
+
total_objects = ObjectSpace.count_objects[:TOTAL]
|
|
29
|
+
puts "Initializing, currently #{total_objects} objects"
|
|
30
|
+
|
|
31
|
+
Appsignal.config = Appsignal::Config.new(Dir.pwd, 'production', :endpoint => 'http://localhost:8080')
|
|
32
|
+
Appsignal.start
|
|
33
|
+
puts "Appsignal #{Appsignal.active? ? 'active' : 'not active'}"
|
|
34
|
+
|
|
35
|
+
threads = []
|
|
36
|
+
puts "Running #{no_transactions} normal transactions in #{no_threads} threads"
|
|
37
|
+
puts(Benchmark.measure do
|
|
38
|
+
no_threads.times do
|
|
39
|
+
thread = Thread.new do
|
|
40
|
+
no_transactions.times do |i|
|
|
41
|
+
request = Appsignal::Transaction::GenericRequest.new(
|
|
42
|
+
:controller => 'HomeController',
|
|
43
|
+
:action => 'show',
|
|
44
|
+
:params => {:id => 1}
|
|
45
|
+
)
|
|
46
|
+
Appsignal::Transaction.create("transaction_#{i}", Appsignal::Transaction::HTTP_REQUEST, request)
|
|
47
|
+
|
|
48
|
+
Appsignal.instrument('process_action.action_controller') do
|
|
49
|
+
Appsignal.instrument_sql('sql.active_record', nil, 'SELECT `users`.* FROM `users` WHERE `users`.`id` = ?')
|
|
50
|
+
10.times do
|
|
51
|
+
Appsignal.instrument_sql('sql.active_record', nil, 'SELECT `todos`.* FROM `todos` WHERE `todos`.`id` = ?')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
Appsignal.instrument('render_template.action_view', 'app/views/home/show.html.erb') do
|
|
55
|
+
5.times do
|
|
56
|
+
Appsignal.instrument('render_partial.action_view', 'app/views/home/_piece.html.erb') do
|
|
57
|
+
3.times do
|
|
58
|
+
Appsignal.instrument('cache.read')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
Appsignal::Transaction.complete_current!
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
thread.abort_on_exception = true
|
|
69
|
+
threads << thread
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
threads.each(&:join)
|
|
73
|
+
puts 'Finished'
|
|
74
|
+
end)
|
|
75
|
+
|
|
76
|
+
puts "Done, currently #{ObjectSpace.count_objects[:TOTAL] - total_objects} objects created"
|
|
77
|
+
end
|
data/bin/appsignal
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
|
4
|
+
require "appsignal/cli"
|
|
5
|
+
|
|
6
|
+
begin
|
|
7
|
+
Appsignal::CLI.run
|
|
8
|
+
rescue => e
|
|
9
|
+
raise e if $DEBUG
|
|
10
|
+
STDERR.puts e.message
|
|
11
|
+
STDERR.puts e.backtrace.join("\n")
|
|
12
|
+
exit 1
|
|
13
|
+
end
|
data/ext/Rakefile
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require File.expand_path("../../lib/appsignal/version.rb", __FILE__)
|
|
2
|
+
require File.expand_path("../base.rb", __FILE__)
|
|
3
|
+
|
|
4
|
+
task :default do
|
|
5
|
+
begin
|
|
6
|
+
logger.info "Installing appsignal agent #{Appsignal::VERSION} for Ruby #{RUBY_VERSION} on #{RUBY_PLATFORM}"
|
|
7
|
+
write_agent_architecture
|
|
8
|
+
next unless check_architecture
|
|
9
|
+
arch_config = AGENT_CONFIG["triples"][ARCH]
|
|
10
|
+
|
|
11
|
+
unless File.exist?(ext_path("appsignal-agent")) &&
|
|
12
|
+
(
|
|
13
|
+
File.exist?(ext_path("libappsignal.dylib")) ||
|
|
14
|
+
File.exist?(ext_path("libappsignal.so"))
|
|
15
|
+
) &&
|
|
16
|
+
File.exist?(ext_path("appsignal.h"))
|
|
17
|
+
archive = download_archive(arch_config, "dynamic")
|
|
18
|
+
next unless verify_archive(archive, arch_config, "dynamic")
|
|
19
|
+
unarchive(archive)
|
|
20
|
+
end
|
|
21
|
+
rescue => ex
|
|
22
|
+
installation_failed "Exception while installing: #{ex}"
|
|
23
|
+
ex.backtrace.each do |line|
|
|
24
|
+
logger.error line
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/ext/agent.yml
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 57a48f4
|
|
3
|
+
triples:
|
|
4
|
+
x86_64-darwin:
|
|
5
|
+
static:
|
|
6
|
+
checksum: 4fa30287925bad17abb3e86784793e13399dd9390c0579ca94bd8f4ee7a832a3
|
|
7
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-darwin-all-static.tar.gz
|
|
8
|
+
dynamic:
|
|
9
|
+
checksum: 1380d4d7263b0fe2a546085efa64643289010b7dd21282c2900e81164a123e8d
|
|
10
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-darwin-all-dynamic.tar.gz
|
|
11
|
+
universal-darwin:
|
|
12
|
+
static:
|
|
13
|
+
checksum: 4fa30287925bad17abb3e86784793e13399dd9390c0579ca94bd8f4ee7a832a3
|
|
14
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-darwin-all-static.tar.gz
|
|
15
|
+
dynamic:
|
|
16
|
+
checksum: 1380d4d7263b0fe2a546085efa64643289010b7dd21282c2900e81164a123e8d
|
|
17
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-darwin-all-dynamic.tar.gz
|
|
18
|
+
i686-linux:
|
|
19
|
+
static:
|
|
20
|
+
checksum: 9a1e59dd42e5ddcd0af04c0cffb0aadeace05dfae46d00aec71e90490186cbfd
|
|
21
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-i686-linux-all-static.tar.gz
|
|
22
|
+
dynamic:
|
|
23
|
+
checksum: ef45877189d3ea4be568ec2fa64a0f04fc94783c42e53f6a55672576a2cfb150
|
|
24
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-i686-linux-all-dynamic.tar.gz
|
|
25
|
+
x86-linux:
|
|
26
|
+
static:
|
|
27
|
+
checksum: 9a1e59dd42e5ddcd0af04c0cffb0aadeace05dfae46d00aec71e90490186cbfd
|
|
28
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-i686-linux-all-static.tar.gz
|
|
29
|
+
dynamic:
|
|
30
|
+
checksum: ef45877189d3ea4be568ec2fa64a0f04fc94783c42e53f6a55672576a2cfb150
|
|
31
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-i686-linux-all-dynamic.tar.gz
|
|
32
|
+
i686-linux-musl:
|
|
33
|
+
static:
|
|
34
|
+
checksum: cfa14d6aa3ad419a1d87854dfb13a780b34e4ccbf3afbe6adc7704ef750fc414
|
|
35
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-i686-linux-musl-all-static.tar.gz
|
|
36
|
+
x86-linux-musl:
|
|
37
|
+
static:
|
|
38
|
+
checksum: cfa14d6aa3ad419a1d87854dfb13a780b34e4ccbf3afbe6adc7704ef750fc414
|
|
39
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-i686-linux-musl-all-static.tar.gz
|
|
40
|
+
x86_64-linux:
|
|
41
|
+
static:
|
|
42
|
+
checksum: 8a68e7da4710fc97be73210437c890897a84f37f6ae9095f36d61099e52f07dc
|
|
43
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-linux-all-static.tar.gz
|
|
44
|
+
dynamic:
|
|
45
|
+
checksum: 5b2806ae841a6052f55c0824370dad41a04ae0ad2025df87a54847cce81054c3
|
|
46
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-linux-all-dynamic.tar.gz
|
|
47
|
+
x86_64-linux-musl:
|
|
48
|
+
static:
|
|
49
|
+
checksum: ffc91182064c1f0dbd9d219816054903fcc28db977cdd74df15802c468a2f252
|
|
50
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-linux-musl-all-static.tar.gz
|
|
51
|
+
x86_64-freebsd:
|
|
52
|
+
static:
|
|
53
|
+
checksum: c1781a09ec4e4c9e2f08a60e662acd8790286ebad62c9d32712a7932d0852a10
|
|
54
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-freebsd-all-static.tar.gz
|
|
55
|
+
dynamic:
|
|
56
|
+
checksum: 0ce479051f5734b330d91811c51813d93e65758ecad97e5f6b9e86764480e7c2
|
|
57
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-freebsd-all-dynamic.tar.gz
|
|
58
|
+
amd64-freebsd:
|
|
59
|
+
static:
|
|
60
|
+
checksum: c1781a09ec4e4c9e2f08a60e662acd8790286ebad62c9d32712a7932d0852a10
|
|
61
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-freebsd-all-static.tar.gz
|
|
62
|
+
dynamic:
|
|
63
|
+
checksum: 0ce479051f5734b330d91811c51813d93e65758ecad97e5f6b9e86764480e7c2
|
|
64
|
+
download_url: https://appsignal-agent-releases.global.ssl.fastly.net/57a48f4/appsignal-x86_64-freebsd-all-dynamic.tar.gz
|
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
#include "ruby/ruby.h"
|
|
2
|
+
#include "ruby/encoding.h"
|
|
3
|
+
#include "appsignal.h"
|
|
4
|
+
|
|
5
|
+
static inline appsignal_string_t make_appsignal_string(VALUE str) {
|
|
6
|
+
return (appsignal_string_t) {
|
|
7
|
+
.len = RSTRING_LEN(str),
|
|
8
|
+
.buf = RSTRING_PTR(str)
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
static inline VALUE make_ruby_string(appsignal_string_t string) {
|
|
13
|
+
VALUE str = rb_str_new(string.buf, string.len);
|
|
14
|
+
rb_enc_associate(str, rb_utf8_encoding());
|
|
15
|
+
return str;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
VALUE Appsignal;
|
|
19
|
+
VALUE Extension;
|
|
20
|
+
VALUE Transaction;
|
|
21
|
+
VALUE Data;
|
|
22
|
+
|
|
23
|
+
static VALUE start(VALUE self) {
|
|
24
|
+
appsignal_start();
|
|
25
|
+
|
|
26
|
+
return Qnil;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static VALUE stop(VALUE self) {
|
|
30
|
+
appsignal_stop();
|
|
31
|
+
|
|
32
|
+
return Qnil;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static VALUE diagnose(VALUE self) {
|
|
36
|
+
return make_ruby_string(appsignal_diagnose());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static VALUE get_server_state(VALUE self, VALUE key) {
|
|
40
|
+
appsignal_string_t string;
|
|
41
|
+
|
|
42
|
+
Check_Type(key, T_STRING);
|
|
43
|
+
|
|
44
|
+
string = appsignal_get_server_state(make_appsignal_string(key));
|
|
45
|
+
if (string.len > 0) {
|
|
46
|
+
return make_ruby_string(string);
|
|
47
|
+
} else {
|
|
48
|
+
return Qnil;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static VALUE start_transaction(VALUE self, VALUE transaction_id, VALUE namespace, VALUE gc_duration_ms) {
|
|
53
|
+
appsignal_transaction_t* transaction;
|
|
54
|
+
|
|
55
|
+
Check_Type(transaction_id, T_STRING);
|
|
56
|
+
Check_Type(namespace, T_STRING);
|
|
57
|
+
Check_Type(gc_duration_ms, T_FIXNUM);
|
|
58
|
+
|
|
59
|
+
transaction = appsignal_start_transaction(
|
|
60
|
+
make_appsignal_string(transaction_id),
|
|
61
|
+
make_appsignal_string(namespace),
|
|
62
|
+
NUM2LONG(gc_duration_ms)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
if (transaction) {
|
|
66
|
+
return Data_Wrap_Struct(Transaction, NULL, appsignal_free_transaction, transaction);
|
|
67
|
+
} else {
|
|
68
|
+
return Qnil;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static VALUE start_event(VALUE self, VALUE gc_duration_ms) {
|
|
73
|
+
appsignal_transaction_t* transaction;
|
|
74
|
+
|
|
75
|
+
Check_Type(gc_duration_ms, T_FIXNUM);
|
|
76
|
+
|
|
77
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
78
|
+
|
|
79
|
+
appsignal_start_event(transaction, NUM2LONG(gc_duration_ms));
|
|
80
|
+
|
|
81
|
+
return Qnil;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static VALUE finish_event(VALUE self, VALUE name, VALUE title, VALUE body, VALUE body_format, VALUE gc_duration_ms) {
|
|
85
|
+
appsignal_transaction_t* transaction;
|
|
86
|
+
appsignal_data_t* body_data;
|
|
87
|
+
int body_type;
|
|
88
|
+
|
|
89
|
+
Check_Type(name, T_STRING);
|
|
90
|
+
Check_Type(title, T_STRING);
|
|
91
|
+
Check_Type(body_format, T_FIXNUM);
|
|
92
|
+
|
|
93
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
94
|
+
|
|
95
|
+
body_type = TYPE(body);
|
|
96
|
+
if (body_type == T_STRING) {
|
|
97
|
+
appsignal_finish_event(
|
|
98
|
+
transaction,
|
|
99
|
+
make_appsignal_string(name),
|
|
100
|
+
make_appsignal_string(title),
|
|
101
|
+
make_appsignal_string(body),
|
|
102
|
+
FIX2INT(body_format),
|
|
103
|
+
FIX2LONG(gc_duration_ms)
|
|
104
|
+
);
|
|
105
|
+
} else if (body_type == RUBY_T_DATA) {
|
|
106
|
+
Data_Get_Struct(body, appsignal_data_t, body_data);
|
|
107
|
+
appsignal_finish_event_data(
|
|
108
|
+
transaction,
|
|
109
|
+
make_appsignal_string(name),
|
|
110
|
+
make_appsignal_string(title),
|
|
111
|
+
body_data,
|
|
112
|
+
FIX2INT(body_format),
|
|
113
|
+
FIX2LONG(gc_duration_ms)
|
|
114
|
+
);
|
|
115
|
+
} else {
|
|
116
|
+
rb_raise(rb_eTypeError, "body should be a String or Appsignal::Extension::Data");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return Qnil;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static VALUE record_event(VALUE self, VALUE name, VALUE title, VALUE body, VALUE body_format, VALUE duration, VALUE gc_duration_ms) {
|
|
123
|
+
appsignal_transaction_t* transaction;
|
|
124
|
+
appsignal_data_t* body_data;
|
|
125
|
+
int body_type;
|
|
126
|
+
int duration_type;
|
|
127
|
+
|
|
128
|
+
Check_Type(name, T_STRING);
|
|
129
|
+
Check_Type(title, T_STRING);
|
|
130
|
+
duration_type = TYPE(duration);
|
|
131
|
+
if (duration_type != T_FIXNUM && duration_type != T_BIGNUM) {
|
|
132
|
+
rb_raise(rb_eTypeError, "duration should be an Integer");
|
|
133
|
+
}
|
|
134
|
+
Check_Type(body_format, T_FIXNUM);
|
|
135
|
+
|
|
136
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
137
|
+
|
|
138
|
+
body_type = TYPE(body);
|
|
139
|
+
if (body_type == T_STRING) {
|
|
140
|
+
appsignal_record_event(
|
|
141
|
+
transaction,
|
|
142
|
+
make_appsignal_string(name),
|
|
143
|
+
make_appsignal_string(title),
|
|
144
|
+
make_appsignal_string(body),
|
|
145
|
+
FIX2INT(body_format),
|
|
146
|
+
NUM2LONG(duration),
|
|
147
|
+
NUM2LONG(gc_duration_ms)
|
|
148
|
+
);
|
|
149
|
+
} else if (body_type == RUBY_T_DATA) {
|
|
150
|
+
Data_Get_Struct(body, appsignal_data_t, body_data);
|
|
151
|
+
appsignal_record_event_data(
|
|
152
|
+
transaction,
|
|
153
|
+
make_appsignal_string(name),
|
|
154
|
+
make_appsignal_string(title),
|
|
155
|
+
body_data,
|
|
156
|
+
FIX2INT(body_format),
|
|
157
|
+
NUM2LONG(duration),
|
|
158
|
+
NUM2LONG(gc_duration_ms)
|
|
159
|
+
);
|
|
160
|
+
} else {
|
|
161
|
+
rb_raise(rb_eTypeError, "body should be a String or Appsignal::Extension::Data");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return Qnil;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static VALUE set_transaction_error(VALUE self, VALUE name, VALUE message, VALUE backtrace) {
|
|
168
|
+
appsignal_transaction_t* transaction;
|
|
169
|
+
appsignal_data_t* backtrace_data;
|
|
170
|
+
|
|
171
|
+
Check_Type(name, T_STRING);
|
|
172
|
+
Check_Type(message, T_STRING);
|
|
173
|
+
Check_Type(backtrace, RUBY_T_DATA);
|
|
174
|
+
|
|
175
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
176
|
+
Data_Get_Struct(backtrace, appsignal_data_t, backtrace_data);
|
|
177
|
+
|
|
178
|
+
appsignal_set_transaction_error(
|
|
179
|
+
transaction,
|
|
180
|
+
make_appsignal_string(name),
|
|
181
|
+
make_appsignal_string(message),
|
|
182
|
+
backtrace_data
|
|
183
|
+
);
|
|
184
|
+
return Qnil;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
static VALUE set_transaction_sample_data(VALUE self, VALUE key, VALUE payload) {
|
|
188
|
+
appsignal_transaction_t* transaction;
|
|
189
|
+
appsignal_data_t* payload_data;
|
|
190
|
+
|
|
191
|
+
Check_Type(key, T_STRING);
|
|
192
|
+
Check_Type(payload, RUBY_T_DATA);
|
|
193
|
+
|
|
194
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
195
|
+
Data_Get_Struct(payload, appsignal_data_t, payload_data);
|
|
196
|
+
|
|
197
|
+
appsignal_set_transaction_sample_data(
|
|
198
|
+
transaction,
|
|
199
|
+
make_appsignal_string(key),
|
|
200
|
+
payload_data
|
|
201
|
+
);
|
|
202
|
+
return Qnil;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
static VALUE set_transaction_action(VALUE self, VALUE action) {
|
|
206
|
+
appsignal_transaction_t* transaction;
|
|
207
|
+
|
|
208
|
+
Check_Type(action, T_STRING);
|
|
209
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
210
|
+
|
|
211
|
+
appsignal_set_transaction_action(
|
|
212
|
+
transaction,
|
|
213
|
+
make_appsignal_string(action)
|
|
214
|
+
);
|
|
215
|
+
return Qnil;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
static VALUE set_transaction_namespace(VALUE self, VALUE namespace) {
|
|
219
|
+
appsignal_transaction_t* transaction;
|
|
220
|
+
|
|
221
|
+
Check_Type(namespace, T_STRING);
|
|
222
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
223
|
+
|
|
224
|
+
appsignal_set_transaction_namespace(
|
|
225
|
+
transaction,
|
|
226
|
+
make_appsignal_string(namespace)
|
|
227
|
+
);
|
|
228
|
+
return Qnil;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
static VALUE set_transaction_queue_start(VALUE self, VALUE queue_start) {
|
|
232
|
+
appsignal_transaction_t* transaction;
|
|
233
|
+
int queue_start_type;
|
|
234
|
+
|
|
235
|
+
queue_start_type = TYPE(queue_start);
|
|
236
|
+
if (queue_start_type != T_FIXNUM && queue_start_type != T_BIGNUM) {
|
|
237
|
+
rb_raise(rb_eTypeError, "queue_start should be an Integer");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
241
|
+
|
|
242
|
+
appsignal_set_transaction_queue_start(
|
|
243
|
+
transaction,
|
|
244
|
+
NUM2LONG(queue_start)
|
|
245
|
+
);
|
|
246
|
+
return Qnil;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
static VALUE set_transaction_metadata(VALUE self, VALUE key, VALUE value) {
|
|
250
|
+
appsignal_transaction_t* transaction;
|
|
251
|
+
|
|
252
|
+
Check_Type(key, T_STRING);
|
|
253
|
+
Check_Type(value, T_STRING);
|
|
254
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
255
|
+
|
|
256
|
+
appsignal_set_transaction_metadata(
|
|
257
|
+
transaction,
|
|
258
|
+
make_appsignal_string(key),
|
|
259
|
+
make_appsignal_string(value)
|
|
260
|
+
);
|
|
261
|
+
return Qnil;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
static VALUE finish_transaction(VALUE self, VALUE gc_duration_ms) {
|
|
265
|
+
appsignal_transaction_t* transaction;
|
|
266
|
+
int sample;
|
|
267
|
+
|
|
268
|
+
Check_Type(gc_duration_ms, T_FIXNUM);
|
|
269
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
270
|
+
|
|
271
|
+
sample = appsignal_finish_transaction(transaction, NUM2LONG(gc_duration_ms));
|
|
272
|
+
return sample == 1 ? Qtrue : Qfalse;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
static VALUE complete_transaction(VALUE self) {
|
|
276
|
+
appsignal_transaction_t* transaction;
|
|
277
|
+
|
|
278
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
279
|
+
|
|
280
|
+
appsignal_complete_transaction(transaction);
|
|
281
|
+
return Qnil;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
static VALUE transaction_to_json(VALUE self) {
|
|
285
|
+
appsignal_transaction_t* transaction;
|
|
286
|
+
appsignal_string_t json;
|
|
287
|
+
|
|
288
|
+
Data_Get_Struct(self, appsignal_transaction_t, transaction);
|
|
289
|
+
|
|
290
|
+
json = appsignal_transaction_to_json(transaction);
|
|
291
|
+
|
|
292
|
+
if (json.len == 0) {
|
|
293
|
+
return Qnil;
|
|
294
|
+
} else {
|
|
295
|
+
return make_ruby_string(json);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
static VALUE data_map_new(VALUE self) {
|
|
300
|
+
appsignal_data_t* data;
|
|
301
|
+
|
|
302
|
+
data = appsignal_data_map_new();
|
|
303
|
+
|
|
304
|
+
if (data) {
|
|
305
|
+
return Data_Wrap_Struct(Data, NULL, appsignal_free_data, data);
|
|
306
|
+
} else {
|
|
307
|
+
return Qnil;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
static VALUE data_array_new(VALUE self) {
|
|
312
|
+
appsignal_data_t* data;
|
|
313
|
+
|
|
314
|
+
data = appsignal_data_array_new();
|
|
315
|
+
|
|
316
|
+
if (data) {
|
|
317
|
+
return Data_Wrap_Struct(Data, NULL, appsignal_free_data, data);
|
|
318
|
+
} else {
|
|
319
|
+
return Qnil;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
static VALUE data_set_string(VALUE self, VALUE key, VALUE value) {
|
|
324
|
+
appsignal_data_t* data;
|
|
325
|
+
|
|
326
|
+
Check_Type(key, T_STRING);
|
|
327
|
+
Check_Type(value, T_STRING);
|
|
328
|
+
|
|
329
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
330
|
+
|
|
331
|
+
appsignal_data_map_set_string(
|
|
332
|
+
data,
|
|
333
|
+
make_appsignal_string(key),
|
|
334
|
+
make_appsignal_string(value)
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
return Qnil;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
static VALUE data_set_integer(VALUE self, VALUE key, VALUE value) {
|
|
341
|
+
appsignal_data_t* data;
|
|
342
|
+
VALUE value_type = TYPE(value);
|
|
343
|
+
|
|
344
|
+
Check_Type(key, T_STRING);
|
|
345
|
+
if (value_type != T_FIXNUM && value_type != T_BIGNUM) {
|
|
346
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (expected Integer)", rb_obj_classname(value));
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
350
|
+
|
|
351
|
+
appsignal_data_map_set_integer(
|
|
352
|
+
data,
|
|
353
|
+
make_appsignal_string(key),
|
|
354
|
+
NUM2LONG(value)
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
return Qnil;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
static VALUE data_set_float(VALUE self, VALUE key, VALUE value) {
|
|
361
|
+
appsignal_data_t* data;
|
|
362
|
+
|
|
363
|
+
Check_Type(key, T_STRING);
|
|
364
|
+
Check_Type(value, T_FLOAT);
|
|
365
|
+
|
|
366
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
367
|
+
|
|
368
|
+
appsignal_data_map_set_float(
|
|
369
|
+
data,
|
|
370
|
+
make_appsignal_string(key),
|
|
371
|
+
NUM2DBL(value)
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
return Qnil;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
static VALUE data_set_boolean(VALUE self, VALUE key, VALUE value) {
|
|
378
|
+
appsignal_data_t* data;
|
|
379
|
+
|
|
380
|
+
Check_Type(key, T_STRING);
|
|
381
|
+
|
|
382
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
383
|
+
|
|
384
|
+
appsignal_data_map_set_boolean(
|
|
385
|
+
data,
|
|
386
|
+
make_appsignal_string(key),
|
|
387
|
+
RTEST(value)
|
|
388
|
+
);
|
|
389
|
+
|
|
390
|
+
return Qnil;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
static VALUE data_set_nil(VALUE self, VALUE key) {
|
|
394
|
+
appsignal_data_t* data;
|
|
395
|
+
|
|
396
|
+
Check_Type(key, T_STRING);
|
|
397
|
+
|
|
398
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
399
|
+
|
|
400
|
+
appsignal_data_map_set_null(
|
|
401
|
+
data,
|
|
402
|
+
make_appsignal_string(key)
|
|
403
|
+
);
|
|
404
|
+
|
|
405
|
+
return Qnil;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
static VALUE data_set_data(VALUE self, VALUE key, VALUE value) {
|
|
409
|
+
appsignal_data_t* data;
|
|
410
|
+
appsignal_data_t* value_data;
|
|
411
|
+
|
|
412
|
+
Check_Type(key, T_STRING);
|
|
413
|
+
Check_Type(value, RUBY_T_DATA);
|
|
414
|
+
|
|
415
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
416
|
+
Data_Get_Struct(value, appsignal_data_t, value_data);
|
|
417
|
+
|
|
418
|
+
appsignal_data_map_set_data(
|
|
419
|
+
data,
|
|
420
|
+
make_appsignal_string(key),
|
|
421
|
+
value_data
|
|
422
|
+
);
|
|
423
|
+
|
|
424
|
+
return Qnil;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
static VALUE data_append_string(VALUE self, VALUE value) {
|
|
428
|
+
appsignal_data_t* data;
|
|
429
|
+
|
|
430
|
+
Check_Type(value, T_STRING);
|
|
431
|
+
|
|
432
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
433
|
+
|
|
434
|
+
appsignal_data_array_append_string(
|
|
435
|
+
data,
|
|
436
|
+
make_appsignal_string(value)
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
return Qnil;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
static VALUE data_append_integer(VALUE self, VALUE value) {
|
|
443
|
+
appsignal_data_t* data;
|
|
444
|
+
VALUE value_type = TYPE(value);
|
|
445
|
+
|
|
446
|
+
if (value_type != T_FIXNUM && value_type != T_BIGNUM) {
|
|
447
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (expected Integer)", rb_obj_classname(value));
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
451
|
+
|
|
452
|
+
appsignal_data_array_append_integer(
|
|
453
|
+
data,
|
|
454
|
+
NUM2LONG(value)
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
return Qnil;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
static VALUE data_append_float(VALUE self, VALUE value) {
|
|
461
|
+
appsignal_data_t* data;
|
|
462
|
+
|
|
463
|
+
Check_Type(value, T_FLOAT);
|
|
464
|
+
|
|
465
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
466
|
+
|
|
467
|
+
appsignal_data_array_append_float(
|
|
468
|
+
data,
|
|
469
|
+
NUM2DBL(value)
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
return Qnil;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
static VALUE data_append_boolean(VALUE self, VALUE value) {
|
|
476
|
+
appsignal_data_t* data;
|
|
477
|
+
|
|
478
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
479
|
+
|
|
480
|
+
appsignal_data_array_append_boolean(
|
|
481
|
+
data,
|
|
482
|
+
RTEST(value)
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
return Qnil;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
static VALUE data_append_nil(VALUE self, VALUE value) {
|
|
489
|
+
appsignal_data_t* data;
|
|
490
|
+
|
|
491
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
492
|
+
|
|
493
|
+
appsignal_data_array_append_null(data);
|
|
494
|
+
|
|
495
|
+
return Qnil;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
static VALUE data_append_data(VALUE self, VALUE value) {
|
|
499
|
+
appsignal_data_t* data;
|
|
500
|
+
appsignal_data_t* value_data;
|
|
501
|
+
|
|
502
|
+
Check_Type(value, RUBY_T_DATA);
|
|
503
|
+
|
|
504
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
505
|
+
Data_Get_Struct(value, appsignal_data_t, value_data);
|
|
506
|
+
|
|
507
|
+
appsignal_data_array_append_data(
|
|
508
|
+
data,
|
|
509
|
+
value_data
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
return Qnil;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
static VALUE data_equal(VALUE self, VALUE other) {
|
|
516
|
+
appsignal_data_t* data;
|
|
517
|
+
appsignal_data_t* other_data;
|
|
518
|
+
|
|
519
|
+
if (TYPE(other) != RUBY_T_DATA) {
|
|
520
|
+
return Qfalse;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
524
|
+
Data_Get_Struct(other, appsignal_data_t, other_data);
|
|
525
|
+
|
|
526
|
+
if (appsignal_data_equal(data, other_data) == 1) {
|
|
527
|
+
return Qtrue;
|
|
528
|
+
} else {
|
|
529
|
+
return Qfalse;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
static VALUE data_to_s(VALUE self) {
|
|
534
|
+
appsignal_data_t* data;
|
|
535
|
+
appsignal_string_t json;
|
|
536
|
+
|
|
537
|
+
Data_Get_Struct(self, appsignal_data_t, data);
|
|
538
|
+
|
|
539
|
+
json = appsignal_data_to_json(data);
|
|
540
|
+
|
|
541
|
+
if (json.len == 0) {
|
|
542
|
+
return Qnil;
|
|
543
|
+
} else {
|
|
544
|
+
return make_ruby_string(json);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
static VALUE set_gauge(VALUE self, VALUE key, VALUE value) {
|
|
549
|
+
Check_Type(key, T_STRING);
|
|
550
|
+
Check_Type(value, T_FLOAT);
|
|
551
|
+
|
|
552
|
+
appsignal_set_gauge(
|
|
553
|
+
make_appsignal_string(key),
|
|
554
|
+
NUM2DBL(value)
|
|
555
|
+
);
|
|
556
|
+
return Qnil;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
static VALUE set_host_gauge(VALUE self, VALUE key, VALUE value) {
|
|
560
|
+
Check_Type(key, T_STRING);
|
|
561
|
+
Check_Type(value, T_FLOAT);
|
|
562
|
+
|
|
563
|
+
appsignal_set_host_gauge(
|
|
564
|
+
make_appsignal_string(key),
|
|
565
|
+
NUM2DBL(value)
|
|
566
|
+
);
|
|
567
|
+
return Qnil;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
static VALUE set_process_gauge(VALUE self, VALUE key, VALUE value) {
|
|
571
|
+
Check_Type(key, T_STRING);
|
|
572
|
+
Check_Type(value, T_FLOAT);
|
|
573
|
+
|
|
574
|
+
appsignal_set_process_gauge(
|
|
575
|
+
make_appsignal_string(key),
|
|
576
|
+
NUM2DBL(value)
|
|
577
|
+
);
|
|
578
|
+
return Qnil;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
static VALUE increment_counter(VALUE self, VALUE key, VALUE count) {
|
|
582
|
+
Check_Type(key, T_STRING);
|
|
583
|
+
Check_Type(count, T_FIXNUM);
|
|
584
|
+
|
|
585
|
+
appsignal_increment_counter(
|
|
586
|
+
make_appsignal_string(key),
|
|
587
|
+
FIX2INT(count)
|
|
588
|
+
);
|
|
589
|
+
return Qnil;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
static VALUE add_distribution_value(VALUE self, VALUE key, VALUE value) {
|
|
593
|
+
Check_Type(key, T_STRING);
|
|
594
|
+
Check_Type(value, T_FLOAT);
|
|
595
|
+
|
|
596
|
+
appsignal_add_distribution_value(
|
|
597
|
+
make_appsignal_string(key),
|
|
598
|
+
NUM2DBL(value)
|
|
599
|
+
);
|
|
600
|
+
return Qnil;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
static void track_allocation(rb_event_flag_t flag, VALUE arg1, VALUE arg2, ID arg3, VALUE arg4) {
|
|
604
|
+
appsignal_track_allocation();
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
static VALUE install_allocation_event_hook() {
|
|
608
|
+
// This event hook is only available on Ruby 2.1 and 2.2
|
|
609
|
+
#if defined(RUBY_INTERNAL_EVENT_NEWOBJ)
|
|
610
|
+
rb_add_event_hook(
|
|
611
|
+
track_allocation,
|
|
612
|
+
RUBY_INTERNAL_EVENT_NEWOBJ,
|
|
613
|
+
Qnil
|
|
614
|
+
);
|
|
615
|
+
#endif
|
|
616
|
+
|
|
617
|
+
return Qnil;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
static VALUE running_in_container() {
|
|
621
|
+
return appsignal_running_in_container() == 1 ? Qtrue : Qfalse;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
void Init_appsignal_extension(void) {
|
|
625
|
+
Appsignal = rb_define_module("Appsignal");
|
|
626
|
+
Extension = rb_define_class_under(Appsignal, "Extension", rb_cObject);
|
|
627
|
+
Transaction = rb_define_class_under(Extension, "Transaction", rb_cObject);
|
|
628
|
+
Data = rb_define_class_under(Extension, "Data", rb_cObject);
|
|
629
|
+
|
|
630
|
+
// Starting and stopping
|
|
631
|
+
rb_define_singleton_method(Extension, "start", start, 0);
|
|
632
|
+
rb_define_singleton_method(Extension, "stop", stop, 0);
|
|
633
|
+
// Diagnostics
|
|
634
|
+
rb_define_singleton_method(Extension, "diagnose", diagnose, 0);
|
|
635
|
+
|
|
636
|
+
// Server state
|
|
637
|
+
rb_define_singleton_method(Extension, "get_server_state", get_server_state, 1);
|
|
638
|
+
|
|
639
|
+
// Start transaction
|
|
640
|
+
rb_define_singleton_method(Extension, "start_transaction", start_transaction, 3);
|
|
641
|
+
|
|
642
|
+
// Transaction instance methods
|
|
643
|
+
rb_define_method(Transaction, "start_event", start_event, 1);
|
|
644
|
+
rb_define_method(Transaction, "finish_event", finish_event, 5);
|
|
645
|
+
rb_define_method(Transaction, "record_event", record_event, 6);
|
|
646
|
+
rb_define_method(Transaction, "set_error", set_transaction_error, 3);
|
|
647
|
+
rb_define_method(Transaction, "set_sample_data", set_transaction_sample_data, 2);
|
|
648
|
+
rb_define_method(Transaction, "set_action", set_transaction_action, 1);
|
|
649
|
+
rb_define_method(Transaction, "set_namespace", set_transaction_namespace, 1);
|
|
650
|
+
rb_define_method(Transaction, "set_queue_start", set_transaction_queue_start, 1);
|
|
651
|
+
rb_define_method(Transaction, "set_metadata", set_transaction_metadata, 2);
|
|
652
|
+
rb_define_method(Transaction, "finish", finish_transaction, 1);
|
|
653
|
+
rb_define_method(Transaction, "complete", complete_transaction, 0);
|
|
654
|
+
rb_define_method(Transaction, "to_json", transaction_to_json, 0);
|
|
655
|
+
|
|
656
|
+
// Create a data map or array
|
|
657
|
+
rb_define_singleton_method(Extension, "data_map_new", data_map_new, 0);
|
|
658
|
+
rb_define_singleton_method(Extension, "data_array_new", data_array_new, 0);
|
|
659
|
+
|
|
660
|
+
// Add content to a data map
|
|
661
|
+
rb_define_method(Data, "set_string", data_set_string, 2);
|
|
662
|
+
rb_define_method(Data, "set_integer", data_set_integer, 2);
|
|
663
|
+
rb_define_method(Data, "set_float", data_set_float, 2);
|
|
664
|
+
rb_define_method(Data, "set_boolean", data_set_boolean, 2);
|
|
665
|
+
rb_define_method(Data, "set_nil", data_set_nil, 1);
|
|
666
|
+
rb_define_method(Data, "set_data", data_set_data, 2);
|
|
667
|
+
|
|
668
|
+
// Add content to a data array
|
|
669
|
+
rb_define_method(Data, "append_string", data_append_string, 1);
|
|
670
|
+
rb_define_method(Data, "append_integer", data_append_integer, 1);
|
|
671
|
+
rb_define_method(Data, "append_float", data_append_float, 1);
|
|
672
|
+
rb_define_method(Data, "append_boolean", data_append_boolean, 1);
|
|
673
|
+
rb_define_method(Data, "append_nil", data_append_nil, 0);
|
|
674
|
+
rb_define_method(Data, "append_data", data_append_data, 1);
|
|
675
|
+
|
|
676
|
+
// Data equality
|
|
677
|
+
rb_define_method(Data, "==", data_equal, 1);
|
|
678
|
+
|
|
679
|
+
// Get JSON content of a data
|
|
680
|
+
rb_define_method(Data, "to_s", data_to_s, 0);
|
|
681
|
+
|
|
682
|
+
// Event hook installation
|
|
683
|
+
rb_define_singleton_method(Extension, "install_allocation_event_hook", install_allocation_event_hook, 0);
|
|
684
|
+
rb_define_singleton_method(Extension, "running_in_container?", running_in_container, 0);
|
|
685
|
+
|
|
686
|
+
// Metrics
|
|
687
|
+
rb_define_singleton_method(Extension, "set_gauge", set_gauge, 2);
|
|
688
|
+
rb_define_singleton_method(Extension, "set_host_gauge", set_host_gauge, 2);
|
|
689
|
+
rb_define_singleton_method(Extension, "set_process_gauge", set_process_gauge, 2);
|
|
690
|
+
rb_define_singleton_method(Extension, "increment_counter", increment_counter, 2);
|
|
691
|
+
rb_define_singleton_method(Extension, "add_distribution_value", add_distribution_value, 2);
|
|
692
|
+
}
|