skylight 0.3.3 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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