skylight 0.3.21 → 0.4.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -4
- data/ext/extconf.rb +92 -47
- data/ext/libskylight.yml +4 -4
- data/ext/skylight_native.c +248 -286
- data/lib/skylight.rb +19 -114
- data/lib/skylight/api.rb +1 -1
- data/lib/skylight/config.rb +176 -146
- data/lib/skylight/data/cacert.pem +717 -719
- data/lib/skylight/formatters/http.rb +1 -1
- data/lib/skylight/instrumenter.rb +28 -35
- data/lib/skylight/native.rb +58 -72
- data/lib/skylight/normalizers.rb +0 -1
- data/lib/skylight/normalizers/active_record/sql.rb +0 -4
- data/lib/skylight/probes/excon/middleware.rb +3 -1
- data/lib/skylight/probes/net_http.rb +3 -1
- data/lib/skylight/subscriber.rb +0 -4
- data/lib/skylight/trace.rb +189 -0
- data/lib/skylight/util.rb +10 -12
- data/lib/skylight/util/hostname.rb +17 -0
- data/lib/skylight/util/http.rb +33 -36
- data/lib/skylight/util/logging.rb +20 -1
- data/lib/skylight/util/multi_io.rb +21 -0
- data/lib/skylight/util/native_ext_fetcher.rb +83 -69
- data/lib/skylight/util/platform.rb +67 -0
- data/lib/skylight/util/ssl.rb +50 -0
- data/lib/skylight/version.rb +1 -1
- metadata +9 -34
- data/ext/rust_support/ruby.h +0 -93
- data/ext/skylight.h +0 -85
- data/ext/skylight.map +0 -4
- data/ext/test/extconf.rb +0 -18
- data/ext/test/skylight_native_test.c +0 -82
- data/ext/test/skylight_test.h +0 -20
- data/lib/skylight/formatters.rb +0 -6
- data/lib/skylight/messages.rb +0 -21
- data/lib/skylight/messages/error.rb +0 -15
- data/lib/skylight/messages/hello.rb +0 -13
- data/lib/skylight/messages/trace.rb +0 -179
- data/lib/skylight/messages/trace_envelope.rb +0 -19
- data/lib/skylight/metrics.rb +0 -9
- data/lib/skylight/metrics/ewma.rb +0 -69
- data/lib/skylight/metrics/meter.rb +0 -58
- data/lib/skylight/metrics/process_cpu_gauge.rb +0 -65
- data/lib/skylight/metrics/process_mem_gauge.rb +0 -34
- data/lib/skylight/util/conversions.rb +0 -9
- data/lib/skylight/util/queue.rb +0 -96
- data/lib/skylight/util/task.rb +0 -172
- data/lib/skylight/util/uniform_sample.rb +0 -63
- data/lib/skylight/worker.rb +0 -19
- data/lib/skylight/worker/builder.rb +0 -73
- data/lib/skylight/worker/collector.rb +0 -274
- data/lib/skylight/worker/connection.rb +0 -87
- data/lib/skylight/worker/connection_set.rb +0 -56
- data/lib/skylight/worker/embedded.rb +0 -24
- data/lib/skylight/worker/metrics_reporter.rb +0 -104
- data/lib/skylight/worker/server.rb +0 -336
- data/lib/skylight/worker/standalone.rb +0 -421
data/lib/skylight.rb
CHANGED
@@ -1,124 +1,37 @@
|
|
1
|
-
require 'rbconfig'
|
2
|
-
require 'socket'
|
3
1
|
require 'skylight/version'
|
4
2
|
|
5
3
|
module Skylight
|
6
4
|
# @api private
|
7
|
-
TRACE_ENV_KEY
|
5
|
+
TRACE_ENV_KEY = 'SKYLIGHT_ENABLE_TRACE_LOGS'.freeze
|
8
6
|
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
# @api private
|
13
|
-
STANDALONE_ENV_VAL = 'server'.freeze
|
14
|
-
|
15
|
-
# @api private
|
16
|
-
# Whether or not the native extension is present
|
17
|
-
@@has_native_ext = false
|
18
|
-
|
19
|
-
def self.native?
|
20
|
-
@@has_native_ext
|
21
|
-
end
|
22
|
-
|
23
|
-
begin
|
24
|
-
unless ENV["SKYLIGHT_DISABLE_AGENT"]
|
25
|
-
# First attempt to require the native extension
|
26
|
-
require 'skylight_native'
|
27
|
-
|
28
|
-
# If nothing was thrown, then the native extension is present
|
29
|
-
@@has_native_ext = true
|
30
|
-
|
31
|
-
# Require ruby support for the native extension
|
32
|
-
require 'skylight/native'
|
33
|
-
end
|
34
|
-
rescue LoadError
|
35
|
-
raise if ENV.key?("SKYLIGHT_REQUIRED")
|
36
|
-
end
|
7
|
+
# Load the native agent
|
8
|
+
require 'skylight/native'
|
37
9
|
|
38
10
|
if defined?(Rails)
|
39
11
|
require 'skylight/railtie'
|
40
12
|
end
|
41
13
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# @api private
|
56
|
-
def self.warn_skylight_native_missing(config)
|
57
|
-
# TODO: Dumping the error messages this way is pretty hacky
|
58
|
-
is_rails = defined?(Rails)
|
59
|
-
env_name = is_rails ? Rails.env : "development"
|
60
|
-
|
61
|
-
if env_name == "development" || env_name == "test"
|
62
|
-
config.alert_logger.warn \
|
63
|
-
"[SKYLIGHT] [#{Skylight::VERSION}] Running Skylight in #{env_name} mode. " \
|
64
|
-
"No data will be reported until you deploy your app.\n" \
|
65
|
-
"(To disable this message, set `alert_log_file` in your config.)"
|
66
|
-
else
|
67
|
-
config.alert_logger.error \
|
68
|
-
"[SKYLIGHT] [#{Skylight::VERSION}] The Skylight native extension for your platform wasn't found. " \
|
69
|
-
"The monitoring portion of Skylight is only supported on production servers running 32- or " \
|
70
|
-
"64-bit Linux. The missing extension will not affect the functioning of your application " \
|
71
|
-
"and you can continue local development without data being reported. If you are on a " \
|
72
|
-
"supported platform, please contact support at support@skylight.io."
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# @api private
|
77
|
-
def self.daemon?
|
78
|
-
ENV[STANDALONE_ENV_KEY] == STANDALONE_ENV_VAL
|
79
|
-
end
|
80
|
-
|
81
|
-
unless daemon?
|
82
|
-
require 'active_support/notifications'
|
83
|
-
require 'skylight/compat' # Require after AS::N
|
84
|
-
|
85
|
-
# Require VM specific things
|
86
|
-
require 'skylight/vm/gc'
|
87
|
-
end
|
14
|
+
require 'active_support/notifications'
|
15
|
+
require 'skylight/compat' # Require after AS::N
|
16
|
+
|
17
|
+
# Require VM specific things
|
18
|
+
require 'skylight/config'
|
19
|
+
require 'skylight/gc'
|
20
|
+
require 'skylight/helpers'
|
21
|
+
require 'skylight/instrumenter'
|
22
|
+
require 'skylight/middleware'
|
23
|
+
require 'skylight/trace'
|
24
|
+
require 'skylight/vm/gc'
|
25
|
+
require 'skylight/util'
|
88
26
|
|
27
|
+
# Used from the CLI
|
89
28
|
autoload :Api, 'skylight/api'
|
90
29
|
autoload :CLI, 'skylight/cli'
|
91
|
-
autoload :Config, 'skylight/config'
|
92
|
-
autoload :Helpers, 'skylight/helpers'
|
93
|
-
autoload :Formatters, 'skylight/formatters'
|
94
|
-
autoload :GC, 'skylight/gc'
|
95
|
-
autoload :Instrumenter, 'skylight/instrumenter'
|
96
|
-
autoload :Messages, 'skylight/messages'
|
97
|
-
autoload :Metrics, 'skylight/metrics'
|
98
|
-
autoload :Middleware, 'skylight/middleware'
|
99
30
|
autoload :Normalizers, 'skylight/normalizers'
|
100
31
|
autoload :Subscriber, 'skylight/subscriber'
|
101
|
-
autoload :Worker, 'skylight/worker'
|
102
|
-
|
103
|
-
# Skylight::Util is defined by the native ext so we can't autoload
|
104
|
-
require 'skylight/util'
|
105
|
-
|
106
|
-
# ==== Exceptions ====
|
107
|
-
|
108
|
-
# @api private
|
109
|
-
class IpcProtoError < RuntimeError; end
|
110
|
-
|
111
|
-
# @api private
|
112
|
-
class WorkerStateError < RuntimeError; end
|
113
|
-
|
114
|
-
# @api private
|
115
|
-
class ConfigError < RuntimeError; end
|
116
32
|
|
117
33
|
# @api private
|
118
|
-
class
|
119
|
-
|
120
|
-
# @api private
|
121
|
-
class SerializeError < RuntimeError; end
|
34
|
+
class ConfigError < RuntimeError; end
|
122
35
|
|
123
36
|
# @api private
|
124
37
|
TIERS = %w(
|
@@ -159,9 +72,9 @@ module Skylight
|
|
159
72
|
end
|
160
73
|
|
161
74
|
if block_given?
|
162
|
-
inst.trace(endpoint, cat, title) { yield }
|
75
|
+
inst.trace(endpoint, cat || DEFAULT_CATEGORY, title) { yield }
|
163
76
|
else
|
164
|
-
inst.trace(endpoint, cat, title)
|
77
|
+
inst.trace(endpoint, cat || DEFAULT_CATEGORY, title)
|
165
78
|
end
|
166
79
|
end
|
167
80
|
|
@@ -207,13 +120,5 @@ module Skylight
|
|
207
120
|
inst.disable { yield }
|
208
121
|
end
|
209
122
|
|
210
|
-
# @api private
|
211
|
-
RUBYBIN = File.join(
|
212
|
-
RbConfig::CONFIG['bindir'],
|
213
|
-
"#{RbConfig::CONFIG['ruby_install_name']}#{RbConfig::CONFIG['EXEEXT']}")
|
214
|
-
|
215
|
-
# Called by the standalone agent
|
216
|
-
Worker::Server.boot if daemon?
|
217
|
-
|
218
123
|
require 'skylight/probes'
|
219
124
|
end
|
data/lib/skylight/api.rb
CHANGED
data/lib/skylight/config.rb
CHANGED
@@ -1,82 +1,92 @@
|
|
1
|
+
require 'uri'
|
1
2
|
require 'yaml'
|
2
3
|
require 'fileutils'
|
3
|
-
require 'logger'
|
4
4
|
require 'thread'
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
def write(*args)
|
13
|
-
STDERR.write *args
|
14
|
-
@config.logger.<<(*args)
|
15
|
-
end
|
16
|
-
|
17
|
-
def close
|
18
|
-
end
|
19
|
-
end
|
5
|
+
require 'openssl'
|
6
|
+
require 'skylight/util/hostname'
|
7
|
+
require 'skylight/util/logging'
|
8
|
+
require 'skylight/util/platform'
|
9
|
+
require 'skylight/util/ssl'
|
20
10
|
|
21
11
|
module Skylight
|
22
12
|
class Config
|
23
13
|
# @api private
|
24
14
|
MUTEX = Mutex.new
|
25
15
|
|
26
|
-
def self.default_hostname
|
27
|
-
if hostname = Socket.gethostname
|
28
|
-
hostname.strip!
|
29
|
-
hostname = nil if hostname == ''
|
30
|
-
end
|
31
|
-
|
32
|
-
hostname || "gen-#{SecureRandom.uuid}"
|
33
|
-
end
|
34
|
-
|
35
16
|
# Map environment variable keys with Skylight configuration keys
|
36
17
|
ENV_TO_KEY = {
|
37
|
-
|
38
|
-
'
|
39
|
-
|
40
|
-
|
41
|
-
'
|
42
|
-
|
43
|
-
|
44
|
-
'
|
45
|
-
'
|
46
|
-
'
|
47
|
-
|
48
|
-
|
49
|
-
'
|
50
|
-
'
|
18
|
+
# == Authentication ==
|
19
|
+
'AUTHENTICATION' => :'authentication',
|
20
|
+
|
21
|
+
# == Version ==
|
22
|
+
'VERSION' => :'version',
|
23
|
+
|
24
|
+
# == App settings ==
|
25
|
+
'ROOT' => :'root',
|
26
|
+
'APPLICATION' => :'application',
|
27
|
+
'HOSTNAME' => :'hostname',
|
28
|
+
|
29
|
+
# == Logging ==
|
30
|
+
'LOG_FILE' => :'log_file',
|
31
|
+
'LOG_LEVEL' => :'log_level',
|
32
|
+
'ALERT_LOG_FILE' => :'alert_log_file',
|
33
|
+
|
34
|
+
# == Proxy ==
|
35
|
+
'PROXY_URL' => :'proxy_url',
|
36
|
+
|
37
|
+
# == Skylight Remote ==
|
38
|
+
"AUTH_URL" => :'auth_url',
|
39
|
+
"AUTH_HTTP_DEFLATE" => :'auth_http_deflate',
|
40
|
+
"AUTH_HTTP_CONNECT_TIMEOUT" => :'auth_http_connect_timeout',
|
41
|
+
"AUTH_HTTP_READ_TIMEOUT" => :'auth_http_read_timeout',
|
42
|
+
"REPORT_URL" => :'report_url',
|
43
|
+
"REPORT_HTTP_DEFLATE" => :'report_http_deflate',
|
44
|
+
"REPORT_HTTP_CONNECT_TIMEOUT" => :'report_http_connect_timeout',
|
45
|
+
"REPORT_HTTP_READ_TIMEOUT" => :'report_http_read_timeout',
|
46
|
+
|
47
|
+
# == Native agent settings ==
|
48
|
+
#
|
49
|
+
"LAZY_START" => :'daemon.lazy_start',
|
50
|
+
"DAEMON_EXEC_PATH" => :'daemon.exec_path',
|
51
|
+
"DAEMON_LIB_PATH" => :'daemon.lib_path',
|
52
|
+
"PIDFILE_PATH" => :'daemon.pidfile_path',
|
53
|
+
"SOCKDIR_PATH" => :'daemon.sockdir_path',
|
54
|
+
"BATCH_QUEUE_DEPTH" => :'daemon.batch_queue_depth',
|
55
|
+
"BATCH_SAMPLE_SIZE" => :'daemon.batch_sample_size',
|
56
|
+
"BATCH_FLUSH_INTERVAL" => :'daemon.batch_flush_interval',
|
57
|
+
"DAEMON_TICK_INTERVAL" => :'daemon.tick_interval',
|
58
|
+
"DAEMON_SANITY_CHECK_INTERVAL" => :'daemon.sanity_check_interval',
|
59
|
+
"DAEMON_INACTIVITY_TIMEOUT" => :'daemon.inactivity_timeout',
|
60
|
+
"CLIENT_MAX_TRIES" => :'daemon.max_connect_tries',
|
61
|
+
"CLIENT_CONN_TRY_WIN" => :'daemon.connect_try_window',
|
62
|
+
"MAX_PRESPAWN_JITTER" => :'daemon.max_prespawn_jitter',
|
63
|
+
"DAEMON_WAIT_TIMEOUT" => :'daemon.wait_timeout',
|
64
|
+
"CLIENT_CHECK_INTERVAL" => :'daemon.client_check_interval',
|
65
|
+
"CLIENT_QUEUE_DEPTH" => :'daemon.client_queue_depth',
|
66
|
+
"CLIENT_WRITE_TIMEOUT" => :'daemon.client_write_timeout',
|
67
|
+
"SSL_CERT_PATH" => :'daemon.ssl_cert_path',
|
68
|
+
"SSL_CERT_DIR" => :'daemon.ssl_cert_dir',
|
69
|
+
|
70
|
+
# == Legacy settings ==
|
71
|
+
#
|
51
72
|
'AGENT_MAX_MEMORY' => :'agent.max_memory',
|
52
|
-
'REPORT_HOST' => :'report.host',
|
53
|
-
'REPORT_PORT' => :'report.port',
|
54
|
-
'REPORT_SSL' => :'report.ssl',
|
55
|
-
'REPORT_DEFLATE' => :'report.deflate',
|
56
|
-
'REPORT_PROXY_ADDR' => :'report.proxy_addr',
|
57
|
-
'REPORT_PROXY_PORT' => :'report.proxy_port',
|
58
|
-
'REPORT_PROXY_USER' => :'report.proxy_user',
|
59
|
-
'REPORT_PROXY_PASS' => :'report.proxy_user',
|
60
|
-
'ACCOUNTS_HOST' => :'accounts.host',
|
61
|
-
'ACCOUNTS_PORT' => :'accounts.port',
|
62
|
-
'ACCOUNTS_SSL' => :'accounts.ssl',
|
63
|
-
'ACCOUNTS_DEFLATE' => :'accounts.deflate',
|
64
|
-
'ACCOUNTS_PROXY_ADDR' => :'accounts.proxy_addr',
|
65
|
-
'ACCOUNTS_PROXY_PORT' => :'accounts.proxy_port',
|
66
|
-
'ACCOUNTS_PROXY_USER' => :'accounts.proxy_user',
|
67
|
-
'ACCOUNTS_PROXY_PASS' => :'accounts.proxy_user',
|
68
73
|
'ME_AUTHENTICATION' => :'me.authentication',
|
69
74
|
'ME_CREDENTIALS_PATH' => :'me.credentials_path',
|
70
|
-
'METRICS_REPORT_INTERVAL' => :'metrics.report_interval',
|
71
|
-
'TEST_CONSTANT_FLUSH' => :'test.constant_flush',
|
72
75
|
'TEST_IGNORE_TOKEN' => :'test.ignore_token' }
|
73
76
|
|
74
77
|
# Default values for Skylight configuration keys
|
75
78
|
DEFAULTS = {
|
79
|
+
:'version' => VERSION,
|
80
|
+
:'auth_url' => 'https://www.skylight.io/agent/authenticate',
|
81
|
+
:'daemon.lazy_start' => true,
|
82
|
+
:'daemon.ssl_cert_path' => Util::SSL.ca_cert_file_or_default,
|
83
|
+
:'daemon.ssl_cert_dir' => Util::SSL.ca_cert_dir,
|
84
|
+
|
85
|
+
# == Legacy ==
|
76
86
|
:'log_file' => '-'.freeze,
|
77
87
|
:'log_level' => 'INFO'.freeze,
|
78
88
|
:'alert_log_file' => '-'.freeze,
|
79
|
-
:'hostname' => default_hostname,
|
89
|
+
:'hostname' => Util::Hostname.default_hostname,
|
80
90
|
:'agent.keepalive' => 60,
|
81
91
|
:'agent.interval' => 5,
|
82
92
|
:'agent.sample' => 200,
|
@@ -91,7 +101,16 @@ module Skylight
|
|
91
101
|
:'accounts.deflate' => false,
|
92
102
|
:'me.credentials_path' => '~/.skylight',
|
93
103
|
:'metrics.report_interval' => 60
|
94
|
-
}
|
104
|
+
}
|
105
|
+
|
106
|
+
if Skylight.native?
|
107
|
+
native_path = Skylight.libskylight_path
|
108
|
+
|
109
|
+
DEFAULTS[:'daemon.lib_path'] = native_path
|
110
|
+
DEFAULTS[:'daemon.exec_path'] = File.join(native_path, 'skylightd')
|
111
|
+
end
|
112
|
+
|
113
|
+
DEFAULTS.freeze
|
95
114
|
|
96
115
|
REQUIRED = {
|
97
116
|
:'authentication' => "authentication token",
|
@@ -99,10 +118,50 @@ module Skylight
|
|
99
118
|
:'report.host' => "skylight remote host",
|
100
119
|
:'report.port' => "skylight remote port" }
|
101
120
|
|
121
|
+
ALWAYS_INCLUDE_IN_ENV = [
|
122
|
+
:version,
|
123
|
+
:'daemon.lazy_start',
|
124
|
+
:'daemon.lib_path',
|
125
|
+
:'daemon.exec_path',
|
126
|
+
:'daemon.ssl_cert_dir',
|
127
|
+
:'daemon.ssl_cert_path' ]
|
128
|
+
|
102
129
|
VALIDATORS = {
|
103
130
|
:'agent.interval' => [lambda { |v, c| Integer === v && v > 0 }, "must be an integer greater than 0"]
|
104
131
|
}
|
105
132
|
|
133
|
+
# @api private
|
134
|
+
attr_reader :environment
|
135
|
+
|
136
|
+
# @api private
|
137
|
+
def initialize(*args)
|
138
|
+
attrs = {}
|
139
|
+
|
140
|
+
if Hash === args.last
|
141
|
+
attrs = args.pop.dup
|
142
|
+
end
|
143
|
+
|
144
|
+
@values = {}
|
145
|
+
@priority = {}
|
146
|
+
@regexp = nil
|
147
|
+
|
148
|
+
p = attrs.delete(:priority)
|
149
|
+
|
150
|
+
if @environment = args[0]
|
151
|
+
@regexp = /^#{Regexp.escape(@environment)}\.(.+)$/
|
152
|
+
end
|
153
|
+
|
154
|
+
attrs.each do |k, v|
|
155
|
+
self[k] = v
|
156
|
+
end
|
157
|
+
|
158
|
+
if p
|
159
|
+
p.each do |k, v|
|
160
|
+
@priority[k.to_sym] = v
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
106
165
|
def self.load(path = nil, environment = nil, env = ENV)
|
107
166
|
attrs = {}
|
108
167
|
version = nil
|
@@ -137,6 +196,10 @@ module Skylight
|
|
137
196
|
def self.remap_env(env)
|
138
197
|
ret = {}
|
139
198
|
|
199
|
+
return ret unless env
|
200
|
+
|
201
|
+
ret[:proxy_url] = detect_proxy_url(env)
|
202
|
+
|
140
203
|
env.each do |k, val|
|
141
204
|
# Support deprecated SK_ key prefix
|
142
205
|
next unless k =~ /^(?:SK|SKYLIGHT)_(.+)$/
|
@@ -152,40 +215,15 @@ module Skylight
|
|
152
215
|
else val
|
153
216
|
end
|
154
217
|
end
|
155
|
-
end
|
218
|
+
end
|
156
219
|
|
157
220
|
ret
|
158
221
|
end
|
159
222
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
def initialize(*args)
|
165
|
-
attrs = {}
|
166
|
-
|
167
|
-
if Hash === args.last
|
168
|
-
attrs = args.pop.dup
|
169
|
-
end
|
170
|
-
|
171
|
-
@values = {}
|
172
|
-
@priority = {}
|
173
|
-
@regexp = nil
|
174
|
-
|
175
|
-
p = attrs.delete(:priority)
|
176
|
-
|
177
|
-
if @environment = args[0]
|
178
|
-
@regexp = /^#{Regexp.escape(@environment)}\.(.+)$/
|
179
|
-
end
|
180
|
-
|
181
|
-
attrs.each do |k, v|
|
182
|
-
self[k] = v
|
183
|
-
end
|
184
|
-
|
185
|
-
if p
|
186
|
-
p.each do |k, v|
|
187
|
-
@priority[k.to_sym] = v
|
188
|
-
end
|
223
|
+
def self.detect_proxy_url(env)
|
224
|
+
if u = env['HTTP_PROXY'] || env['http_proxy']
|
225
|
+
u = "http://#{u}" unless u =~ %r[://]
|
226
|
+
u
|
189
227
|
end
|
190
228
|
end
|
191
229
|
|
@@ -207,24 +245,6 @@ module Skylight
|
|
207
245
|
true
|
208
246
|
end
|
209
247
|
|
210
|
-
# @api private
|
211
|
-
def validate_token
|
212
|
-
return :ok if skip_validation?
|
213
|
-
|
214
|
-
http_auth = Util::HTTP.new(self, :accounts, timeout: 5)
|
215
|
-
|
216
|
-
res = http_auth.get("/agent/authenticate?hostname=#{URI.escape(self[:'hostname'])}")
|
217
|
-
|
218
|
-
case res.status
|
219
|
-
when 200...300
|
220
|
-
:ok
|
221
|
-
when 400...500
|
222
|
-
:invalid
|
223
|
-
else
|
224
|
-
:unknown
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
248
|
def key?(key)
|
229
249
|
key = key.to_sym
|
230
250
|
@priority.key?(key) || @values.key?(key)
|
@@ -280,12 +300,32 @@ module Skylight
|
|
280
300
|
|
281
301
|
alias []= set
|
282
302
|
|
303
|
+
def duration_ms(key, default = nil)
|
304
|
+
if (v = self[key]) && v.to_s =~ /^\s*(\d+)(s|sec|ms|micros|nanos)?\s*$/
|
305
|
+
v = $1.to_i
|
306
|
+
case $2
|
307
|
+
when "ms"
|
308
|
+
v
|
309
|
+
when "micros"
|
310
|
+
v / 1_000
|
311
|
+
when "nanos"
|
312
|
+
v / 1_000_000
|
313
|
+
else # "s", "sec", nil
|
314
|
+
v * 1000
|
315
|
+
end
|
316
|
+
else
|
317
|
+
default
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
283
321
|
def to_env
|
284
|
-
ret =
|
322
|
+
ret = []
|
285
323
|
|
286
324
|
ENV_TO_KEY.each do |k, v|
|
287
|
-
|
288
|
-
|
325
|
+
c = get(v)
|
326
|
+
# Always need to pass daemon lib_path config even when default
|
327
|
+
if c != DEFAULTS[v] || ALWAYS_INCLUDE_IN_ENV.include?(v)
|
328
|
+
ret << "SKYLIGHT_#{k}" << cast_for_env(c) if c
|
289
329
|
end
|
290
330
|
end
|
291
331
|
|
@@ -313,21 +353,11 @@ authentication: #{self[:authentication]}
|
|
313
353
|
#
|
314
354
|
#
|
315
355
|
|
316
|
-
# @api private
|
317
|
-
def worker
|
318
|
-
@worker ||= Worker::Builder.new(self)
|
319
|
-
end
|
320
|
-
|
321
356
|
# @api private
|
322
357
|
def gc
|
323
358
|
@gc ||= GC.new(self, get('gc.profiler', VM::GC.new))
|
324
359
|
end
|
325
360
|
|
326
|
-
# @api private
|
327
|
-
def constant_flush?
|
328
|
-
get('test.constant_flush')
|
329
|
-
end
|
330
|
-
|
331
361
|
# @api private
|
332
362
|
def ignore_token?
|
333
363
|
get('test.ignore_token')
|
@@ -339,29 +369,8 @@ authentication: #{self[:authentication]}
|
|
339
369
|
|
340
370
|
def logger
|
341
371
|
@logger ||=
|
342
|
-
|
343
|
-
|
344
|
-
unless l = @logger
|
345
|
-
out = get(:'log_file')
|
346
|
-
out = STDOUT if out == '-'
|
347
|
-
|
348
|
-
unless IO === out
|
349
|
-
out = File.expand_path(out, root)
|
350
|
-
FileUtils.mkdir_p(File.dirname(out))
|
351
|
-
end
|
352
|
-
|
353
|
-
l = Logger.new(out)
|
354
|
-
l.level =
|
355
|
-
case get(:'log_level')
|
356
|
-
when /^debug$/i then Logger::DEBUG
|
357
|
-
when /^info$/i then Logger::INFO
|
358
|
-
when /^warn$/i then Logger::WARN
|
359
|
-
when /^error$/i then Logger::ERROR
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
l
|
364
|
-
end
|
372
|
+
MUTEX.synchronize do
|
373
|
+
load_logger
|
365
374
|
end
|
366
375
|
end
|
367
376
|
|
@@ -377,7 +386,7 @@ authentication: #{self[:authentication]}
|
|
377
386
|
out = get(:'alert_log_file')
|
378
387
|
|
379
388
|
if out == '-'
|
380
|
-
out =
|
389
|
+
out = Util::AlertLogger.new(load_logger)
|
381
390
|
elsif !(IO === out)
|
382
391
|
out = File.expand_path(out, root)
|
383
392
|
FileUtils.mkdir_p(File.dirname(out))
|
@@ -396,9 +405,31 @@ authentication: #{self[:authentication]}
|
|
396
405
|
@alert_logger = logger
|
397
406
|
end
|
398
407
|
|
399
|
-
|
400
408
|
private
|
401
409
|
|
410
|
+
def load_logger
|
411
|
+
unless l = @logger
|
412
|
+
out = get(:'log_file')
|
413
|
+
out = STDOUT if out == '-'
|
414
|
+
|
415
|
+
unless IO === out
|
416
|
+
out = File.expand_path(out, root)
|
417
|
+
FileUtils.mkdir_p(File.dirname(out))
|
418
|
+
end
|
419
|
+
|
420
|
+
l = Logger.new(out)
|
421
|
+
l.level =
|
422
|
+
case get(:'log_level')
|
423
|
+
when /^debug$/i then Logger::DEBUG
|
424
|
+
when /^info$/i then Logger::INFO
|
425
|
+
when /^warn$/i then Logger::WARN
|
426
|
+
when /^error$/i then Logger::ERROR
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
l
|
431
|
+
end
|
432
|
+
|
402
433
|
def cast_for_env(v)
|
403
434
|
case v
|
404
435
|
when true then 'true'
|
@@ -407,6 +438,5 @@ authentication: #{self[:authentication]}
|
|
407
438
|
else v.to_s
|
408
439
|
end
|
409
440
|
end
|
410
|
-
|
411
441
|
end
|
412
442
|
end
|