appsignal 0.6.7 → 0.7.0.alpha.1

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 (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