appsignal 0.5.3 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +6 -14
- data/.travis.yml +5 -5
- data/{LICENCE → LICENSE} +0 -0
- data/Rakefile +2 -0
- data/appsignal.gemspec +1 -1
- data/lib/appsignal.rb +1 -0
- data/lib/appsignal/agent.rb +11 -11
- data/lib/appsignal/aggregator.rb +4 -1
- data/lib/appsignal/capistrano.rb +1 -1
- data/lib/appsignal/cli.rb +3 -3
- data/lib/appsignal/config.rb +31 -5
- data/lib/appsignal/integrations/passenger.rb +4 -2
- data/lib/appsignal/marker.rb +2 -2
- data/lib/appsignal/transaction.rb +5 -5
- data/lib/appsignal/transaction/transaction_formatter.rb +2 -1
- data/lib/appsignal/version.rb +1 -1
- data/lib/generators/appsignal/appsignal_generator.rb +1 -1
- data/spec/appsignal/cli_spec.rb +56 -35
- data/spec/appsignal/config_spec.rb +74 -4
- data/spec/appsignal/to_appsignal_hash_spec.rb +1 -1
- data/spec/appsignal/transaction/transaction_formatter_spec.rb +6 -6
- data/spec/appsignal/transaction_spec.rb +2 -2
- data/spec/appsignal/transmitter_spec.rb +6 -6
- data/spec/appsignal_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/helpers/transaction_helpers.rb +2 -2
- metadata +18 -18
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MmE4YWQ3MzNhYmQ4NGNlZTJlZDM5MDVkNGZlN2RjOWE5ODk3OTg5NDg3NzIw
|
10
|
-
ZjUwYTAxYWI4OTkzMWUwNzMwYzMyMmFjZTVkYjRhMWUzZGU1OTY4Y2ExZjY1
|
11
|
-
ZGFkYmQ1Zjg2ZWI2YmQ0OTgxZTk4YzBmYjcxZDcwNzE1Y2NmNjM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OWFjYjM1MWM3NDgyNmFlZjk2MTE2NWNlZGZjNzkxOGY5ZGNiOTBkMzZhZGJj
|
14
|
-
MDY0NmMwYTQ4ZmU2YjY3N2RhZDBkZDg4MzllZjczNTA4YzUyM2VkN2FkODMw
|
15
|
-
NjZhYTA3ZTk3ZjY1NzUyOGY4NTEyOTcxMTI2ZDVkODg5Nzk2Mzc=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ac8120b63e45fdea0861e414b1c64bff97abb942
|
4
|
+
data.tar.gz: 25b2c51d536d5dae8a637ff109c436776942df8a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6316bff3682062da20c389a3b875f06f9a91e3e9e078380ec61d57ad1b01cdbe7ae4d6668b491000b7f1b563c0e959b486ef513bc66e621cbc88578cba0d873d
|
7
|
+
data.tar.gz: ab0be93d7752313f9970c1c9c91955a1b55d8cbadc13003d90e1f89fa70b1f03daf8922404ca49a45cd9b1a36d034deae36c5a8ac5b28f29f9d6c36c8a8695bf
|
data/.travis.yml
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
language: ruby
|
2
2
|
|
3
3
|
rvm:
|
4
|
-
# - 1.9.2
|
5
|
-
- 1.9.3
|
6
4
|
- 1.8.7
|
5
|
+
- 1.9.2
|
6
|
+
- 1.9.3
|
7
7
|
- ree
|
8
|
-
|
9
|
-
|
8
|
+
- ruby-head
|
9
|
+
- jruby-18mode
|
10
10
|
- jruby-19mode
|
11
|
-
|
11
|
+
- jruby-head
|
12
12
|
|
13
13
|
gemfile:
|
14
14
|
- gemfiles/3.0.gemfile
|
data/{LICENCE → LICENSE}
RENAMED
File without changes
|
data/Rakefile
CHANGED
@@ -17,7 +17,9 @@ task :publish do
|
|
17
17
|
puts "# Creating tag #{version}"
|
18
18
|
puts `git tag #{version}`
|
19
19
|
puts `git push origin #{version}`
|
20
|
+
puts `git push appsignal #{version}`
|
20
21
|
puts `git push origin master`
|
22
|
+
puts `git push appsignal master`
|
21
23
|
rescue
|
22
24
|
raise "Tag: '#{version}' already exists"
|
23
25
|
end
|
data/appsignal.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.description = 'The official appsignal.com gem'
|
14
14
|
gem.summary = 'Logs performance and exception data from your app to'\
|
15
15
|
'appsignal.com'
|
16
|
-
gem.homepage = 'http://github.com/
|
16
|
+
gem.homepage = 'http://github.com/appsignal/appsignal'
|
17
17
|
|
18
18
|
gem.files = `git ls-files`.split($\)
|
19
19
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/lib/appsignal.rb
CHANGED
data/lib/appsignal/agent.rb
CHANGED
@@ -12,7 +12,7 @@ module Appsignal
|
|
12
12
|
@thread = Thread.new do
|
13
13
|
while true do
|
14
14
|
send_queue if aggregator.has_transactions?
|
15
|
-
Appsignal.logger.debug("
|
15
|
+
Appsignal.logger.debug("Sleeping #{sleep_time}")
|
16
16
|
sleep(sleep_time)
|
17
17
|
end
|
18
18
|
end
|
@@ -21,7 +21,7 @@ module Appsignal
|
|
21
21
|
ACTION,
|
22
22
|
Appsignal.config.fetch(:api_key)
|
23
23
|
)
|
24
|
-
Appsignal.logger.info("
|
24
|
+
Appsignal.logger.info("Started the Appsignal agent")
|
25
25
|
end
|
26
26
|
|
27
27
|
def enqueue(transaction)
|
@@ -29,7 +29,7 @@ module Appsignal
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def send_queue
|
32
|
-
Appsignal.logger.debug("
|
32
|
+
Appsignal.logger.debug("Sending queue")
|
33
33
|
current_aggregator = aggregator
|
34
34
|
@aggregator = Aggregator.new
|
35
35
|
begin
|
@@ -43,7 +43,7 @@ module Appsignal
|
|
43
43
|
def forked!
|
44
44
|
@forked = true
|
45
45
|
@aggregator = Aggregator.new
|
46
|
-
Appsignal.logger.info("
|
46
|
+
Appsignal.logger.info("Forked the Appsignal agent")
|
47
47
|
end
|
48
48
|
|
49
49
|
def forked?
|
@@ -51,7 +51,7 @@ module Appsignal
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def shutdown(send_current_queue=false)
|
54
|
-
Appsignal.logger.info("
|
54
|
+
Appsignal.logger.info("Shutting down the agent")
|
55
55
|
ActiveSupport::Notifications.unsubscribe(Appsignal.subscriber)
|
56
56
|
Thread.kill(thread) if thread
|
57
57
|
send_queue if send_current_queue && @aggregator.has_transactions?
|
@@ -60,7 +60,7 @@ module Appsignal
|
|
60
60
|
protected
|
61
61
|
|
62
62
|
def handle_result(code)
|
63
|
-
Appsignal.logger.debug "
|
63
|
+
Appsignal.logger.debug "Queue sent, response code: #{code}"
|
64
64
|
case code.to_i
|
65
65
|
when 200 # ok
|
66
66
|
when 420 # Enhance Your Calm
|
@@ -68,20 +68,20 @@ module Appsignal
|
|
68
68
|
when 413 # Request Entity Too Large
|
69
69
|
@sleep_time = sleep_time / 1.5
|
70
70
|
when 429
|
71
|
-
Appsignal.logger.error "
|
71
|
+
Appsignal.logger.error "Too many requests sent"
|
72
72
|
shutdown
|
73
73
|
when 406
|
74
|
-
Appsignal.logger.error "
|
74
|
+
Appsignal.logger.error "Your appsignal gem cannot "\
|
75
75
|
"communicate with the API anymore, please upgrade."
|
76
76
|
shutdown
|
77
77
|
when 402
|
78
|
-
Appsignal.logger.error "
|
78
|
+
Appsignal.logger.error "Payment required"
|
79
79
|
shutdown
|
80
80
|
when 401
|
81
|
-
Appsignal.logger.error "
|
81
|
+
Appsignal.logger.error "API token cannot be authorized"
|
82
82
|
shutdown
|
83
83
|
else
|
84
|
-
Appsignal.logger.error "
|
84
|
+
Appsignal.logger.error "Unknown Appsignal response code: "\
|
85
85
|
"'#{code}'"
|
86
86
|
end
|
87
87
|
end
|
data/lib/appsignal/aggregator.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Appsignal
|
2
2
|
class Aggregator
|
3
|
-
attr_reader :queue, :slowness_index
|
3
|
+
attr_reader :queue, :slowness_index, :counts
|
4
4
|
|
5
5
|
def initialize(queue = [], slowness_index = {})
|
6
6
|
@queue = queue
|
7
7
|
@slowness_index = slowness_index
|
8
|
+
@counts = {:regular_request => 0, :slow_request => 0, :exception => 0}
|
8
9
|
end
|
9
10
|
|
10
11
|
# truncates or reduces the size of event values of the transaction, and
|
@@ -20,6 +21,7 @@ module Appsignal
|
|
20
21
|
when :exception
|
21
22
|
transaction.convert_values_to_primitives!
|
22
23
|
end
|
24
|
+
counts[transaction.type] += 1
|
23
25
|
queue << transaction
|
24
26
|
end
|
25
27
|
|
@@ -34,6 +36,7 @@ module Appsignal
|
|
34
36
|
#
|
35
37
|
# @returns [ Array ] Array of post processed Appsignal::Transaction objects
|
36
38
|
def post_processed_queue!
|
39
|
+
Appsignal.logger.debug("Post processing queue: #{counts.inspect}")
|
37
40
|
Appsignal::PostProcessor.new(queue).post_processed_queue!
|
38
41
|
end
|
39
42
|
|
data/lib/appsignal/capistrano.rb
CHANGED
@@ -25,7 +25,7 @@ module Appsignal
|
|
25
25
|
|
26
26
|
marker = Marker.new(marker_data, ENV['PWD'], rails_env, logger)
|
27
27
|
if config.dry_run
|
28
|
-
logger.info
|
28
|
+
logger.info("Dry run: Deploy marker not actually sent.")
|
29
29
|
else
|
30
30
|
marker.transmit
|
31
31
|
end
|
data/lib/appsignal/cli.rb
CHANGED
@@ -11,11 +11,11 @@ require 'appsignal/transmitter'
|
|
11
11
|
module Appsignal
|
12
12
|
class CLI
|
13
13
|
AVAILABLE_COMMANDS = %w(notify_of_deploy api_check).freeze
|
14
|
-
PROJECT_ROOT =
|
14
|
+
PROJECT_ROOT = ENV['PWD']
|
15
15
|
|
16
16
|
class << self
|
17
17
|
def run(argv=ARGV)
|
18
|
-
unless File.exists?(File.join(
|
18
|
+
unless File.exists?(File.join(PROJECT_ROOT, 'config/appsignal.yml'))
|
19
19
|
puts 'No config file present at config/appsignal.yml'
|
20
20
|
puts 'Log in to https://appsignal.com to get instructions on how to generate the config file.'
|
21
21
|
exit(1)
|
@@ -108,7 +108,7 @@ module Appsignal
|
|
108
108
|
:repository => options[:repository],
|
109
109
|
:user => options[:user]
|
110
110
|
},
|
111
|
-
|
111
|
+
PROJECT_ROOT,
|
112
112
|
options[:environment],
|
113
113
|
logger
|
114
114
|
).transmit
|
data/lib/appsignal/config.rb
CHANGED
@@ -16,22 +16,25 @@ module Appsignal
|
|
16
16
|
attr_reader :configurations, :project_path, :env
|
17
17
|
|
18
18
|
def initialize(project_path, env, logger=Appsignal.logger)
|
19
|
-
@project_path = project_path
|
19
|
+
@project_path = project_path || ENV['PWD']
|
20
20
|
@env = env.to_sym
|
21
21
|
@logger = logger
|
22
22
|
@configurations = {}
|
23
23
|
end
|
24
24
|
|
25
25
|
def load
|
26
|
-
return unless
|
26
|
+
return unless load_configurations
|
27
27
|
return unless used_unique_api_keys
|
28
28
|
return unless current_environment_present
|
29
29
|
|
30
|
+
if Appsignal.respond_to?(:logger) && @logger == Appsignal.logger
|
31
|
+
@logger.level = Logger::DEBUG if configurations[env][:debug]
|
32
|
+
end
|
30
33
|
DEFAULT_CONFIG.merge(configurations[env])
|
31
34
|
end
|
32
35
|
|
33
36
|
def load_all
|
34
|
-
return unless
|
37
|
+
return unless load_configurations
|
35
38
|
return unless used_unique_api_keys
|
36
39
|
|
37
40
|
{}.tap do |result|
|
@@ -43,10 +46,22 @@ module Appsignal
|
|
43
46
|
|
44
47
|
protected
|
45
48
|
|
49
|
+
def config_file
|
50
|
+
File.join(project_path, 'config', 'appsignal.yml')
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_configurations
|
54
|
+
unless load_configurations_from_disk || load_configurations_from_env
|
55
|
+
carefully_log_error "no config file found at '#{config_file}'
|
56
|
+
and no APPSIGNAL_API_KEY found in ENV"
|
57
|
+
return false
|
58
|
+
end
|
59
|
+
true
|
60
|
+
end
|
61
|
+
|
46
62
|
def load_configurations_from_disk
|
47
|
-
file =
|
63
|
+
file = config_file
|
48
64
|
unless File.exists?(file)
|
49
|
-
carefully_log_error "config not found at: '#{file}'"
|
50
65
|
return false
|
51
66
|
end
|
52
67
|
@configurations = YAML.load(ERB.new(IO.read(file)).result)
|
@@ -55,6 +70,17 @@ module Appsignal
|
|
55
70
|
true
|
56
71
|
end
|
57
72
|
|
73
|
+
def load_configurations_from_env
|
74
|
+
api_key = ENV['APPSIGNAL_API_KEY']
|
75
|
+
env = ENV['RAILS_ENV'] || :production
|
76
|
+
if api_key.present?
|
77
|
+
@configurations = {env.to_sym => {:api_key => api_key, :active => true}}
|
78
|
+
true
|
79
|
+
else
|
80
|
+
false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
58
84
|
def used_unique_api_keys
|
59
85
|
keys = configurations.each_value.map { |config| config[:api_key] }.compact
|
60
86
|
if keys.uniq.count < keys.count
|
@@ -1,11 +1,13 @@
|
|
1
1
|
if defined?(PhusionPassenger)
|
2
|
+
Appsignal.logger.info("Using Passenger")
|
3
|
+
|
2
4
|
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
3
|
-
Appsignal.logger.debug("
|
5
|
+
Appsignal.logger.debug("starting worker process")
|
4
6
|
Appsignal.agent.forked!
|
5
7
|
end
|
6
8
|
|
7
9
|
PhusionPassenger.on_event(:stopping_worker_process) do
|
8
|
-
Appsignal.logger.debug("
|
10
|
+
Appsignal.logger.debug("stopping worker process")
|
9
11
|
Appsignal.agent.shutdown(true)
|
10
12
|
end
|
11
13
|
end
|
data/lib/appsignal/marker.rb
CHANGED
@@ -18,10 +18,10 @@ module Appsignal
|
|
18
18
|
transmitter = Transmitter.new(
|
19
19
|
@config[:endpoint], ACTION, @config[:api_key]
|
20
20
|
)
|
21
|
-
@logger.info
|
21
|
+
@logger.info("Notifying Appsignal of deploy...")
|
22
22
|
result = transmitter.transmit(marker_data)
|
23
23
|
if result == '200'
|
24
|
-
@logger.info
|
24
|
+
@logger.info("Appsignal has been notified of this deploy!")
|
25
25
|
else
|
26
26
|
raise "#{result} at #{transmitter.uri}"
|
27
27
|
end
|
@@ -24,11 +24,11 @@ module Appsignal
|
|
24
24
|
Appsignal.transactions[Thread.current[:appsignal_transaction_id]]
|
25
25
|
end
|
26
26
|
|
27
|
-
attr_reader :
|
28
|
-
:fullpath, :time
|
27
|
+
attr_reader :request_id, :events, :process_action_event, :action, :exception,
|
28
|
+
:env, :fullpath, :time
|
29
29
|
|
30
|
-
def initialize(
|
31
|
-
@
|
30
|
+
def initialize(request_id, env)
|
31
|
+
@request_id = request_id
|
32
32
|
@events = []
|
33
33
|
@process_action_event = nil
|
34
34
|
@exception = nil
|
@@ -103,7 +103,7 @@ module Appsignal
|
|
103
103
|
|
104
104
|
def complete!
|
105
105
|
Thread.current[:appsignal_transaction_id] = nil
|
106
|
-
current_transaction = Appsignal.transactions.delete(@
|
106
|
+
current_transaction = Appsignal.transactions.delete(@request_id)
|
107
107
|
if process_action_event || exception?
|
108
108
|
Appsignal.enqueue(current_transaction)
|
109
109
|
end
|
@@ -2,6 +2,7 @@ require 'delegate'
|
|
2
2
|
|
3
3
|
module Appsignal
|
4
4
|
class TransactionFormatter < SimpleDelegator
|
5
|
+
|
5
6
|
def initialize(transaction)
|
6
7
|
super(transaction)
|
7
8
|
end
|
@@ -21,7 +22,7 @@ module Appsignal
|
|
21
22
|
|
22
23
|
def default_hash
|
23
24
|
{
|
24
|
-
:request_id =>
|
25
|
+
:request_id => request_id,
|
25
26
|
:log_entry => {
|
26
27
|
:path => fullpath,
|
27
28
|
:kind => 'http_request',
|
data/lib/appsignal/version.rb
CHANGED
@@ -17,7 +17,7 @@ class AppsignalGenerator < Rails::Generators::Base
|
|
17
17
|
say_status(:error, "#{environment}:", :red)
|
18
18
|
say_status(:error, " api_key: #{push_key}\n\n", :red)
|
19
19
|
say_status(:info, "Then run:\n\n", :red)
|
20
|
-
say_status(:info, "
|
20
|
+
say_status(:info, " appsignal api_check", :red)
|
21
21
|
else
|
22
22
|
template template_file, appsignal_file
|
23
23
|
capyistrano_install
|
data/spec/appsignal/cli_spec.rb
CHANGED
@@ -54,6 +54,62 @@ describe Appsignal::CLI do
|
|
54
54
|
"appsignal -h to see the help"
|
55
55
|
end
|
56
56
|
|
57
|
+
describe "#notify_of_deploy" do
|
58
|
+
it "should validate that all options have been supplied" do
|
59
|
+
options = {}
|
60
|
+
cli.should_receive(:validate_required_options).with(
|
61
|
+
[:revision, :repository, :user, :environment],
|
62
|
+
options
|
63
|
+
)
|
64
|
+
Appsignal::Marker.should_receive(:new).
|
65
|
+
and_return(mock(:transmit => true))
|
66
|
+
cli.notify_of_deploy(options)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should notify of a deploy" do
|
70
|
+
transmitter = double
|
71
|
+
Appsignal::Transmitter.should_receive(:new).with(
|
72
|
+
'http://localhost:3000/1',
|
73
|
+
'markers',
|
74
|
+
'def'
|
75
|
+
).and_return(transmitter)
|
76
|
+
transmitter.should_receive(:transmit).with(
|
77
|
+
:revision => 'aaaaa',
|
78
|
+
:repository => 'git@github.com:our/project.git',
|
79
|
+
:user => 'thijs'
|
80
|
+
)
|
81
|
+
|
82
|
+
cli.run([
|
83
|
+
'notify_of_deploy',
|
84
|
+
'--revision=aaaaa',
|
85
|
+
'--repository=git@github.com:our/project.git',
|
86
|
+
'--user=thijs',
|
87
|
+
'--environment=production'
|
88
|
+
])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "api_check" do
|
93
|
+
it "should detect configured environments" do
|
94
|
+
authcheck = double
|
95
|
+
Appsignal::AuthCheck.should_receive(:new).with(
|
96
|
+
:development,
|
97
|
+
kind_of(Hash)
|
98
|
+
).and_return(authcheck)
|
99
|
+
Appsignal::AuthCheck.should_receive(:new).with(
|
100
|
+
:production,
|
101
|
+
kind_of(Hash)
|
102
|
+
).and_return(authcheck)
|
103
|
+
Appsignal::AuthCheck.should_receive(:new).with(
|
104
|
+
:test,
|
105
|
+
kind_of(Hash)
|
106
|
+
).and_return(authcheck)
|
107
|
+
|
108
|
+
authcheck.should_receive(:perform).exactly(3).times.and_return('200')
|
109
|
+
cli.api_check
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
57
113
|
# protected
|
58
114
|
|
59
115
|
describe "#validate_required_options" do
|
@@ -94,39 +150,4 @@ describe Appsignal::CLI do
|
|
94
150
|
out_stream.string.should include("Missing options: option_2, option_3")
|
95
151
|
end
|
96
152
|
end
|
97
|
-
|
98
|
-
describe "#notify_of_deploy" do
|
99
|
-
it "should validate that all options have been supplied" do
|
100
|
-
options = {}
|
101
|
-
cli.should_receive(:validate_required_options).with(
|
102
|
-
[:revision, :repository, :user, :environment],
|
103
|
-
options
|
104
|
-
)
|
105
|
-
Appsignal::Marker.should_receive(:new).
|
106
|
-
and_return(mock(:transmit => true))
|
107
|
-
cli.notify_of_deploy(options)
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should notify of a deploy" do
|
111
|
-
transmitter = double
|
112
|
-
Appsignal::Transmitter.should_receive(:new).with(
|
113
|
-
'http://localhost:3000/1',
|
114
|
-
'markers',
|
115
|
-
'def'
|
116
|
-
).and_return(transmitter)
|
117
|
-
transmitter.should_receive(:transmit).with(
|
118
|
-
:revision => 'aaaaa',
|
119
|
-
:repository => 'git@github.com:our/project.git',
|
120
|
-
:user => 'thijs'
|
121
|
-
)
|
122
|
-
|
123
|
-
cli.run([
|
124
|
-
'notify_of_deploy',
|
125
|
-
'--revision=aaaaa',
|
126
|
-
'--repository=git@github.com:our/project.git',
|
127
|
-
'--user=thijs',
|
128
|
-
'--environment=production'
|
129
|
-
])
|
130
|
-
end
|
131
|
-
end
|
132
153
|
end
|
@@ -24,11 +24,25 @@ describe Appsignal::Config do
|
|
24
24
|
}
|
25
25
|
|
26
26
|
context 'when there is no config file' do
|
27
|
-
before {
|
27
|
+
before { config.stub(:config_file => '/not/existing') }
|
28
28
|
|
29
29
|
it { should be_nil }
|
30
30
|
end
|
31
31
|
|
32
|
+
context "the current env is in debug mode" do
|
33
|
+
context "using the Appsignal logger" do
|
34
|
+
specify { Appsignal.logger.should_not_receive(:level=) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "using another logger" do
|
38
|
+
let(:logger_parameter) { [Appsignal.logger.clone] }
|
39
|
+
|
40
|
+
specify { Appsignal.logger.should_not_receive(:level=) }
|
41
|
+
end
|
42
|
+
|
43
|
+
after { subject }
|
44
|
+
end
|
45
|
+
|
32
46
|
context "the env is not in the config" do
|
33
47
|
before { config.stub(:current_environment_present => false) }
|
34
48
|
|
@@ -44,6 +58,37 @@ describe Appsignal::Config do
|
|
44
58
|
|
45
59
|
# protected
|
46
60
|
|
61
|
+
describe "#load_configurations" do
|
62
|
+
subject { config.send(:load_configurations) }
|
63
|
+
|
64
|
+
context "when there is a config file" do
|
65
|
+
before do
|
66
|
+
config.should_receive(:load_configurations_from_disk).and_return(true)
|
67
|
+
end
|
68
|
+
|
69
|
+
it { should be_true }
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when there is no config file" do
|
73
|
+
before do
|
74
|
+
config.should_receive(:load_configurations_from_disk).and_return(false)
|
75
|
+
config.should_receive(:load_configurations_from_env).and_return(true)
|
76
|
+
end
|
77
|
+
|
78
|
+
it { should be_true }
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when there is no env api_key" do
|
82
|
+
before do
|
83
|
+
config.should_receive(:load_configurations_from_disk).and_return(false)
|
84
|
+
config.should_receive(:load_configurations_from_env).and_return(false)
|
85
|
+
config.should_receive(:carefully_log_error)
|
86
|
+
end
|
87
|
+
|
88
|
+
it { should be_false }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
47
92
|
describe "#load_configurations_from_disk" do
|
48
93
|
subject do
|
49
94
|
config.send(:load_configurations_from_disk)
|
@@ -57,12 +102,37 @@ describe Appsignal::Config do
|
|
57
102
|
end
|
58
103
|
|
59
104
|
context "when the file is not present" do
|
105
|
+
before { config.stub(:project_path => '/non/existing') }
|
106
|
+
|
107
|
+
it { should be_empty }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "#load_configurations_from_env" do
|
112
|
+
subject do
|
113
|
+
config.send(:load_configurations_from_env)
|
114
|
+
config.configurations
|
115
|
+
end
|
116
|
+
|
117
|
+
context "when the ENV api_key variable is present" do
|
118
|
+
before { ENV['APPSIGNAL_API_KEY'] = 'ghi' }
|
119
|
+
|
120
|
+
it { should == {:test => {:api_key => "ghi", :active => true}} }
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when the ENV api_key variable is not present" do
|
124
|
+
before { ENV['APPSIGNAL_API_KEY'] = nil }
|
125
|
+
|
126
|
+
it { should be_empty }
|
127
|
+
end
|
128
|
+
|
129
|
+
context "when the RAILS env is not present" do
|
60
130
|
before do
|
61
|
-
|
62
|
-
|
131
|
+
ENV['APPSIGNAL_API_KEY'] = 'ghi'
|
132
|
+
ENV['RAILS_ENV'] = nil
|
63
133
|
end
|
64
134
|
|
65
|
-
it { should
|
135
|
+
it { should == {:production => {:api_key => "ghi", :active => true}} }
|
66
136
|
end
|
67
137
|
end
|
68
138
|
|
@@ -13,12 +13,12 @@ describe Appsignal::TransactionFormatter do
|
|
13
13
|
context "with a regular request" do
|
14
14
|
let(:transaction) { regular_transaction }
|
15
15
|
|
16
|
-
its(:keys) { should
|
16
|
+
its(:keys) { should =~ [:request_id, :log_entry, :failed] }
|
17
17
|
its([:request_id]) { should == '1' }
|
18
18
|
its([:log_entry]) { should == {
|
19
19
|
:action => "BlogPostsController#show",
|
20
20
|
:db_runtime => 500,
|
21
|
-
:duration => 100.0,
|
21
|
+
:duration => be_within(0.01).of(100.0),
|
22
22
|
:end => 978364860.1,
|
23
23
|
:environment => {},
|
24
24
|
:kind => "http_request",
|
@@ -36,14 +36,14 @@ describe Appsignal::TransactionFormatter do
|
|
36
36
|
context "with an exception request" do
|
37
37
|
let(:transaction) { transaction_with_exception }
|
38
38
|
|
39
|
-
its(:keys) { should
|
39
|
+
its(:keys) { should =~ [:request_id, :log_entry, :failed, :exception] }
|
40
40
|
its([:request_id]) { should == '1' }
|
41
41
|
its([:failed]) { should be_true }
|
42
42
|
|
43
43
|
context "exception content" do
|
44
44
|
subject { formatter.hash[:exception] }
|
45
45
|
|
46
|
-
its(:keys) { should
|
46
|
+
its(:keys) { should =~ [:backtrace, :exception, :message] }
|
47
47
|
its([:backtrace]) { should be_instance_of Array }
|
48
48
|
its([:exception]) { should == 'ArgumentError' }
|
49
49
|
its([:message]) { should == 'oh no' }
|
@@ -53,7 +53,7 @@ describe Appsignal::TransactionFormatter do
|
|
53
53
|
context "with a slow request" do
|
54
54
|
let(:transaction) { slow_transaction }
|
55
55
|
|
56
|
-
its(:keys) { should
|
56
|
+
its(:keys) { should =~ [:request_id, :log_entry, :failed, :events] }
|
57
57
|
its([:request_id]) { should == '1' }
|
58
58
|
its([:failed]) { should be_false }
|
59
59
|
|
@@ -63,7 +63,7 @@ describe Appsignal::TransactionFormatter do
|
|
63
63
|
its(:length) { should == 1 }
|
64
64
|
its(:first) { should == {
|
65
65
|
:name => "query.mongoid",
|
66
|
-
:duration => 100.0,
|
66
|
+
:duration => be_within(0.01).of(100.0),
|
67
67
|
:time => 978364860.0,
|
68
68
|
:end => 978364860.1,
|
69
69
|
:payload => {
|
@@ -102,7 +102,7 @@ describe Appsignal::Transaction do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
context "when the request took too long" do
|
105
|
-
let(:duration) { 0.
|
105
|
+
let(:duration) { 0.201 } # in seconds
|
106
106
|
|
107
107
|
it { should be_true }
|
108
108
|
end
|
@@ -298,7 +298,7 @@ describe Appsignal::Transaction do
|
|
298
298
|
subject { transaction.sanitized_environment }
|
299
299
|
before { transaction.send(:sanitize_environment!) }
|
300
300
|
|
301
|
-
its(:keys) { should
|
301
|
+
its(:keys) { should =~ whitelisted_keys }
|
302
302
|
end
|
303
303
|
|
304
304
|
describe '#sanitize_session_data!' do
|
@@ -10,10 +10,11 @@ describe Appsignal::Transmitter do
|
|
10
10
|
describe "#uri" do
|
11
11
|
it "returns the uri" do
|
12
12
|
Socket.stub(:gethostname => 'app1.local')
|
13
|
-
subject.uri.
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
uri = subject.uri.to_s
|
14
|
+
uri.should include "http://www.80beans.com/action?"
|
15
|
+
uri.should include "api_key=the_api_key"
|
16
|
+
uri.should include "hostname=app1.local"
|
17
|
+
uri.should include "gem_version=#{Appsignal::VERSION}"
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
@@ -36,8 +37,7 @@ describe Appsignal::Transmitter do
|
|
36
37
|
Socket.stub(:gethostname => 'app1.local')
|
37
38
|
|
38
39
|
Net::HTTP::Post.should_receive(:new).with(
|
39
|
-
|
40
|
-
"gem_version=#{Appsignal::VERSION}"
|
40
|
+
instance.uri.request_uri
|
41
41
|
).and_return(post)
|
42
42
|
instance.send(:http_post, :the => :payload)
|
43
43
|
end
|
data/spec/appsignal_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -26,7 +26,7 @@ module TransactionHelpers
|
|
26
26
|
{
|
27
27
|
:process_action_event => notification_event(
|
28
28
|
:start => fixed_time,
|
29
|
-
:ending => fixed_time + Appsignal.config[:slow_request_threshold] /
|
29
|
+
:ending => fixed_time + Appsignal.config[:slow_request_threshold] / 999.99
|
30
30
|
)
|
31
31
|
}.merge(args)
|
32
32
|
)
|
@@ -37,7 +37,7 @@ module TransactionHelpers
|
|
37
37
|
{
|
38
38
|
:process_action_event => notification_event(
|
39
39
|
:start => fixed_time,
|
40
|
-
:ending => fixed_time + Appsignal.config[:slow_request_threshold] /
|
40
|
+
:ending => fixed_time + Appsignal.config[:slow_request_threshold] / 499.99
|
41
41
|
)
|
42
42
|
}.merge(args)
|
43
43
|
)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appsignal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Beekman
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-06-09 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rails
|
@@ -32,84 +32,84 @@ dependencies:
|
|
32
32
|
name: rake
|
33
33
|
requirement: !ruby/object:Gem::Requirement
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: '0'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
|
-
- -
|
42
|
+
- - '>='
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: '0'
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: json
|
47
47
|
requirement: !ruby/object:Gem::Requirement
|
48
48
|
requirements:
|
49
|
-
- -
|
49
|
+
- - '>='
|
50
50
|
- !ruby/object:Gem::Version
|
51
51
|
version: '0'
|
52
52
|
type: :runtime
|
53
53
|
prerelease: false
|
54
54
|
version_requirements: !ruby/object:Gem::Requirement
|
55
55
|
requirements:
|
56
|
-
- -
|
56
|
+
- - '>='
|
57
57
|
- !ruby/object:Gem::Version
|
58
58
|
version: '0'
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rspec
|
61
61
|
requirement: !ruby/object:Gem::Requirement
|
62
62
|
requirements:
|
63
|
-
- -
|
63
|
+
- - '>='
|
64
64
|
- !ruby/object:Gem::Version
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
68
|
version_requirements: !ruby/object:Gem::Requirement
|
69
69
|
requirements:
|
70
|
-
- -
|
70
|
+
- - '>='
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '0'
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: capistrano
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
76
76
|
requirements:
|
77
|
-
- -
|
77
|
+
- - '>='
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: '0'
|
80
80
|
type: :development
|
81
81
|
prerelease: false
|
82
82
|
version_requirements: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
|
-
- -
|
84
|
+
- - '>='
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: '0'
|
87
87
|
- !ruby/object:Gem::Dependency
|
88
88
|
name: generator_spec
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
type: :development
|
95
95
|
prerelease: false
|
96
96
|
version_requirements: !ruby/object:Gem::Requirement
|
97
97
|
requirements:
|
98
|
-
- -
|
98
|
+
- - '>='
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
- !ruby/object:Gem::Dependency
|
102
102
|
name: pry
|
103
103
|
requirement: !ruby/object:Gem::Requirement
|
104
104
|
requirements:
|
105
|
-
- -
|
105
|
+
- - '>='
|
106
106
|
- !ruby/object:Gem::Version
|
107
107
|
version: '0'
|
108
108
|
type: :development
|
109
109
|
prerelease: false
|
110
110
|
version_requirements: !ruby/object:Gem::Requirement
|
111
111
|
requirements:
|
112
|
-
- -
|
112
|
+
- - '>='
|
113
113
|
- !ruby/object:Gem::Version
|
114
114
|
version: '0'
|
115
115
|
description: The official appsignal.com gem
|
@@ -125,7 +125,7 @@ files:
|
|
125
125
|
- .travis.yml
|
126
126
|
- CHANGELOG.md
|
127
127
|
- Gemfile
|
128
|
-
-
|
128
|
+
- LICENSE
|
129
129
|
- README.md
|
130
130
|
- Rakefile
|
131
131
|
- appsignal.gemspec
|
@@ -193,7 +193,7 @@ files:
|
|
193
193
|
- spec/support/delegate_matcher.rb
|
194
194
|
- spec/support/helpers/notification_helpers.rb
|
195
195
|
- spec/support/helpers/transaction_helpers.rb
|
196
|
-
homepage: http://github.com/
|
196
|
+
homepage: http://github.com/appsignal/appsignal
|
197
197
|
licenses: []
|
198
198
|
metadata: {}
|
199
199
|
post_install_message:
|
@@ -202,12 +202,12 @@ require_paths:
|
|
202
202
|
- lib
|
203
203
|
required_ruby_version: !ruby/object:Gem::Requirement
|
204
204
|
requirements:
|
205
|
-
- -
|
205
|
+
- - '>='
|
206
206
|
- !ruby/object:Gem::Version
|
207
207
|
version: '0'
|
208
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
209
|
requirements:
|
210
|
-
- -
|
210
|
+
- - '>='
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|