skylight 5.0.1 → 5.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +395 -364
  3. data/CLA.md +1 -1
  4. data/LICENSE.md +7 -17
  5. data/README.md +1 -1
  6. data/ext/extconf.rb +42 -54
  7. data/ext/libskylight.yml +9 -6
  8. data/lib/skylight.rb +20 -30
  9. data/lib/skylight/api.rb +22 -18
  10. data/lib/skylight/cli.rb +47 -46
  11. data/lib/skylight/cli/doctor.rb +50 -50
  12. data/lib/skylight/cli/helpers.rb +19 -19
  13. data/lib/skylight/cli/merger.rb +141 -139
  14. data/lib/skylight/config.rb +265 -300
  15. data/lib/skylight/deprecation.rb +4 -4
  16. data/lib/skylight/errors.rb +3 -4
  17. data/lib/skylight/extensions.rb +17 -29
  18. data/lib/skylight/extensions/source_location.rb +128 -128
  19. data/lib/skylight/formatters/http.rb +1 -3
  20. data/lib/skylight/gc.rb +30 -40
  21. data/lib/skylight/helpers.rb +43 -41
  22. data/lib/skylight/instrumenter.rb +25 -18
  23. data/lib/skylight/middleware.rb +31 -35
  24. data/lib/skylight/native.rb +8 -10
  25. data/lib/skylight/native_ext_fetcher.rb +10 -12
  26. data/lib/skylight/normalizers.rb +43 -39
  27. data/lib/skylight/normalizers/action_controller/process_action.rb +24 -25
  28. data/lib/skylight/normalizers/action_controller/send_file.rb +7 -6
  29. data/lib/skylight/normalizers/action_dispatch/route_set.rb +7 -7
  30. data/lib/skylight/normalizers/active_job/perform.rb +48 -44
  31. data/lib/skylight/normalizers/active_model_serializers/render.rb +7 -3
  32. data/lib/skylight/normalizers/active_storage.rb +11 -13
  33. data/lib/skylight/normalizers/active_support/cache.rb +1 -12
  34. data/lib/skylight/normalizers/coach/handler_finish.rb +1 -3
  35. data/lib/skylight/normalizers/default.rb +1 -9
  36. data/lib/skylight/normalizers/faraday/request.rb +1 -3
  37. data/lib/skylight/normalizers/grape/endpoint.rb +13 -19
  38. data/lib/skylight/normalizers/grape/endpoint_run.rb +16 -18
  39. data/lib/skylight/normalizers/grape/endpoint_run_filters.rb +1 -3
  40. data/lib/skylight/normalizers/graphql/base.rb +23 -28
  41. data/lib/skylight/normalizers/render.rb +19 -21
  42. data/lib/skylight/normalizers/shrine.rb +15 -17
  43. data/lib/skylight/normalizers/sql.rb +4 -4
  44. data/lib/skylight/probes.rb +38 -46
  45. data/lib/skylight/probes/action_controller.rb +32 -28
  46. data/lib/skylight/probes/action_dispatch/request_id.rb +9 -5
  47. data/lib/skylight/probes/action_dispatch/routing/route_set.rb +7 -5
  48. data/lib/skylight/probes/action_view.rb +9 -10
  49. data/lib/skylight/probes/active_job_enqueue.rb +3 -9
  50. data/lib/skylight/probes/active_model_serializers.rb +8 -8
  51. data/lib/skylight/probes/delayed_job.rb +37 -42
  52. data/lib/skylight/probes/elasticsearch.rb +3 -5
  53. data/lib/skylight/probes/excon.rb +1 -1
  54. data/lib/skylight/probes/excon/middleware.rb +22 -23
  55. data/lib/skylight/probes/graphql.rb +2 -7
  56. data/lib/skylight/probes/middleware.rb +14 -5
  57. data/lib/skylight/probes/mongo.rb +83 -91
  58. data/lib/skylight/probes/net_http.rb +1 -1
  59. data/lib/skylight/probes/redis.rb +5 -17
  60. data/lib/skylight/probes/sequel.rb +7 -11
  61. data/lib/skylight/probes/sinatra.rb +8 -5
  62. data/lib/skylight/probes/tilt.rb +2 -4
  63. data/lib/skylight/railtie.rb +121 -135
  64. data/lib/skylight/sidekiq.rb +4 -5
  65. data/lib/skylight/subscriber.rb +31 -33
  66. data/lib/skylight/test.rb +89 -84
  67. data/lib/skylight/trace.rb +121 -115
  68. data/lib/skylight/user_config.rb +14 -17
  69. data/lib/skylight/util/clock.rb +1 -0
  70. data/lib/skylight/util/component.rb +18 -21
  71. data/lib/skylight/util/deploy.rb +11 -13
  72. data/lib/skylight/util/http.rb +104 -105
  73. data/lib/skylight/util/logging.rb +4 -6
  74. data/lib/skylight/util/lru_cache.rb +2 -6
  75. data/lib/skylight/util/platform.rb +2 -6
  76. data/lib/skylight/util/ssl.rb +1 -25
  77. data/lib/skylight/version.rb +1 -1
  78. data/lib/skylight/vm/gc.rb +1 -9
  79. metadata +6 -6
