skylight 0.3.3 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 79eb0c65a8c541558b3a890c8e740ee4c1356c97
4
- data.tar.gz: 11dd29df096b2125fde4ef9e156f3303c1b5e52c
3
+ metadata.gz: 3b26b3f575af56669c5257a37d8d7ca11544aba4
4
+ data.tar.gz: 5fb2964195f3d146693f62b6593ff2b0bbf3944d
5
5
  SHA512:
6
- metadata.gz: 2597212fd3072f84d1f7f1c71de29d16afdd99e7667c3d047b713244af23e3411bc1f60e7303566312525a1e2bd817acf4d399e3a1c7216676aa3af4e34b6ecb
7
- data.tar.gz: 83fbbcf7476f2ad62886b59b403b3056522a1f5459cf8dea4841eb34dc3e522778f9ee668e996c3b577683d32e0f5da410235517e6ce434128eba760f0c23818
6
+ metadata.gz: 5e9759155ce35d86bd96b058788b153544dff9aa73d08cfb4f742ddd5dc2871b4c4c8bc4e4799eb006b59e3e8bb99b89920b98a67698fd601d612793b2f68ec3
7
+ data.tar.gz: 0009517b20943ce01703c10210b925f3d687b16e471f7b57af1066bbdeb28e88f3f91937b00a4c4942167f2d7983d89b1621d10891f16962c644965dbf573fb8
@@ -1,3 +1,24 @@
1
+ ## 0.3.6 (March 27, 2014)
2
+
3
+ * Shorter token validation timeout
4
+ * Allow validation to be skipped
5
+
6
+ ## 0.3.5 (March 26, 2014)
7
+
8
+ * Update Rust component
9
+ * Return true from Task#handle to avoid sutdown
10
+ * Fix numeric check that caused crash on some 32-bit systems
11
+ * Improve error message for missing Skylight ext
12
+ * Better config error messages
13
+ * Validate authentication token before starting
14
+ * Add proxy support
15
+
16
+ ## 0.3.4 (March 13, 2014)
17
+
18
+ * Don't try to boot Skylight without native agent
19
+ * Make exception classes always available
20
+ * CLI should require railtie before loading application.rb
21
+
1
22
  ## 0.3.3 (March 12, 2014)
2
23
 
3
24
  * Load the railtie even without native agent
@@ -1,3 +1,3 @@
1
1
  ---
2
- x86_64-linux: "4f0b9ef0d700d2da590ad0994c2067304a50d7b290f70353c394e4a040cdf0a5"
3
- i686-linux : "9b7beebe61ef3201f4d7ad2cf5e92dc69cedefda033b9d081384c71700927a37"
2
+ x86_64-linux: "98b04f7d73c1894cc79621a135b4598a679c421f5ff3eecc652f84ba07258d9c"
3
+ i686-linux : "1d4bbd58e319237b18752607d087ce0c895fe99c58482e994abe62a9f07d41dd"
@@ -9,7 +9,7 @@ require_relative '../lib/skylight/version.rb'
9
9
 
10
10
  checksums = YAML.load_file("checksums.yml")
11
11
 
12
- rust_version = "dc29745"
12
+ rust_version = "74fb9b3"
13
13
 
14
14
  arch = RbConfig::CONFIG["arch"]
15
15
 
@@ -26,7 +26,9 @@
26
26
  } while(0) \
27
27
 
28
28
  #define CHECK_NUMERIC(VAL) \
