appsignal 0.6.7 → 0.7.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +3 -2
  3. data/.travis.yml +11 -11
  4. data/CHANGELOG.md +6 -0
  5. data/README.md +26 -0
  6. data/Rakefile +32 -3
  7. data/appsignal.gemspec +25 -16
  8. data/gemfiles/no_dependencies.gemfile +3 -0
  9. data/gemfiles/{3.0.gemfile → rails-3.0.gemfile} +2 -1
  10. data/gemfiles/{3.1.gemfile → rails-3.1.gemfile} +2 -1
  11. data/gemfiles/{3.2.gemfile → rails-3.2.gemfile} +2 -1
  12. data/gemfiles/{4.0.gemfile → rails-4.0.gemfile} +2 -1
  13. data/gemfiles/sinatra.gemfile +5 -0
  14. data/lib/appsignal.rb +30 -25
  15. data/lib/appsignal/agent.rb +37 -17
  16. data/lib/appsignal/aggregator.rb +2 -4
  17. data/lib/appsignal/aggregator/middleware.rb +4 -0
  18. data/lib/appsignal/aggregator/middleware/action_view_sanitizer.rb +23 -0
  19. data/lib/appsignal/aggregator/middleware/active_record_sanitizer.rb +64 -0
  20. data/lib/appsignal/aggregator/middleware/chain.rb +101 -0
  21. data/lib/appsignal/aggregator/middleware/delete_blanks.rb +16 -0
  22. data/lib/appsignal/aggregator/post_processor.rb +21 -18
  23. data/lib/appsignal/auth_check.rb +7 -21
  24. data/lib/appsignal/capistrano.rb +1 -36
  25. data/lib/appsignal/cli.rb +30 -46
  26. data/lib/appsignal/config.rb +46 -61
  27. data/lib/appsignal/integrations/capistrano.rb +44 -0
  28. data/lib/appsignal/{careful_logger.rb → integrations/capistrano/careful_logger.rb} +2 -0
  29. data/lib/appsignal/integrations/passenger.rb +6 -6
  30. data/lib/appsignal/integrations/rails.rb +33 -0
  31. data/lib/appsignal/integrations/sinatra.rb +20 -0
  32. data/lib/appsignal/marker.rb +9 -10
  33. data/lib/appsignal/rack/instrumentation.rb +28 -0
  34. data/lib/appsignal/rack/listener.rb +33 -0
  35. data/lib/appsignal/transaction.rb +18 -12
  36. data/lib/appsignal/transaction/formatter.rb +96 -0
  37. data/lib/appsignal/transaction/params_sanitizer.rb +80 -78
  38. data/lib/appsignal/transmitter.rb +10 -9
  39. data/lib/appsignal/version.rb +1 -1
  40. data/lib/generators/appsignal/appsignal_generator.rb +20 -21
  41. data/lib/generators/appsignal/templates/appsignal.yml +15 -21
  42. data/spec/{appsignal → lib/appsignal}/agent_spec.rb +69 -1
  43. data/spec/lib/appsignal/aggregator/middleware/action_view_sanitizer_spec.rb +32 -0
  44. data/spec/lib/appsignal/aggregator/middleware/active_record_sanitizer_spec.rb +215 -0
  45. data/spec/{appsignal → lib/appsignal/aggregator}/middleware/chain_spec.rb +5 -5
  46. data/spec/{appsignal → lib/appsignal/aggregator}/middleware/delete_blanks_spec.rb +2 -2
  47. data/spec/{appsignal → lib/appsignal}/aggregator/post_processor_spec.rb +15 -6
  48. data/spec/{appsignal → lib/appsignal}/aggregator_spec.rb +4 -1
  49. data/spec/{appsignal → lib/appsignal}/auth_check_spec.rb +8 -23
  50. data/spec/{appsignal → lib/appsignal}/cli_spec.rb +65 -66
  51. data/spec/lib/appsignal/config_spec.rb +132 -0
  52. data/spec/lib/appsignal/integrations/capistrano_spec.rb +123 -0
  53. data/spec/{appsignal → lib/appsignal}/integrations/passenger_spec.rb +0 -1
  54. data/spec/lib/appsignal/integrations/rails_spec.rb +38 -0
  55. data/spec/lib/appsignal/integrations/sinatra_spec.rb +43 -0
  56. data/spec/{appsignal → lib/appsignal}/marker_spec.rb +20 -23
  57. data/spec/lib/appsignal/rack/instrumentation_spec.rb +49 -0
  58. data/spec/{appsignal → lib/appsignal/rack}/listener_spec.rb +39 -6
  59. data/spec/{appsignal/transaction/transaction_formatter_spec.rb → lib/appsignal/transaction/formatter_spec.rb} +29 -6
  60. data/spec/{appsignal → lib/appsignal}/transaction/params_sanitizer_spec.rb +13 -12
  61. data/spec/{appsignal → lib/appsignal}/transaction_spec.rb +52 -7
  62. data/spec/{appsignal → lib/appsignal}/transmitter_spec.rb +27 -20
  63. data/spec/lib/appsignal_spec.rb +230 -0
  64. data/spec/lib/generators/appsignal/appsignal_generator_spec.rb +166 -0
  65. data/spec/lib/tmp/config/appsignal.yml +2 -0
  66. data/spec/spec_helper.rb +29 -20
  67. data/spec/support/delegate_matcher.rb +0 -1
  68. data/spec/support/fixtures/generated_config.yml +20 -0
  69. data/{log/.gitkeep → spec/support/fixtures/uploaded_file.txt} +0 -0
  70. data/spec/support/helpers/config_helpers.rb +24 -0
  71. data/spec/support/helpers/notification_helpers.rb +0 -2
  72. data/spec/support/helpers/transaction_helpers.rb +17 -2
  73. data/spec/support/project_fixture/config/appsignal.yml +18 -0
  74. data/spec/support/project_fixture/log/.gitkeep +0 -0
  75. data/spec/support/rails/my_app.rb +6 -0
  76. metadata +99 -83
  77. data/config/appsignal.yml +0 -10
  78. data/lib/appsignal/listener.rb +0 -21
  79. data/lib/appsignal/middleware.rb +0 -3
  80. data/lib/appsignal/middleware/action_view_sanitizer.rb +0 -21
  81. data/lib/appsignal/middleware/active_record_sanitizer.rb +0 -62
  82. data/lib/appsignal/middleware/chain.rb +0 -99
  83. data/lib/appsignal/middleware/delete_blanks.rb +0 -12
  84. data/lib/appsignal/railtie.rb +0 -37
  85. data/lib/appsignal/to_appsignal_hash.rb +0 -21
  86. data/lib/appsignal/transaction/transaction_formatter.rb +0 -67
  87. data/spec/appsignal/capistrano_spec.rb +0 -81
  88. data/spec/appsignal/config_spec.rb +0 -177
  89. data/spec/appsignal/inactive_railtie_spec.rb +0 -32
  90. data/spec/appsignal/middleware/action_view_sanitizer_spec.rb +0 -27
  91. data/spec/appsignal/middleware/active_record_sanitizer_spec.rb +0 -212
  92. data/spec/appsignal/railtie_spec.rb +0 -74
  93. data/spec/appsignal/to_appsignal_hash_spec.rb +0 -29
  94. data/spec/appsignal_spec.rb +0 -195
  95. data/spec/generators/appsignal/appsignal_generator_spec.rb +0 -181
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzU0MjdjNTA0YTU2NjRhOTcyYTI2OWQ0N2NmODJiMzc5MzRiMjM2Ng==
4
+ MmJjZmJmYThiYzQxNmNkYmY3OTljN2M4MzE3ZmI2NTJiNWExM2QyZA==
5
5
  data.tar.gz: !binary |-