@@ -22,112 +22,96 @@ module Skylight
22
22
  # Map environment variable keys with Skylight configuration keys
23
23
  ENV_TO_KEY = {
24
24
  # == Authentication ==
25
- -"AUTHENTICATION" => :authentication,
26
-
25
+ -"AUTHENTICATION" => :authentication,
27
26
  # == App settings ==
28
- -"ROOT" => :root,
29
- -"HOSTNAME" => :hostname,
30
- -"SESSION_TOKEN" => :session_token,
31
-
27
+ -"ROOT" => :root,
28
+ -"HOSTNAME" => :hostname,
29
+ -"SESSION_TOKEN" => :session_token,
32
30
  # == Component settings ==
33
- -"ENV" => :env,
34
- -"COMPONENT" => :component,
35
- -"REPORT_RAILS_ENV" => :report_rails_env,
36
-
31
+ -"ENV" => :env,
32
+ -"COMPONENT" => :component,
33
+ -"REPORT_RAILS_ENV" => :report_rails_env,
37
34
  # == Deploy settings ==
38
- -"DEPLOY_ID" => :'deploy.id',
39
- -"DEPLOY_GIT_SHA" => :'deploy.git_sha',
40
- -"DEPLOY_DESCRIPTION" => :'deploy.description',
41
-
35
+ -"DEPLOY_ID" => :'deploy.id',
36
+ -"DEPLOY_GIT_SHA" => :'deploy.git_sha',
37
+ -"DEPLOY_DESCRIPTION" => :'deploy.description',
42
38
  # == Logging ==
43
- -"LOG_FILE" => :log_file,
44
- -"LOG_LEVEL" => :log_level,
45
- -"ALERT_LOG_FILE" => :alert_log_file,
46
- -"NATIVE_LOG_FILE" => :native_log_file,
47
- -"NATIVE_LOG_LEVEL" => :native_log_level,
48
- -"LOG_SQL_PARSE_ERRORS" => :log_sql_parse_errors,
49
-
39
+ -"LOG_FILE" => :log_file,
40
+ -"LOG_LEVEL" => :log_level,
41
+ -"ALERT_LOG_FILE" => :alert_log_file,
42
+ -"NATIVE_LOG_FILE" => :native_log_file,
43
+ -"NATIVE_LOG_LEVEL" => :native_log_level,
44
+ -"LOG_SQL_PARSE_ERRORS" => :log_sql_parse_errors,
50
45
  # == Proxy ==
51
- -"PROXY_URL" => :proxy_url,
52
-
46
+ -"PROXY_URL" => :proxy_url,
53
47
  # == Instrumenter ==
54
- -"ENABLE_SEGMENTS" => :enable_segments,
55
- -"ENABLE_SIDEKIQ" => :enable_sidekiq,
56
- -"IGNORED_ENDPOINT" => :ignored_endpoint,
57
- -"IGNORED_ENDPOINTS" => :ignored_endpoints,
58
- -"SINATRA_ROUTE_PREFIXES" => :sinatra_route_prefixes,
59
- -"ENABLE_SOURCE_LOCATIONS" => :enable_source_locations,
60
-
48
+ -"ENABLE_SEGMENTS" => :enable_segments,
49
+ -"ENABLE_SIDEKIQ" => :enable_sidekiq,
50
+ -"IGNORED_ENDPOINT" => :ignored_endpoint,
51
+ -"IGNORED_ENDPOINTS" => :ignored_endpoints,
52
+ -"SINATRA_ROUTE_PREFIXES" => :sinatra_route_prefixes,
53
+ -"ENABLE_SOURCE_LOCATIONS" => :enable_source_locations,
61
54
  # == Max Span Handling ==
62
- -"REPORT_MAX_SPANS_EXCEEDED" => :report_max_spans_exceeded,
63
- -"PRUNE_LARGE_TRACES" => :prune_large_traces,
64
-
55
+ -"REPORT_MAX_SPANS_EXCEEDED" => :report_max_spans_exceeded,
56
+ -"PRUNE_LARGE_TRACES" => :prune_large_traces,
65
57
  # == Skylight Remote ==
66
- -"AUTH_URL" => :auth_url,
67
- -"APP_CREATE_URL" => :app_create_url,
68
- -"MERGES_URL" => :merges_url,
69
- -"VALIDATION_URL" => :validation_url,
70
- -"AUTH_HTTP_DEFLATE" => :auth_http_deflate,
71
- -"AUTH_HTTP_CONNECT_TIMEOUT" => :auth_http_connect_timeout,
72
- -"AUTH_HTTP_READ_TIMEOUT" => :auth_http_read_timeout,
73
- -"REPORT_URL" => :report_url,
74
- -"REPORT_HTTP_DEFLATE" => :report_http_deflate,
75
- -"REPORT_HTTP_CONNECT_TIMEOUT" => :report_http_connect_timeout,
76
- -"REPORT_HTTP_READ_TIMEOUT" => :report_http_read_timeout,
77
- -"REPORT_HTTP_DISABLED" => :report_http_disabled,
78
-
58
+ -"AUTH_URL" => :auth_url,
59
+ -"APP_CREATE_URL" => :app_create_url,
60
+ -"MERGES_URL" => :merges_url,
61
+ -"VALIDATION_URL" => :validation_url,
62
+ -"AUTH_HTTP_DEFLATE" => :auth_http_deflate,
63
+ -"AUTH_HTTP_CONNECT_TIMEOUT" => :auth_http_connect_timeout,
64
+ -"AUTH_HTTP_READ_TIMEOUT" => :auth_http_read_timeout,
65
+ -"REPORT_URL" => :report_url,
66
+ -"REPORT_HTTP_DEFLATE" => :report_http_deflate,
67
+ -"REPORT_HTTP_CONNECT_TIMEOUT" => :report_http_connect_timeout,
68
+ -"REPORT_HTTP_READ_TIMEOUT" => :report_http_read_timeout,
69
+ -"REPORT_HTTP_DISABLED" => :report_http_disabled,
79
70
  # == Native agent settings ==
80
71
  #
81
- -"LAZY_START" => :'daemon.lazy_start',
82
- -"DAEMON_EXEC_PATH" => :'daemon.exec_path',
83
- -"DAEMON_LIB_PATH" => :'daemon.lib_path',
84
- -"PIDFILE_PATH" => :'daemon.pidfile_path',
85
- -"SOCKDIR_PATH" => :'daemon.sockdir_path',
86
- -"BATCH_QUEUE_DEPTH" => :'daemon.batch_queue_depth',
87
- -"BATCH_SAMPLE_SIZE" => :'daemon.batch_sample_size',
88
- -"BATCH_FLUSH_INTERVAL" => :'daemon.batch_flush_interval',
89
- -"DAEMON_TICK_INTERVAL" => :'daemon.tick_interval',
90
- -"DAEMON_LOCK_CHECK_INTERVAL" => :'daemon.lock_check_interval',
91
- -"DAEMON_INACTIVITY_TIMEOUT" => :'daemon.inactivity_timeout',
92
- -"CLIENT_MAX_TRIES" => :'daemon.max_connect_tries',
93
- -"CLIENT_CONN_TRY_WIN" => :'daemon.connect_try_window',
94
- -"MAX_PRESPAWN_JITTER" => :'daemon.max_prespawn_jitter',
95
- -"DAEMON_WAIT_TIMEOUT" => :'daemon.wait_timeout',
96
- -"CLIENT_CHECK_INTERVAL" => :'daemon.client_check_interval',
97
- -"CLIENT_QUEUE_DEPTH" => :'daemon.client_queue_depth',
98
- -"CLIENT_WRITE_TIMEOUT" => :'daemon.client_write_timeout',
99
- -"SSL_CERT_PATH" => :'daemon.ssl_cert_path',
100
- -"SSL_CERT_DIR" => :'daemon.ssl_cert_dir',
101
-
72
+ -"LAZY_START" => :'daemon.lazy_start',
73
+ -"DAEMON_EXEC_PATH" => :'daemon.exec_path',
74
+ -"DAEMON_LIB_PATH" => :'daemon.lib_path',
75
+ -"PIDFILE_PATH" => :'daemon.pidfile_path',
76
+ -"SOCKDIR_PATH" => :'daemon.sockdir_path',
77
+ -"BATCH_QUEUE_DEPTH" => :'daemon.batch_queue_depth',
78
+ -"BATCH_SAMPLE_SIZE" => :'daemon.batch_sample_size',
79
+ -"BATCH_FLUSH_INTERVAL" => :'daemon.batch_flush_interval',
80
+ -"DAEMON_TICK_INTERVAL" => :'daemon.tick_interval',
81
+ -"DAEMON_LOCK_CHECK_INTERVAL" => :'daemon.lock_check_interval',
82
+ -"DAEMON_INACTIVITY_TIMEOUT" => :'daemon.inactivity_timeout',
83
+ -"CLIENT_MAX_TRIES" => :'daemon.max_connect_tries',
84
+ -"CLIENT_CONN_TRY_WIN" => :'daemon.connect_try_window',
85
+ -"MAX_PRESPAWN_JITTER" => :'daemon.max_prespawn_jitter',
86
+ -"DAEMON_WAIT_TIMEOUT" => :'daemon.wait_timeout',
87
+ -"CLIENT_CHECK_INTERVAL" => :'daemon.client_check_interval',
88
+ -"CLIENT_QUEUE_DEPTH" => :'daemon.client_queue_depth',
89
+ -"CLIENT_WRITE_TIMEOUT" => :'daemon.client_write_timeout',
90
+ -"SSL_CERT_PATH" => :'daemon.ssl_cert_path',
91
+ -"ENABLE_TCP" => :'daemon.enable_tcp',
92
+ -"TCP_PORT" => :'daemon.tcp_port',
102
93
  # == Legacy env vars ==
103
94
  #
104
- -"AGENT_LOCKFILE" => :'agent.lockfile',
105
- -"AGENT_SOCKFILE_PATH" => :'agent.sockfile_path',
106
-
95
+ -"AGENT_LOCKFILE" => :'agent.lockfile',
96
+ -"AGENT_SOCKFILE_PATH" => :'agent.sockfile_path',
107
97
  # == User config settings ==
108
- -"USER_CONFIG_PATH" => :user_config_path,
109
-
98
+ -"USER_CONFIG_PATH" => :user_config_path,
110
99
  # == Heroku settings ==
111
- -"HEROKU_DYNO_INFO_PATH" => :'heroku.dyno_info_path',
112
-
100
+ -"HEROKU_DYNO_INFO_PATH" => :'heroku.dyno_info_path',
113
101
  # == Source Location ==
114
102
  -"SOURCE_LOCATION_IGNORED_GEMS" => :source_location_ignored_gems,
115
- -"SOURCE_LOCATION_CACHE_SIZE" => :source_location_cache_size
103
+ -"SOURCE_LOCATION_CACHE_SIZE" => :source_location_cache_size
116
104
  }.freeze
