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.
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
+ }