skylight 1.7.2 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -33
- data/ext/extconf.rb +32 -6
- data/ext/libskylight.yml +6 -9
- data/ext/skylight_native.c +49 -18
- data/lib/skylight.rb +35 -1
- data/lib/skylight/api.rb +4 -2
- data/lib/skylight/cli.rb +1 -1
- data/lib/skylight/cli/doctor.rb +6 -4
- data/lib/skylight/config.rb +149 -518
- data/lib/skylight/data/cacert.pem +236 -812
- data/lib/skylight/helpers.rb +5 -1
- data/lib/skylight/instrumenter.rb +10 -241
- data/lib/skylight/middleware.rb +1 -89
- data/lib/skylight/native.rb +8 -6
- data/lib/skylight/native_ext_fetcher.rb +251 -0
- data/lib/skylight/normalizers/active_job/enqueue_at.rb +2 -20
- data/lib/skylight/probes/sinatra_add_middleware.rb +22 -0
- data/lib/skylight/railtie.rb +11 -131
- data/lib/skylight/sinatra.rb +1 -5
- data/lib/skylight/trace.rb +1 -229
- data/lib/skylight/util/http.rb +3 -3
- data/lib/skylight/vendor/cli/thor/actions/directory.rb +5 -15
- data/lib/skylight/version.rb +1 -1
- metadata +114 -91
- data/lib/skylight/compat.rb +0 -76
- data/lib/skylight/core.rb +0 -149
- data/lib/skylight/deprecation.rb +0 -55
- data/lib/skylight/formatters/http.rb +0 -20
- data/lib/skylight/gc.rb +0 -107
- data/lib/skylight/normalizers.rb +0 -192
- data/lib/skylight/normalizers/action_controller/process_action.rb +0 -50
- data/lib/skylight/normalizers/action_controller/send_file.rb +0 -50
- data/lib/skylight/normalizers/action_view/render_collection.rb +0 -22
- data/lib/skylight/normalizers/action_view/render_partial.rb +0 -21
- data/lib/skylight/normalizers/action_view/render_template.rb +0 -21
- data/lib/skylight/normalizers/active_model_serializers/render.rb +0 -26
- data/lib/skylight/normalizers/active_record/instantiation.rb +0 -17
- data/lib/skylight/normalizers/active_record/sql.rb +0 -55
- data/lib/skylight/normalizers/active_support/cache.rb +0 -51
- data/lib/skylight/normalizers/active_support/cache_clear.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_decrement.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_delete.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_exist.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_fetch_hit.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_generate.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_increment.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_read.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_read_multi.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_write.rb +0 -16
- data/lib/skylight/normalizers/coach/handler_finish.rb +0 -36
- data/lib/skylight/normalizers/coach/middleware_finish.rb +0 -23
- data/lib/skylight/normalizers/couch_potato/query.rb +0 -20
- data/lib/skylight/normalizers/default.rb +0 -27
- data/lib/skylight/normalizers/elasticsearch/request.rb +0 -20
- data/lib/skylight/normalizers/faraday/request.rb +0 -38
- data/lib/skylight/normalizers/grape/endpoint.rb +0 -30
- data/lib/skylight/normalizers/grape/endpoint_render.rb +0 -26
- data/lib/skylight/normalizers/grape/endpoint_run.rb +0 -33
- data/lib/skylight/normalizers/grape/endpoint_run_filters.rb +0 -23
- data/lib/skylight/normalizers/moped/query.rb +0 -100
- data/lib/skylight/probes.rb +0 -129
- data/lib/skylight/probes/action_controller.rb +0 -64
- data/lib/skylight/probes/action_dispatch.rb +0 -30
- data/lib/skylight/probes/action_view.rb +0 -43
- data/lib/skylight/probes/active_model_serializers.rb +0 -55
- data/lib/skylight/probes/elasticsearch.rb +0 -37
- data/lib/skylight/probes/excon.rb +0 -26
- data/lib/skylight/probes/excon/middleware.rb +0 -68
- data/lib/skylight/probes/faraday.rb +0 -22
- data/lib/skylight/probes/grape.rb +0 -88
- data/lib/skylight/probes/httpclient.rb +0 -46
- data/lib/skylight/probes/middleware.rb +0 -68
- data/lib/skylight/probes/mongo.rb +0 -161
- data/lib/skylight/probes/mongoid.rb +0 -21
- data/lib/skylight/probes/moped.rb +0 -39
- data/lib/skylight/probes/net_http.rb +0 -58
- data/lib/skylight/probes/redis.rb +0 -71
- data/lib/skylight/probes/sequel.rb +0 -37
- data/lib/skylight/probes/sinatra.rb +0 -76
- data/lib/skylight/probes/tilt.rb +0 -31
- data/lib/skylight/subscriber.rb +0 -122
- data/lib/skylight/user_config.rb +0 -60
- data/lib/skylight/util.rb +0 -17
- data/lib/skylight/util/allocation_free.rb +0 -26
- data/lib/skylight/util/clock.rb +0 -54
- data/lib/skylight/util/deploy.rb +0 -132
- data/lib/skylight/util/gzip.rb +0 -21
- data/lib/skylight/util/inflector.rb +0 -112
- data/lib/skylight/util/logging.rb +0 -127
- data/lib/skylight/util/multi_io.rb +0 -21
- data/lib/skylight/util/native_ext_fetcher.rb +0 -253
- data/lib/skylight/util/platform.rb +0 -75
- data/lib/skylight/util/proxy.rb +0 -13
- data/lib/skylight/vendor/active_support/notifications.rb +0 -207
- data/lib/skylight/vendor/active_support/notifications/fanout.rb +0 -159
- data/lib/skylight/vendor/active_support/notifications/instrumenter.rb +0 -72
- data/lib/skylight/vendor/active_support/per_thread_registry.rb +0 -52
- data/lib/skylight/vendor/thread_safe.rb +0 -126
- data/lib/skylight/vendor/thread_safe/non_concurrent_cache_backend.rb +0 -133
- data/lib/skylight/vendor/thread_safe/synchronized_cache_backend.rb +0 -76
- data/lib/skylight/vm/gc.rb +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 257ac0e93ef049212cce0ee890a96265fbc0e6b4cf1b3a0e7e8ddb944ae30fb3
|
4
|
+
data.tar.gz: 5a31861bfd7feba873b7c40605acf861ab2b1861b586c0d027d3b3e6d2557b3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba086a499bb89abbfd796b58093ddac311f610e04f1c29d8e398343daa63c3c879a96cccbb43acb25b411e1bf931f8b3390eb4d2fb83b067f103e2d2e0224b18
|
7
|
+
data.tar.gz: 27190de3814b1d7c83775e5cc2e015a85e0fbf211d78ee225bd3bfcbdd9d6b8ba10883926dd3ba4691aab601cc2109c89ee71aaff141eab9e60cc28077ae62f1
|
data/CHANGELOG.md
CHANGED
@@ -1,41 +1,12 @@
|
|
1
|
-
##
|
2
|
-
* [BUGFIX] (Backported from 3.1.x series) Fix issue where routes in mounted engines could cause spans to be closed out-of-order.
|
1
|
+
## 2.0.0-beta1
|
3
2
|
|
4
|
-
|
5
|
-
* [
|
6
|
-
|
7
|
-
## 1.7.0 (April 24, 2018)
|
8
|
-
|
9
|
-
* [FEATURE] New API for loading Probes. Example: `Skylight.probe(:excon')`
|
10
|
-
* [FEATURE] New API for enabling non-default Normalizers. Example: `Skylight.enable_normalizer('active_job')`
|
11
|
-
* [DEPRECATION] Support for Rails versions prior to 4.2
|
12
|
-
* [DEPRECATION] Support for Tilt versions prior to 1.4.1
|
13
|
-
* [DEPRECATION] Support for Sinatra versions prior to 1.4
|
14
|
-
* [DEPRECATION] Support for Grape versions prior to 0.13.0
|
15
|
-
|
16
|
-
## 1.6.1 (April 12, 2018)
|
17
|
-
|
18
|
-
* [IMPROVEMENT] Include endpoint name in error logging
|
19
|
-
* [BUGFIX] Make sure to correctly release broken traces
|
20
|
-
* [BUGFIX] Keep the `require` method private when overwriting
|
21
|
-
|
22
|
-
## 1.6.0 (March 21, 2018)
|
23
|
-
|
24
|
-
* [FEATURE] Time spent the Rails router is now identified separately in the trace
|
25
|
-
* [IMPROVEMENT] Switch logger to debug mode if tracing is enabled
|
26
|
-
* [IMPROVEMENT] Improved logging for a number of error cases
|
27
|
-
* [IMPROVEMENT] Middleware probe should now accept anything allowed by Rack::Lint
|
28
|
-
* [IMPROVEMENT] We were using arity checks to determine Rails version but due to other libraries' monkey patches this could sometimes fail. We just check version numbers now.
|
29
|
-
* [BUGFIX] Middleware probe no longer errors when Middleware returns a frozen array
|
30
|
-
|
31
|
-
## 1.5.1 (February 7, 2018)
|
32
|
-
|
33
|
-
* [BUGFIX] `skylight doctor` no longer erroneously reports inability to reach Skylight servers.
|
3
|
+
* [FEATURE] New SQL lexer to support a wider variety of SQL queries.
|
4
|
+
* [BREAKING] Drop support for a number of deprecated libraries, including Rails prior to 4.2, Ruby prior to 2.2, and Sinatra prior to 1.4.
|
34
5
|
|
35
6
|
## 1.5.0 (December 6, 2017)
|
36
7
|
|
37
8
|
* [FEATURE] [Coach](https://github.com/gocardless/coach) instrumentation. Enabled automatically via ActiveSupport::Notifications.
|
38
|
-
* [FEATURE] Option to enable or disable agent by setting
|
9
|
+
* [FEATURE] Option to enable or disable agent by setting SKYLIGHT_ENABLE via ENV.
|
39
10
|
* [IMPROVEMENT] Better logging for certain error cases.
|
40
11
|
* [BUGFIX] Backport a SPEC compliance fix for older Rack::ETag to resolve case where the Middleware probe could cause empty traces.
|
41
12
|
* [BUGFIX] Fix a case where using the non-block form of `Skylight.instrument` with `Skylight.done` could cause lost trace data.
|
data/ext/extconf.rb
CHANGED
@@ -5,12 +5,38 @@ require 'logger'
|
|
5
5
|
require 'fileutils'
|
6
6
|
|
7
7
|
$:.unshift File.expand_path("../../lib", __FILE__)
|
8
|
+
|
8
9
|
require 'skylight/version'
|
9
|
-
require 'skylight/util/multi_io'
|
10
|
-
require 'skylight/util/native_ext_fetcher'
|
11
|
-
require 'skylight/util/platform'
|
12
10
|
|
13
|
-
|
11
|
+
# Don't use the gem for dev
|
12
|
+
if File.exists?(File.expand_path("../../Gemfile", __FILE__))
|
13
|
+
# This approach won't work in production since skylight-core isn't in the skylight gem
|
14
|
+
$:.unshift File.expand_path("../../skylight-core/lib", __FILE__)
|
15
|
+
else
|
16
|
+
# Is there a better way to get this into lib?
|
17
|
+
gem 'skylight-core', Skylight::Core::VERSION.tr('-', '.')
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'skylight/native_ext_fetcher'
|
21
|
+
require 'skylight/core/util/platform'
|
22
|
+
|
23
|
+
# Util allowing proxying writes to multiple location
|
24
|
+
class MultiIO
|
25
|
+
|
26
|
+
def initialize(*targets)
|
27
|
+
@targets = targets
|
28
|
+
end
|
29
|
+
|
30
|
+
def write(*args)
|
31
|
+
@targets.each {|t| t.write(*args)}
|
32
|
+
end
|
33
|
+
|
34
|
+
def close
|
35
|
+
@targets.each(&:close)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
include Skylight::Core::Util
|
14
40
|
|
15
41
|
SKYLIGHT_INSTALL_LOG = File.expand_path("../install.log", __FILE__)
|
16
42
|
SKYLIGHT_REQUIRED = ENV.key?("SKYLIGHT_REQUIRED") && ENV['SKYLIGHT_REQUIRED'] !~ /^false$/i
|
@@ -126,7 +152,7 @@ if !File.exist?(libskylight) && !File.exist?(skylight_dlopen_c) && !File.exist?(
|
|
126
152
|
end
|
127
153
|
|
128
154
|
begin
|
129
|
-
res = NativeExtFetcher.fetch(
|
155
|
+
res = Skylight::NativeExtFetcher.fetch(
|
130
156
|
source: SKYLIGHT_SOURCE_URL,
|
131
157
|
version: version,
|
132
158
|
target: hdrpath,
|
@@ -220,7 +246,7 @@ $CFLAGS << " -std=c99 -Wall -fno-strict-aliasing"
|
|
220
246
|
|
221
247
|
# Allow stricter checks to be turned on for development or debugging
|
222
248
|
if SKYLIGHT_EXT_STRICT
|
223
|
-
$CFLAGS << " -
|
249
|
+
$CFLAGS << " -pedantic"
|
224
250
|
end
|
225
251
|
|
226
252
|
# TODO: Compute the relative path to the location
|
data/ext/libskylight.yml
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
---
|
2
|
-
version: "
|
2
|
+
version: "2.0.0-7fe2c49"
|
3
3
|
checksums:
|
4
|
-
x86-linux: "
|
5
|
-
x86_64-linux: "
|
6
|
-
x86_64-linux-musl: "
|
7
|
-
x86_64-darwin: "
|
8
|
-
|
9
|
-
x86_64-freebsd:
|
10
|
-
version: "1.4.1-33c50db"
|
11
|
-
checksum: "c71d958fdba4c6ea1f62aea03474e2b479e787d5e21a436dabf00218ea25d2b0"
|
4
|
+
x86-linux: "57e0b65fd5bd03be9ad406711279d6164982107a4af144a85d4a352f035244ff"
|
5
|
+
x86_64-linux: "5a2648e000f7b184dfaadd01f37399e808c80826613279571b61e4d7b122118a"
|
6
|
+
x86_64-linux-musl: "39fc56d55782af71c8c37f93d1082e05c9a4c0decb68487ea6695d95971985f6"
|
7
|
+
x86_64-darwin: "05a68826b7cef60c19d22302ec4f5eaa5134fd3be6d19513f6de76337fccb734"
|
8
|
+
x86_64-freebsd: "97f4a65c0ba19cfa236fec73f2fdd74e0df9ae0e12ecec7709c996a3c4eb10f2"
|
data/ext/skylight_native.c
CHANGED
@@ -73,6 +73,7 @@ STR2BUF(VALUE str) {
|
|
73
73
|
* Ruby GVL helpers
|
74
74
|
*/
|
75
75
|
|
76
|
+
// FIXME: This conditional doesn't logically cover every case
|
76
77
|
#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) && \
|
77
78
|
defined(HAVE_RUBY_THREAD_H)
|
78
79
|
|
@@ -98,10 +99,9 @@ typedef VALUE (*blocking_fn_t)(void*);
|
|
98
99
|
*/
|
99
100
|
|
100
101
|
VALUE rb_mSkylight;
|
102
|
+
VALUE rb_mCore;
|
101
103
|
VALUE rb_mUtil;
|
102
104
|
VALUE rb_cClock;
|
103
|
-
VALUE rb_cTrace;
|
104
|
-
VALUE rb_cInstrumenter;
|
105
105
|
|
106
106
|
static const char* no_instrumenter_msg =
|
107
107
|
"Instrumenter not currently running";
|
@@ -133,7 +133,7 @@ load_libskylight(VALUE klass, VALUE path) {
|
|
133
133
|
|
134
134
|
/*
|
135
135
|
*
|
136
|
-
* class Skylight::Util::Clock
|
136
|
+
* class Skylight::Core::Util::Clock
|
137
137
|
*
|
138
138
|
*/
|
139
139
|
|
@@ -145,7 +145,7 @@ clock_high_res_time(VALUE self) {
|
|
145
145
|
|
146
146
|
/*
|
147
147
|
*
|
148
|
-
* class Skylight::Instrumenter
|
148
|
+
* class Skylight::Core::Instrumenter
|
149
149
|
*
|
150
150
|
*/
|
151
151
|
|
@@ -155,7 +155,6 @@ instrumenter_new(VALUE klass, VALUE rb_env) {
|
|
155
155
|
sky_buf_t env[256];
|
156
156
|
int i, envc;
|
157
157
|
|
158
|
-
UNUSED(klass);
|
159
158
|
CHECK_TYPE(rb_env, T_ARRAY);
|
160
159
|
|
161
160
|
if (RARRAY_LEN(rb_env) >= 256) {
|
@@ -178,7 +177,7 @@ instrumenter_new(VALUE klass, VALUE rb_env) {
|
|
178
177
|
sky_instrumenter_new(env, envc, &instrumenter),
|
179
178
|
"failed to initialize instrumenter");
|
180
179
|
|
181
|
-
return Data_Wrap_Struct(
|
180
|
+
return Data_Wrap_Struct(klass, NULL, sky_instrumenter_free, instrumenter);
|
182
181
|
}
|
183
182
|
|
184
183
|
static void*
|
@@ -262,15 +261,16 @@ instrumenter_track_desc(VALUE self, VALUE rb_endpoint, VALUE rb_desc) {
|
|
262
261
|
|
263
262
|
/*
|
264
263
|
*
|
265
|
-
* class Skylight::Trace
|
264
|
+
* class Skylight::Core::Trace
|
266
265
|
*
|
267
266
|
*/
|
268
267
|
|
269
268
|
static VALUE
|
270
|
-
trace_new(VALUE klass, VALUE start, VALUE uuid, VALUE endpoint) {
|
269
|
+
trace_new(VALUE klass, VALUE start, VALUE uuid, VALUE endpoint, VALUE meta) {
|
271
270
|
sky_trace_t* trace;
|
272
271
|
|
273
|
-
UNUSED(
|
272
|
+
UNUSED(meta);
|
273
|
+
|
274
274
|
CHECK_NUMERIC(start);
|
275
275
|
CHECK_TYPE(uuid, T_STRING);
|
276
276
|
CHECK_TYPE(endpoint, T_STRING);
|
@@ -281,7 +281,7 @@ trace_new(VALUE klass, VALUE start, VALUE uuid, VALUE endpoint) {
|
|
281
281
|
|
282
282
|
sky_clear_allocation_count();
|
283
283
|
|
284
|
-
return Data_Wrap_Struct(
|
284
|
+
return Data_Wrap_Struct(klass, NULL, sky_trace_free, trace);
|
285
285
|
}
|
286
286
|
|
287
287
|
static VALUE
|
@@ -326,6 +326,11 @@ trace_set_endpoint(VALUE self, VALUE endpoint) {
|
|
326
326
|
return Qnil;
|
327
327
|
}
|
328
328
|
|
329
|
+
static VALUE
|
330
|
+
trace_set_exception(VALUE self, VALUE exception) {
|
331
|
+
return Qnil;
|
332
|
+
}
|
333
|
+
|
329
334
|
static VALUE
|
330
335
|
trace_get_uuid(VALUE self) {
|
331
336
|
sky_trace_t* trace;
|
@@ -414,7 +419,22 @@ trace_span_set_description(VALUE self, VALUE span, VALUE desc) {
|
|
414
419
|
}
|
415
420
|
|
416
421
|
static VALUE
|
417
|
-
|
422
|
+
trace_span_set_meta(VALUE self, VALUE span, VALUE meta) {
|
423
|
+
return Qnil;
|
424
|
+
}
|
425
|
+
|
426
|
+
static VALUE
|
427
|
+
trace_span_set_exception(VALUE self, VALUE span, VALUE exception, VALUE exception_details) {
|
428
|
+
return Qnil;
|
429
|
+
}
|
430
|
+
|
431
|
+
static VALUE
|
432
|
+
trace_span_get_correlation_header(VALUE self, VALUE span_id) {
|
433
|
+
return Qnil;
|
434
|
+
}
|
435
|
+
|
436
|
+
static VALUE
|
437
|
+
lex_sql(VALUE klass, VALUE rb_sql, VALUE rb_use_old_lexer) {
|
418
438
|
sky_buf_t sql;
|
419
439
|
sky_buf_t title;
|
420
440
|
sky_buf_t statement;
|
@@ -438,9 +458,13 @@ lex_sql(VALUE klass, VALUE rb_sql) {
|
|
438
458
|
.len = RSTRING_LEN(rb_sql),
|
439
459
|
};
|
440
460
|
|
441
|
-
|
442
|
-
|
461
|
+
if (RTEST(rb_use_old_lexer)) {
|
462
|
+
CHECK_FFI(sky_lex_sql_old(sql, &title, &statement),
|
463
|
+
"native lex_sql_old failed");
|
464
|
+
} else {
|
465
|
+
CHECK_FFI(sky_lex_sql(sql, &title, &statement),
|
443
466
|
"native lex_sql failed");
|
467
|
+
}
|
444
468
|
|
445
469
|
// Set the statement return
|
446
470
|
rb_str_set_len(rb_statement, statement.len);
|
@@ -463,24 +487,31 @@ lex_sql(VALUE klass, VALUE rb_sql) {
|
|
463
487
|
void Init_skylight_native() {
|
464
488
|
rb_mSkylight = rb_define_module("Skylight");
|
465
489
|
rb_define_singleton_method(rb_mSkylight, "load_libskylight", load_libskylight, 1);
|
466
|
-
rb_define_singleton_method(rb_mSkylight, "lex_sql", lex_sql,
|
490
|
+
rb_define_singleton_method(rb_mSkylight, "lex_sql", lex_sql, 2);
|
491
|
+
|
492
|
+
rb_mCore = rb_define_module_under(rb_mSkylight, "Core");
|
467
493
|
|
468
|
-
|
494
|
+
// FIXME: Don't put these under Core
|
495
|
+
rb_mUtil = rb_define_module_under(rb_mCore, "Util");
|
469
496
|
rb_cClock = rb_define_class_under(rb_mUtil, "Clock", rb_cObject);
|
470
497
|
rb_define_method(rb_cClock, "native_hrtime", clock_high_res_time, 0);
|
471
498
|
|
472
|
-
rb_cTrace =
|
473
|
-
rb_define_singleton_method(rb_cTrace, "native_new", trace_new,
|
499
|
+
VALUE rb_cTrace = rb_const_get(rb_mSkylight, rb_intern("Trace"));
|
500
|
+
rb_define_singleton_method(rb_cTrace, "native_new", trace_new, 4);
|
474
501
|
rb_define_method(rb_cTrace, "native_get_started_at", trace_get_started_at, 0);
|
475
502
|
rb_define_method(rb_cTrace, "native_get_endpoint", trace_get_endpoint, 0);
|
476
503
|
rb_define_method(rb_cTrace, "native_set_endpoint", trace_set_endpoint, 1);
|
504
|
+
rb_define_method(rb_cTrace, "native_set_exception", trace_set_exception, 1);
|
477
505
|
rb_define_method(rb_cTrace, "native_get_uuid", trace_get_uuid, 0);
|
478
506
|
rb_define_method(rb_cTrace, "native_start_span", trace_start_span, 2);
|
479
507
|
rb_define_method(rb_cTrace, "native_stop_span", trace_stop_span, 2);
|
480
508
|
rb_define_method(rb_cTrace, "native_span_set_title", trace_span_set_title, 2);
|
481
509
|
rb_define_method(rb_cTrace, "native_span_set_description", trace_span_set_description, 2);
|
510
|
+
rb_define_method(rb_cTrace, "native_span_set_meta", trace_span_set_meta, 2);
|
511
|
+
rb_define_method(rb_cTrace, "native_span_set_exception", trace_span_set_exception, 3);
|
512
|
+
rb_define_method(rb_cTrace, "native_span_get_correlation_header", trace_span_get_correlation_header, 1);
|
482
513
|
|
483
|
-
rb_cInstrumenter =
|
514
|
+
VALUE rb_cInstrumenter = rb_const_get(rb_mSkylight, rb_intern("Instrumenter"));
|
484
515
|
rb_define_singleton_method(rb_cInstrumenter, "native_new", instrumenter_new, 1);
|
485
516
|
rb_define_method(rb_cInstrumenter, "native_start", instrumenter_start, 0);
|
486
517
|
rb_define_method(rb_cInstrumenter, "native_stop", instrumenter_stop, 0);
|
data/lib/skylight.rb
CHANGED
@@ -1,2 +1,36 @@
|
|
1
|
+
require 'skylight/version'
|
1
2
|
require 'skylight/core'
|
2
|
-
require 'skylight/
|
3
|
+
require 'skylight/trace'
|
4
|
+
require 'skylight/instrumenter'
|
5
|
+
require 'skylight/middleware'
|
6
|
+
require 'skylight/api'
|
7
|
+
require 'skylight/helpers'
|
8
|
+
require 'skylight/config'
|
9
|
+
require 'skylight/native'
|
10
|
+
|
11
|
+
module Skylight
|
12
|
+
# Used from the CLI
|
13
|
+
autoload :CLI, 'skylight/cli'
|
14
|
+
|
15
|
+
# Specifically check for Railtie since we've had at least one case of a
|
16
|
+
# customer having Rails defined without having all of Rails loaded.
|
17
|
+
if defined?(Rails::Railtie)
|
18
|
+
require 'skylight/railtie'
|
19
|
+
end
|
20
|
+
|
21
|
+
include Core::Instrumentable
|
22
|
+
|
23
|
+
def self.instrumenter_class
|
24
|
+
Instrumenter
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.config_class
|
28
|
+
Config
|
29
|
+
end
|
30
|
+
|
31
|
+
# Install probes
|
32
|
+
def self.probe(*probes)
|
33
|
+
Core::Probes.probe(*probes)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/skylight/api.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'uri'
|
2
|
+
require 'skylight/util/http'
|
2
3
|
|
3
4
|
module Skylight
|
4
5
|
# @api private
|
5
6
|
class Api
|
6
|
-
include Util::Logging
|
7
|
+
include Core::Util::Logging
|
7
8
|
|
8
9
|
attr_reader :config
|
9
10
|
|
@@ -33,7 +34,7 @@ module Skylight
|
|
33
34
|
|
34
35
|
class ConfigValidationResults
|
35
36
|
|
36
|
-
include Util::Logging
|
37
|
+
include Core::Util::Logging
|
37
38
|
|
38
39
|
attr_reader :raw_response
|
39
40
|
|
@@ -116,4 +117,5 @@ module Skylight
|
|
116
117
|
end
|
117
118
|
|
118
119
|
end
|
120
|
+
|
119
121
|
end
|
data/lib/skylight/cli.rb
CHANGED
data/lib/skylight/cli/doctor.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'skylight/util/http'
|
2
|
+
|
1
3
|
module Skylight
|
2
4
|
module CLI
|
3
5
|
class Doctor < Thor::Group
|
@@ -9,7 +11,7 @@ module Skylight
|
|
9
11
|
say "Checking SSL"
|
10
12
|
http = Util::HTTP.new(config)
|
11
13
|
indent do
|
12
|
-
req = http.get("/
|
14
|
+
req = http.get("/", "Accept" => "text/html")
|
13
15
|
if req.success?
|
14
16
|
say "OK", :green
|
15
17
|
else
|
@@ -85,7 +87,7 @@ module Skylight
|
|
85
87
|
begin
|
86
88
|
config.validate!
|
87
89
|
say "Configuration is valid", :green
|
88
|
-
rescue ConfigError => e
|
90
|
+
rescue Core::ConfigError => e
|
89
91
|
encountered_error!
|
90
92
|
|
91
93
|
say "Configuration is invalid", :red
|
@@ -111,7 +113,7 @@ module Skylight
|
|
111
113
|
logger.level = Logger::DEBUG
|
112
114
|
# Remove excess formatting
|
113
115
|
logger.formatter = proc { |severity, datetime, progname, msg|
|
114
|
-
msg = msg.sub("[SKYLIGHT] [#{Skylight::VERSION}] ", '')
|
116
|
+
msg = msg.sub("[SKYLIGHT] [#{Skylight::Core::VERSION}] ", '')
|
115
117
|
say "#{severity} - #{msg}" # Definitely non-standard
|
116
118
|
}
|
117
119
|
config.logger = logger
|
@@ -182,7 +184,7 @@ module Skylight
|
|
182
184
|
end
|
183
185
|
|
184
186
|
def is_mac?
|
185
|
-
Util::Platform::OS == 'darwin'
|
187
|
+
Core::Util::Platform::OS == 'darwin'
|
186
188
|
end
|
187
189
|
|
188
190
|
# NOTE: This check won't work correctly on Windows
|
data/lib/skylight/config.rb
CHANGED
@@ -1,314 +1,181 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'fileutils'
|
3
|
-
require 'thread'
|
4
1
|
require 'openssl'
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require 'skylight/util/deploy'
|
2
|
+
require 'skylight/core/util/deploy'
|
3
|
+
require 'skylight/core/util/platform'
|
8
4
|
require 'skylight/util/hostname'
|
9
|
-
require 'skylight/util/logging'
|
10
|
-
require 'skylight/util/platform'
|
11
5
|
require 'skylight/util/ssl'
|
12
|
-
require 'skylight/util/proxy'
|
13
6
|
|
14
7
|
module Skylight
|
15
|
-
class Config
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
"CLIENT_CONN_TRY_WIN" => :'daemon.connect_try_window',
|
80
|
-
"MAX_PRESPAWN_JITTER" => :'daemon.max_prespawn_jitter',
|
81
|
-
"DAEMON_WAIT_TIMEOUT" => :'daemon.wait_timeout',
|
82
|
-
"CLIENT_CHECK_INTERVAL" => :'daemon.client_check_interval',
|
83
|
-
"CLIENT_QUEUE_DEPTH" => :'daemon.client_queue_depth',
|
84
|
-
"CLIENT_WRITE_TIMEOUT" => :'daemon.client_write_timeout',
|
85
|
-
"SSL_CERT_PATH" => :'daemon.ssl_cert_path',
|
86
|
-
"SSL_CERT_DIR" => :'daemon.ssl_cert_dir',
|
87
|
-
|
88
|
-
# == Heroku settings ==
|
89
|
-
#
|
90
|
-
"HEROKU_DYNO_INFO_PATH" => :'heroku.dyno_info_path',
|
91
|
-
|
92
|
-
# == Legacy env vars ==
|
93
|
-
#
|
94
|
-
'AGENT_LOCKFILE' => :'agent.lockfile',
|
95
|
-
'AGENT_SOCKFILE_PATH' => :'agent.sockfile_path'
|
96
|
-
}
|
97
|
-
|
98
|
-
# Default values for Skylight configuration keys
|
99
|
-
DEFAULTS = {
|
100
|
-
:auth_url => 'https://auth.skylight.io/agent',
|
101
|
-
:app_create_url => 'https://www.skylight.io/apps',
|
102
|
-
:validation_url => 'https://auth.skylight.io/agent/config',
|
103
|
-
:'daemon.lazy_start' => true,
|
104
|
-
:log_file => '-'.freeze,
|
105
|
-
:log_level => 'INFO'.freeze,
|
106
|
-
:alert_log_file => '-'.freeze,
|
107
|
-
:log_sql_parse_errors => false,
|
108
|
-
:enable_segments => true,
|
109
|
-
:hostname => Util::Hostname.default_hostname,
|
110
|
-
:'heroku.dyno_info_path' => '/etc/heroku/dyno'
|
111
|
-
}
|
112
|
-
|
113
|
-
if Skylight::Util::Platform::OS != 'darwin'
|
114
|
-
DEFAULTS[:'daemon.ssl_cert_path'] = Util::SSL.ca_cert_file_or_default
|
115
|
-
DEFAULTS[:'daemon.ssl_cert_dir'] = Util::SSL.ca_cert_dir
|
116
|
-
end
|
117
|
-
|
118
|
-
if Skylight.native?
|
119
|
-
native_path = Skylight.libskylight_path
|
120
|
-
|
121
|
-
DEFAULTS[:'daemon.lib_path'] = native_path
|
122
|
-
DEFAULTS[:'daemon.exec_path'] = File.join(native_path, 'skylightd')
|
123
|
-
end
|
124
|
-
|
125
|
-
DEFAULTS.freeze
|
126
|
-
|
127
|
-
REQUIRED = {
|
128
|
-
authentication: "authentication token",
|
129
|
-
hostname: "server hostname",
|
130
|
-
auth_url: "authentication url",
|
131
|
-
validation_url: "config validation url" }
|
132
|
-
|
133
|
-
SERVER_VALIDATE = [
|
134
|
-
# Nothing is validated for now, but this is a list of symbols
|
135
|
-
# for the key we want to validate.
|
136
|
-
]
|
137
|
-
|
138
|
-
NATIVE_ENV = [
|
139
|
-
:version,
|
140
|
-
:root,
|
141
|
-
:hostname,
|
142
|
-
:deploy_id,
|
143
|
-
:session_token,
|
144
|
-
:proxy_url,
|
145
|
-
:auth_url,
|
146
|
-
:auth_http_deflate,
|
147
|
-
:auth_http_connect_timeout,
|
148
|
-
:auth_http_read_timeout,
|
149
|
-
:report_url,
|
150
|
-
:report_http_deflate,
|
151
|
-
:report_http_connect_timeout,
|
152
|
-
:report_http_read_timeout,
|
153
|
-
:'daemon.lazy_start',
|
154
|
-
:'daemon.exec_path',
|
155
|
-
:'daemon.lib_path',
|
156
|
-
:'daemon.pidfile_path',
|
157
|
-
:'daemon.sockdir_path',
|
158
|
-
:'daemon.batch_queue_depth',
|
159
|
-
:'daemon.batch_sample_size',
|
160
|
-
:'daemon.batch_flush_interval',
|
161
|
-
:'daemon.tick_interval',
|
162
|
-
:'daemon.sanity_check_interval',
|
163
|
-
:'daemon.inactivity_timeout',
|
164
|
-
:'daemon.max_connect_tries',
|
165
|
-
:'daemon.connect_try_window',
|
166
|
-
:'daemon.max_prespawn_jitter',
|
167
|
-
:'daemon.wait_timeout',
|
168
|
-
:'daemon.client_check_interval',
|
169
|
-
:'daemon.client_queue_depth',
|
170
|
-
:'daemon.client_write_timeout',
|
171
|
-
:'daemon.ssl_cert_path',
|
172
|
-
:'daemon.ssl_cert_dir'
|
173
|
-
]
|
174
|
-
|
175
|
-
# Maps legacy config keys to new config keys
|
176
|
-
LEGACY = {
|
177
|
-
:'agent.sockfile_path' => :'daemon.sockdir_path',
|
178
|
-
:'agent.lockfile' => :'daemon.pidfile_path'
|
179
|
-
}
|
180
|
-
|
181
|
-
VALIDATORS = {
|
182
|
-
:'agent.interval' => [lambda { |v, c| Integer === v && v > 0 }, "must be an integer greater than 0"]
|
183
|
-
}
|
184
|
-
|
185
|
-
# @api private
|
186
|
-
attr_reader :environment
|
187
|
-
|
188
|
-
# @api private
|
189
|
-
def initialize(*args)
|
190
|
-
attrs = {}
|
191
|
-
|
192
|
-
if Hash === args.last
|
193
|
-
attrs = args.pop.dup
|
194
|
-
end
|
195
|
-
|
196
|
-
@values = {}
|
197
|
-
@priority = {}
|
198
|
-
@regexp = nil
|
199
|
-
|
200
|
-
p = attrs.delete(:priority)
|
201
|
-
|
202
|
-
if @environment = args[0]
|
203
|
-
@regexp = /^#{Regexp.escape(@environment)}\.(.+)$/
|
204
|
-
end
|
205
|
-
|
206
|
-
attrs.each do |k, v|
|
207
|
-
self[k] = v
|
208
|
-
end
|
209
|
-
|
210
|
-
if p
|
211
|
-
p.each do |k, v|
|
212
|
-
@priority[Config.remap_key(k)] = v
|
213
|
-
end
|
214
|
-
end
|
8
|
+
class Config < Core::Config
|
9
|
+
|
10
|
+
def self.env_to_key
|
11
|
+
@env_to_key ||= super.merge(
|
12
|
+
# == Authentication ==
|
13
|
+
'AUTHENTICATION' => :authentication,
|
14
|
+
|
15
|
+
# == App settings ==
|
16
|
+
'ROOT' => :root,
|
17
|
+
'HOSTNAME' => :hostname,
|
18
|
+
'SESSION_TOKEN' => :session_token,
|
19
|
+
|
20
|
+
# == Deploy settings ==
|
21
|
+
'DEPLOY_ID' => :'deploy.id',
|
22
|
+
'DEPLOY_GIT_SHA' => :'deploy.git_sha',
|
23
|
+
'DEPLOY_DESCRIPTION' => :'deploy.description',
|
24
|
+
|
25
|
+
# == Sql Lexer ==
|
26
|
+
'USE_OLD_SQL_LEXER' => :use_old_sql_lexer,
|
27
|
+
|
28
|
+
# == Instrumenter ==
|
29
|
+
"IGNORED_ENDPOINT" => :ignored_endpoint,
|
30
|
+
"IGNORED_ENDPOINTS" => :ignored_endpoints,
|
31
|
+
|
32
|
+
# == Skylight Remote ==
|
33
|
+
"AUTH_URL" => :auth_url,
|
34
|
+
"APP_CREATE_URL" => :app_create_url,
|
35
|
+
"VALIDATION_URL" => :validation_url,
|
36
|
+
"AUTH_HTTP_DEFLATE" => :auth_http_deflate,
|
37
|
+
"AUTH_HTTP_CONNECT_TIMEOUT" => :auth_http_connect_timeout,
|
38
|
+
"AUTH_HTTP_READ_TIMEOUT" => :auth_http_read_timeout,
|
39
|
+
"REPORT_URL" => :report_url,
|
40
|
+
"REPORT_HTTP_DEFLATE" => :report_http_deflate,
|
41
|
+
"REPORT_HTTP_CONNECT_TIMEOUT" => :report_http_connect_timeout,
|
42
|
+
"REPORT_HTTP_READ_TIMEOUT" => :report_http_read_timeout,
|
43
|
+
|
44
|
+
# == Native agent settings ==
|
45
|
+
#
|
46
|
+
"LAZY_START" => :'daemon.lazy_start',
|
47
|
+
"DAEMON_EXEC_PATH" => :'daemon.exec_path',
|
48
|
+
"DAEMON_LIB_PATH" => :'daemon.lib_path',
|
49
|
+
"PIDFILE_PATH" => :'daemon.pidfile_path',
|
50
|
+
"SOCKDIR_PATH" => :'daemon.sockdir_path',
|
51
|
+
"BATCH_QUEUE_DEPTH" => :'daemon.batch_queue_depth',
|
52
|
+
"BATCH_SAMPLE_SIZE" => :'daemon.batch_sample_size',
|
53
|
+
"BATCH_FLUSH_INTERVAL" => :'daemon.batch_flush_interval',
|
54
|
+
"DAEMON_TICK_INTERVAL" => :'daemon.tick_interval',
|
55
|
+
"DAEMON_SANITY_CHECK_INTERVAL" => :'daemon.sanity_check_interval',
|
56
|
+
"DAEMON_INACTIVITY_TIMEOUT" => :'daemon.inactivity_timeout',
|
57
|
+
"CLIENT_MAX_TRIES" => :'daemon.max_connect_tries',
|
58
|
+
"CLIENT_CONN_TRY_WIN" => :'daemon.connect_try_window',
|
59
|
+
"MAX_PRESPAWN_JITTER" => :'daemon.max_prespawn_jitter',
|
60
|
+
"DAEMON_WAIT_TIMEOUT" => :'daemon.wait_timeout',
|
61
|
+
"CLIENT_CHECK_INTERVAL" => :'daemon.client_check_interval',
|
62
|
+
"CLIENT_QUEUE_DEPTH" => :'daemon.client_queue_depth',
|
63
|
+
"CLIENT_WRITE_TIMEOUT" => :'daemon.client_write_timeout',
|
64
|
+
"SSL_CERT_PATH" => :'daemon.ssl_cert_path',
|
65
|
+
"SSL_CERT_DIR" => :'daemon.ssl_cert_dir',
|
66
|
+
|
67
|
+
# == Legacy env vars ==
|
68
|
+
#
|
69
|
+
'AGENT_LOCKFILE' => :'agent.lockfile',
|
70
|
+
'AGENT_SOCKFILE_PATH' => :'agent.sockfile_path'
|
71
|
+
)
|
215
72
|
end
|
216
73
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
74
|
+
# Default values for Skylight configuration keys
|
75
|
+
def self.default_values
|
76
|
+
@default_values ||= begin
|
77
|
+
ret = super.merge(
|
78
|
+
:auth_url => 'https://auth.skylight.io/agent',
|
79
|
+
:app_create_url => 'https://www.skylight.io/apps',
|
80
|
+
:validation_url => 'https://auth.skylight.io/agent/config',
|
81
|
+
:'daemon.lazy_start' => true,
|
82
|
+
:hostname => Util::Hostname.default_hostname,
|
83
|
+
:use_old_sql_lexer => false
|
84
|
+
)
|
85
|
+
|
86
|
+
if Core::Util::Platform::OS != 'darwin'
|
87
|
+
ret[:'daemon.ssl_cert_path'] = Util::SSL.ca_cert_file_or_default
|
88
|
+
ret[:'daemon.ssl_cert_dir'] = Util::SSL.ca_cert_dir
|
232
89
|
end
|
233
90
|
|
234
|
-
|
91
|
+
if Skylight.native?
|
92
|
+
native_path = Skylight.libskylight_path
|
235
93
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
if env
|
240
|
-
attrs[:priority] = remap_env(env)
|
241
|
-
end
|
242
|
-
|
243
|
-
config = new(environment, attrs)
|
94
|
+
ret[:'daemon.lib_path'] = native_path
|
95
|
+
ret[:'daemon.exec_path'] = File.join(native_path, 'skylightd')
|
96
|
+
end
|
244
97
|
|
245
|
-
|
246
|
-
config[k] = v
|
98
|
+
ret
|
247
99
|
end
|
248
|
-
|
249
|
-
config
|
250
100
|
end
|
251
101
|
|
252
|
-
def self.
|
253
|
-
|
254
|
-
|
102
|
+
def self.required_keys
|
103
|
+
@required_keys ||= super.merge(
|
104
|
+
authentication: "authentication token",
|
105
|
+
hostname: "server hostname",
|
106
|
+
auth_url: "authentication url",
|
107
|
+
validation_url: "config validation url"
|
108
|
+
)
|
255
109
|
end
|
256
110
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
111
|
+
def self.native_env_keys
|
112
|
+
@native_env_keys ||= super + [
|
113
|
+
:version,
|
114
|
+
:root,
|
115
|
+
:hostname,
|
116
|
+
:deploy_id,
|
117
|
+
:session_token,
|
118
|
+
:auth_url,
|
119
|
+
:auth_http_deflate,
|
120
|
+
:auth_http_connect_timeout,
|
121
|
+
:auth_http_read_timeout,
|
122
|
+
:report_url,
|
123
|
+
:report_http_deflate,
|
124
|
+
:report_http_connect_timeout,
|
125
|
+
:report_http_read_timeout,
|
126
|
+
:'daemon.lazy_start',
|
127
|
+
:'daemon.exec_path',
|
128
|
+
:'daemon.lib_path',
|
129
|
+
:'daemon.pidfile_path',
|
130
|
+
:'daemon.sockdir_path',
|
131
|
+
:'daemon.batch_queue_depth',
|
132
|
+
:'daemon.batch_sample_size',
|
133
|
+
:'daemon.batch_flush_interval',
|
134
|
+
:'daemon.tick_interval',
|
135
|
+
:'daemon.sanity_check_interval',
|
136
|
+
:'daemon.inactivity_timeout',
|
137
|
+
:'daemon.max_connect_tries',
|
138
|
+
:'daemon.connect_try_window',
|
139
|
+
:'daemon.max_prespawn_jitter',
|
140
|
+
:'daemon.wait_timeout',
|
141
|
+
:'daemon.client_check_interval',
|
142
|
+
:'daemon.client_queue_depth',
|
143
|
+
:'daemon.client_write_timeout',
|
144
|
+
:'daemon.ssl_cert_path',
|
145
|
+
:'daemon.ssl_cert_dir'
|
146
|
+
]
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.legacy_keys
|
150
|
+
@legacy_keys ||= super.merge(
|
151
|
+
:'agent.sockfile_path' => :'daemon.sockdir_path',
|
152
|
+
:'agent.lockfile' => :'daemon.pidfile_path'
|
153
|
+
)
|
154
|
+
end
|
284
155
|
|
285
|
-
|
156
|
+
def self.validators
|
157
|
+
@validators ||= super.merge(
|
158
|
+
:'agent.interval' => [lambda { |v, c| Integer === v && v > 0 }, "must be an integer greater than 0"]
|
159
|
+
)
|
286
160
|
end
|
287
161
|
|
162
|
+
# @api private
|
288
163
|
def api
|
289
164
|
@api ||= Api.new(self)
|
290
165
|
end
|
291
166
|
|
292
167
|
# @api private
|
293
168
|
def validate!
|
294
|
-
|
295
|
-
unless get(k)
|
296
|
-
raise ConfigError, "#{v} required"
|
297
|
-
end
|
298
|
-
end
|
169
|
+
super
|
299
170
|
|
300
171
|
# TODO: Move this out of the validate! method: https://github.com/tildeio/direwolf-agent/issues/273
|
301
172
|
# FIXME: Why not set the sockdir_path and pidfile_path explicitly?
|
302
173
|
# That way we don't have to keep this in sync with the Rust repo.
|
303
174
|
sockdir_path = File.expand_path(self[:'daemon.sockdir_path'] || '.', root)
|
304
175
|
pidfile_path = File.expand_path(self[:'daemon.pidfile_path'] || 'skylight.pid', sockdir_path)
|
305
|
-
log_file = self[:log_file]
|
306
|
-
alert_log_file = self[:alert_log_file]
|
307
176
|
|
308
177
|
check_file_permissions(pidfile_path, "daemon.pidfile_path or daemon.sockdir_path")
|
309
178
|
check_sockdir_permissions(sockdir_path)
|
310
|
-
check_logfile_permissions(log_file, "log_file")
|
311
|
-
check_logfile_permissions(alert_log_file, "alert_log_file")
|
312
179
|
|
313
180
|
true
|
314
181
|
end
|
@@ -336,7 +203,7 @@ module Skylight
|
|
336
203
|
corrected_config = res.corrected_config
|
337
204
|
unless corrected_config
|
338
205
|
# Use defaults if no corrected config is available. This will happen if the request failed.
|
339
|
-
corrected_config = Hash[
|
206
|
+
corrected_config = Hash[self.class.server_validated_keys.map{|k| [k, [k]] }]
|
340
207
|
end
|
341
208
|
|
342
209
|
config_to_update = corrected_config.select{|k,v| get(k) != v }
|
@@ -357,139 +224,23 @@ module Skylight
|
|
357
224
|
return true
|
358
225
|
end
|
359
226
|
|
360
|
-
def check_file_permissions(file, key)
|
361
|
-
file_root = File.dirname(file)
|
362
|
-
|
363
|
-
# Try to make the directory, don't blow up if we can't. Our writable? check will fail later.
|
364
|
-
FileUtils.mkdir_p file_root rescue nil
|
365
|
-
|
366
|
-
if File.exist?(file) && !FileTest.writable?(file)
|
367
|
-
raise ConfigError, "File `#{file}` is not writable. Please set #{key} in your config to a writable path"
|
368
|
-
end
|
369
|
-
|
370
|
-
unless FileTest.writable?(file_root)
|
371
|
-
raise ConfigError, "Directory `#{file_root}` is not writable. Please set #{key} in your config to a writable path"
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
227
|
def check_sockdir_permissions(sockdir_path)
|
376
228
|
# Try to make the directory, don't blow up if we can't. Our writable? check will fail later.
|
377
229
|
FileUtils.mkdir_p sockdir_path rescue nil
|
378
230
|
|
379
231
|
unless FileTest.writable?(sockdir_path)
|
380
|
-
raise ConfigError, "Directory `#{sockdir_path}` is not writable. Please set daemon.sockdir_path in your config to a writable path"
|
232
|
+
raise Core::ConfigError, "Directory `#{sockdir_path}` is not writable. Please set daemon.sockdir_path in your config to a writable path"
|
381
233
|
end
|
382
234
|
|
383
235
|
if check_nfs(sockdir_path)
|
384
|
-
raise ConfigError, "Directory `#{sockdir_path}` is an NFS mount and will not allow sockets. Please set daemon.sockdir_path in your config to a non-NFS path."
|
236
|
+
raise Core::ConfigError, "Directory `#{sockdir_path}` is an NFS mount and will not allow sockets. Please set daemon.sockdir_path in your config to a non-NFS path."
|
385
237
|
end
|
386
238
|
end
|
387
239
|
|
388
|
-
def check_logfile_permissions(log_file, key)
|
389
|
-
return if log_file == '-' # STDOUT
|
390
|
-
log_file = File.expand_path(log_file, root)
|
391
|
-
check_file_permissions(log_file, key)
|
392
|
-
end
|
393
|
-
|
394
|
-
def key?(key)
|
395
|
-
key = Config.remap_key(key)
|
396
|
-
@priority.key?(key) || @values.key?(key)
|
397
|
-
end
|
398
|
-
|
399
|
-
def get(key, default = nil, &blk)
|
400
|
-
key = Config.remap_key(key)
|
401
|
-
|
402
|
-
return @priority[key] if @priority.key?(key)
|
403
|
-
return @values[key] if @values.key?(key)
|
404
|
-
return DEFAULTS[key] if DEFAULTS.key?(key)
|
405
|
-
|
406
|
-
if default
|
407
|
-
return default
|
408
|
-
elsif blk
|
409
|
-
return blk.call(key)
|
410
|
-
end
|
411
|
-
|
412
|
-
nil
|
413
|
-
end
|
414
|
-
|
415
|
-
alias [] get
|
416
|
-
|
417
|
-
def set(key, val, scope = nil)
|
418
|
-
if scope
|
419
|
-
key = [scope, key].join('.')
|
420
|
-
end
|
421
|
-
|
422
|
-
if Hash === val
|
423
|
-
val.each do |k, v|
|
424
|
-
set(k, v, key)
|
425
|
-
end
|
426
|
-
else
|
427
|
-
k = Config.remap_key(key)
|
428
|
-
|
429
|
-
if validator = VALIDATORS[k]
|
430
|
-
blk, msg = validator
|
431
|
-
|
432
|
-
unless blk.call(val, self)
|
433
|
-
error_msg = "invalid value for #{k} (#{val})"
|
434
|
-
error_msg << ", #{msg}" if msg
|
435
|
-
raise ConfigError, error_msg
|
436
|
-
end
|
437
|
-
end
|
438
|
-
|
439
|
-
if @regexp && k =~ @regexp
|
440
|
-
@priority[$1.to_sym] = val
|
441
|
-
end
|
442
|
-
|
443
|
-
@values[k] = val
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
alias []= set
|
448
|
-
|
449
|
-
def send_or_get(v)
|
450
|
-
respond_to?(v) ? send(v) : get(v)
|
451
|
-
end
|
452
|
-
|
453
|
-
def duration_ms(key, default = nil)
|
454
|
-
if (v = self[key]) && v.to_s =~ /^\s*(\d+)(s|sec|ms|micros|nanos)?\s*$/
|
455
|
-
v = $1.to_i
|
456
|
-
case $2
|
457
|
-
when "ms"
|
458
|
-
v
|
459
|
-
when "micros"
|
460
|
-
v / 1_000
|
461
|
-
when "nanos"
|
462
|
-
v / 1_000_000
|
463
|
-
else # "s", "sec", nil
|
464
|
-
v * 1000
|
465
|
-
end
|
466
|
-
else
|
467
|
-
default
|
468
|
-
end
|
469
|
-
end
|
470
|
-
|
471
|
-
def to_json
|
472
|
-
JSON.generate(
|
473
|
-
config: {
|
474
|
-
priority: @priority,
|
475
|
-
values: @values
|
476
|
-
}
|
477
|
-
)
|
478
|
-
end
|
479
|
-
|
480
240
|
def to_native_env
|
481
|
-
ret =
|
241
|
+
ret = super
|
482
242
|
|
483
243
|
ret << "SKYLIGHT_AUTHENTICATION" << authentication_with_deploy
|
484
|
-
|
485
|
-
NATIVE_ENV.each do |key|
|
486
|
-
value = send_or_get(key)
|
487
|
-
unless value.nil?
|
488
|
-
env_key = ENV_TO_KEY.key(key) || key.upcase
|
489
|
-
ret << "SKYLIGHT_#{env_key}" << cast_for_env(value)
|
490
|
-
end
|
491
|
-
end
|
492
|
-
|
493
244
|
ret << "SKYLIGHT_VALIDATE_AUTHENTICATION" << "false"
|
494
245
|
|
495
246
|
ret
|
@@ -513,42 +264,6 @@ authentication: #{self[:authentication]}
|
|
513
264
|
#
|
514
265
|
#
|
515
266
|
|
516
|
-
def version
|
517
|
-
VERSION
|
518
|
-
end
|
519
|
-
|
520
|
-
# @api private
|
521
|
-
def gc
|
522
|
-
@gc ||= GC.new(self, get('gc.profiler', VM::GC.new))
|
523
|
-
end
|
524
|
-
|
525
|
-
# @api private
|
526
|
-
def ignore_token?
|
527
|
-
get('test.ignore_token')
|
528
|
-
end
|
529
|
-
|
530
|
-
# @api private
|
531
|
-
def ignored_endpoints
|
532
|
-
@ignored_endpoints ||=
|
533
|
-
begin
|
534
|
-
ignored_endpoints = get(:ignored_endpoints)
|
535
|
-
|
536
|
-
# If, for some odd reason you have a comma in your endpoint name, use the
|
537
|
-
# YML config instead.
|
538
|
-
if ignored_endpoints.is_a?(String)
|
539
|
-
ignored_endpoints = ignored_endpoints.split(/\s*,\s*/)
|
540
|
-
end
|
541
|
-
|
542
|
-
val = Array(get(:ignored_endpoint))
|
543
|
-
val.concat(Array(ignored_endpoints))
|
544
|
-
val
|
545
|
-
end
|
546
|
-
end
|
547
|
-
|
548
|
-
def root
|
549
|
-
self[:root] || Dir.pwd
|
550
|
-
end
|
551
|
-
|
552
267
|
def authentication_with_deploy
|
553
268
|
token = get(:authentication)
|
554
269
|
|
@@ -562,49 +277,8 @@ authentication: #{self[:authentication]}
|
|
562
277
|
token
|
563
278
|
end
|
564
279
|
|
565
|
-
def logger
|
566
|
-
@logger ||=
|
567
|
-
MUTEX.synchronize do
|
568
|
-
load_logger
|
569
|
-
end
|
570
|
-
end
|
571
|
-
|
572
|
-
def logger=(logger)
|
573
|
-
@logger = logger
|
574
|
-
end
|
575
|
-
|
576
|
-
def alert_logger
|
577
|
-
@alert_logger ||= MUTEX.synchronize do
|
578
|
-
unless l = @alert_logger
|
579
|
-
out = get(:alert_log_file)
|
580
|
-
out = Util::AlertLogger.new(load_logger) if out == '-'
|
581
|
-
|
582
|
-
l = create_logger(out)
|
583
|
-
l.level = Logger::DEBUG
|
584
|
-
end
|
585
|
-
|
586
|
-
l
|
587
|
-
end
|
588
|
-
end
|
589
|
-
|
590
|
-
def alert_logger=(logger)
|
591
|
-
@alert_logger = logger
|
592
|
-
end
|
593
|
-
|
594
|
-
def on_heroku?
|
595
|
-
File.exist?(get(:'heroku.dyno_info_path'))
|
596
|
-
end
|
597
|
-
|
598
280
|
def deploy
|
599
|
-
@deploy ||= Util::Deploy.build(self)
|
600
|
-
end
|
601
|
-
|
602
|
-
def enable_segments?
|
603
|
-
!!get(:enable_segments)
|
604
|
-
end
|
605
|
-
|
606
|
-
def user_config
|
607
|
-
@user_config ||= UserConfig.new(self)
|
281
|
+
@deploy ||= Core::Util::Deploy.build(self)
|
608
282
|
end
|
609
283
|
|
610
284
|
private
|
@@ -614,48 +288,5 @@ authentication: #{self[:authentication]}
|
|
614
288
|
`stat -f -L -c %T #{path} 2>&1`.strip == 'nfs'
|
615
289
|
end
|
616
290
|
|
617
|
-
def create_logger(out)
|
618
|
-
if out.is_a?(String)
|
619
|
-
out = File.expand_path(out, root)
|
620
|
-
# May be redundant since we also do this in the permissions check
|
621
|
-
FileUtils.mkdir_p(File.dirname(out))
|
622
|
-
end
|
623
|
-
|
624
|
-
Logger.new(out)
|
625
|
-
rescue
|
626
|
-
Logger.new(STDOUT)
|
627
|
-
end
|
628
|
-
|
629
|
-
def load_logger
|
630
|
-
unless l = @logger
|
631
|
-
out = get(:log_file)
|
632
|
-
out = STDOUT if out == '-'
|
633
|
-
|
634
|
-
l = create_logger(out)
|
635
|
-
|
636
|
-
if ENV[TRACE_ENV_KEY]
|
637
|
-
l.level = Logger::DEBUG
|
638
|
-
else
|
639
|
-
l.level =
|
640
|
-
case get(:log_level)
|
641
|
-
when /^debug$/i then Logger::DEBUG
|
642
|
-
when /^info$/i then Logger::INFO
|
643
|
-
when /^warn$/i then Logger::WARN
|
644
|
-
when /^error$/i then Logger::ERROR
|
645
|
-
end
|
646
|
-
end
|
647
|
-
end
|
648
|
-
|
649
|
-
l
|
650
|
-
end
|
651
|
-
|
652
|
-
def cast_for_env(v)
|
653
|
-
case v
|
654
|
-
when true then 'true'
|
655
|
-
when false then 'false'
|
656
|
-
when nil then 'nil'
|
657
|
-
else v.to_s
|
658
|
-
end
|
659
|
-
end
|
660
291
|
end
|
661
292
|
end
|