117
105
 
118
106
  KEY_TO_NATIVE_ENV = {
119
107
  # We use different log files for native and Ruby, but the native code doesn't know this
120
- native_log_file: "LOG_FILE",
108
+ native_log_file: "LOG_FILE",
121
109
  native_log_level: "LOG_LEVEL"
122
110
  }.freeze
123
111
 
124
112
  SERVER_VALIDATE = %i[].freeze
125
113
 
126
- DEFAULT_IGNORED_SOURCE_LOCATION_GEMS = [
127
- -"skylight",
128
- -"activesupport",
129
- -"activerecord"
130
- ].freeze
114
+ DEFAULT_IGNORED_SOURCE_LOCATION_GEMS = [-"skylight", -"activesupport", -"activerecord"].freeze
131
115
 
132
116
  # Default values for Skylight configuration keys
133
117
  def self.default_values
@@ -135,39 +119,32 @@ module Skylight
135
119
  begin
136
120
  ret = {
137
121
  # URLs
138
- auth_url: -"https://auth.skylight.io/agent",
139
- app_create_url: -"https://www.skylight.io/apps",
140
- merges_url: -"https://www.skylight.io/merges",
141
- validation_url: -"https://auth.skylight.io/agent/config",
142
-
122
+ auth_url: -"https://auth.skylight.io/agent",
123
+ app_create_url: -"https://www.skylight.io/apps",
124
+ merges_url: -"https://www.skylight.io/merges",
125
+ validation_url: -"https://auth.skylight.io/agent/config",
143
126
  # Logging
144
- log_file: -"-",
145
- log_level: -"INFO",
146
- alert_log_file: -"-",
147
- log_sql_parse_errors: true,
148
- native_log_level: -"warn",
149
-
127
+ log_file: -"-",
128
+ log_level: -"INFO",
129
+ alert_log_file: -"-",
130
+ log_sql_parse_errors: true,
131
+ native_log_level: -"warn",
150
132
  # Features
151
- enable_segments: true,
152
- enable_sidekiq: false,
153
- sinatra_route_prefixes: false,
154
- enable_source_locations: true,
155
-
133
+ enable_segments: true,
134
+ enable_sidekiq: false,
135
+ sinatra_route_prefixes: false,
136
+ enable_source_locations: true,
156
137
  # Deploys
157
- 'heroku.dyno_info_path': -"/etc/heroku/dyno",
158
- report_rails_env: true,
159
-
138
+ 'heroku.dyno_info_path': -"/etc/heroku/dyno",
139
+ report_rails_env: true,
160
140
  # Daemon
161
- 'daemon.lazy_start': true,
162
- hostname: Util::Hostname.default_hostname,
141
+ 'daemon.lazy_start': true,
142
+ hostname: Util::Hostname.default_hostname,
163
143
  report_max_spans_exceeded: false,
164
- prune_large_traces: true
144
+ prune_large_traces: true
165
145
  }
