appsignal 0.12.beta.31 → 0.12.beta.32
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 +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
|