6
- NmRlZmZlMDAxMDVkMGNmMGVmZWJhYzE4N2NiMTVlZDkyYzU2ZTY5Zg==
6
+ MDdlY2ZlZDlhN2FlN2Q4MDI0Nzg0NDFiODdmMDAxODRlYjI4NjQwMA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZWI0OTIyMzg0YzRhMmU1MTZkNDUzM2ZjMzI3MjZhMmM4OTIwNTYwNWI0M2Fm
10
- NjVlYTZiZTQyOWM3ZjE1MThlMTQ2MjAyZmUxZjNjMjMyN2ExMzkyMjdkM2Yz
11
- N2FhNmU0OWQxOGMyOTBhNDc1MmZkYTVmZTUyM2Y3Y2UyNjYzZWQ=
9
+ NjQxMWVmNmI4NThmYzdmMDQ3ZDM1YzNkODAwYTZjNWY2NTJlNzNlNzQzNDRk
10
+ NGVkYzQwYWZiOGZmN2ZiN2ExMGJhODRmMmFhNGY3N2M0M2VkNjQxNzRiZmRk
11
+ MmJlMjFmYmRjMmU4NWI0YWNmZDk3NjY0MThkYzVjMDE3MjRjMmE=
12
12
  data.tar.gz: !binary |-
