appsignal 2.5.0.alpha.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +33 -0
  3. data/.rspec +4 -0
  4. data/.rubocop.yml +66 -0
  5. data/.rubocop_todo.yml +124 -0
  6. data/.travis.yml +72 -0
  7. data/.yardopts +8 -0
  8. data/CHANGELOG.md +639 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE +20 -0
  11. data/README.md +264 -0
  12. data/Rakefile +214 -0
  13. data/appsignal.gemspec +42 -0
  14. data/benchmark.rake +77 -0
  15. data/bin/appsignal +13 -0
  16. data/ext/Rakefile +27 -0
  17. data/ext/agent.yml +64 -0
  18. data/ext/appsignal_extension.c +692 -0
  19. data/ext/base.rb +79 -0
  20. data/ext/extconf.rb +35 -0
  21. data/gemfiles/capistrano2.gemfile +7 -0
  22. data/gemfiles/capistrano3.gemfile +7 -0
  23. data/gemfiles/grape.gemfile +7 -0
  24. data/gemfiles/no_dependencies.gemfile +5 -0
  25. data/gemfiles/padrino.gemfile +7 -0
  26. data/gemfiles/que.gemfile +5 -0
  27. data/gemfiles/rails-3.2.gemfile +6 -0
  28. data/gemfiles/rails-4.0.gemfile +6 -0
  29. data/gemfiles/rails-4.1.gemfile +6 -0
  30. data/gemfiles/rails-4.2.gemfile +10 -0
  31. data/gemfiles/rails-5.0.gemfile +5 -0
  32. data/gemfiles/rails-5.1.gemfile +5 -0
  33. data/gemfiles/resque.gemfile +12 -0
  34. data/gemfiles/sequel-435.gemfile +11 -0
  35. data/gemfiles/sequel.gemfile +11 -0
  36. data/gemfiles/sinatra.gemfile +6 -0
  37. data/gemfiles/webmachine.gemfile +5 -0
  38. data/lib/appsignal.rb +804 -0
  39. data/lib/appsignal/auth_check.rb +65 -0
  40. data/lib/appsignal/capistrano.rb +10 -0
  41. data/lib/appsignal/cli.rb +108 -0
  42. data/lib/appsignal/cli/demo.rb +63 -0
  43. data/lib/appsignal/cli/diagnose.rb +500 -0
  44. data/lib/appsignal/cli/helpers.rb +72 -0
  45. data/lib/appsignal/cli/install.rb +277 -0
  46. data/lib/appsignal/cli/notify_of_deploy.rb +113 -0
  47. data/lib/appsignal/config.rb +287 -0
  48. data/lib/appsignal/demo.rb +107 -0
  49. data/lib/appsignal/event_formatter.rb +74 -0
  50. data/lib/appsignal/event_formatter/action_view/render_formatter.rb +24 -0
  51. data/lib/appsignal/event_formatter/active_record/instantiation_formatter.rb +14 -0
  52. data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +14 -0
  53. data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +32 -0
  54. data/lib/appsignal/event_formatter/faraday/request_formatter.rb +19 -0
  55. data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +89 -0
  56. data/lib/appsignal/event_formatter/moped/query_formatter.rb +80 -0
  57. data/lib/appsignal/extension.rb +63 -0
  58. data/lib/appsignal/extension/jruby.rb +460 -0
  59. data/lib/appsignal/garbage_collection_profiler.rb +48 -0
  60. data/lib/appsignal/hooks.rb +105 -0
  61. data/lib/appsignal/hooks/action_cable.rb +113 -0
  62. data/lib/appsignal/hooks/active_support_notifications.rb +52 -0
  63. data/lib/appsignal/hooks/celluloid.rb +30 -0
  64. data/lib/appsignal/hooks/data_mapper.rb +18 -0
  65. data/lib/appsignal/hooks/delayed_job.rb +19 -0
  66. data/lib/appsignal/hooks/mongo_ruby_driver.rb +21 -0
  67. data/lib/appsignal/hooks/net_http.rb +29 -0
  68. data/lib/appsignal/hooks/passenger.rb +22 -0
  69. data/lib/appsignal/hooks/puma.rb +35 -0
  70. data/lib/appsignal/hooks/que.rb +21 -0
  71. data/lib/appsignal/hooks/rake.rb +39 -0
  72. data/lib/appsignal/hooks/redis.rb +30 -0
  73. data/lib/appsignal/hooks/sequel.rb +60 -0
  74. data/lib/appsignal/hooks/shoryuken.rb +43 -0
  75. data/lib/appsignal/hooks/sidekiq.rb +144 -0
  76. data/lib/appsignal/hooks/unicorn.rb +40 -0
  77. data/lib/appsignal/hooks/webmachine.rb +23 -0
  78. data/lib/appsignal/integrations/capistrano/appsignal.cap +39 -0
  79. data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +52 -0
  80. data/lib/appsignal/integrations/data_mapper.rb +33 -0
  81. data/lib/appsignal/integrations/delayed_job_plugin.rb +54 -0
  82. data/lib/appsignal/integrations/grape.rb +53 -0
  83. data/lib/appsignal/integrations/mongo_ruby_driver.rb +55 -0
  84. data/lib/appsignal/integrations/object.rb +35 -0
  85. data/lib/appsignal/integrations/padrino.rb +84 -0
  86. data/lib/appsignal/integrations/que.rb +43 -0
  87. data/lib/appsignal/integrations/railtie.rb +41 -0
  88. data/lib/appsignal/integrations/rake.rb +2 -0
  89. data/lib/appsignal/integrations/resque.rb +20 -0
  90. data/lib/appsignal/integrations/resque_active_job.rb +30 -0
  91. data/lib/appsignal/integrations/sinatra.rb +17 -0
  92. data/lib/appsignal/integrations/webmachine.rb +38 -0
  93. data/lib/appsignal/js_exception_transaction.rb +54 -0
  94. data/lib/appsignal/marker.rb +63 -0
  95. data/lib/appsignal/minutely.rb +42 -0
  96. data/lib/appsignal/rack/generic_instrumentation.rb +49 -0
  97. data/lib/appsignal/rack/js_exception_catcher.rb +70 -0
  98. data/lib/appsignal/rack/rails_instrumentation.rb +51 -0
  99. data/lib/appsignal/rack/sinatra_instrumentation.rb +99 -0
  100. data/lib/appsignal/rack/streaming_listener.rb +73 -0
  101. data/lib/appsignal/system.rb +81 -0
  102. data/lib/appsignal/transaction.rb +498 -0
  103. data/lib/appsignal/transmitter.rb +107 -0
  104. data/lib/appsignal/utils.rb +127 -0
  105. data/lib/appsignal/utils/params_sanitizer.rb +59 -0
  106. data/lib/appsignal/utils/query_params_sanitizer.rb +55 -0
  107. data/lib/appsignal/version.rb +3 -0
  108. data/lib/sequel/extensions/appsignal_integration.rb +3 -0
  109. data/resources/appsignal.yml.erb +39 -0
  110. data/resources/cacert.pem +3866 -0
  111. data/spec/.rubocop.yml +7 -0
  112. data/spec/lib/appsignal/auth_check_spec.rb +80 -0
  113. data/spec/lib/appsignal/capistrano2_spec.rb +224 -0
  114. data/spec/lib/appsignal/capistrano3_spec.rb +237 -0
  115. data/spec/lib/appsignal/cli/demo_spec.rb +67 -0
  116. data/spec/lib/appsignal/cli/diagnose_spec.rb +988 -0
  117. data/spec/lib/appsignal/cli/helpers_spec.rb +171 -0
  118. data/spec/lib/appsignal/cli/install_spec.rb +632 -0
  119. data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +168 -0
  120. data/spec/lib/appsignal/cli_spec.rb +56 -0
  121. data/spec/lib/appsignal/config_spec.rb +637 -0
  122. data/spec/lib/appsignal/demo_spec.rb +87 -0
  123. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +44 -0
  124. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +21 -0
  125. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +21 -0
  126. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +52 -0
  127. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +21 -0
  128. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +113 -0
  129. data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +112 -0
  130. data/spec/lib/appsignal/event_formatter_spec.rb +100 -0
  131. data/spec/lib/appsignal/extension/jruby_spec.rb +43 -0
  132. data/spec/lib/appsignal/extension_spec.rb +137 -0
  133. data/spec/lib/appsignal/garbage_collection_profiler_spec.rb +66 -0
  134. data/spec/lib/appsignal/hooks/action_cable_spec.rb +370 -0
  135. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +92 -0
  136. data/spec/lib/appsignal/hooks/celluloid_spec.rb +35 -0
  137. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +39 -0
  138. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +358 -0
  139. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +44 -0
  140. data/spec/lib/appsignal/hooks/net_http_spec.rb +53 -0
  141. data/spec/lib/appsignal/hooks/passenger_spec.rb +30 -0
  142. data/spec/lib/appsignal/hooks/puma_spec.rb +80 -0
  143. data/spec/lib/appsignal/hooks/que_spec.rb +19 -0
  144. data/spec/lib/appsignal/hooks/rake_spec.rb +73 -0
  145. data/spec/lib/appsignal/hooks/redis_spec.rb +55 -0
  146. data/spec/lib/appsignal/hooks/sequel_spec.rb +46 -0
  147. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +192 -0
  148. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +419 -0
  149. data/spec/lib/appsignal/hooks/unicorn_spec.rb +52 -0
  150. data/spec/lib/appsignal/hooks/webmachine_spec.rb +35 -0
  151. data/spec/lib/appsignal/hooks_spec.rb +195 -0
  152. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +65 -0
  153. data/spec/lib/appsignal/integrations/grape_spec.rb +225 -0
  154. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +127 -0
  155. data/spec/lib/appsignal/integrations/object_spec.rb +249 -0
  156. data/spec/lib/appsignal/integrations/padrino_spec.rb +323 -0
  157. data/spec/lib/appsignal/integrations/que_spec.rb +174 -0
  158. data/spec/lib/appsignal/integrations/railtie_spec.rb +129 -0
  159. data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +83 -0
  160. data/spec/lib/appsignal/integrations/resque_spec.rb +92 -0
  161. data/spec/lib/appsignal/integrations/sinatra_spec.rb +73 -0
  162. data/spec/lib/appsignal/integrations/webmachine_spec.rb +69 -0
  163. data/spec/lib/appsignal/js_exception_transaction_spec.rb +128 -0
  164. data/spec/lib/appsignal/marker_spec.rb +51 -0
  165. data/spec/lib/appsignal/minutely_spec.rb +50 -0
  166. data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +90 -0
  167. data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +147 -0
  168. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +117 -0
  169. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +213 -0
  170. data/spec/lib/appsignal/rack/streaming_listener_spec.rb +161 -0
  171. data/spec/lib/appsignal/system_spec.rb +131 -0
  172. data/spec/lib/appsignal/transaction_spec.rb +1146 -0
  173. data/spec/lib/appsignal/transmitter_spec.rb +152 -0
  174. data/spec/lib/appsignal/utils/params_sanitizer_spec.rb +136 -0
  175. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +192 -0
  176. data/spec/lib/appsignal/utils_spec.rb +150 -0
  177. data/spec/lib/appsignal_spec.rb +1049 -0
  178. data/spec/spec_helper.rb +116 -0
  179. data/spec/support/fixtures/containers/cgroups/docker +14 -0
  180. data/spec/support/fixtures/containers/cgroups/docker_systemd +8 -0
  181. data/spec/support/fixtures/containers/cgroups/lxc +10 -0
  182. data/spec/support/fixtures/containers/cgroups/no_permission +0 -0
  183. data/spec/support/fixtures/containers/cgroups/none +1 -0
  184. data/spec/support/fixtures/generated_config.yml +24 -0
  185. data/spec/support/fixtures/uploaded_file.txt +0 -0
  186. data/spec/support/helpers/api_request_helper.rb +19 -0
  187. data/spec/support/helpers/cli_helpers.rb +26 -0
  188. data/spec/support/helpers/config_helpers.rb +21 -0
  189. data/spec/support/helpers/dependency_helper.rb +73 -0
  190. data/spec/support/helpers/directory_helper.rb +27 -0
  191. data/spec/support/helpers/env_helpers.rb +33 -0
  192. data/spec/support/helpers/example_exception.rb +13 -0
  193. data/spec/support/helpers/example_standard_error.rb +13 -0
  194. data/spec/support/helpers/log_helpers.rb +22 -0
  195. data/spec/support/helpers/std_streams_helper.rb +66 -0
  196. data/spec/support/helpers/system_helpers.rb +8 -0
  197. data/spec/support/helpers/time_helpers.rb +11 -0
  198. data/spec/support/helpers/transaction_helpers.rb +37 -0
  199. data/spec/support/matchers/contains_log.rb +7 -0
  200. data/spec/support/mocks/fake_gc_profiler.rb +19 -0
  201. data/spec/support/mocks/mock_extension.rb +6 -0
  202. data/spec/support/project_fixture/config/application.rb +0 -0
  203. data/spec/support/project_fixture/config/appsignal.yml +32 -0
  204. data/spec/support/project_fixture/config/environments/development.rb +0 -0
  205. data/spec/support/project_fixture/config/environments/production.rb +0 -0
  206. data/spec/support/project_fixture/config/environments/test.rb +0 -0
  207. data/spec/support/project_fixture/log/.gitkeep +0 -0
  208. data/spec/support/rails/my_app.rb +6 -0
  209. data/spec/support/shared_examples/instrument.rb +43 -0
  210. data/spec/support/stubs/delayed_job.rb +0 -0
  211. metadata +483 -0
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
+ }