appsignal 0.12.beta.31 → 0.12.beta.32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -0
- data/Rakefile +1 -0
- data/benchmark.rake +20 -20
- data/ext/appsignal_extension.c +31 -23
- data/gemfiles/padrino.gemfile +7 -0
- data/lib/appsignal.rb +50 -27
- data/lib/appsignal/capistrano.rb +2 -1
- data/lib/appsignal/config.rb +94 -39
- data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +12 -17
- data/lib/appsignal/integrations/padrino.rb +65 -0
- data/lib/appsignal/integrations/rails.rb +4 -2
- data/lib/appsignal/integrations/rake.rb +30 -0
- data/lib/appsignal/integrations/sidekiq.rb +2 -2
- data/lib/appsignal/integrations/sinatra.rb +0 -1
- data/lib/appsignal/js_exception_transaction.rb +4 -9
- data/lib/appsignal/params_sanitizer.rb +8 -5
- data/lib/appsignal/rack/rails_instrumentation.rb +41 -0
- data/lib/appsignal/rack/sinatra_instrumentation.rb +31 -24
- data/lib/appsignal/subscriber.rb +2 -9
- data/lib/appsignal/transaction.rb +86 -75
- data/lib/appsignal/transmitter.rb +30 -3
- data/lib/appsignal/version.rb +2 -2
- data/spec/lib/appsignal/cli_spec.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +38 -131
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +27 -29
- data/spec/lib/appsignal/extension_spec.rb +11 -29
- data/spec/lib/appsignal/integrations/padrino_spec.rb +191 -0
- data/spec/lib/appsignal/integrations/rails_spec.rb +3 -4
- data/spec/lib/appsignal/integrations/rake_spec.rb +78 -0
- data/spec/lib/appsignal/integrations/resque_spec.rb +2 -2
- data/spec/lib/appsignal/integrations/sequel_spec.rb +2 -3
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +22 -5
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +0 -6
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +4 -6
- data/spec/lib/appsignal/params_sanitizer_spec.rb +27 -11
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +79 -0
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +71 -71
- data/spec/lib/appsignal/subscriber_spec.rb +3 -37
- data/spec/lib/appsignal/transaction_spec.rb +290 -155
- data/spec/lib/appsignal/transmitter_spec.rb +10 -0
- data/spec/lib/appsignal_spec.rb +80 -47
- data/spec/spec_helper.rb +21 -2
- data/spec/support/helpers/env_helpers.rb +31 -0
- data/spec/support/helpers/notification_helpers.rb +1 -30
- data/spec/support/helpers/transaction_helpers.rb +7 -7
- data/spec/support/project_fixture/config/appsignal.yml +2 -0
- metadata +14 -8
- data/lib/appsignal/rack/instrumentation.rb +0 -32
- data/lib/appsignal/rack/listener.rb +0 -32
- data/spec/lib/appsignal/rack/instrumentation_spec.rb +0 -72
- data/spec/lib/appsignal/rack/listener_spec.rb +0 -104
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3904c5300ef30db2a6f5c8eaadce8e7a1ac7a5b6
|
4
|
+
data.tar.gz: dc5d9e98c1eaabaf84eacb629e490f6494819bf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66c82fe27b587026438c1608735dbd29e80ba2d475fb9057d33bb7b66b60a55c8347ee4fe92544a2b8bb74d0f8adb4e446bd392f59fb139a1ec48e715f7bf89b
|
7
|
+
data.tar.gz: 2e67ade5b8bb20aa9c28728590f0bf490f90806420804151c66f9952c11105e300c08e2467cf98199448738455e89a5d2217b40b81dc23e3167a873d07412408
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,29 @@
|
|
3
3
|
* Use native library and agent
|
4
4
|
* Use API V2
|
5
5
|
|
6
|
+
# 0.11.15
|
7
|
+
* Improve Sinatra support
|
8
|
+
|
9
|
+
# 0.11.14
|
10
|
+
* Support ActiveJob wrapped jobs
|
11
|
+
* Improve proxy support
|
12
|
+
* Improve rake support
|
13
|
+
|
14
|
+
# 0.11.13
|
15
|
+
* Add Padrino support
|
16
|
+
* Add Rake task monitoring
|
17
|
+
* Add http proxy support
|
18
|
+
* Configure Net::HTTP to only use TLS
|
19
|
+
* Don't send queue if there is no content
|
20
|
+
* Don't retry transmission when response code is 400 (no content)
|
21
|
+
* Don't start Resque IPC server when AppSignal is not active
|
22
|
+
* Display warning message when attempting to send a non-exception to `send_exception`
|
23
|
+
* Fix capistrano 2 detection
|
24
|
+
* Fix issue with Sinatra integration attempting to attach an exception to a transaction that doesn't exist.
|
25
|
+
|
26
|
+
# 0.11.12
|
27
|
+
* Sanitizer will no longer inspect unknown objects, since implementations of inspect sometimes trigger unexpected behavior.
|
28
|
+
|
6
29
|
# 0.11.11
|
7
30
|
* Reliably get errors in production for Sinatra
|
8
31
|
|
data/Rakefile
CHANGED
data/benchmark.rake
CHANGED
@@ -7,6 +7,8 @@ end
|
|
7
7
|
|
8
8
|
GC.disable
|
9
9
|
|
10
|
+
task :default => :'benchmark:all'
|
11
|
+
|
10
12
|
namespace :benchmark do
|
11
13
|
task :all => [:run_inactive, :run_active] do
|
12
14
|
end
|
@@ -37,33 +39,31 @@ def run_benchmark
|
|
37
39
|
puts "Running #{no_transactions} normal transactions"
|
38
40
|
puts(Benchmark.measure do
|
39
41
|
no_transactions.times do |i|
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
request = Appsignal::Transaction::GenericRequest.new(
|
43
|
+
:controller => 'HomeController',
|
44
|
+
:action => 'show',
|
45
|
+
:params => {:id => 1}
|
46
|
+
)
|
47
|
+
Appsignal::Transaction.create("transaction_#{i}", Appsignal::Transaction::HTTP_REQUEST, request)
|
43
48
|
|
44
|
-
ActiveSupport::Notifications.instrument('
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
+
ActiveSupport::Notifications.instrument('process_action.action_controller') do
|
50
|
+
ActiveSupport::Notifications.instrument('sql.active_record', :sql => 'SELECT `users`.* FROM `users`
|
51
|
+
WHERE `users`.`id` = ?')
|
52
|
+
10.times do
|
53
|
+
ActiveSupport::Notifications.instrument('sql.active_record', :sql => 'SELECT `todos`.* FROM `todos` WHERE `todos`.`id` = ?')
|
54
|
+
end
|
49
55
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
56
|
+
ActiveSupport::Notifications.instrument('render_template.action_view', :identifier => 'app/views/home/show.html.erb') do
|
57
|
+
5.times do
|
58
|
+
ActiveSupport::Notifications.instrument('render_partial.action_view', :identifier => 'app/views/home/_piece.html.erb') do
|
59
|
+
3.times do
|
60
|
+
ActiveSupport::Notifications.instrument('cache.read')
|
61
|
+
end
|
55
62
|
end
|
56
63
|
end
|
57
64
|
end
|
58
65
|
end
|
59
66
|
|
60
|
-
ActiveSupport::Notifications.instrument(
|
61
|
-
'process_action.action_controller',
|
62
|
-
:controller => 'HomeController',
|
63
|
-
:action => 'show',
|
64
|
-
:params => {:id => 1}
|
65
|
-
)
|
66
|
-
|
67
67
|
Appsignal::Transaction.complete_current!
|
68
68
|
end
|
69
69
|
puts 'Finished'
|
data/ext/appsignal_extension.c
CHANGED
@@ -19,10 +19,10 @@ static VALUE stop_extension(VALUE self) {
|
|
19
19
|
return Qnil;
|
20
20
|
}
|
21
21
|
|
22
|
-
static VALUE start_transaction(VALUE self, VALUE transaction_id) {
|
22
|
+
static VALUE start_transaction(VALUE self, VALUE transaction_id, VALUE namespace) {
|
23
23
|
Check_Type(transaction_id, T_STRING);
|
24
24
|
|
25
|
-
return INT2FIX(appsignal_start_transaction(StringValueCStr(transaction_id)));
|
25
|
+
return INT2FIX(appsignal_start_transaction(StringValueCStr(transaction_id), StringValueCStr(namespace)));
|
26
26
|
}
|
27
27
|
|
28
28
|
static VALUE start_event(VALUE self, VALUE transaction_index) {
|
@@ -73,16 +73,23 @@ static VALUE set_transaction_error_data(VALUE self, VALUE transaction_index, VAL
|
|
73
73
|
return Qnil;
|
74
74
|
}
|
75
75
|
|
76
|
-
static VALUE
|
76
|
+
static VALUE set_transaction_action(VALUE self, VALUE transaction_index, VALUE action) {
|
77
77
|
Check_Type(transaction_index, T_FIXNUM);
|
78
|
-
Check_Type(namespace, T_STRING);
|
79
78
|
Check_Type(action, T_STRING);
|
79
|
+
|
80
|
+
appsignal_set_transaction_action(
|
81
|
+
FIX2INT(transaction_index),
|
82
|
+
StringValueCStr(action)
|
83
|
+
);
|
84
|
+
return Qnil;
|
85
|
+
}
|
86
|
+
|
87
|
+
static VALUE set_transaction_queue_start(VALUE self, VALUE transaction_index, VALUE queue_start) {
|
88
|
+
Check_Type(transaction_index, T_FIXNUM);
|
80
89
|
Check_Type(queue_start, T_FIXNUM);
|
81
90
|
|
82
|
-
|
91
|
+
appsignal_set_transaction_queue_start(
|
83
92
|
FIX2INT(transaction_index),
|
84
|
-
StringValueCStr(namespace),
|
85
|
-
StringValueCStr(action),
|
86
93
|
FIX2LONG(queue_start)
|
87
94
|
);
|
88
95
|
return Qnil;
|
@@ -214,24 +221,25 @@ void Init_appsignal_extension(void) {
|
|
214
221
|
VALUE Extension = rb_define_class_under(Appsignal, "Extension", rb_cObject);
|
215
222
|
|
216
223
|
// Transaction monitoring
|
217
|
-
rb_define_singleton_method(Extension, "start",
|
218
|
-
rb_define_singleton_method(Extension, "stop_agent",
|
219
|
-
rb_define_singleton_method(Extension, "stop_extension",
|
220
|
-
rb_define_singleton_method(Extension, "start_transaction",
|
221
|
-
rb_define_singleton_method(Extension, "start_event",
|
222
|
-
rb_define_singleton_method(Extension, "finish_event",
|
223
|
-
rb_define_singleton_method(Extension, "set_transaction_error",
|
224
|
-
rb_define_singleton_method(Extension, "set_transaction_error_data",
|
225
|
-
rb_define_singleton_method(Extension, "
|
226
|
-
rb_define_singleton_method(Extension, "
|
227
|
-
rb_define_singleton_method(Extension, "
|
224
|
+
rb_define_singleton_method(Extension, "start", start, 0);
|
225
|
+
rb_define_singleton_method(Extension, "stop_agent", stop_agent, 0);
|
226
|
+
rb_define_singleton_method(Extension, "stop_extension", stop_extension, 0);
|
227
|
+
rb_define_singleton_method(Extension, "start_transaction", start_transaction, 2);
|
228
|
+
rb_define_singleton_method(Extension, "start_event", start_event, 1);
|
229
|
+
rb_define_singleton_method(Extension, "finish_event", finish_event, 4);
|
230
|
+
rb_define_singleton_method(Extension, "set_transaction_error", set_transaction_error, 3);
|
231
|
+
rb_define_singleton_method(Extension, "set_transaction_error_data", set_transaction_error_data, 3);
|
232
|
+
rb_define_singleton_method(Extension, "set_transaction_action", set_transaction_action, 2);
|
233
|
+
rb_define_singleton_method(Extension, "set_transaction_queue_start", set_transaction_queue_start, 2);
|
234
|
+
rb_define_singleton_method(Extension, "set_transaction_metadata", set_transaction_metadata, 3);
|
235
|
+
rb_define_singleton_method(Extension, "finish_transaction", finish_transaction, 1);
|
228
236
|
|
229
237
|
// Metrics
|
230
|
-
rb_define_singleton_method(Extension, "set_gauge",
|
231
|
-
rb_define_singleton_method(Extension, "set_host_gauge",
|
232
|
-
rb_define_singleton_method(Extension, "set_process_gauge",
|
233
|
-
rb_define_singleton_method(Extension, "increment_counter",
|
234
|
-
rb_define_singleton_method(Extension, "add_distribution_value",
|
238
|
+
rb_define_singleton_method(Extension, "set_gauge", set_gauge, 2);
|
239
|
+
rb_define_singleton_method(Extension, "set_host_gauge", set_host_gauge, 2);
|
240
|
+
rb_define_singleton_method(Extension, "set_process_gauge", set_process_gauge, 2);
|
241
|
+
rb_define_singleton_method(Extension, "increment_counter", increment_counter, 2);
|
242
|
+
rb_define_singleton_method(Extension, "add_distribution_value", add_distribution_value, 2);
|
235
243
|
|
236
244
|
// Event hooks
|
237
245
|
install_event_hooks();
|
data/lib/appsignal.rb
CHANGED
@@ -68,53 +68,74 @@ module Appsignal
|
|
68
68
|
Appsignal::Extension.stop_extension
|
69
69
|
end
|
70
70
|
|
71
|
-
|
72
|
-
def monitor_transaction(name, payload={})
|
71
|
+
def monitor_transaction(name, env={})
|
73
72
|
unless active?
|
74
73
|
yield
|
75
74
|
return
|
76
75
|
end
|
77
76
|
|
77
|
+
if name.start_with?('perform_job'.freeze)
|
78
|
+
namespace = Appsignal::Transaction::BACKGROUND_JOB
|
79
|
+
request = Appsignal::Transaction::GenericRequest.new(env)
|
80
|
+
elsif name.start_with?('process_action'.freeze)
|
81
|
+
namespace = Appsignal::Transaction::HTTP_REQUEST
|
82
|
+
request = ::Rack::Request.new(env)
|
83
|
+
else
|
84
|
+
logger.error("Unrecognized name '#{name}'") and return
|
85
|
+
end
|
86
|
+
transaction = Appsignal::Transaction.create(
|
87
|
+
SecureRandom.uuid,
|
88
|
+
namespace,
|
89
|
+
request
|
90
|
+
)
|
78
91
|
begin
|
79
|
-
|
80
|
-
ActiveSupport::Notifications.instrument(name, payload) do
|
92
|
+
ActiveSupport::Notifications.instrument(name) do
|
81
93
|
yield
|
82
94
|
end
|
83
|
-
rescue =>
|
84
|
-
|
85
|
-
raise
|
95
|
+
rescue => error
|
96
|
+
transaction.set_error(error)
|
97
|
+
raise error
|
86
98
|
ensure
|
99
|
+
transaction.set_http_or_background_action(request.env)
|
100
|
+
transaction.set_http_or_background_queue_start
|
87
101
|
Appsignal::Transaction.complete_current!
|
88
102
|
end
|
89
103
|
end
|
90
104
|
|
91
|
-
def
|
105
|
+
def listen_for_error(&block)
|
92
106
|
yield
|
93
|
-
rescue
|
94
|
-
|
95
|
-
raise
|
107
|
+
rescue => error
|
108
|
+
send_error(error)
|
109
|
+
raise error
|
96
110
|
end
|
111
|
+
alias :listen_for_exception :listen_for_error
|
97
112
|
|
98
|
-
def
|
99
|
-
return if !active? ||
|
100
|
-
|
113
|
+
def send_error(error, tags=nil, namespace=Appsignal::Transaction::HTTP_REQUEST)
|
114
|
+
return if !active? || is_ignored_error?(error)
|
115
|
+
unless error.is_a?(Exception)
|
116
|
+
logger.error('Can\'t send error, given value is not an exception')
|
117
|
+
return
|
118
|
+
end
|
119
|
+
transaction = Appsignal::Transaction.create(
|
120
|
+
SecureRandom.uuid,
|
121
|
+
namespace,
|
122
|
+
Appsignal::Transaction::GenericRequest.new({})
|
123
|
+
)
|
101
124
|
transaction.set_tags(tags) if tags
|
102
|
-
transaction.set_error(
|
125
|
+
transaction.set_error(error)
|
103
126
|
Appsignal::Transaction.complete_current!
|
104
127
|
end
|
128
|
+
alias :send_exception :send_error
|
105
129
|
|
106
|
-
def
|
107
|
-
warn '[DEPRECATION] add_exception is deprecated, use set_exception instead'
|
108
|
-
set_exception(exception)
|
109
|
-
end
|
110
|
-
|
111
|
-
def set_exception(exception)
|
130
|
+
def set_error(exception)
|
112
131
|
return if !active? ||
|
113
132
|
Appsignal::Transaction.current.nil? ||
|
114
133
|
exception.nil? ||
|
115
|
-
|
134
|
+
is_ignored_error?(exception)
|
116
135
|
Appsignal::Transaction.current.set_error(exception)
|
117
136
|
end
|
137
|
+
alias :set_exception :set_error
|
138
|
+
alias :add_exception :set_error
|
118
139
|
|
119
140
|
def tag_request(params={})
|
120
141
|
return unless active?
|
@@ -178,9 +199,10 @@ module Appsignal
|
|
178
199
|
config && config.active?
|
179
200
|
end
|
180
201
|
|
181
|
-
def
|
182
|
-
Appsignal.config[:
|
202
|
+
def is_ignored_error?(error)
|
203
|
+
Appsignal.config[:ignore_errors].include?(error.class.name)
|
183
204
|
end
|
205
|
+
alias :is_ignored_exception? :is_ignored_error?
|
184
206
|
|
185
207
|
def is_ignored_action?(action)
|
186
208
|
Appsignal.config[:ignore_actions].include?(action)
|
@@ -208,8 +230,9 @@ require 'appsignal/subscriber'
|
|
208
230
|
require 'appsignal/transaction'
|
209
231
|
require 'appsignal/version'
|
210
232
|
require 'appsignal/rack/js_exception_catcher'
|
211
|
-
require 'appsignal/rack/listener'
|
212
|
-
require 'appsignal/rack/instrumentation'
|
213
|
-
require 'appsignal/integrations/rails'
|
214
233
|
require 'appsignal/js_exception_transaction'
|
215
234
|
require 'appsignal/transmitter'
|
235
|
+
|
236
|
+
# This needs to be required immediately, that's why it's
|
237
|
+
# not in load_integrations
|
238
|
+
require 'appsignal/integrations/rails'
|
data/lib/appsignal/capistrano.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'appsignal'
|
2
|
+
require 'capistrano/version'
|
2
3
|
|
3
|
-
if defined?(Capistrano::VERSION)
|
4
|
+
if defined?(Capistrano::VERSION) && Gem::Version.new(Capistrano::VERSION) >= Gem::Version.new(3)
|
4
5
|
# Capistrano 3+
|
5
6
|
load File.expand_path('../integrations/capistrano/appsignal.cap', __FILE__)
|
6
7
|
else
|
data/lib/appsignal/config.rb
CHANGED
@@ -8,7 +8,7 @@ module Appsignal
|
|
8
8
|
|
9
9
|
DEFAULT_CONFIG = {
|
10
10
|
:debug => false,
|
11
|
-
:
|
11
|
+
:ignore_errors => [],
|
12
12
|
:ignore_actions => [],
|
13
13
|
:send_params => true,
|
14
14
|
:endpoint => 'https://push.appsignal.com',
|
@@ -18,6 +18,21 @@ module Appsignal
|
|
18
18
|
:frontend_error_catching_path => '/appsignal_error_catcher'
|
19
19
|
}.freeze
|
20
20
|
|
21
|
+
ENV_TO_KEY_MAPPING = {
|
22
|
+
'APPSIGNAL_ACTIVE' => :active,
|
23
|
+
'APPSIGNAL_PUSH_API_KEY' => :push_api_key,
|
24
|
+
'APPSIGNAL_APP_NAME' => :name,
|
25
|
+
'APPSIGNAL_PUSH_API_ENDPOINT' => :endpoint,
|
26
|
+
'APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH' => :frontend_error_catching_path,
|
27
|
+
'APPSIGNAL_DEBUG' => :debug,
|
28
|
+
'APPSIGNAL_INSTRUMENT_NET_HTTP' => :instrument_net_http,
|
29
|
+
'APPSIGNAL_SKIP_SESSION_DATA' => :skip_session_data,
|
30
|
+
'APPSIGNAL_ENABLE_FRONTEND_ERROR_CATCHING' => :enable_frontend_error_catching,
|
31
|
+
'APPSIGNAL_IGNORE_ERRORS' => :ignore_errors,
|
32
|
+
'APPSIGNAL_IGNORE_ACTIONS' => :ignore_actions,
|
33
|
+
'APPSIGNAL_HTTP_PROXY' => :http_proxy
|
34
|
+
}.freeze
|
35
|
+
|
21
36
|
attr_reader :root_path, :env, :initial_config, :config_hash
|
22
37
|
|
23
38
|
def initialize(root_path, env, initial_config={}, logger=Appsignal.logger)
|
@@ -25,46 +40,33 @@ module Appsignal
|
|
25
40
|
@env = env.to_s
|
26
41
|
@initial_config = initial_config
|
27
42
|
@logger = logger
|
43
|
+
@valid = false
|
44
|
+
|
45
|
+
# Initial config
|
46
|
+
@config_hash = DEFAULT_CONFIG.merge(initial_config)
|
28
47
|
|
48
|
+
# Load config from environment variables
|
49
|
+
load_from_environment
|
50
|
+
|
51
|
+
# Load the config file if it exists
|
29
52
|
if File.exists?(config_file)
|
30
|
-
|
31
|
-
elsif ENV['APPSIGNAL_PUSH_API_KEY']
|
32
|
-
load_default_config_with_push_api_key_and_name_from_env(
|
33
|
-
ENV['APPSIGNAL_PUSH_API_KEY']
|
34
|
-
)
|
35
|
-
elsif ENV['APPSIGNAL_API_KEY']
|
36
|
-
load_default_config_with_push_api_key_and_name_from_env(
|
37
|
-
ENV['APPSIGNAL_API_KEY']
|
38
|
-
)
|
39
|
-
@logger.info(
|
40
|
-
'The APPSIGNAL_API_KEY environment variable has been deprecated, ' \
|
41
|
-
'please switch to APPSIGNAL_PUSH_API_KEY'
|
42
|
-
)
|
43
|
-
else
|
44
|
-
carefully_log_error(
|
45
|
-
"Not loading: No config file found at '#{config_file}' " \
|
46
|
-
"and no APPSIGNAL_PUSH_API_KEY env var present"
|
47
|
-
)
|
53
|
+
load_from_disk
|
48
54
|
end
|
49
|
-
if config_hash && !config_hash[:name]
|
50
|
-
@logger.debug(
|
51
|
-
"There's no application name set in your config file or in the APPSIGNAL_APP_NAME env var. " \
|
52
|
-
"You should set one unless your app runs on Heroku."
|
53
|
-
)
|
54
|
-
end
|
55
|
-
end
|
56
55
|
|
57
|
-
|
58
|
-
|
56
|
+
# Validate that we have a correct config
|
57
|
+
validate
|
59
58
|
end
|
60
59
|
|
61
60
|
def [](key)
|
62
|
-
return unless loaded?
|
63
61
|
config_hash[key]
|
64
62
|
end
|
65
63
|
|
64
|
+
def valid?
|
65
|
+
@valid
|
66
|
+
end
|
67
|
+
|
66
68
|
def active?
|
67
|
-
|
69
|
+
@valid && self[:active]
|
68
70
|
end
|
69
71
|
|
70
72
|
def write_to_environment
|
@@ -72,12 +74,14 @@ module Appsignal
|
|
72
74
|
ENV['APPSIGNAL_APP_PATH'] = root_path.to_s
|
73
75
|
ENV['APPSIGNAL_AGENT_PATH'] = File.expand_path('../../../ext', __FILE__).to_s
|
74
76
|
ENV['APPSIGNAL_LOG_PATH'] = File.join(root_path, 'log')
|
77
|
+
ENV['APPSIGNAL_ENVIRONMENT'] = env
|
78
|
+
ENV['APPSIGNAL_AGENT_VERSION'] = Appsignal::AGENT_VERSION
|
75
79
|
ENV['APPSIGNAL_DEBUG_LOGGING'] = config_hash[:debug].to_s
|
76
80
|
ENV['APPSIGNAL_PUSH_API_ENDPOINT'] = config_hash[:endpoint]
|
77
81
|
ENV['APPSIGNAL_PUSH_API_KEY'] = config_hash[:push_api_key]
|
78
82
|
ENV['APPSIGNAL_APP_NAME'] = config_hash[:name]
|
79
|
-
ENV['
|
80
|
-
ENV['
|
83
|
+
ENV['APPSIGNAL_HTTP_PROXY'] = config_hash[:http_proxy]
|
84
|
+
ENV['APPSIGNAL_IGNORE_ACTIONS'] = config_hash[:ignore_actions].join(',')
|
81
85
|
end
|
82
86
|
|
83
87
|
protected
|
@@ -86,7 +90,7 @@ module Appsignal
|
|
86
90
|
@config_file ||= File.join(root_path, 'config', 'appsignal.yml')
|
87
91
|
end
|
88
92
|
|
89
|
-
def
|
93
|
+
def load_from_disk
|
90
94
|
configurations = YAML.load(ERB.new(IO.read(config_file)).result)
|
91
95
|
config_for_this_env = configurations[env]
|
92
96
|
if config_for_this_env
|
@@ -99,10 +103,65 @@ module Appsignal
|
|
99
103
|
if !config_for_this_env[:push_api_key] && config_for_this_env[:api_key]
|
100
104
|
config_for_this_env[:push_api_key] = config_for_this_env[:api_key]
|
101
105
|
end
|
106
|
+
if !config_for_this_env[:ignore_errors] && config_for_this_env[:ignore_exceptions]
|
107
|
+
config_for_this_env[:ignore_errors] = config_for_this_env[:ignore_exceptions]
|
108
|
+
end
|
109
|
+
|
110
|
+
merge(@config_hash, config_for_this_env)
|
111
|
+
else
|
112
|
+
carefully_log_error("Not loading from config file: config for '#{env}' not found")
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def load_from_environment
|
117
|
+
config = {}
|
118
|
+
|
119
|
+
# Make active by default if APPSIGNAL_PUSH_API_KEY is present
|
120
|
+
if ENV['APPSIGNAL_PUSH_API_KEY']
|
121
|
+
config[:active] = true
|
122
|
+
end
|
123
|
+
|
124
|
+
# Configuration with string type
|
125
|
+
%w(APPSIGNAL_PUSH_API_KEY APPSIGNAL_APP_NAME APPSIGNAL_PUSH_API_ENDPOINT
|
126
|
+
APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH APPSIGNAL_HTTP_PROXY).each do |var|
|
127
|
+
if env_var = ENV[var]
|
128
|
+
config[ENV_TO_KEY_MAPPING[var]] = env_var
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Configuration with boolean type
|
133
|
+
%w(APPSIGNAL_ACTIVE APPSIGNAL_DEBUG APPSIGNAL_INSTRUMENT_NET_HTTP
|
134
|
+
APPSIGNAL_SKIP_SESSION_DATA APPSIGNAL_ENABLE_FRONTEND_ERROR_CATCHING).each do |var|
|
135
|
+
if env_var = ENV[var]
|
136
|
+
config[ENV_TO_KEY_MAPPING[var]] = env_var == 'true'
|
137
|
+
end
|
138
|
+
end
|
102
139
|
|
103
|
-
|
140
|
+
# Configuration with array of strings type
|
141
|
+
%w(APPSIGNAL_IGNORE_ERRORS APPSIGNAL_IGNORE_ACTIONS).each do |var|
|
142
|
+
if env_var = ENV[var]
|
143
|
+
config[ENV_TO_KEY_MAPPING[var]] = env_var.split(',')
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
merge(@config_hash, config)
|
148
|
+
end
|
149
|
+
|
150
|
+
def merge(original_config, new_config)
|
151
|
+
new_config.each do |key, value|
|
152
|
+
unless original_config[key].nil?
|
153
|
+
@logger.warn("Config key '#{key}' is being overwritten")
|
154
|
+
end
|
155
|
+
original_config[key] = value
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def validate
|
160
|
+
if config_hash[:push_api_key]
|
161
|
+
@valid = true
|
104
162
|
else
|
105
|
-
|
163
|
+
@valid = false
|
164
|
+
carefully_log_error("Push api key not set after loading config")
|
106
165
|
end
|
107
166
|
end
|
108
167
|
|
@@ -115,9 +174,5 @@ module Appsignal
|
|
115
174
|
@config_hash[:name] = ENV['APPSIGNAL_APP_NAME'] if ENV['APPSIGNAL_APP_NAME']
|
116
175
|
@config_hash[:active] = ENV['APPSIGNAL_ACTIVE'] == 'true' if ENV['APPSIGNAL_ACTIVE']
|
117
176
|
end
|
118
|
-
|
119
|
-
def merge_config(config)
|
120
|
-
DEFAULT_CONFIG.merge(initial_config).merge(config)
|
121
|
-
end
|
122
177
|
end
|
123
178
|
end
|