166
146
 
167
- unless Util::Platform::OS == -"darwin"
168
- ret[:'daemon.ssl_cert_path'] = Util::SSL.ca_cert_file_or_default
169
- ret[:'daemon.ssl_cert_dir'] = Util::SSL.ca_cert_dir
170
- end
147
+ ret[:'daemon.ssl_cert_path'] = Util::SSL.ca_cert_file_or_default unless Util::Platform::OS == -"darwin"
171
148
 
172
149
  if Skylight.native?
173
150
  native_path = Skylight.libskylight_path
@@ -182,65 +159,64 @@ module Skylight
182
159
 
183
160
  REQUIRED_KEYS = {
184
161
  authentication: "authentication token",
185
- hostname: "server hostname",
186
- auth_url: "authentication url",
162
+ hostname: "server hostname",
163
+ auth_url: "authentication url",
187
164
  validation_url: "config validation url"
188
165
  }.freeze
189
166
 
190
167
  def self.native_env_keys
191
- @native_env_keys ||= %i[
192
- native_log_level
193
- native_log_file
194
- log_sql_parse_errors
195
- version
196
- root
197
- proxy_url
198
- hostname
199
- session_token
200
- auth_url
201
- auth_http_deflate
202
- auth_http_connect_timeout
203
- auth_http_read_timeout
204
- report_url
205
- report_http_deflate
206
- report_http_connect_timeout
207
- report_http_read_timeout
208
- report_http_disabled
209
- daemon.lazy_start
210
- daemon.exec_path
211
- daemon.lib_path
212
- daemon.pidfile_path
213
- daemon.sockdir_path
214
- daemon.batch_queue_depth
215
- daemon.batch_sample_size
216
- daemon.batch_flush_interval
217
- daemon.tick_interval
218
- daemon.lock_check_interval
219
- daemon.inactivity_timeout
220
- daemon.max_connect_tries
221
- daemon.connect_try_window
222
- daemon.max_prespawn_jitter
223
- daemon.wait_timeout
224
- daemon.client_check_interval
225
- daemon.client_queue_depth
226
- daemon.client_write_timeout
227
- daemon.ssl_cert_path
228
- daemon.ssl_cert_dir
229
- ]
168
+ @native_env_keys ||=
169
+ %i[
170
+ native_log_level
171
+ native_log_file
172
+ log_sql_parse_errors
173
+ version
174
+ root
175
+ proxy_url
176
+ hostname
177
+ session_token
178
+ auth_url
179
+ auth_http_deflate
180
+ auth_http_connect_timeout
181
+ auth_http_read_timeout
182
+ report_url
183
+ report_http_deflate
184
+ report_http_connect_timeout
185
+ report_http_read_timeout
186
+ report_http_disabled
187
+ daemon.lazy_start
188
+ daemon.exec_path
189
+ daemon.lib_path
190
+ daemon.pidfile_path
191
+ daemon.sockdir_path
192
+ daemon.batch_queue_depth
193
+ daemon.batch_sample_size
194
+ daemon.batch_flush_interval
195
+ daemon.tick_interval
196
+ daemon.lock_check_interval
197
+ daemon.inactivity_timeout
198
+ daemon.max_connect_tries
199
+ daemon.connect_try_window
200
+ daemon.max_prespawn_jitter
201
+ daemon.wait_timeout
202
+ daemon.client_check_interval
203
+ daemon.client_queue_depth
204
+ daemon.client_write_timeout
205
+ daemon.ssl_cert_path
206
+ daemon.ssl_cert_dir
207
+ daemon.enable_tcp
208
+ daemon.tcp_port
209
+ ]
230
210
  end
231
211
 
232
212
  # Maps legacy config keys to new config keys
233
213
  def self.legacy_keys
234
- @legacy_keys ||= {
235
- 'agent.sockfile_path': :'daemon.sockdir_path',
236
- 'agent.lockfile': :'daemon.pidfile_path'
237
- }
214
+ @legacy_keys ||= { 'agent.sockfile_path': :'daemon.sockdir_path', 'agent.lockfile': :'daemon.pidfile_path' }
238
215
  end
239
216
 
240
217
  def self.validators
241
- @validators ||= {
242
- 'agent.interval': [->(v, _c) { v.is_a?(Integer) && v > 0 }, "must be an integer greater than 0"]
243
- }
218
+ @validators ||=
219
+ { 'agent.interval': [->(v, _c) { v.is_a?(Integer) && v > 0 }, "must be an integer greater than 0"] }
244
220
  end
245
221
 
246
222
  # @api private
@@ -250,9 +226,7 @@ module Skylight
250
226
  def initialize(*args)
251
227
  attrs = {}
252
228
 
253
- if args.last.is_a?(Hash)
254
- attrs = args.pop.dup
255
- end
229
+ attrs = args.pop.dup if args.last.is_a?(Hash)
256
230
 
257
231
  @values = {}
258
232
  @priority = {}
@@ -266,13 +240,9 @@ module Skylight
266
240
  @priority_regexp = /^#{Regexp.escape(priority_key)}\.(.+)$/
267
241
  end
268
242
 
269
- attrs.each do |k, v|
270
- self[k] = v
271
- end
243
+ attrs.each { |k, v| self[k] = v }
272
244
 
273
- p&.each do |k, v|
274
- @priority[self.class.remap_key(k)] = v
275
- end
245
+ p&.each { |k, v| @priority[self.class.remap_key(k)] = v }
276
246
  end
277
247
 
278
248
  def self.load(opts = {}, env = ENV)
@@ -284,10 +254,8 @@ module Skylight
284
254
  if path
285
255
  error = nil
286
256
  begin
287
- attrs = YAML.safe_load(ERB.new(File.read(path)).result,
288
- [], # permitted_classes
289
- [], # permitted_symbols
290
- true) # aliases enabled
257
+ attrs =
258
+ YAML.safe_load(ERB.new(File.read(path)).result, permitted_classes: [], permitted_symbols: [], aliases: true)
291
259
  error = "empty file" unless attrs
292
260
  error = "invalid format" if attrs && !attrs.is_a?(Hash)
293
261
  rescue Exception => e
@@ -300,15 +268,11 @@ module Skylight
300
268
  # The key-value pairs in this `priority` option are inserted into the
301
269
  # config's @priority hash *after* anything listed under priority_key;
302
270
  # i.e., ENV takes precendence over priority_key
303
- if env
304
- attrs[:priority] = remap_env(env)
305
- end
271
+ attrs[:priority] = remap_env(env) if env
306
272
 
307
273
  config = new(priority_key, attrs)
308
274
 
309
- opts.each do |k, v|
310
- config[k] = v
311
- end
275
+ opts.each { |k, v| config[k] = v }
312
276
 
313
277
  config
314
278
  end
@@ -335,12 +299,18 @@ module Skylight
335
299
 
336
300
  ret[key] =
337
301
  case val
338
- when /^false$/i then false
339
- when /^true$/i then true
340
- when /^(nil|null)$/i then nil
341
- when /^\d+$/ then val.to_i
342
- when /^\d+\.\d+$/ then val.to_f
343
- else val
302
+ when /^false$/i
303
+ false
304
+ when /^true$/i
305
+ true
306
+ when /^(nil|null)$/i
307
+ nil
308
+ when /^\d+$/
309
+ val.to_i
310
+ when /^\d+\.\d+$/
311
+ val.to_f
312
+ else
313
+ val
344
314
  end
345
315
  end
346
316
 
@@ -349,11 +319,7 @@ module Skylight
349
319
 
350
320
  # @api private
351
321
  def validate!
352
- REQUIRED_KEYS.each do |k, v|
353
- unless get(k)
354
- raise ConfigError, "#{v} required"
355
- end
356
- end
322
+ REQUIRED_KEYS.each { |k, v| raise ConfigError, "#{v} required" unless get(k) }
357
323
 
358
324
  log_file = self[:log_file]
359
325
  alert_log_file = self[:alert_log_file]
@@ -361,6 +327,7 @@ module Skylight
361
327
 
362
328
  check_logfile_permissions(log_file, "log_file")
363
329
  check_logfile_permissions(alert_log_file, "alert_log_file")
330
+
364
331
  # TODO: Support rotation interpolation in this check
365
332
  check_logfile_permissions(native_log_file, "native_log_file")
366
333
 
@@ -380,15 +347,20 @@ module Skylight
380
347
  file_root = File.dirname(file)
381
348
 
382
349
  # Try to make the directory, don't blow up if we can't. Our writable? check will fail later.
383
- FileUtils.mkdir_p file_root rescue nil
350
+ begin
351
+ FileUtils.mkdir_p file_root
352
+ rescue StandardError
353
+ nil
354
+ end
384
355
 
385
356
  if File.exist?(file) && !FileTest.writable?(file)
386
357
  raise ConfigError, "File `#{file}` is not writable. Please set #{key} in your config to a writable path"
387
358
  end
388
359
 
389
360
  unless FileTest.writable?(file_root)
390
- raise ConfigError, "Directory `#{file_root}` is not writable. Please set #{key} in your config to a " \
391
- "writable path"
361
+ raise ConfigError,
362
+ "Directory `#{file_root}` is not writable. Please set #{key} in your config to a " \
363
+ "writable path"
392
364
  end
393
365
  end
394
366
 
@@ -408,7 +380,7 @@ module Skylight
408
380
  key = self.class.remap_key(key)
409
381
 
410
382
  return @priority[key] if @priority.key?(key)
411
- return @values[key] if @values.key?(key)
383
+ return @values[key] if @values.key?(key)
412
384
  return self.class.default_values[key] if self.class.default_values.key?(key)
413
385
 
414
386
  if default
@@ -423,14 +395,10 @@ module Skylight
423
395
  alias [] get
424
396
 
425
397
  def set(key, val, scope = nil)
426
- if scope
427
- key = [scope, key].join(".")
428
- end
398
+ key = [scope, key].join(".") if scope
429
399
 
430
400
  if val.is_a?(Hash)
431
- val.each do |k, v|
432
- set(k, v, key)
433
- end
401
+ val.each { |k, v| set(k, v, key) }
434
402
  else
435
403
  k = self.class.remap_key(key)
436
404
 
@@ -444,9 +412,7 @@ module Skylight
444
412
  end
445
413
  end
446
414
 
447
- if @priority_regexp && k =~ @priority_regexp
448
- @priority[$1.to_sym] = val
449
- end
415
+ @priority[$1.to_sym] = val if @priority_regexp && k =~ @priority_regexp
450
416
 
451
417
  @values[k] = val
452
418
  end
@@ -468,7 +434,8 @@ module Skylight
468
434
  v / 1_000
469
435
  when "nanos"
470
436
  v / 1_000_000
471
- else # "s", "sec", nil
437
+ else
438
+ # "s", "sec", nil
472
439
  v * 1000
473
440
  end
474
441
  else
@@ -479,13 +446,16 @@ module Skylight
479
446
  def to_native_env
480
447
  ret = []
481
448
 
482
- self.class.native_env_keys.each do |key|
483
- value = send_or_get(key)
484
- unless value.nil?
485
- env_key = KEY_TO_NATIVE_ENV[key] || ENV_TO_KEY.key(key) || key.upcase
486
- ret << "SKYLIGHT_#{env_key}" << cast_for_env(value)
449
+ self
450
+ .class
451
+ .native_env_keys
452
+ .each do |key|
453
+ value = send_or_get(key)
454
+ unless value.nil?
455
+ env_key = KEY_TO_NATIVE_ENV[key] || ENV_TO_KEY.key(key) || key.upcase
456
+ ret << "SKYLIGHT_#{env_key}" << cast_for_env(value)
457
+ end
487
458
  end
488
- end
489
459
 
490
460
  ret << "SKYLIGHT_AUTHENTICATION" << authentication_with_meta