29
- CHECK(VAL, #VAL " is not numeric") \
29
+ CHECK(TYPE(VAL) == T_BIGNUM || \
30
+ TYPE(VAL) == T_FIXNUM, \
31
+ #VAL " is not numeric") \
30
32
 
31
33
  #define My_Struct(name, Type, msg) \
32
34
  Get_Struct(name, self, Type, msg); \
@@ -109,7 +111,7 @@ bool skylight_high_res_time(uint64_t*);
109
111
  bool skylight_trace_new(uint64_t, RustSlice, RustTrace*);
110
112
  bool skylight_trace_free(RustTrace);
111
113
  bool skylight_trace_load(RustSlice, RustTrace*);
112
- bool skylight_trace_name_from_serialized_into_new_buffer(RustSlice, RustSlice*);
114
+ bool skylight_trace_name_from_serialized_into_new_buffer(RustSlice, RustString*);
113
115
  bool skylight_trace_get_started_at(RustTrace, uint64_t*);
114
116
  bool skylight_trace_set_name(RustTrace, RustSlice);
115
117
  bool skylight_trace_get_name(RustTrace, RustSlice*);
@@ -344,7 +346,7 @@ static VALUE error_serialize(VALUE self) {
344
346
  static const char* freedTrace = "You can't do anything with a Trace once it's been serialized or moved into a Batch";
345
347
 
346
348
  static VALUE trace_new(VALUE self, VALUE started_at, VALUE uuid) {
347
- CHECK_TYPE(started_at, T_FIXNUM);
349
+ CHECK_NUMERIC(started_at);
348
350
  CHECK_TYPE(uuid, T_STRING);
349
351
 
350
352
  RustTrace trace;
@@ -367,11 +369,13 @@ static VALUE trace_load(VALUE self, VALUE protobuf) {
367
369
  static VALUE trace_name_from_serialized(VALUE self, VALUE protobuf) {
368
370
  CHECK_TYPE(protobuf, T_STRING);
369
371
 
370
- RustSlice trace_name;
372
+ RustString trace_name;
371
373
 
372
374
  CHECK_FFI(skylight_trace_name_from_serialized_into_new_buffer(STR2SLICE(protobuf), &trace_name), "Could not read name from serialized Trace");
373
375
 
374
- return SLICE2STR(trace_name);
376
+ VALUE ret = VEC2STR(trace_name);
377
+ skylight_free_buf(trace_name);
378
+ return ret;
375
379
  }
376
380
 
377
381
  static VALUE trace_get_started_at(VALUE self) {
@@ -522,7 +526,7 @@ VALUE batch_new(VALUE klass, VALUE rb_timestamp, VALUE rb_hostname) {
522
526
  CHECK_NUMERIC(rb_timestamp);
523
527
 
524
528
  RustString hostname = NULL;
525
- uint32_t timestamp = NUM2ULONG(rb_timestamp);
529
+ uint32_t timestamp = (uint32_t) NUM2ULONG(rb_timestamp);
526
530
 
527
531
  if (rb_hostname != Qnil) {
528
532
  CHECK_TYPE(rb_hostname, T_STRING);
@@ -9,7 +9,13 @@ begin
9
9
  has_native_ext = true
10
10
  end
11
11
  rescue LoadError
12
- puts "[SKYLIGHT] [#{Skylight::VERSION}] The Skylight native extension wasn't found. Skylight is not running."
12
+ if defined?(Rails) && !Rails.env.development? && !Rails.env.test?
13
+ puts "[SKYLIGHT] [#{Skylight::VERSION}] The Skylight native extension for your platform wasn't found. We currently support monitoring in 32- and 64-bit Linux only. If you are on a supported platform, please contact support at support@skylight.io. The missing extension will not affect the functioning of your application."
14
+ elsif defined?(Rails)
15
+ puts "[SKYLIGHT] [#{Skylight::VERSION}] Running Skylight in #{Rails.env} mode. No data will be reported until you deploy your app."
16
+ else
17
+ puts "[SKYLIGHT] [#{Skylight::VERSION}] Running Skylight in development mode."
18
+ end
13
19
  raise if ENV.key?("SKYLIGHT_REQUIRED")
14
20
  end
15
21
 
@@ -26,6 +32,13 @@ module Skylight
26
32
  autoload :HTTP, 'skylight/util/http'
27
33
  end
28
34
 
35
+ # ==== Exceptions ====
36
+ class IpcProtoError < RuntimeError; end
37
+ class WorkerStateError < RuntimeError; end
38
+ class ConfigError < RuntimeError; end
39
+ class TraceError < RuntimeError; end
40
+ class SerializeError < RuntimeError; end
41
+
29
42
  if defined?(Rails)
30
43
  require 'skylight/railtie'
31
44
  end
@@ -37,6 +50,10 @@ module Skylight
37
50
  STANDALONE_ENV_KEY = 'SKYLIGHT_STANDALONE'.freeze
38
51
  STANDALONE_ENV_VAL = 'server'.freeze
39
52
 
53
+ def self.native?
54
+ true
55
+ end
56
+
40
57
  def self.daemon?
41
58
  ENV[STANDALONE_ENV_KEY] == STANDALONE_ENV_VAL
42
59
  end
@@ -73,13 +90,6 @@ module Skylight
73
90
  autoload :HTTP, 'skylight/formatters/http'
74
91
  end
75
92
 
76
- # ==== Exceptions ====
77
- class IpcProtoError < RuntimeError; end
78
- class WorkerStateError < RuntimeError; end
79
- class ConfigError < RuntimeError; end
80
- class TraceError < RuntimeError; end
81
- class SerializeError < RuntimeError; end
82
-
83
93
  TIERS = %w(
84
94
  api
85
95
  app
@@ -164,6 +174,10 @@ end
164
174
  else
165
175
 
166
176
  module Skylight
177
+ def self.native?
178
+ false
179
+ end
180
+
167
181
  def self.start!(*)
168
182
  end
169
183
 
@@ -186,4 +200,4 @@ module Skylight
186
200
  end
187
201
  end
188
202
 
189
- end
203
+ end
@@ -51,6 +51,14 @@ repository and deploy from there. You can learn more about the process at:
51
51
  @app_name ||=
52
52
  begin
53
53
  if File.exist?("config/application.rb")
54
+ # This looks like a Rails app, lets make sure we have the railtie loaded
55
+ # skylight.rb checks for Rails, but when running the CLI, Skylight loads before Rails does
56
+ begin
57
+ require "skylight/railtie"
58
+ rescue LoadError => e
59
+ error "Unable to load Railtie. Please notify support@skylight.io."
60
+ end
61
+
54
62
  require "./config/application"
55
63
  Rails.application.class.name.split("::").first.underscore.humanize
56
64
  else
@@ -25,6 +25,7 @@ module Skylight
25
25
  'APPLICATION' => :'application',
26
26
  'AUTHENTICATION' => :'authentication',
27
27
  'HOSTNAME' => :'hostname',
28
+ 'SKIP_VALIDATION' => :'skip_validation',
28
29
  'AGENT_INTERVAL' => :'agent.interval',
29
30
  'AGENT_KEEPALIVE' => :'agent.keepalive',
30
31
  'AGENT_SAMPLE_SIZE' => :'agent.sample',
@@ -70,7 +71,7 @@ module Skylight
70
71
  :'report.port' => "skylight remote port" }
71
72
 
72
73
  VALIDATORS = {
73
- :'agent.interval' => lambda { |v, c| Integer === v && v > 0 }
74
+ :'agent.interval' => [lambda { |v, c| Integer === v && v > 0 }, "must be an integer greater than 0"]
74
75
  }
75
76
 
76
77
  def self.load(path = nil, environment = nil, env = ENV)
@@ -151,7 +152,13 @@ module Skylight
151
152
  end
152
153
  end
153
154
 
155
+ def skip_validation?
156
+ !!get(:skip_validation)
157
+ end
158
+
154
159
  def validate!
160
+ return true if skip_validation?
161
+
155
162
  REQUIRED.each do |k, v|
156
163
  unless get(k)
157
164
  raise ConfigError, "#{v} required"
@@ -161,6 +168,23 @@ module Skylight
161
168
  true
162
169
  end
163
170
 
171
+ def validate_token
172
+ return :ok if skip_validation?
173
+
174
+ http_auth = Util::HTTP.new(self, :accounts)
175
+
176
+ res = http_auth.get("/agent/authenticate?hostname=#{URI.escape(self[:'hostname'])}")
177
+
178
+ case res.status
179
+ when 200...300
180
+ :ok
181
+ when 400...500
182
+ :invalid
183
+ else
184
+ :unknown
185
+ end
186
+ end
187
+
164
188
  def key?(key)
165
189
  key = key.to_sym
166
190
  @priority.key?(key) || @values.key?(key)
@@ -197,8 +221,12 @@ module Skylight
197
221
  k = key.to_sym
198
222
 
199
223
  if validator = VALIDATORS[k]
200
- unless validator.call(val, self)
201
- raise ConfigError, "invalid value for #{k} (#{val})"
224
+ blk, msg = validator
225
+
226
+ unless blk.call(val, self)
227
+ error_msg = "invalid value for #{k} (#{val})"
228
+ error_msg << ", #{msg}" if msg
229
+ raise ConfigError, error_msg
202
230
  end
203
231
  end
204
232
 
@@ -72,6 +72,16 @@ module Skylight
72
72
 
73
73
  t { "starting instrumenter" }
74
74
  @config.validate!
75
+
76
+ case @config.validate_token
77
+ when :ok
78
+ # Good to go
79
+ when :unknown
80
+ log_warn "unable to validate authentication token"
81
+ else
82
+ raise ConfigError, "authentication token is invalid"
83
+ end
84
+
75
85
  @config.gc.enable
76
86
  @worker.spawn
77
87
  @subscriber.register!
@@ -1,5 +1,3 @@
1
- # skylight/probes.rb
2
-
3
1
  module Skylight
4
2
  module Probes
5
3
 
@@ -15,17 +15,19 @@ module Skylight
15
15
  config.skylight.probes = []
16
16
 
17
17
  initializer 'skylight.configure' do |app|
18
- if activate?
19
- load_probes
18
+ if Skylight.native?
19
+ if activate?
20
+ load_probes
20
21
 
21
- if config = load_skylight_config(app)
22
- Instrumenter.start!(config)
23
- app.middleware.insert 0, Middleware
22
+ if config = load_skylight_config(app)
23
+ Instrumenter.start!(config)
24
+ app.middleware.insert 0, Middleware
24
25
 
25
- puts "[SKYLIGHT] [#{Skylight::VERSION}] Skylight agent enabled"
26
+ puts "[SKYLIGHT] [#{Skylight::VERSION}] Skylight agent enabled"
27
+ end
28
+ elsif !Rails.env.test? && Rails.env.development?
29
+ puts "[SKYLIGHT] [#{Skylight::VERSION}] You are running in the #{Rails.env} environment but haven't added it to config.skylight.environments, so no data will be sent to skylight.io."
26
30
  end
27
- elsif !Rails.env.test? && Rails.env.development?
28
- puts "[SKYLIGHT] [#{Skylight::VERSION}] You are running in the #{Rails.env} environment but haven't added it to config.skylight.environments, so no data will be sent to skylight.io."
29
31
  end
30
32
  end
31
33
 
@@ -26,6 +26,10 @@ module Skylight
26
26
  @ssl = config["#{service}.ssl"]
27
27
  @host = config["#{service}.host"]
28
28
  @port = config["#{service}.port"]
29
+ @proxy_addr = config["#{service}.proxy_addr"]
30
+ @proxy_port = config["#{service}.proxy_port"]
31
+ @proxy_user = config["#{service}.proxy_user"]
32
+ @proxy_pass = config["#{service}.proxy_pass"]
29
33
  @deflate = config["#{service}.deflate"]
30
34
  @authentication = config[:'authentication']
31
35
  end
@@ -87,7 +91,10 @@ module Skylight
87
91
  req.body = body
88
92
  end
89
93
 
90
- http = Net::HTTP.new @host, @port
94
+ http = Net::HTTP.new(@host, @port, @proxy_addr, @proxy_port, @proxy_user, @proxy_pass)
95
+
96
+ # Default is 60, but that's also the Heroku boot timeout and we don't want to slow boot
97
+ http.read_timeout = 15
91
98
 
92
99
  if @ssl
93
100
  http.use_ssl = true
@@ -1,4 +1,4 @@
1
1
  module Skylight
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.6'
3
3
  end
4
4
 
@@ -12,8 +12,5 @@ module Skylight
12
12
  autoload :Server, 'skylight/worker/server'
13
13
  autoload :Standalone, 'skylight/worker/standalone'
14
14
 
15
- def self.spawn
16
- Standalone.new
17
- end
18
15
  end
19
16
  end
@@ -24,7 +24,7 @@ module Skylight
24
24
  trace "building standalone worker"
25
25
 
26
26
  unless config[:'agent.sockfile_path']
27
- raise ArgumentError, 'agent.sockfile_path config required'
27
+ raise ConfigError, 'agent.sockfile_path required'
28
28
  end
29
29
 
30
30
  Standalone.new(
@@ -32,7 +32,8 @@ module Skylight
32
32
  lockfile,
33
33
  server)
34
34
  else
35
- raise "unknown strategy: `#{s}`"
35
+ # We can assume that if it's unknown it's from the config
36
+ raise ConfigError, "unknown agent.strategy: `#{s}`"
36
37
  end
37
38
  end
38
39
 
@@ -40,7 +40,7 @@ module Skylight
40
40
  flush(@batch)
41
41
  else
42
42
  warn "do not have valid session token -- dropping"
43
- return
43
+ return true
44
44
  end
45
45
 
46
46
  @batch = new_batch(now)
@@ -1,6 +1,7 @@
1
1
  require 'socket'
2
2
  require 'thread'
3
3
  require 'fileutils'
4
+ require 'rbconfig'
4
5
 
5
6
  # TODO: Handle cool-off
6
7
  module Skylight
@@ -12,11 +13,29 @@ module Skylight
12
13
  class Standalone
13
14
  include Util::Logging
14
15
 
15
- SUBPROCESS_CMD = [
16
- RUBYBIN,
17
- '-I', File.expand_path('../../..', __FILE__),
18
- File.expand_path('../../../skylight.rb', __FILE__) ]
16
+ # Locates skylight_native so that it can be included in the standalone agent startup command
17
+ def self.locate_skylight_native
18
+ $LOADED_FEATURES.each do |feature|
19
+ return feature if feature =~ /skylight_native\.#{RbConfig::CONFIG['DLEXT']}/
20
+ end
21
+ end
22
+
23
+ def self.build_subprocess_cmd
24
+ paths = [
25
+ File.expand_path('../../..', __FILE__), # Ruby code root
26
+ File.dirname(locate_skylight_native) # Native extension location
27
+ ].uniq.compact
28
+
29
+ ret = [ RUBYBIN ]
30
+ paths.each { |path| ret << "-I" << path }
31
+ ret << File.expand_path('../../../skylight.rb', __FILE__) # The agent startup script
32
+ ret
33
+ end
34
+
35
+ # Used to start the standalone agent as well as included in the hello message
36
+ SUBPROCESS_CMD = build_subprocess_cmd
19
37
 
38
+ # Used to handle starting the thread
20
39
  LOCK = Mutex.new
21
40
 
22
41
  attr_reader \
@@ -172,8 +191,10 @@ module Skylight
172
191
  trace "shuting down agent connection"
173
192
  @sock.close if @sock
174
193
  @pid = nil
194
+
195
+ return false
175
196
  elsif msg
176
- handle(msg)
197
+ return handle(msg)
177
198
  else
178
199
  begin
179
200
  @sock.read_nonblock(1)
@@ -185,11 +206,11 @@ module Skylight
185
206
  end
186
207
  end
187
208
 
188
- true
209
+ return true
189
210
  end
190
211
  rescue WorkerStateError => e
191
212
  error "skylight shutting down: %s", e.message
192
- false
213
+ return false
193
214
  end
194
215
 
195
216
  def handle(msg)
@@ -299,6 +320,7 @@ module Skylight
299
320
  sf = sockfile(pid)
300
321
  File.unlink(sf) rescue nil
301
322
 
323
+ t { fmt "opening a new socket; %s", sf }
302
324
  srv = UNIXServer.new(sf)
303
325
 
304
326
  unless ENV[TRACE_ENV_KEY]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skylight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tilde, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-12 00:00:00.000000000 Z
11
+ date: 2014-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport