appsignal 0.5.5 → 0.6.0.beta.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.
- checksums.yaml +14 -6
- data/.travis.yml +1 -0
- data/Rakefile +2 -0
- data/appsignal.gemspec +1 -1
- data/lib/appsignal.rb +35 -2
- data/lib/appsignal/auth_check.rb +24 -1
- data/lib/appsignal/cli.rb +6 -17
- data/lib/appsignal/exception_notification.rb +5 -5
- data/lib/appsignal/listener.rb +1 -8
- data/lib/appsignal/transaction.rb +1 -1
- data/lib/appsignal/transmitter.rb +11 -9
- data/lib/appsignal/version.rb +1 -1
- data/lib/generators/appsignal/appsignal_generator.rb +6 -27
- data/spec/appsignal/auth_check_spec.rb +43 -20
- data/spec/appsignal/cli_spec.rb +16 -4
- data/spec/appsignal/inactive_railtie_spec.rb +1 -0
- data/spec/appsignal/railtie_spec.rb +9 -2
- data/spec/appsignal/transaction_spec.rb +27 -2
- data/spec/appsignal/transmitter_spec.rb +7 -4
- data/spec/appsignal_spec.rb +34 -0
- data/spec/generators/appsignal/appsignal_generator_spec.rb +13 -7
- data/spec/spec_helper.rb +2 -0
- metadata +19 -19
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MjNjZDg5OTdhZGVjYTJmZDJhODU2ZDg5M2QzMjQ5MzQ0NGUxMmM4Nw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NTRiMWI0ODg1ZDllOTliMzNjMGE4Njc2MjRkYzE1NDA0ZTFlYmRhOQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
M2QxYzYzN2ViNTE5ZjFhMGI5ZDgyZmJjY2I3YjdhMTgxMjM0NTlmNjM0ZDJm
|
10
|
+
NzFhMzg5MWI5MmY0NTE0NTBiNGM2YmFjMGNjZjdmMTJkODBjMTUxYTc0MTVj
|
11
|
+
MGIzOGFkYTNlNzlmODJjM2ZkZjdlZTdmNGU4ZDIzNmY1N2ZmODE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NzdkNmI1NWM4Mjc4Mjc4YzBhODU4YjAwYzA2NjdiNGRjYjBiZmU0M2I1ODg0
|
14
|
+
NjVhMzI5OTkyMzk3OTk5OWMzMTcwZDA0Mjc5ZDYyNjc0MzI0MmYzYTE4ODM0
|
15
|
+
Mzc1NGVkZGVjYjFkYjg2ZjM0ZTU3ODIzOTcxMjJiY2MxOWQ4MTc=
|
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
data/appsignal.gemspec
CHANGED
data/lib/appsignal.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
require "rails" unless defined?(Rails)
|
3
|
+
rescue
|
4
|
+
raise 'This appsignal gem only works with rails'
|
5
|
+
end
|
2
6
|
|
3
7
|
module Appsignal
|
4
8
|
class << self
|
@@ -15,6 +19,27 @@ module Appsignal
|
|
15
19
|
agent.enqueue(transaction)
|
16
20
|
end
|
17
21
|
|
22
|
+
def listen_for_exception(&block)
|
23
|
+
yield
|
24
|
+
rescue Exception => exception
|
25
|
+
send_exception(exception)
|
26
|
+
raise exception
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_exception(exception)
|
30
|
+
unless is_ignored_exception?(exception)
|
31
|
+
Appsignal.agent
|
32
|
+
env = ENV.to_hash
|
33
|
+
|
34
|
+
transaction = Appsignal::Transaction.create(SecureRandom.uuid, env)
|
35
|
+
transaction.add_exception(
|
36
|
+
Appsignal::ExceptionNotification.new(env, exception, false)
|
37
|
+
)
|
38
|
+
transaction.complete!
|
39
|
+
Appsignal.agent.send_queue
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
18
43
|
def transactions
|
19
44
|
@transactions ||= {}
|
20
45
|
end
|
@@ -35,6 +60,10 @@ module Appsignal
|
|
35
60
|
Appsignal.logger << @in_memory_log.string
|
36
61
|
end
|
37
62
|
|
63
|
+
def json
|
64
|
+
ActiveSupport::JSON
|
65
|
+
end
|
66
|
+
|
38
67
|
def logger=(l)
|
39
68
|
@logger = l
|
40
69
|
end
|
@@ -52,13 +81,17 @@ module Appsignal
|
|
52
81
|
def active?
|
53
82
|
config && config[:active] == true
|
54
83
|
end
|
84
|
+
|
85
|
+
def is_ignored_exception?(exception)
|
86
|
+
Array.wrap(Appsignal.config[:ignore_exceptions]).
|
87
|
+
include?(exception.class.name)
|
88
|
+
end
|
55
89
|
end
|
56
90
|
end
|
57
91
|
|
58
92
|
require 'appsignal/agent'
|
59
93
|
require 'appsignal/aggregator'
|
60
94
|
require 'appsignal/auth_check'
|
61
|
-
require 'appsignal/cli'
|
62
95
|
require 'appsignal/config'
|
63
96
|
require 'appsignal/exception_notification'
|
64
97
|
require 'appsignal/integrations/passenger'
|
data/lib/appsignal/auth_check.rb
CHANGED
@@ -4,7 +4,6 @@ module Appsignal
|
|
4
4
|
|
5
5
|
attr_reader :environment, :logger
|
6
6
|
attr_accessor :transmitter
|
7
|
-
delegate :uri, :to => :transmitter
|
8
7
|
|
9
8
|
def initialize(*args)
|
10
9
|
@environment = args.shift
|
@@ -13,6 +12,10 @@ module Appsignal
|
|
13
12
|
@logger = options[:logger]
|
14
13
|
end
|
15
14
|
|
15
|
+
def uri
|
16
|
+
transmitter.uri
|
17
|
+
end
|
18
|
+
|
16
19
|
def config
|
17
20
|
@config ||= Appsignal::Config.new(Rails.root, environment, logger).load
|
18
21
|
end
|
@@ -23,5 +26,25 @@ module Appsignal
|
|
23
26
|
)
|
24
27
|
transmitter.transmit({})
|
25
28
|
end
|
29
|
+
|
30
|
+
def perform_with_result
|
31
|
+
begin
|
32
|
+
status = perform
|
33
|
+
case status
|
34
|
+
when '200'
|
35
|
+
result = 'AppSignal has confirmed authorization!'
|
36
|
+
when '401'
|
37
|
+
result = 'API key not valid with AppSignal...'
|
38
|
+
else
|
39
|
+
result = 'Could not confirm authorization: '\
|
40
|
+
"#{status.nil? ? 'nil' : status}"
|
41
|
+
end
|
42
|
+
[status, result]
|
43
|
+
rescue Exception => e
|
44
|
+
result = 'Something went wrong while trying to '\
|
45
|
+
"authenticate with AppSignal: #{e}"
|
46
|
+
[nil, result]
|
47
|
+
end
|
48
|
+
end
|
26
49
|
end
|
27
50
|
end
|
data/lib/appsignal/cli.rb
CHANGED
@@ -17,7 +17,8 @@ module Appsignal
|
|
17
17
|
def run(argv=ARGV)
|
18
18
|
unless File.exists?(File.join(PROJECT_ROOT, 'config/appsignal.yml'))
|
19
19
|
puts 'No config file present at config/appsignal.yml'
|
20
|
-
puts 'Log in to https://appsignal.com to get instructions on how to
|
20
|
+
puts 'Log in to https://appsignal.com to get instructions on how to '\
|
21
|
+
'generate the config file.'
|
21
22
|
exit(1)
|
22
23
|
end
|
23
24
|
options = {}
|
@@ -36,7 +37,8 @@ module Appsignal
|
|
36
37
|
api_check
|
37
38
|
end
|
38
39
|
else
|
39
|
-
puts "Command '#{command}' does not exist, run appsignal -h to
|
40
|
+
puts "Command '#{command}' does not exist, run appsignal -h to "\
|
41
|
+
"see the help"
|
40
42
|
exit(1)
|
41
43
|
end
|
42
44
|
else
|
@@ -126,21 +128,8 @@ module Appsignal
|
|
126
128
|
)
|
127
129
|
puts "[#{env}]"
|
128
130
|
puts ' * Configured not to monitor this environment' unless config[:active]
|
129
|
-
|
130
|
-
|
131
|
-
case result
|
132
|
-
when '200'
|
133
|
-
puts ' * AppSignal has confirmed authorisation!'
|
134
|
-
when '401'
|
135
|
-
puts ' * API key not valid with AppSignal...'
|
136
|
-
else
|
137
|
-
puts ' * Could not confirm authorisation: '\
|
138
|
-
"#{result.nil? ? 'nil' : result}"
|
139
|
-
end
|
140
|
-
rescue Exception => e
|
141
|
-
puts "Something went wrong while trying to "\
|
142
|
-
"authenticate with AppSignal: #{e}"
|
143
|
-
end
|
131
|
+
status, result = auth_check.perform_with_result
|
132
|
+
puts " * #{result}"
|
144
133
|
end
|
145
134
|
end
|
146
135
|
|
@@ -7,11 +7,11 @@ module Appsignal
|
|
7
7
|
class ExceptionNotification
|
8
8
|
attr_reader :env, :exception, :kontroller, :request, :backtrace
|
9
9
|
|
10
|
-
def initialize(env, exception)
|
11
|
-
@exception
|
12
|
-
@backtrace
|
13
|
-
|
14
|
-
|
10
|
+
def initialize(env, exception, rails_cleaner=true)
|
11
|
+
@exception = exception
|
12
|
+
@backtrace = rails_cleaner && Rails.respond_to?(:backtrace_cleaner) ?
|
13
|
+
Rails.backtrace_cleaner.send(:filter, exception.backtrace) :
|
14
|
+
exception.backtrace
|
15
15
|
end
|
16
16
|
|
17
17
|
def name
|
data/lib/appsignal/listener.rb
CHANGED
@@ -10,7 +10,7 @@ module Appsignal
|
|
10
10
|
Appsignal::Transaction.create(env['action_dispatch.request_id'], env)
|
11
11
|
@app.call(env)
|
12
12
|
rescue Exception => exception
|
13
|
-
unless
|
13
|
+
unless Appsignal.is_ignored_exception?(exception)
|
14
14
|
Appsignal::Transaction.current.add_exception(
|
15
15
|
Appsignal::ExceptionNotification.new(env, exception)
|
16
16
|
)
|
@@ -19,12 +19,5 @@ module Appsignal
|
|
19
19
|
ensure
|
20
20
|
Appsignal::Transaction.current.complete!
|
21
21
|
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def in_ignored_exceptions?(exception)
|
26
|
-
Array.wrap(Appsignal.config[:ignore_exceptions]).
|
27
|
-
include?(exception.class.name)
|
28
|
-
end
|
29
22
|
end
|
30
23
|
end
|
@@ -125,7 +125,7 @@ module Appsignal
|
|
125
125
|
|
126
126
|
def sanitize_session_data!
|
127
127
|
@sanitized_session_data =
|
128
|
-
Appsignal::ParamsSanitizer.sanitize(request.session)
|
128
|
+
Appsignal::ParamsSanitizer.sanitize(request.session.to_hash)
|
129
129
|
@fullpath = request.fullpath
|
130
130
|
end
|
131
131
|
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'net/https'
|
3
3
|
require 'uri'
|
4
|
-
require 'json'
|
5
4
|
require 'rack/utils'
|
6
5
|
|
7
6
|
module Appsignal
|
8
7
|
class Transmitter
|
8
|
+
CONTENT_TYPE = 'application/json; charset=UTF-8'.freeze
|
9
|
+
CONTENT_ENCODING = 'gzip'.freeze
|
10
|
+
CA_FILE_PATH = File.
|
11
|
+
expand_path(File.join(__FILE__, '../../../resources/cacert.pem'))
|
12
|
+
|
9
13
|
attr_reader :endpoint, :action, :api_key
|
10
14
|
|
11
15
|
def initialize(endpoint, action, api_key, logger=nil)
|
@@ -30,14 +34,12 @@ module Appsignal
|
|
30
34
|
|
31
35
|
protected
|
32
36
|
|
33
|
-
def ca_file_path
|
34
|
-
File.expand_path(File.join(__FILE__, '../../../resources/cacert.pem'))
|
35
|
-
end
|
36
|
-
|
37
37
|
def http_post(payload)
|
38
|
-
Net::HTTP::Post.new(uri.request_uri).tap do |
|
39
|
-
|
40
|
-
|
38
|
+
Net::HTTP::Post.new(uri.request_uri).tap do |request|
|
39
|
+
request['Content-Type'] = CONTENT_TYPE
|
40
|
+
request['Content-Encoding'] = CONTENT_ENCODING
|
41
|
+
request.body = Zlib::Deflate.
|
42
|
+
deflate(Appsignal.json.encode(payload), Zlib::BEST_SPEED)
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
@@ -46,7 +48,7 @@ module Appsignal
|
|
46
48
|
if uri.scheme == 'https'
|
47
49
|
http.use_ssl = true
|
48
50
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
49
|
-
http.ca_file =
|
51
|
+
http.ca_file = CA_FILE_PATH
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
data/lib/appsignal/version.rb
CHANGED
@@ -44,20 +44,12 @@ class AppsignalGenerator < Rails::Generators::Base
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def check_key
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
say_status :error, "Push key not valid with AppSignal...", :red
|
54
|
-
else
|
55
|
-
say_status :error, "Could not confirm authorisation: "\
|
56
|
-
"#{result.nil? ? 'nil' : result}", :red
|
57
|
-
end
|
58
|
-
rescue Exception => e
|
59
|
-
say_status :error, "Something went wrong while trying to authenticate "\
|
60
|
-
"with AppSignal: #{e}", :red
|
47
|
+
auth_check = ::Appsignal::AuthCheck.new(environment)
|
48
|
+
status, result = auth_check.perform_with_result
|
49
|
+
if status == '200'
|
50
|
+
say_status :success, result
|
51
|
+
else
|
52
|
+
say_status :error, result, :red
|
61
53
|
end
|
62
54
|
end
|
63
55
|
|
@@ -70,17 +62,4 @@ class AppsignalGenerator < Rails::Generators::Base
|
|
70
62
|
File.join(%w(. config environments *.rb))
|
71
63
|
).map { |o| File.basename(o, ".rb").to_sym } - EXCLUDED_ENVIRONMENTS
|
72
64
|
end
|
73
|
-
|
74
|
-
def environment_setup?(config_file)
|
75
|
-
file_contents = File.read(config_file)
|
76
|
-
file_contents =~ Regexp.new("#{environment}:")
|
77
|
-
end
|
78
|
-
|
79
|
-
# As based on Thor's template method
|
80
|
-
def new_template_content(template_file)
|
81
|
-
source = File.expand_path(find_in_source_paths(template_file.to_s))
|
82
|
-
context = instance_eval('binding')
|
83
|
-
content = ERB.new(::File.binread(source), nil, '-', '@output_buffer').
|
84
|
-
result(context)
|
85
|
-
end
|
86
65
|
end
|
@@ -2,35 +2,58 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Appsignal::AuthCheck do
|
4
4
|
let(:auth_check) { Appsignal::AuthCheck.new('production') }
|
5
|
-
before do
|
6
|
-
@transmitter = mock
|
7
|
-
Appsignal::Transmitter.should_receive(:new).
|
8
|
-
with('http://localhost:3000/1', 'auth', 'def').
|
9
|
-
and_return(@transmitter)
|
10
|
-
end
|
11
5
|
|
12
|
-
describe "#
|
13
|
-
it "should
|
14
|
-
|
15
|
-
auth_check.
|
6
|
+
describe "#perform_with_result" do
|
7
|
+
it "should give success message" do
|
8
|
+
auth_check.should_receive(:perform).and_return('200')
|
9
|
+
auth_check.perform_with_result.should ==
|
10
|
+
['200', 'AppSignal has confirmed authorisation!']
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should give 401 message" do
|
14
|
+
auth_check.should_receive(:perform).and_return('401')
|
15
|
+
auth_check.perform_with_result.should ==
|
16
|
+
['401', 'API key not valid with AppSignal...']
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should give error message" do
|
20
|
+
auth_check.should_receive(:perform).and_return('402')
|
21
|
+
auth_check.perform_with_result.should ==
|
22
|
+
['402', 'Could not confirm authorisation: 402']
|
16
23
|
end
|
17
24
|
end
|
18
25
|
|
19
|
-
|
26
|
+
context "transmitting" do
|
20
27
|
before do
|
21
|
-
@transmitter
|
22
|
-
|
28
|
+
@transmitter = mock
|
29
|
+
Appsignal::Transmitter.should_receive(:new).
|
30
|
+
with('http://localhost:3000/1', 'auth', 'def').
|
31
|
+
and_return(@transmitter)
|
23
32
|
end
|
24
33
|
|
25
|
-
|
26
|
-
|
27
|
-
|
34
|
+
describe "#perform" do
|
35
|
+
it "should not transmit any extra data" do
|
36
|
+
@transmitter.should_receive(:transmit).with({}).and_return({})
|
37
|
+
auth_check.perform
|
38
|
+
end
|
28
39
|
end
|
29
40
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
41
|
+
describe "#uri" do
|
42
|
+
before do
|
43
|
+
@transmitter.should_receive(:transmit)
|
44
|
+
auth_check.perform
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should delegate to transmitter" do
|
48
|
+
@transmitter.should_receive(:uri)
|
49
|
+
auth_check.uri
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return uri" do
|
53
|
+
@transmitter.should_receive(:uri).
|
54
|
+
and_return('http://appsignal.com/1/auth')
|
55
|
+
auth_check.uri.should == 'http://appsignal.com/1/auth'
|
56
|
+
end
|
34
57
|
end
|
35
58
|
end
|
36
59
|
end
|
data/spec/appsignal/cli_spec.rb
CHANGED
@@ -5,7 +5,12 @@ describe Appsignal::CLI do
|
|
5
5
|
let(:error_stream) { StringIO.new }
|
6
6
|
let(:cli) { Appsignal::CLI }
|
7
7
|
before :each do
|
8
|
-
|
8
|
+
@original_stdout, @original_stderr = $stdout, $stderr
|
9
|
+
$stdout, $stderr = out_stream, error_stream
|
10
|
+
end
|
11
|
+
after :each do
|
12
|
+
$stdout = @original_stdout
|
13
|
+
$stderr = @original_stderr
|
9
14
|
end
|
10
15
|
|
11
16
|
describe "#logger" do
|
@@ -89,7 +94,7 @@ describe Appsignal::CLI do
|
|
89
94
|
end
|
90
95
|
end
|
91
96
|
|
92
|
-
describe "api_check" do
|
97
|
+
describe "#api_check" do
|
93
98
|
it "should detect configured environments" do
|
94
99
|
authcheck = double
|
95
100
|
Appsignal::AuthCheck.should_receive(:new).with(
|
@@ -105,8 +110,15 @@ describe Appsignal::CLI do
|
|
105
110
|
kind_of(Hash)
|
106
111
|
).and_return(authcheck)
|
107
112
|
|
108
|
-
authcheck.should_receive(:
|
109
|
-
|
113
|
+
authcheck.should_receive(:perform_with_result).exactly(3).times.
|
114
|
+
and_return(['200', 'result'])
|
115
|
+
cli.run([
|
116
|
+
'api_check'
|
117
|
+
])
|
118
|
+
out_stream.string.should =~ /\[development\]/
|
119
|
+
out_stream.string.should =~ /\[production\]/
|
120
|
+
out_stream.string.should =~ /\[test\]/
|
121
|
+
out_stream.string.should =~ /\* result/
|
110
122
|
end
|
111
123
|
end
|
112
124
|
|
@@ -19,8 +19,15 @@ describe Appsignal::Railtie do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should have set the appsignal subscriber" do
|
22
|
-
|
23
|
-
|
22
|
+
if defined? ActiveSupport::Notifications::Fanout::Subscribers::Timed
|
23
|
+
# Rails 4
|
24
|
+
Appsignal.subscriber.
|
25
|
+
should be_a ActiveSupport::Notifications::Fanout::Subscribers::Timed
|
26
|
+
else
|
27
|
+
# Rails 3
|
28
|
+
Appsignal.subscriber.
|
29
|
+
should be_a ActiveSupport::Notifications::Fanout::Subscriber
|
30
|
+
end
|
24
31
|
end
|
25
32
|
|
26
33
|
it "should have added the listener middleware for exceptions" do
|
@@ -305,12 +305,12 @@ describe Appsignal::Transaction do
|
|
305
305
|
subject { transaction.send(:sanitize_session_data!) }
|
306
306
|
before do
|
307
307
|
transaction.should respond_to(:request)
|
308
|
-
transaction.stub_chain(:request, :session => :foo)
|
308
|
+
transaction.stub_chain(:request, :session => {:foo => :bar})
|
309
309
|
transaction.stub_chain(:request, :fullpath => :bar)
|
310
310
|
end
|
311
311
|
|
312
312
|
it "passes the session data into the params sanitizer" do
|
313
|
-
Appsignal::ParamsSanitizer.should_receive(:sanitize).with(:foo).
|
313
|
+
Appsignal::ParamsSanitizer.should_receive(:sanitize).with({:foo => :bar}).
|
314
314
|
and_return(:sanitized_foo)
|
315
315
|
subject
|
316
316
|
transaction.sanitized_session_data.should == :sanitized_foo
|
@@ -319,6 +319,31 @@ describe Appsignal::Transaction do
|
|
319
319
|
it "sets the fullpath of the request" do
|
320
320
|
expect { subject }.to change(transaction, :fullpath).to(:bar)
|
321
321
|
end
|
322
|
+
|
323
|
+
if defined? ActionDispatch::Request::Session
|
324
|
+
context "with ActionDispatch::Request::Session" do
|
325
|
+
before do
|
326
|
+
transaction.should respond_to(:request)
|
327
|
+
transaction.stub_chain(:request, :session => action_dispatch_session)
|
328
|
+
transaction.stub_chain(:request, :fullpath => :bar)
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should return an session hash" do
|
332
|
+
Appsignal::ParamsSanitizer.should_receive(:sanitize).with({'foo' => :bar}).
|
333
|
+
and_return(:sanitized_foo)
|
334
|
+
subject
|
335
|
+
end
|
336
|
+
|
337
|
+
|
338
|
+
def action_dispatch_session
|
339
|
+
store = Class.new {
|
340
|
+
def load_session(env); [1, {:foo => :bar}]; end
|
341
|
+
def session_exists?(env); true; end
|
342
|
+
}.new
|
343
|
+
ActionDispatch::Request::Session.create(store, {}, {})
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
322
347
|
end
|
323
348
|
end
|
324
349
|
end
|
@@ -33,7 +33,10 @@ describe Appsignal::Transmitter do
|
|
33
33
|
post = mock(:post)
|
34
34
|
post.should_receive(:[]=).
|
35
35
|
with('Content-Type', 'application/json; charset=UTF-8')
|
36
|
-
post.should_receive(:
|
36
|
+
post.should_receive(:[]=).
|
37
|
+
with('Content-Encoding', 'gzip')
|
38
|
+
post.should_receive(:body=).
|
39
|
+
with(Zlib::Deflate.deflate("{\"the\":\"payload\"}", Zlib::BEST_SPEED))
|
37
40
|
Socket.stub(:gethostname => 'app1.local')
|
38
41
|
|
39
42
|
Net::HTTP::Post.should_receive(:new).with(
|
@@ -43,8 +46,8 @@ describe Appsignal::Transmitter do
|
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
46
|
-
describe "
|
47
|
-
subject {
|
49
|
+
describe ".CA_FILE_PATH" do
|
50
|
+
subject { Appsignal::Transmitter::CA_FILE_PATH }
|
48
51
|
|
49
52
|
it { should include('resources/cacert.pem') }
|
50
53
|
it("should exist") { File.exists?(subject).should be_true }
|
@@ -64,7 +67,7 @@ describe Appsignal::Transmitter do
|
|
64
67
|
|
65
68
|
its(:use_ssl?) { should be_true }
|
66
69
|
its(:verify_mode) { should == OpenSSL::SSL::VERIFY_PEER }
|
67
|
-
its(:ca_file) {
|
70
|
+
its(:ca_file) { Appsignal::Transmitter::CA_FILE_PATH }
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
data/spec/appsignal_spec.rb
CHANGED
@@ -53,6 +53,12 @@ describe Appsignal do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
describe ".json" do
|
57
|
+
subject { Appsignal.json }
|
58
|
+
|
59
|
+
it { should == ActiveSupport::JSON }
|
60
|
+
end
|
61
|
+
|
56
62
|
describe ".post_processing_middleware" do
|
57
63
|
before { Appsignal.instance_variable_set(:@post_processing_chain, nil) }
|
58
64
|
|
@@ -96,4 +102,32 @@ describe Appsignal do
|
|
96
102
|
it { should be_true }
|
97
103
|
end
|
98
104
|
end
|
105
|
+
|
106
|
+
describe ".send_exception" do
|
107
|
+
it "should raise exception" do
|
108
|
+
agent = mock
|
109
|
+
Appsignal.should_receive(:agent).exactly(3).times.and_return(agent)
|
110
|
+
agent.should_receive(:send_queue)
|
111
|
+
agent.should_receive(:enqueue).with(kind_of(Appsignal::Transaction))
|
112
|
+
|
113
|
+
Appsignal::Transaction.should_receive(:create).and_call_original
|
114
|
+
|
115
|
+
begin
|
116
|
+
raise "I am an exception"
|
117
|
+
rescue Exception => e
|
118
|
+
Appsignal.send_exception(e)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe ".listen_for_exception" do
|
124
|
+
it "should raise exception" do
|
125
|
+
Appsignal.should_receive(:send_exception).with(kind_of(Exception))
|
126
|
+
lambda {
|
127
|
+
Appsignal.listen_for_exception do
|
128
|
+
raise "I am an exception"
|
129
|
+
end
|
130
|
+
}.should raise_error(RuntimeError, "I am an exception")
|
131
|
+
end
|
132
|
+
end
|
99
133
|
end
|
@@ -21,12 +21,13 @@ describe AppsignalGenerator do
|
|
21
21
|
prepare_destination
|
22
22
|
authcheck = mock()
|
23
23
|
Appsignal::AuthCheck.should_receive(:new).and_return(authcheck)
|
24
|
-
authcheck.should_receive(:
|
24
|
+
authcheck.should_receive(:perform_with_result).
|
25
|
+
and_return(['200', 'everything ok'])
|
25
26
|
run_generator_in_tmp %w(production my_app_key)
|
26
27
|
end
|
27
28
|
|
28
29
|
specify "should mention successful auth check" do
|
29
|
-
@output.should include('
|
30
|
+
@output.should include('success everything ok')
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -35,12 +36,13 @@ describe AppsignalGenerator do
|
|
35
36
|
prepare_destination
|
36
37
|
authcheck = mock()
|
37
38
|
Appsignal::AuthCheck.should_receive(:new).and_return(authcheck)
|
38
|
-
authcheck.should_receive(:
|
39
|
+
authcheck.should_receive(:perform_with_result).
|
40
|
+
and_return(['401', 'unauthorized'])
|
39
41
|
run_generator_in_tmp %w(production my_app_key)
|
40
42
|
end
|
41
43
|
|
42
44
|
specify "should mention invalid key" do
|
43
|
-
@output.should include('
|
45
|
+
@output.should include('error unauthorized')
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
@@ -49,19 +51,23 @@ describe AppsignalGenerator do
|
|
49
51
|
prepare_destination
|
50
52
|
authcheck = mock()
|
51
53
|
Appsignal::AuthCheck.should_receive(:new).and_return(authcheck)
|
52
|
-
authcheck.should_receive(:
|
54
|
+
authcheck.should_receive(:perform_with_result).
|
55
|
+
and_return(['500', 'error!'])
|
53
56
|
run_generator_in_tmp %w(production my_app_key)
|
54
57
|
end
|
55
58
|
|
56
59
|
specify "should mention failed check" do
|
57
|
-
@output.should include('error
|
60
|
+
@output.should include('error error!')
|
58
61
|
end
|
59
62
|
end
|
60
63
|
|
61
64
|
context "internal failure" do
|
62
65
|
before do
|
63
66
|
prepare_destination
|
64
|
-
Appsignal::AuthCheck.
|
67
|
+
authcheck = Appsignal::AuthCheck.new
|
68
|
+
Appsignal::AuthCheck.should_receive(:new).and_return(authcheck)
|
69
|
+
authcheck.should_receive(:perform).
|
70
|
+
and_throw(:error)
|
65
71
|
run_generator_in_tmp %w(production my_app_key)
|
66
72
|
end
|
67
73
|
|
data/spec/spec_helper.rb
CHANGED
@@ -13,6 +13,7 @@ end
|
|
13
13
|
module MyApp
|
14
14
|
class Application < Rails::Application
|
15
15
|
config.active_support.deprecation = proc { |message, stack| }
|
16
|
+
config.eager_load = false
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -21,6 +22,7 @@ def log_file
|
|
21
22
|
end
|
22
23
|
|
23
24
|
require 'appsignal'
|
25
|
+
require 'appsignal/cli'
|
24
26
|
|
25
27
|
RSpec.configure do |config|
|
26
28
|
config.include TransactionHelpers
|
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.
|
4
|
+
version: 0.6.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Beekman
|
@@ -12,104 +12,104 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-06-
|
15
|
+
date: 2013-06-18 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rails
|
19
19
|
requirement: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- -
|
21
|
+
- - ! '>='
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: '3.0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- -
|
28
|
+
- - ! '>='
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '3.0'
|
31
31
|
- !ruby/object:Gem::Dependency
|
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
|
@@ -202,14 +202,14 @@ 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
|
-
version:
|
212
|
+
version: 1.3.1
|
213
213
|
requirements: []
|
214
214
|
rubyforge_project:
|
215
215
|
rubygems_version: 2.0.3
|