skylight 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/ext/libskylight.yml +3 -3
- data/ext/skylight_native.c +0 -41
- data/lib/skylight.rb +8 -0
- data/lib/skylight/config.rb +44 -41
- data/lib/skylight/metrics/ewma.rb +69 -0
- data/lib/skylight/metrics/meter.rb +58 -0
- data/lib/skylight/metrics/process_cpu_gauge.rb +65 -0
- data/lib/skylight/metrics/process_mem_gauge.rb +34 -0
- data/lib/skylight/util/clock.rb +13 -7
- data/lib/skylight/util/conversions.rb +9 -0
- data/lib/skylight/util/http.rb +6 -4
- data/lib/skylight/util/native_ext_fetcher.rb +1 -1
- data/lib/skylight/util/task.rb +21 -5
- data/lib/skylight/vendor/cli/highline.rb +42 -20
- data/lib/skylight/vendor/cli/highline/menu.rb +6 -23
- data/lib/skylight/vendor/cli/highline/question.rb +20 -14
- data/lib/skylight/vendor/cli/highline/string_extensions.rb +19 -39
- data/lib/skylight/vendor/cli/highline/system_extensions.rb +28 -4
- data/lib/skylight/version.rb +1 -1
- data/lib/skylight/worker.rb +8 -6
- data/lib/skylight/worker/builder.rb +1 -1
- data/lib/skylight/worker/collector.rb +57 -16
- data/lib/skylight/worker/connection.rb +14 -2
- data/lib/skylight/worker/connection_set.rb +56 -0
- data/lib/skylight/worker/metrics_reporter.rb +103 -0
- data/lib/skylight/worker/server.rb +35 -36
- metadata +23 -15
data/lib/skylight/util/http.rb
CHANGED
@@ -20,6 +20,7 @@ module Skylight
|
|
20
20
|
include Logging
|
21
21
|
|
22
22
|
attr_accessor :authentication, :config
|
23
|
+
attr_reader :host, :port
|
23
24
|
|
24
25
|
def initialize(config, service = :report)
|
25
26
|
@config = config
|
@@ -93,7 +94,8 @@ module Skylight
|
|
93
94
|
|
94
95
|
http = Net::HTTP.new(@host, @port, @proxy_addr, @proxy_port, @proxy_user, @proxy_pass)
|
95
96
|
|
96
|
-
# Default is 60, but
|
97
|
+
# Default is 60, but we don't want to wait that long.
|
98
|
+
# This path is also used on app boot and Heroku will timeout at 60
|
97
99
|
http.read_timeout = 15
|
98
100
|
|
99
101
|
if @ssl
|
@@ -113,9 +115,9 @@ module Skylight
|
|
113
115
|
Response.new(res.code.to_i, res, res.body)
|
114
116
|
end
|
115
117
|
rescue Exception => e
|
116
|
-
error "http %s failed; error=%s; msg=%s", req.method, e.class, e.message
|
118
|
+
error "http %s %s failed; error=%s; msg=%s", req.method, req.path, e.class, e.message
|
117
119
|
t { e.backtrace.join("\n") }
|
118
|
-
ErrorResponse.new(req
|
120
|
+
ErrorResponse.new(req, e)
|
119
121
|
end
|
120
122
|
|
121
123
|
class Response
|
@@ -167,7 +169,7 @@ module Skylight
|
|
167
169
|
end
|
168
170
|
end
|
169
171
|
|
170
|
-
class ErrorResponse < Struct.new(:
|
172
|
+
class ErrorResponse < Struct.new(:request, :exception)
|
171
173
|
def status
|
172
174
|
nil
|
173
175
|
end
|
data/lib/skylight/util/task.rb
CHANGED
@@ -7,13 +7,17 @@ module Skylight
|
|
7
7
|
|
8
8
|
include Util::Logging
|
9
9
|
|
10
|
+
attr_reader :queue_depth_metric
|
11
|
+
|
10
12
|
def initialize(size, timeout = 0.1, &blk)
|
11
|
-
@pid
|
12
|
-
@thread
|
13
|
-
@size
|
14
|
-
@lock
|
13
|
+
@pid = Process.pid
|
14
|
+
@thread = nil
|
15
|
+
@size = size
|
16
|
+
@lock = Mutex.new
|
15
17
|
@timeout = timeout
|
16
|
-
@blk
|
18
|
+
@blk = blk
|
19
|
+
|
20
|
+
@queue_depth_metric = build_queue_depth_metric
|
17
21
|
end
|
18
22
|
|
19
23
|
def submit(msg, pid = Process.pid)
|
@@ -84,6 +88,8 @@ module Skylight
|
|
84
88
|
@queue = Util::Queue.new(@size)
|
85
89
|
@thread = Thread.new do
|
86
90
|
begin
|
91
|
+
prepare
|
92
|
+
|
87
93
|
unless work
|
88
94
|
@queue = nil
|
89
95
|
end
|
@@ -147,9 +153,19 @@ module Skylight
|
|
147
153
|
@blk.call(msg)
|
148
154
|
end
|
149
155
|
|
156
|
+
def prepare
|
157
|
+
end
|
158
|
+
|
150
159
|
def finish
|
151
160
|
end
|
152
161
|
|
162
|
+
def build_queue_depth_metric
|
163
|
+
lambda do
|
164
|
+
q = @queue
|
165
|
+
q ? @queue.length : 0
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
153
169
|
end
|
154
170
|
end
|
155
171
|
end
|
@@ -28,7 +28,7 @@ require "highline/style"
|
|
28
28
|
#
|
29
29
|
class HighLine
|
30
30
|
# The version of the installed library.
|
31
|
-
VERSION = "1.6.
|
31
|
+
VERSION = "1.6.21".freeze
|
32
32
|
|
33
33
|
# An internal HighLine error. User code does not need to trap this.
|
34
34
|
class QuestionError < StandardError
|
@@ -255,6 +255,7 @@ class HighLine
|
|
255
255
|
# Also, JRuby-1.7's ConsoleReader.readLine() needs to be passed the prompt
|
256
256
|
# to handle line editing properly.
|
257
257
|
say(@question) unless ((JRUBY or @question.readline) and @question.echo == true)
|
258
|
+
|
258
259
|
begin
|
259
260
|
@answer = @question.answer_or_default(get_response)
|
260
261
|
unless @question.valid_answer?(@answer)
|
@@ -613,22 +614,10 @@ class HighLine
|
|
613
614
|
# and the HighLine.color() method.
|
614
615
|
#
|
615
616
|
def say( statement )
|
616
|
-
statement = statement
|
617
|
+
statement = format_statement(statement)
|
617
618
|
return unless statement.length > 0
|
618
619
|
|
619
|
-
|
620
|
-
# with the environment's default encoding(usually utf8)
|
621
|
-
statement.force_encoding(Encoding.default_external) if defined?(Encoding) && Encoding.default_external
|
622
|
-
|
623
|
-
template = ERB.new(statement, nil, "%")
|
624
|
-
statement = template.result(binding)
|
625
|
-
|
626
|
-
statement = wrap(statement) unless @wrap_at.nil?
|
627
|
-
statement = page_print(statement) unless @page_at.nil?
|
628
|
-
|
629
|
-
statement = statement.gsub(/\n(?!$)/,"\n#{indentation}") if @multi_indent
|
630
|
-
|
631
|
-
# Don't add a newline if statement ends with whitespace, OR
|
620
|
+
# Don't add a newline if statement ends with whitespace, OR
|
632
621
|
# if statement ends with whitespace before a color escape code.
|
633
622
|
if /[ \t](\e\[\d+(;\d+)*m)?\Z/ =~ statement
|
634
623
|
@output.print(indentation+statement)
|
@@ -672,10 +661,16 @@ class HighLine
|
|
672
661
|
@indent_level += increase
|
673
662
|
multi = @multi_indent
|
674
663
|
@multi_indent = multiline unless multiline.nil?
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
664
|
+
begin
|
665
|
+
if block_given?
|
666
|
+
yield self
|
667
|
+
else
|
668
|
+
say(statement)
|
669
|
+
end
|
670
|
+
rescue
|
671
|
+
@multi_indent = multi
|
672
|
+
@indent_level -= increase
|
673
|
+
raise
|
679
674
|
end
|
680
675
|
@multi_indent = multi
|
681
676
|
@indent_level -= increase
|
@@ -712,6 +707,25 @@ class HighLine
|
|
712
707
|
|
713
708
|
private
|
714
709
|
|
710
|
+
def format_statement statement
|
711
|
+
statement = statement.dup.to_str
|
712
|
+
return statement unless statement.length > 0
|
713
|
+
|
714
|
+
# Allow non-ascii menu prompts in ruby > 1.9.2. ERB eval the menu statement
|
715
|
+
# with the environment's default encoding(usually utf8)
|
716
|
+
statement.force_encoding(Encoding.default_external) if defined?(Encoding) && Encoding.default_external
|
717
|
+
|
718
|
+
template = ERB.new(statement, nil, "%")
|
719
|
+
statement = template.result(binding)
|
720
|
+
|
721
|
+
statement = wrap(statement) unless @wrap_at.nil?
|
722
|
+
statement = page_print(statement) unless @page_at.nil?
|
723
|
+
|
724
|
+
statement = statement.gsub(/\n(?!$)/,"\n#{indentation}") if @multi_indent
|
725
|
+
|
726
|
+
statement
|
727
|
+
end
|
728
|
+
|
715
729
|
#
|
716
730
|
# A helper method for sending the output stream and error and repeat
|
717
731
|
# of the question.
|
@@ -839,7 +853,11 @@ class HighLine
|
|
839
853
|
answer
|
840
854
|
else
|
841
855
|
if JRUBY
|
842
|
-
|
856
|
+
statement = format_statement(@question)
|
857
|
+
raw_answer = @java_console.readLine(statement, nil)
|
858
|
+
|
859
|
+
raise EOFError, "The input stream is exhausted." if raw_answer.nil? and
|
860
|
+
@@track_eof
|
843
861
|
else
|
844
862
|
raise EOFError, "The input stream is exhausted." if @@track_eof and
|
845
863
|
@input.eof?
|
@@ -917,6 +935,10 @@ class HighLine
|
|
917
935
|
@question.change_case(@question.remove_whitespace(line))
|
918
936
|
end
|
919
937
|
else
|
938
|
+
if JRUBY #prompt has not been shown
|
939
|
+
say @question
|
940
|
+
end
|
941
|
+
|
920
942
|
raw_no_echo_mode
|
921
943
|
begin
|
922
944
|
if @question.character == :getc
|
@@ -368,31 +368,14 @@ class HighLine
|
|
368
368
|
|
369
369
|
#
|
370
370
|
# This method will update the intelligent responses to account for
|
371
|
-
# Menu specific differences.
|
372
|
-
#
|
371
|
+
# Menu specific differences. Calls the superclass' (Question's)
|
372
|
+
# build_responses method, overriding its default arguments to specify
|
373
|
+
# 'options' will be used to populate choice lists, and that
|
374
|
+
# the newly built hash will predominate over the preexisting hash
|
375
|
+
# for any keys that are the same.
|
373
376
|
#
|
374
377
|
def update_responses( )
|
375
|
-
|
376
|
-
@responses = @responses.merge(
|
377
|
-
:ambiguous_completion =>
|
378
|
-
"Ambiguous choice. " +
|
379
|
-
"Please choose one of #{options.inspect}.",
|
380
|
-
:ask_on_error =>
|
381
|
-
"? ",
|
382
|
-
:invalid_type =>
|
383
|
-
"You must enter a valid #{options}.",
|
384
|
-
:no_completion =>
|
385
|
-
"You must choose one of " +
|
386
|
-
"#{options.inspect}.",
|
387
|
-
:not_in_range =>
|
388
|
-
"Your answer isn't within the expected range " +
|
389
|
-
"(#{expected_range}).",
|
390
|
-
:mismatch =>
|
391
|
-
"Your entries didn't match.",
|
392
|
-
:not_valid =>
|
393
|
-
"Your answer isn't valid (must match " +
|
394
|
-
"#{@validate.inspect})."
|
395
|
-
)
|
378
|
+
build_responses(options, true)
|
396
379
|
end
|
397
380
|
end
|
398
381
|
end
|
@@ -225,22 +225,29 @@ class HighLine
|
|
225
225
|
#
|
226
226
|
# Called late in the initialization process to build intelligent
|
227
227
|
# responses based on the details of this Question object.
|
228
|
+
# Also used by Menu#update_responses.
|
228
229
|
#
|
229
|
-
def build_responses(
|
230
|
-
|
231
|
-
### Menu.update_responses(). Check there too when ###
|
232
|
-
### making changes! ###
|
230
|
+
def build_responses(message_source = answer_type, new_hash_wins = false)
|
231
|
+
|
233
232
|
append_default unless default.nil?
|
234
|
-
|
235
|
-
|
236
|
-
|
233
|
+
|
234
|
+
choice_error_str_func = lambda do
|
235
|
+
message_source.is_a?(Array) \
|
236
|
+
? '[' + message_source.map { |s| "#{s}" }.join(', ') + ']' \
|
237
|
+
: message_source.inspect
|
238
|
+
end
|
239
|
+
|
240
|
+
old_hash = @responses
|
241
|
+
|
242
|
+
new_hash = { :ambiguous_completion =>
|
243
|
+
"Ambiguous choice. Please choose one of " +
|
244
|
+
choice_error_str_func.call + '.',
|
237
245
|
:ask_on_error =>
|
238
246
|
"? ",
|
239
247
|
:invalid_type =>
|
240
|
-
"You must enter a valid #{
|
248
|
+
"You must enter a valid #{message_source}.",
|
241
249
|
:no_completion =>
|
242
|
-
"You must choose one of " +
|
243
|
-
"#{@answer_type.inspect}.",
|
250
|
+
"You must choose one of " + choice_error_str_func.call + '.',
|
244
251
|
:not_in_range =>
|
245
252
|
"Your answer isn't within the expected range " +
|
246
253
|
"(#{expected_range}).",
|
@@ -248,10 +255,9 @@ class HighLine
|
|
248
255
|
"Your entries didn't match.",
|
249
256
|
:not_valid =>
|
250
257
|
"Your answer isn't valid (must match " +
|
251
|
-
"#{@validate.inspect})." }
|
252
|
-
|
253
|
-
|
254
|
-
### making changes! ###
|
258
|
+
"#{@validate.inspect})." }
|
259
|
+
|
260
|
+
@responses = new_hash_wins ? old_hash.merge(new_hash) : new_hash.merge(old_hash)
|
255
261
|
end
|
256
262
|
|
257
263
|
#
|
@@ -31,85 +31,65 @@ class HighLine
|
|
31
31
|
module StringExtensions
|
32
32
|
def self.included(base)
|
33
33
|
HighLine::COLORS.each do |color|
|
34
|
+
color = color.downcase
|
34
35
|
base.class_eval <<-END
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
def #{color.downcase}
|
40
|
-
color(:#{color.downcase})
|
36
|
+
undef :#{color} if method_defined? :#{color}
|
37
|
+
def #{color}
|
38
|
+
color(:#{color})
|
41
39
|
end
|
42
40
|
END
|
41
|
+
|
43
42
|
base.class_eval <<-END
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
-
def on_#{color.downcase}
|
49
|
-
on(:#{color.downcase})
|
43
|
+
undef :on_#{color} if method_defined? :on_#{color}
|
44
|
+
def on_#{color}
|
45
|
+
on(:#{color})
|
50
46
|
end
|
51
47
|
END
|
52
48
|
HighLine::STYLES.each do |style|
|
49
|
+
style = style.downcase
|
53
50
|
base.class_eval <<-END
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
def #{style.downcase}
|
59
|
-
color(:#{style.downcase})
|
51
|
+
undef :#{style} if method_defined? :#{style}
|
52
|
+
def #{style}
|
53
|
+
color(:#{style})
|
60
54
|
end
|
61
55
|
END
|
62
56
|
end
|
63
57
|
end
|
64
58
|
|
65
59
|
base.class_eval do
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
-
if public_instance_methods.map { |m| m.to_s }.include? "foreground"
|
70
|
-
undef :foreground
|
71
|
-
end
|
60
|
+
undef :color if method_defined? :color
|
61
|
+
undef :foreground if method_defined? :foreground
|
72
62
|
def color(*args)
|
73
63
|
self.class.new(HighLine.color(self, *args))
|
74
64
|
end
|
75
65
|
alias_method :foreground, :color
|
76
66
|
|
77
|
-
|
78
|
-
undef :on
|
79
|
-
end
|
67
|
+
undef :on if method_defined? :on
|
80
68
|
def on(arg)
|
81
69
|
color(('on_' + arg.to_s).to_sym)
|
82
70
|
end
|
83
71
|
|
84
|
-
|
85
|
-
undef :uncolor
|
86
|
-
end
|
72
|
+
undef :uncolor if method_defined? :uncolor
|
87
73
|
def uncolor
|
88
74
|
self.class.new(HighLine.uncolor(self))
|
89
75
|
end
|
90
76
|
|
91
|
-
|
92
|
-
undef :rgb
|
93
|
-
end
|
77
|
+
undef :rgb if method_defined? :rgb
|
94
78
|
def rgb(*colors)
|
95
79
|
color_code = colors.map{|color| color.is_a?(Numeric) ? '%02x'%color : color.to_s}.join
|
96
80
|
raise "Bad RGB color #{colors.inspect}" unless color_code =~ /^[a-fA-F0-9]{6}/
|
97
81
|
color("rgb_#{color_code}".to_sym)
|
98
82
|
end
|
99
83
|
|
100
|
-
|
101
|
-
undef :on_rgb
|
102
|
-
end
|
84
|
+
undef :on_rgb if method_defined? :on_rgb
|
103
85
|
def on_rgb(*colors)
|
104
86
|
color_code = colors.map{|color| color.is_a?(Numeric) ? '%02x'%color : color.to_s}.join
|
105
87
|
raise "Bad RGB color #{colors.inspect}" unless color_code =~ /^[a-fA-F0-9]{6}/
|
106
88
|
color("on_rgb_#{color_code}".to_sym)
|
107
89
|
end
|
108
90
|
|
109
|
-
if public_instance_methods.map { |m| m.to_s }.include? "method_missing"
|
110
|
-
undef :method_missing
|
111
|
-
end
|
112
91
|
# TODO Chain existing method_missing
|
92
|
+
undef :method_missing if method_defined? :method_missing
|
113
93
|
def method_missing(method, *args, &blk)
|
114
94
|
if method.to_s =~ /^(on_)?rgb_([0-9a-fA-F]{6})$/
|
115
95
|
color(method)
|
@@ -14,10 +14,14 @@ class HighLine
|
|
14
14
|
if JRUBY
|
15
15
|
def initialize_system_extensions
|
16
16
|
require 'java'
|
17
|
+
require 'readline'
|
17
18
|
if JRUBY_VERSION =~ /^1.7/
|
18
19
|
java_import 'jline.console.ConsoleReader'
|
19
20
|
|
20
|
-
|
21
|
+
input = @input && @input.to_inputstream
|
22
|
+
output = @output && @output.to_outputstream
|
23
|
+
|
24
|
+
@java_console = ConsoleReader.new(input, output)
|
21
25
|
@java_console.set_history_enabled(false)
|
22
26
|
@java_console.set_bell_enabled(true)
|
23
27
|
@java_console.set_pagination_enabled(false)
|
@@ -76,7 +80,13 @@ class HighLine
|
|
76
80
|
require "dl/import"
|
77
81
|
|
78
82
|
module WinAPI
|
79
|
-
|
83
|
+
if defined?(DL::Importer)
|
84
|
+
# Ruby 1.9
|
85
|
+
extend DL::Importer
|
86
|
+
else
|
87
|
+
# Ruby 1.8
|
88
|
+
extend DL::Importable
|
89
|
+
end
|
80
90
|
begin
|
81
91
|
dlload "msvcrt", "kernel32"
|
82
92
|
rescue DL::DLError
|
@@ -85,6 +95,16 @@ class HighLine
|
|
85
95
|
extern "unsigned long _getch()"
|
86
96
|
extern "unsigned long GetConsoleScreenBufferInfo(unsigned long, void*)"
|
87
97
|
extern "unsigned long GetStdHandle(unsigned long)"
|
98
|
+
|
99
|
+
# Ruby 1.8 DL::Importable.import does mname[0,1].downcase so FooBar becomes fooBar
|
100
|
+
if defined?(getConsoleScreenBufferInfo)
|
101
|
+
alias_method :GetConsoleScreenBufferInfo, :getConsoleScreenBufferInfo
|
102
|
+
module_function :GetConsoleScreenBufferInfo
|
103
|
+
end
|
104
|
+
if defined?(getStdHandle)
|
105
|
+
alias_method :GetStdHandle, :getStdHandle
|
106
|
+
module_function :GetStdHandle
|
107
|
+
end
|
88
108
|
end
|
89
109
|
end
|
90
110
|
|
@@ -140,7 +160,11 @@ class HighLine
|
|
140
160
|
CHARACTER_MODE = "jline" # For Debugging purposes only.
|
141
161
|
|
142
162
|
def terminal_size
|
143
|
-
|
163
|
+
if JRUBY_VERSION =~ /^1.7/
|
164
|
+
[ @java_terminal.get_width, @java_terminal.get_height ]
|
165
|
+
else
|
166
|
+
[ @java_terminal.getTerminalWidth, @java_terminal.getTerminalHeight ]
|
167
|
+
end
|
144
168
|
end
|
145
169
|
|
146
170
|
def raw_no_echo_mode
|
@@ -172,7 +196,7 @@ class HighLine
|
|
172
196
|
size = [80, 40]
|
173
197
|
FFI::NCurses.initscr
|
174
198
|
begin
|
175
|
-
size = FFI::NCurses.getmaxyx(stdscr).reverse
|
199
|
+
size = FFI::NCurses.getmaxyx(FFI::NCurses.stdscr).reverse
|
176
200
|
ensure
|
177
201
|
FFI::NCurses.endwin
|
178
202
|
end
|