13
- MjZjYmQyZjFjNmUwNWZhZWYwOTIyZmI3NjBiNTlkYTE1YTU1NDVlY2U1Yjhl
14
- MDEzNThjYTBhZGZmNTM5NmFlMTgxOTE5ZGUxZTVkYWE1ZWI3ZjY0MDhiNmZj
15
- YmU3NTU0YTU3Yzk4MjI5YmYxY2YxZDRiYjg5MGZjZWJmNTZhOGY=
13
+ ZDUwNTQ3ZGQyZmUwMmQ1OWE1YzcxNTQ4NzNkYWJjNDUwZmQ0OGEyMDY2ODgy
14
+ NDExNWQyMGRlZjc3MTMwMzk1MjFkYTdkMzBkZDNjOTNiNTI2YTEyNzdiMWEz
15
+ NWMzYzY2MTkyMjg2YzY0NDVmNjBmOTM3ZDkwZjU3ZGNjYmY1MTQ=
data/.gitignore CHANGED
@@ -3,14 +3,15 @@
3
3
  .sass-cache
4
4
  capybara-*.html
5
5
  .rspec
6
- /log/*.log
6
+ *.log
7
7
  /.bundle
8
8
  /vendor/bundle
9
9
  /tmp/*
10
10
  /db/*.sqlite3
11
11
  /public/system/*
12
12
  /coverage/
13
- /spec/tmp/*
13
+ /spec/tmp
14
+ /spec/support/project_fixture/log/*.log
14
15
  **.orig
15
16
  rerun.txt
16
17
  pickle-email-*.html
data/.travis.yml CHANGED
@@ -1,20 +1,20 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 1.8.7
5
- - 1.9.3
6
- - 2.0.0
7
- - jruby-19mode
4
+ - "1.9.3"
5
+ - "2.0.0"
6
+ - "jruby-19mode"
7
+ - "rbx-2.1.1"
8
8
 
9
9
  gemfile:
10
- - gemfiles/3.0.gemfile
11
- - gemfiles/3.1.gemfile
12
- - gemfiles/3.2.gemfile
13
- - gemfiles/4.0.gemfile
10
+ - "gemfiles/rack.gemfile"
11
+ - "gemfiles/rails-3.0.gemfile"
12
+ - "gemfiles/rails-3.1.gemfile"
13
+ - "gemfiles/rails-3.2.gemfile"
14
+ - "gemfiles/rails-4.0.gemfile"
14
15
 
15
16
  matrix:
16
17
  allow_failures:
17
- - rvm: 1.8.7
18
- - rvm: jruby-19mode
18
+ - rvm: "jruby-19mode"
19
19
 
20
- script: RAILS_ENV=test bundle exec rspec spec
20
+ script: "RAILS_ENV=test bundle exec rspec spec"
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.7.0
2
+ * Mayor refactor and cleanup
3
+ * New easier onboarding process
4
+ * Support for Rack apps, including experimental Sinatra integration
5
+ * Monitor HTTP queue times
6
+
1
7
  # 0.6.7
2
8
  * Send HTTP_X_FORWARDED_FOR env var
3
9
 
data/README.md CHANGED
@@ -52,3 +52,29 @@ class RemoveBoringPayload
52
52
  end
53
53
  end
54
54
  ```
55
+
56
+ ## Development
57
+
58
+ Run rake bundle or, or run bundle install for all Gemfiles:
59
+
60
+ ```
61
+ bundle --gemfile gemfiles/no_dependencies.gemfile
62
+ bundle --gemfile gemfiles/rails-3.0.gemfile
63
+ bundle --gemfile gemfiles/rails-3.1.gemfile
64
+ bundle --gemfile gemfiles/rails-3.2.gemfile
65
+ bundle --gemfile gemfiles/rails-4.0.gemfile
66
+ bundle --gemfile gemfiles/sinatra.gemfile
67
+ ```
68
+
69
+ To run the spec suite with a specific Gemfile:
70
+
71
+ ```
72
+ BUNDLE_GEMFILE=gemfiles/no_dependencies.gemfile bundle exec rspec
73
+ BUNDLE_GEMFILE=gemfiles/rails-3.0.gemfile bundle exec rspec
74
+ BUNDLE_GEMFILE=gemfiles/rails-3.1.gemfile bundle exec rspec
75
+ BUNDLE_GEMFILE=gemfiles/rails-3.2.gemfile bundle exec rspec
76
+ BUNDLE_GEMFILE=gemfiles/rails-4.0.gemfile bundle exec rspec
77
+ BUNDLE_GEMFILE=gemfiles/sinatra.gemfile bundle exec rspec
78
+ ```
79
+
80
+ Or run `rake spec` to run specs for all Gemfiles. Travis will run specs for these Gemfiles as well.
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require 'appsignal/version'
2
-
3
1
  task :publish do
2
+ require 'appsignal/version'
3
+
4
4
  NAME = 'appsignal'
5
5
  VERSION_FILE = 'lib/appsignal/version.rb'
6
6
  CHANGELOG_FILE = 'CHANGELOG.md'
@@ -29,7 +29,7 @@ task :publish do
29
29
  end
30
30
 
31
31
  def changes
32
- git_status_to_array(`git status -s -u `)
32
+ git_status_to_array(`git status -s -u`)
33
33
  end
34
34
 
35
35
  def gem_version
@@ -57,3 +57,32 @@ task :publish do
57
57
  raise "Actually change the version in: #{VERSION_FILE}"
58
58
  end
59
59
  end
60
+
61
+ task :bundle do
62
+ puts `bundle --gemfile gemfiles/no_dependencies.gemfile`
63
+ puts `bundle --gemfile gemfiles/rails-3.0.gemfile`
64
+ puts `bundle --gemfile gemfiles/rails-3.1.gemfile`
65
+ puts `bundle --gemfile gemfiles/rails-3.2.gemfile`
66
+ puts `bundle --gemfile gemfiles/rails-4.0.gemfile`
67
+ puts `bundle --gemfile gemfiles/sinatra.gemfile`
68
+ end
69
+
70
+ task :spec do
71
+ puts 'Running no dependencies'
72
+ puts `env BUNDLE_GEMFILE=gemfiles/no_dependencies.gemfile bundle exec rspec`
73
+
74
+ puts 'Running rails-3.0'
75
+ puts `env BUNDLE_GEMFILE=gemfiles/rails-3.0.gemfile bundle exec rspec`
76
+
77
+ puts 'Running rails-3.1'
78
+ puts `env BUNDLE_GEMFILE=gemfiles/rails-3.1.gemfile bundle exec rspec`
79
+
80
+ puts 'Running rails-3.2'
81
+ puts `env BUNDLE_GEMFILE=gemfiles/rails-3.2.gemfile bundle exec rspec`
82
+
83
+ puts 'Running rails-4.0'
84
+ puts `env BUNDLE_GEMFILE=gemfiles/rails-4.0.gemfile bundle exec rspec`
85
+
86
+ puts 'Running sinatra'
87
+ puts `env BUNDLE_GEMFILE=gemfiles/sinatra.gemfile bundle exec rspec`
88
+ end
data/appsignal.gemspec CHANGED
@@ -9,26 +9,35 @@ Gem::Specification.new do |gem|
9
9
  'Ron Cadier',
10
10
  'Jacob Vosmaer'
11
11
  ]
12
- gem.email = ['contact@appsignal.com']
13
- gem.description = 'The official appsignal.com gem'
14
- gem.summary = 'Logs performance and exception data from your app to'\
15
- 'appsignal.com'
16
- gem.homepage = 'http://github.com/appsignal/appsignal'
17
- gem.license = 'MIT'
12
+ gem.email = ['support@appsignal.com']
13
+ gem.description = 'The official appsignal.com gem'
14
+ gem.summary = 'Logs performance and exception data from your app to'\
15
+ 'appsignal.com'
16
+ gem.homepage = 'https://github.com/appsignal/appsignal'
17
+ gem.license = 'MIT'
18
18
 
19
- gem.files = `git ls-files`.split($\)
20
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
22
- gem.name = 'appsignal'
23
- gem.require_paths = ['lib']
24
- gem.version = Appsignal::VERSION
19
+ gem.files = `git ls-files`.split($\)
20
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
22
+ gem.name = 'appsignal'
23
+ gem.require_paths = ['lib']
24
+ gem.version = Appsignal::VERSION
25
+ gem.required_ruby_version = '>= 1.9.3'
25
26
 
26
- gem.add_dependency 'rails', '>= 3.0'
27
- gem.add_dependency 'rake'
28
- gem.add_dependency 'json'
27
+ gem.add_dependency 'activesupport', '>= 3.0'
28
+ gem.add_dependency 'rack'
29
+ gem.add_dependency 'thread_safe'
29
30
 
31
+ gem.add_development_dependency 'rake'
30
32
  gem.add_development_dependency 'rspec'
31
33
  gem.add_development_dependency 'capistrano', '< 3.0'
32
- gem.add_development_dependency 'generator_spec'
33
34
  gem.add_development_dependency 'pry'
35
+
36
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
37
+ gem.add_development_dependency 'racc'
38
+ gem.add_development_dependency 'rubysl-enumerator'
39
+ gem.add_development_dependency 'rubysl-net-http'
40
+ gem.add_development_dependency 'rubysl-rexml'
41
+ gem.add_development_dependency 'rubysl-test-unit'
42
+ end
34
43
  end
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec :path => '../'
@@ -1,6 +1,7 @@
1
- # encoding: utf-8
2
1
  source 'https://rubygems.org'
3
2
 
4
3
  gem 'rails', '~> 3.0.20'
5
4
 
5
+ gem 'generator_spec'
6
+
6
7
  gemspec :path => '../'
@@ -1,6 +1,7 @@
1
- # encoding: utf-8
2
1
  source 'https://rubygems.org'
3
2
 
4
3
  gem 'rails', '~> 3.1.12'
5
4
 
5
+ gem 'generator_spec'
6
+
6
7
  gemspec :path => '../'
@@ -1,6 +1,7 @@
1
- # encoding: utf-8
2
1
  source 'https://rubygems.org'
3
2
 
4
3
  gem 'rails', '~> 3.2.14'
5
4
 
5
+ gem 'generator_spec'
6
+
6
7
  gemspec :path => '../'
@@ -1,6 +1,7 @@
1
- # encoding: utf-8
2
1
  source 'https://rubygems.org'
3
2
 
4
3
  gem 'rails', '~> 4.0.0'
5
4
 
5
+ gem 'generator_spec'
6
+
6
7
  gemspec :path => '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'sinatra'
4
+
5
+ gemspec :path => '../'
data/lib/appsignal.rb CHANGED
@@ -1,14 +1,27 @@
1
- begin
2
- require "rails" unless defined?(Rails)
3
- rescue
4
- raise 'This appsignal gem only works with rails'
5
- end
1
+ require 'logger'
2
+ require 'rack'
3
+ require 'thread_safe'
4
+ require 'active_support/json'
6
5
 
7
6
  module Appsignal
8
7
  class << self
9
- attr_accessor :subscriber
8
+ attr_accessor :config, :logger, :agent
10
9
  attr_reader :in_memory_log
11
10
 
11
+ def start
12
+ if config
13
+ if config[:debug]
14
+ logger.level = Logger::DEBUG
15
+ else
16
+ logger.level = Logger::INFO
17
+ end
18
+ logger.info("Starting appsignal-#{Appsignal::VERSION}")
19
+ @agent = Appsignal::Agent.new
20
+ else
21
+ logger.error("Can't start, no config loaded")
22
+ end
23
+ end
24
+
12
25
  # Convenience method for adding a transaction to the queue. This queue is
13
26
  # managed and is periodically pushed to Appsignal.
14
27
  #
@@ -51,10 +64,6 @@ module Appsignal
51
64
  @transactions ||= {}
52
65
  end
53
66
 
54
- def agent
55
- @agent ||= Appsignal::Agent.new
56
- end
57
-
58
67
  def logger
59
68
  @in_memory_log = StringIO.new unless @in_memory_log
60
69
  @logger ||= Logger.new(@in_memory_log).tap do |l|
@@ -71,16 +80,8 @@ module Appsignal
71
80
  ActiveSupport::JSON
72
81
  end
73
82
 
74
- def logger=(l)
75
- @logger = l
76
- end
77
-
78
- def config
79
- @config ||= Appsignal::Config.new(Rails.root, Rails.env).load
80
- end
81
-
82
83
  def post_processing_middleware
83
- @post_processing_chain ||= PostProcessor.default_middleware
84
+ @post_processing_chain ||= Appsignal::Aggregator::PostProcessor.default_middleware
84
85
  yield @post_processing_chain if block_given?
85
86
  @post_processing_chain
86
87
  end
@@ -90,21 +91,25 @@ module Appsignal
90
91
  end
91
92
 
92
93
  def is_ignored_exception?(exception)
93
- Array.wrap(Appsignal.config[:ignore_exceptions]).
94
- include?(exception.class.name)
94
+ Appsignal.config[:ignore_exceptions].include?(exception.class.name)
95
95
  end
96
96
  end
97
97
  end
98
98
 
99
99
  require 'appsignal/agent'
100
100
  require 'appsignal/aggregator'
101
+ require 'appsignal/aggregator/post_processor'
102
+ require 'appsignal/aggregator/middleware'
101
103
  require 'appsignal/auth_check'
102
104
  require 'appsignal/config'
103
- require 'appsignal/integrations/passenger'
104
- require 'appsignal/listener'
105
105
  require 'appsignal/marker'
106
- require 'appsignal/middleware'
107
- require 'appsignal/railtie'
106
+ require 'appsignal/rack/listener'
107
+ require 'appsignal/rack/instrumentation'
108
108
  require 'appsignal/transaction'
109
+ require 'appsignal/transaction/formatter'
110
+ require 'appsignal/transaction/params_sanitizer'
109
111
  require 'appsignal/transmitter'
110
112
  require 'appsignal/version'
113
+
114
+ require 'appsignal/integrations/passenger'
115
+ require 'appsignal/integrations/rails'
@@ -2,44 +2,64 @@ module Appsignal
2
2
  class Agent
3
3
  ACTION = 'log_entries'.freeze
4
4
 
5
- attr_reader :aggregator, :thread, :active, :sleep_time, :transmitter, :aggregator_semaphore
5
+ attr_reader :aggregator, :thread, :active, :sleep_time, :transmitter, :subscriber
6
6
 
7
7
  def initialize
8
8
  return unless Appsignal.active?
9
- @sleep_time = 60.0
9
+ if Appsignal.config.env == 'development'
10
+ @sleep_time = 10.0
11
+ else
12
+ @sleep_time = 60.0
13
+ end
10
14
  @aggregator = Aggregator.new
11
- @aggregator_semaphore = Mutex.new
12
- @retry_request = true
15
+ @transmitter = Transmitter.new(ACTION)
16
+ subscribe
17
+ start_thread
18
+ # Shutdown at exit. This does not work in passenger, see integrations/passenger
19
+ #at_exit { Appsignal.agent.shutdown(true) }
20
+ Appsignal.logger.info('Started Appsignal agent')
21
+ end
22
+
23
+ def start_thread
24
+ Appsignal.logger.debug('Starting agent thread')
13
25
  @thread = Thread.new do
14
- Appsignal.logger.debug('Starting agent thread')
15
- while true do
26
+ loop do
16
27
  send_queue if aggregator.has_transactions?
17
28
  Appsignal.logger.debug("Sleeping #{sleep_time}")
18
29
  sleep(sleep_time)
19
30
  end
20
31
  end
21
- @transmitter = Transmitter.new(
22
- Appsignal.config.fetch(:endpoint),
23
- ACTION,
24
- Appsignal.config.fetch(:api_key)
25
- )
26
- Appsignal.logger.info('Started Appsignal agent')
32
+ end
33
+
34
+ def subscribe
35
+ Appsignal.logger.debug('Subscribing to notifications')
36
+ # Subscribe to notifications that don't start with a !
37
+ @subscriber = ActiveSupport::Notifications.subscribe(/^[^!]/) do |*args|
38
+ if Appsignal::Transaction.current
39
+ event = ActiveSupport::Notifications::Event.new(*args)
40
+ if event.name.start_with?('process_action')
41
+ Appsignal::Transaction.current.set_process_action_event(event)
42
+ end
43
+ Appsignal::Transaction.current.add_event(event)
44
+ end
45
+ end
27
46
  end
28
47
 
29
48
  def enqueue(transaction)
30
49
  Appsignal.logger.debug('Enqueueing transaction')
31
- aggregator_semaphore.synchronize do
32
- aggregator.add(transaction)
33
- end
50
+ aggregator.add(transaction)
34
51
  end
35
52
 
36
53
  def send_queue
37
54
  Appsignal.logger.debug('Sending queue')
55
+ # Replace aggregator while making sure no thread
56
+ # is adding to it's queue
38
57
  aggregator_to_be_sent = nil
39
- aggregator_semaphore.synchronize do
58
+ Thread.exclusive do
40
59
  aggregator_to_be_sent = aggregator
41
60
  @aggregator = Aggregator.new
42
61
  end
62
+
43
63
  begin
44
64
  handle_result(
45
65
  transmitter.transmit(aggregator_to_be_sent.post_processed_queue!)
@@ -62,7 +82,7 @@ module Appsignal
62
82
 
63
83
  def shutdown(send_current_queue=false)
64
84
  Appsignal.logger.info('Shutting down the agent')
65
- ActiveSupport::Notifications.unsubscribe(Appsignal.subscriber)
85
+ ActiveSupport::Notifications.unsubscribe(subscriber)
66
86
  Thread.kill(thread) if thread
67
87
  send_queue if send_current_queue && @aggregator.has_transactions?
68
88
  end