491
461
  ret << "SKYLIGHT_VALIDATE_AUTHENTICATION" << "false"
@@ -516,9 +486,7 @@ module Skylight
516
486
 
517
487
  # If, for some odd reason you have a comma in your endpoint name, use the
518
488
  # YML config instead.
519
- if ignored_endpoints.is_a?(String)
520
- ignored_endpoints = ignored_endpoints.split(/\s*,\s*/)
521
- end
489
+ ignored_endpoints = ignored_endpoints.split(/\s*,\s*/) if ignored_endpoints.is_a?(String)
522
490
 
523
491
  val = Array(get(:ignored_endpoint))
524
492
  val.concat(Array(ignored_endpoints))
@@ -531,9 +499,7 @@ module Skylight
531
499
  @source_location_ignored_gems ||=
532
500
  begin
533
501
  ignored_gems = get(:source_location_ignored_gems)
534
- if ignored_gems.is_a?(String)
535
- ignored_gems = ignored_gems.split(/\s*,\s*/)
536
- end
502
+ ignored_gems = ignored_gems.split(/\s*,\s*/) if ignored_gems.is_a?(String)
537
503
 
538
504
  Array(ignored_gems) | DEFAULT_IGNORED_SOURCE_LOCATION_GEMS
539
505
  end
@@ -549,12 +515,18 @@ module Skylight
549
515
  Logger::DEBUG
550
516
  else
551
517
  case get(:log_level)
552
- when /^debug$/i then Logger::DEBUG
553
- when /^info$/i then Logger::INFO
554
- when /^warn$/i then Logger::WARN
555
- when /^error$/i then Logger::ERROR
556
- when /^fatal$/i then Logger::FATAL
557
- else Logger::ERROR # rubocop:disable Lint/DuplicateBranch
518
+ when /^debug$/i
519
+ Logger::DEBUG
520
+ when /^info$/i
521
+ Logger::INFO
522
+ when /^warn$/i
523
+ Logger::WARN
524
+ when /^error$/i
525
+ Logger::ERROR
526
+ when /^fatal$/i
527
+ Logger::FATAL
528
+ else
529
+ Logger::ERROR
558
530
  end
559
531
  end
560
532
  end
@@ -564,36 +536,35 @@ module Skylight
564
536
  end
565
537
 
566
538
  def logger
567
- @logger ||=
568
- MUTEX.synchronize do
569
- load_logger
570
- end
539
+ @logger ||= MUTEX.synchronize { load_logger }
571
540
  end
572
541
 
573
542
  def native_log_file
574
- @native_log_file ||= get("native_log_file") do
575
- log_file = self["log_file"]
576
- return "-" if log_file == "-"
577
-
578
- parts = log_file.to_s.split(".")
579
- parts.insert(-2, "native")
580
- parts.join(".")
581
- end
543
+ @native_log_file ||=
544
+ get("native_log_file") do
545
+ log_file = self["log_file"]
546
+ return "-" if log_file == "-"
547
+
548
+ parts = log_file.to_s.split(".")
549
+ parts.insert(-2, "native")
550
+ parts.join(".")
551
+ end
582
552
  end
583
553
 
584
554
  attr_writer :logger, :alert_logger
585
555
 
586
556
  def alert_logger
587
- @alert_logger ||= MUTEX.synchronize do
588
- unless (l = @alert_logger)
589
- out = get(:alert_log_file)
590
- out = Util::AlertLogger.new(load_logger) if out == "-"
557
+ @alert_logger ||=
558
+ MUTEX.synchronize do
559
+ unless (l = @alert_logger)
560
+ out = get(:alert_log_file)
561
+ out = Util::AlertLogger.new(load_logger) if out == "-"
591
562
 
592
- l = create_logger(out, level: Logger::DEBUG)
593
- end
563
+ l = create_logger(out, level: Logger::DEBUG)
564
+ end
594
565
 
595
- l
596
- end
566
+ l
567
+ end
597
568
  end
598
569
 
599
570
  def enable_segments?
@@ -622,36 +593,41 @@ module Skylight
622
593
 
623
594
  private
624
595
 
625
- def create_logger(out, level: :info)
626
- if out.is_a?(String)
627
- out = File.expand_path(out, root)
628
- # May be redundant since we also do this in the permissions check
629
- FileUtils.mkdir_p(File.dirname(out))
630
- end
596
+ def create_logger(out, level: :info)
597
+ if out.is_a?(String)
598
+ out = File.expand_path(out, root)
631
599
 
632
- Logger.new(out, progname: "Skylight", level: level)
633
- rescue
634
- Logger.new($stdout, progname: "Skylight", level: level)
600
+ # May be redundant since we also do this in the permissions check
601
+ FileUtils.mkdir_p(File.dirname(out))
635
602
  end
636
603
 
637
- def load_logger
638
- unless (l = @logger)
639
- out = get(:log_file)
640
- out = $stdout if out == "-"
641
- l = create_logger(out, level: log_level)
642
- end
604
+ Logger.new(out, progname: "Skylight", level: level)
605
+ rescue StandardError
606
+ Logger.new($stdout, progname: "Skylight", level: level)
607
+ end
643
608
 
644
- l
609
+ def load_logger
610
+ unless (l = @logger)
611
+ out = get(:log_file)
612
+ out = $stdout if out == "-"
613
+ l = create_logger(out, level: log_level)
645
614
  end
646
615
 
647
- def cast_for_env(val)
648
- case val
649
- when true then "true"
650
- when false then "false"
651
- when nil then "nil"
652
- else val.to_s
653
- end
616
+ l
617
+ end
618
+
619
+ def cast_for_env(val)
620
+ case val
621
+ when true
622
+ "true"
623
+ when false
624
+ "false"
625
+ when nil
626
+ "nil"
627
+ else
628
+ val.to_s
654
629
  end
630
+ end
655
631
 
656
632
  public
657
633
 
@@ -668,15 +644,11 @@ module Skylight
668
644
  return false
669
645
  end
670
646
 
671
- if res.error_response?
672
- warn("Unable to reach server for config validation")
673
- end
647
+ warn("Unable to reach server for config validation") if res.error_response?
674
648
 
675
649
  unless res.config_valid?
676
650
  warn("Invalid configuration") unless res.error_response?
677
- res.validation_errors.each do |k, v|
678
- warn(" #{k}: #{v}")
679
- end
651
+ res.validation_errors.each { |k, v| warn(" #{k}: #{v}") }
680
652
 
681
653
  return false if res.forbidden?
682
654
 
@@ -705,29 +677,33 @@ module Skylight
705
677
 
706
678
  def check_sockdir_permissions(sockdir_path)
707
679
  # Try to make the directory, don't blow up if we can't. Our writable? check will fail later.
708
- FileUtils.mkdir_p sockdir_path rescue nil
680
+ begin
681
+ FileUtils.mkdir_p sockdir_path
682
+ rescue StandardError
683
+ nil
684
+ end
709
685
 
710
686
  unless FileTest.writable?(sockdir_path)
711
- raise ConfigError, "Directory `#{sockdir_path}` is not writable. Please set daemon.sockdir_path in " \
712
- "your config to a writable path"
687
+ raise ConfigError,
688
+ "Directory `#{sockdir_path}` is not writable. Please set daemon.sockdir_path in " \
689
+ "your config to a writable path"
713
690
  end
714
691
 
715
692
  if check_nfs(sockdir_path)
716
- raise ConfigError, "Directory `#{sockdir_path}` is an NFS mount and will not allow sockets. Please set " \
717
- "daemon.sockdir_path in your config to a non-NFS path."
693
+ raise ConfigError,
694
+ "Directory `#{sockdir_path}` is an NFS mount and will not allow sockets. Please set " \
695
+ "daemon.sockdir_path in your config to a non-NFS path."
718
696
  end
719
697
  end
720
698
 
721
699
  def write(path)
722
700
  FileUtils.mkdir_p(File.dirname(path))
723
701
 
724
- File.open(path, "w") do |f|
725
- f.puts <<~YAML
702
+ File.open(path, "w") { |f| f.puts <<~YAML }
726
703
  ---
727
704
  # The authentication token for the application.
728
705
  authentication: #{self[:authentication]}
729
706
  YAML
730
- end
731
707
  end
732
708
 
733
709
  #
@@ -757,17 +733,11 @@ module Skylight
757
733
  end
758
734
 
759
735
  def components
760
- @components ||= {
761
- web: Util::Component.new(
762
- get(:env),
763
- Util::Component::DEFAULT_NAME
764
- ),
765
- worker: Util::Component.new(
766
- get(:env),
767
- get(:component) || get(:worker_component),
768
- force_worker: true
769
- )
770
- }
736
+ @components ||=
737
+ {
738
+ web: Util::Component.new(get(:env), Util::Component::DEFAULT_NAME),
739
+ worker: Util::Component.new(get(:env), get(:component) || get(:worker_component), force_worker: true)
740
+ }
771
741
  rescue ArgumentError => e
772
742
  raise ConfigError, e.message
773
743
  end
@@ -781,25 +751,20 @@ module Skylight
781
751
  end
782
752
 
783
753
  def as_json(*)
784
- {
785
- config: {
786
- priority: @priority.merge(component.as_json),
787
- values: @values
788
- }
789
- }
754
+ { config: { priority: @priority.merge(component.as_json), values: @values } }
790
755
  end
791
756
 
792
757
  private
793
758
 
794
- def check_nfs(path)
795
- # Should work on most *nix, though not on OS X
796
- `stat -f -L -c %T #{path} 2>&1`.strip == "nfs"
797
- end
759
+ def check_nfs(path)
760
+ # Should work on most *nix, though not on OS X
761
+ `stat -f -L -c %T #{path} 2>&1`.strip == "nfs"
762
+ end
798
763
 
799
- def reporting_env?
800
- # true if env was explicitly set,
801
- # or if we are auto-detecting via the opt-in SKYLIGHT_REPORT_RAILS_ENV=true
802
- !!(get(:report_rails_env) || get(:env))
803
- end
764
+ def reporting_env?
765
+ # true if env was explicitly set,
766
+ # or if we are auto-detecting via the opt-in SKYLIGHT_REPORT_RAILS_ENV=true
767
+ !!(get(:report_rails_env) || get(:env))
768
+ end
804
769
  end
805
770
  end