skylight 1.4.0.beta → 1.4.0.beta.2

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/CONTRIBUTING.md +7 -1
  4. data/README.md +3 -3
  5. data/ext/libskylight.yml +1 -0
  6. data/lib/skylight/cli.rb +2 -2
  7. data/lib/skylight/config.rb +7 -0
  8. data/lib/skylight/core.rb +1 -0
  9. data/lib/skylight/formatters/http.rb +10 -0
  10. data/lib/skylight/normalizers.rb +11 -0
  11. data/lib/skylight/normalizers/action_controller/process_action.rb +7 -0
  12. data/lib/skylight/normalizers/action_view/render_collection.rb +7 -0
  13. data/lib/skylight/normalizers/action_view/render_partial.rb +6 -0
  14. data/lib/skylight/normalizers/action_view/render_template.rb +6 -0
  15. data/lib/skylight/normalizers/active_job/enqueue_at.rb +21 -0
  16. data/lib/skylight/normalizers/active_record/instantiation.rb +17 -0
  17. data/lib/skylight/normalizers/active_record/sql.rb +7 -0
  18. data/lib/skylight/normalizers/active_support/cache.rb +1 -0
  19. data/lib/skylight/normalizers/default.rb +8 -0
  20. data/lib/skylight/normalizers/faraday/request.rb +36 -0
  21. data/lib/skylight/normalizers/moped/query.rb +9 -0
  22. data/lib/skylight/probes/elasticsearch.rb +6 -3
  23. data/lib/skylight/probes/excon.rb +1 -0
  24. data/lib/skylight/probes/excon/middleware.rb +2 -0
  25. data/lib/skylight/probes/faraday.rb +22 -0
  26. data/lib/skylight/probes/net_http.rb +1 -0
  27. data/lib/skylight/railtie.rb +6 -5
  28. data/lib/skylight/user_config.rb +4 -7
  29. data/lib/skylight/util/allocation_free.rb +9 -0
  30. data/lib/skylight/util/clock.rb +1 -0
  31. data/lib/skylight/util/gzip.rb +6 -0
  32. data/lib/skylight/util/inflector.rb +4 -2
  33. data/lib/skylight/util/logging.rb +30 -2
  34. data/lib/skylight/util/native_ext_fetcher.rb +47 -0
  35. data/lib/skylight/version.rb +1 -1
  36. metadata +8 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a44af3f665e6d0fd8a25dc3d867ea86dae43620
4
- data.tar.gz: edac70c82631fb57e9990aeeedbb55a62e4111d5
3
+ metadata.gz: 26a5c49afa9a810288570e751ee26df5982b98e9
4
+ data.tar.gz: 606b839a3ad60282a40fa50567c2703a3f6fff4f
5
5
  SHA512:
6
- metadata.gz: da6cec1e164c3c49cce1239c88efb74f7dca60e0b699aadf051cf97fb2def14a813e0a99badac04c50c2750ab2bd0f420d69fb88fb2421ce92ef4d9a42dc1bb6
7
- data.tar.gz: 12bc7d82549fc243fd7446892d2387ce635a941d5ae23600713e9b2432d68dbb2b7793e8bcaa369227127b1027d964d1125492f273e89f5e5220813fcf027bed
6
+ metadata.gz: 9791c329fa6bd1088fb2841110d891e47c5eb363af5bea00eca268bc59f9105e0168cf80acc82cb4627529e316be509116c825cc11ef537e1066edb7fc66723d
7
+ data.tar.gz: a81389b6de9384fc7e2ac59bb4cb0a77ed8ff1cc2db9e215469787c4010531d99f63b1b748694a94ee2bacf6384c460c074e0c88116dbbfd2feb29d6db35a494
@@ -1,3 +1,12 @@
1
+ ## 1.4.0-beta.2 (September 28, 2017)
2
+
3
+ * [FEATURE] Faraday instrumentation
4
+ * [FEATURE] Rack Middleware probe enabled by default
5
+ * [FEATURE] ActiveRecord Instantiation instrumentation
6
+ * [IMPROVEMENT] Improved handling of the user-level configuration options
7
+ * [EXPERIMENTAL] ActionJob Enqueue instrumentation. (Only tracks the enqueuing of new jobs. Does not instrument jobs themselves. Off by default since it's not clear how useful it is. To enable: `require 'skylight/normalizers/active_job/enqueue_at`.)
8
+ * [EXPERIMENTAL] FreeBSD support. (This should work automatically on FreeBSD systems, but real-world testing has been minimal.)
9
+
1
10
  ## 1.4.0-beta (July 13, 2017)
2
11
 
3
12
  * [FEATURE] Add probe for Rack Middlewares. To enable, add 'middleware' to `config.skylight.probes` list.
@@ -6,4 +6,10 @@ If you've got a bug report or have a feature you'd like to request, please conta
6
6
 
7
7
  Before contributing, please [sign the CLA](https://docs.google.com/spreadsheet/viewform?usp=drive_web&formkey=dHJVY1M5bzNzY0pwN2dRZjMxV0dXSkE6MA#gid=0).
8
8
 
9
- In general, we recommend that you speak with us about any new features you'd like to add so we can make sure we're on the same page.
9
+ In general, we recommend that you speak with us about any new features you'd like to add so we can make sure we're on the same page.
10
+
11
+ ## Emulating Travis Builds
12
+
13
+ We have many Travis build configurations that must pass in order to merge a pull request. You can emulate these configurations locally by running `rake run_travis_builds`. The only prerequisites are that you have both [VirtualBox](https://www.virtualbox.org/wiki/VirtualBox) and [Vagrant](https://www.vagrantup.com/) installed (most recent versions are best).
14
+
15
+ After that rake task completes, be sure to run `rake clean build`. This will delete the local native extension that was built when you ran `rake run_travis_builds` and rebuilds it.
data/README.md CHANGED
@@ -3,11 +3,11 @@
3
3
  Instrument your ruby application and send the data to the Skylight
4
4
  servers.
5
5
 
6
- Sign up at https://skylight.io.
6
+ Sign up at https://www.skylight.io.
7
7
 
8
- For more documentation see https://docs.skylight.io/.
8
+ For more documentation see https://www.skylight.io/support.
9
9
 
10
10
 
11
11
  ## Bug Reports and Feature Requests
12
12
 
13
- If you've got a bug report or have a feature you'd like to request, please contact us at support@skylight.io or use the "?" button in the Skylight web interface. We'll be much quicker to respond that way :)
13
+ If you've got a bug report or have a feature you'd like to request, please contact us at support@skylight.io or use the built-in messenger in the Skylight web interface. We'll be much quicker to respond that way :)
@@ -5,3 +5,4 @@ checksums:
5
5
  x86_64-linux: "117ac0ff29240a518717fcf52f7cd3eeec69a135c481693b8eb259bb4c2b528c"
6
6
  x86_64-linux-musl: "bab4030060eb4b83d0543839e0f51b09545d7d5b20c3f7dd35ae6f81f3189499"
7
7
  x86_64-darwin: "1c0fdb68c0dde34a1b0842403db2ea2ca6a0de2fb7d729e869f395f6d10383b5"
8
+ x86_64-freebsd: "1b81c47c154c7dcb40787f159e663bc3c97c204c5baedf2d741e5f561fa41ecd"
@@ -56,7 +56,7 @@ you should set the `SKYLIGHT_AUTHENTICATION` variable to:
56
56
 
57
57
  OUT
58
58
  rescue Api::CreateFailed => e
59
- say "Could not create the application. Please run `skylight doctor` for diagnostics.", :red
59
+ say "Could not create the application. Please run `bundle exec skylight doctor` for diagnostics.", :red
60
60
  say e.to_s, :yellow
61
61
  rescue Interrupt
62
62
  end
@@ -132,7 +132,7 @@ you should set the `SKYLIGHT_AUTHENTICATION` variable to:
132
132
  end
133
133
 
134
134
  def user_config
135
- UserConfig.instance
135
+ config.user_config
136
136
  end
137
137
 
138
138
  end
@@ -59,6 +59,9 @@ module Skylight
59
59
  "REPORT_HTTP_CONNECT_TIMEOUT" => :report_http_connect_timeout,
60
60
  "REPORT_HTTP_READ_TIMEOUT" => :report_http_read_timeout,
61
61
 
62
+ # == User config settings ==
63
+ "USER_CONFIG_PATH" => :'user_config_path',
64
+
62
65
  # == Native agent settings ==
63
66
  #
64
67
  "LAZY_START" => :'daemon.lazy_start',
@@ -600,6 +603,10 @@ authentication: #{self[:authentication]}
600
603
  !!get(:enable_segments)
601
604
  end
602
605
 
606
+ def user_config
607
+ @user_config ||= UserConfig.new(self)
608
+ end
609
+
603
610
  private
604
611
 
605
612
  def check_nfs(path)
@@ -1,5 +1,6 @@
1
1
  require 'skylight/version'
2
2
 
3
+ # Root Skylight namespace
3
4
  module Skylight
4
5
  # @api private
5
6
  TRACE_ENV_KEY = 'SKYLIGHT_ENABLE_TRACE_LOGS'.freeze
@@ -1,6 +1,16 @@
1
1
  module Skylight
2
2
  module Formatters
3
3
  module HTTP
4
+
5
+ # Build instrumentation options for HTTP queries
6
+ #
7
+ # @param [String] method HTTP method, e.g. get, post
8
+ # @param [String] scheme HTTP scheme, e.g. http, https
9
+ # @param [String] host Request host, e.g. example.com
10
+ # @param [String, Integer] port Request port
11
+ # @param [String] path Request path
12
+ # @param [String] query Request query string
13
+ # @return [Hash] a hash containing `:category`, `:title`, and `:annotations`
4
14
  def self.build_opts(method, scheme, host, port, path, query)
5
15
  { category: "api.http.#{method.downcase}",
6
16
  title: "#{method.upcase} #{host}" }
@@ -47,6 +47,7 @@ module Skylight
47
47
  end
48
48
  end
49
49
 
50
+ # Base Normalizer for Rails rendering
50
51
  class RenderNormalizer < Normalizer
51
52
  include Util::AllocationFree
52
53
 
@@ -54,6 +55,11 @@ module Skylight
54
55
  @paths = config['normalizers.render.view_paths'] || []
55
56
  end
56
57
 
58
+ # Generic normalizer for renders
59
+ # @param category [String]
60
+ # @param payload [Hash]
61
+ # @option payload [String] :identifier
62
+ # @return [Array]
57
63
  def normalize_render(category, payload)
58
64
  if path = payload[:identifier]
59
65
  title = relative_path(path)
@@ -143,13 +149,18 @@ module Skylight
143
149
  action_view/render_partial
144
150
  action_view/render_template
145
151
  active_model_serializers/render
152
+ active_record/instantiation
146
153
  active_record/sql
147
154
  active_support/cache
148
155
  elasticsearch/request
149
156
  grape/endpoint
150
157
  moped/query
158
+ faraday/request
151
159
  couch_potato/query).each do |file|
152
160
  require "skylight/normalizers/#{file}"
153
161
  end
162
+
163
+ # The following are not required by default as they are of dubious usefulness:
164
+ # - active_job/enqueue_at
154
165
  end
155
166
  end
@@ -1,6 +1,7 @@
1
1
  module Skylight
2
2
  module Normalizers
3
3
  module ActionController
4
+ # Normalizer for processing a Rails controller action
4
5
  class ProcessAction < Normalizer
5
6
  register "process_action.action_controller"
6
7
 
@@ -10,6 +11,12 @@ module Skylight
10
11
  # Additional keys available in `normalize_after`: status, view_runtime
11
12
  # Along with ones added by probe: variant
12
13
 
14
+ # @param trace [Skylight::Messages::Trace::Builder]
15
+ # @param name [String] ignored, only present to match API
16
+ # @param payload [Hash]
17
+ # @option payload [String] :controller Controller name
18
+ # @option payload [String] :action Action name
19
+ # @return [Array]
13
20
  def normalize(trace, name, payload)
14
21
  trace.endpoint = controller_action(payload)
15
22
  [ CAT, trace.endpoint, nil ]
@@ -1,11 +1,18 @@
1
1
  module Skylight
2
2
  module Normalizers
3
3
  module ActionView
4
+ # Normalizer for Rails collection rendering
4
5
  class RenderCollection < RenderNormalizer
5
6
  register "render_collection.action_view"
6
7
 
7
8
  CAT = "view.render.collection".freeze
8
9
 
10
+ # @param trace [Skylight::Messages::Trace::Builder] ignored, only present to match API
11
+ # @param name [String] ignored, only present to match API
12
+ # @param payload (see RenderNormalizer#normalize_render)
13
+ # @option payload (see RenderNormalizer#normalize_render)
14
+ # @option payload [Integer] :count
15
+ # @return (see RenderNormalizer#normalize_render)
9
16
  def normalize(trace, name, payload)
10
17
  normalize_render(CAT, payload)
11
18
  end
@@ -1,11 +1,17 @@
1
1
  module Skylight
2
2
  module Normalizers
3
3
  module ActionView
4
+ # Normalizer for Rails partial rendering
4
5
  class RenderPartial < RenderNormalizer
5
6
  register "render_partial.action_view"
6
7
 
7
8
  CAT = "view.render.template".freeze
8
9
 
10
+ # @param trace [Skylight::Messages::Trace::Builder] ignored, only present to match API
11
+ # @param name [String] ignored, only present to match API
12
+ # @param payload (see RenderNormalizer#normalize_render)
13
+ # @option payload (see RenderNormalizer#normalize_render)
14
+ # @return (see RenderNormalizer#normalize_render)
9
15
  def normalize(trace, name, payload)
10
16
  normalize_render(CAT, payload)
11
17
  end
@@ -1,11 +1,17 @@
1
1
  module Skylight
2
2
  module Normalizers
3
3
  module ActionView
4
+ # Normalizer for Rails template rendering
4
5
  class RenderTemplate < RenderNormalizer
5
6
  register "render_template.action_view"
6
7
 
7
8
  CAT = "view.render.template".freeze
8
9
 
10
+ # @param trace [Skylight::Messages::Trace::Builder] ignored, only present to match API
11
+ # @param name [String] ignored, only present to match API
12
+ # @param payload (see RenderNormalizer#normalize_render)
13
+ # @option payload (see RenderNormalizer#normalize_render)
14
+ # @return (see RenderNormalizer#normalize_render)
9
15
  def normalize(trace, name, payload)
10
16
  normalize_render(CAT, payload)
11
17
  end
@@ -0,0 +1,21 @@
1
+ module Skylight
2
+ module Normalizers
3
+ module ActiveJob
4
+ class EnqueueAt < Normalizer
5
+ register "enqueue_at.active_job"
6
+
7
+ CAT = "other.job.enqueue_at".freeze
8
+
9
+ def normalize(_trace, _name, payload)
10
+ title = "Enqueue #{payload[:job].class}"
11
+
12
+ adapter_class_name = payload[:adapter].class.name
13
+ adapter_name = adapter_class_name.match(/^ActiveJob::QueueAdapters::(\w+)Adapter$/)[1].underscore
14
+ desc = "{ adapter: '#{adapter_name}', queue: '#{payload[:job].queue_name}' }"
15
+
16
+ [ CAT, title, desc ]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ module Skylight
2
+ module Normalizers
3
+ module ActiveRecord
4
+ class Instantiation < Normalizer
5
+ register "instantiation.active_record"
6
+
7
+ CAT = "db.active_record.instantiation".freeze
8
+
9
+ def normalize(trace, name, payload)
10
+ # Payload also includes `:record_count` but this will be variable
11
+ [ CAT, "#{payload[:class_name]} Instantiation", nil]
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -3,6 +3,7 @@ require "json"
3
3
  module Skylight
4
4
  module Normalizers
5
5
  module ActiveRecord
6
+ # Normalizer for SQL requests
6
7
  class SQL < Normalizer
7
8
  register "sql.active_record"
8
9
  register "sql.sequel"
@@ -10,6 +11,12 @@ module Skylight
10
11
 
11
12
  CAT = "db.sql.query".freeze
12
13
 
14
+ # @param trace [Skylight::Messages::Trace::Builder] ignored, only present to match API
15
+ # @param name [String] ignored, only present to match API
16
+ # @param payload [Hash]
17
+ # @option payload [String] [:name] The SQL operation
18
+ # @option payload [Hash] [:binds] The bound parameters
19
+ # @return [Array]
13
20
  def normalize(trace, name, payload)
14
21
  case payload[:name]
15
22
  when "SCHEMA".freeze, "CACHE".freeze
@@ -33,6 +33,7 @@ if defined?(ActiveSupport::Cache::Store.instrument)
33
33
  end
34
34
 
35
35
  unless deprecated
36
+ # @api private
36
37
  class ActiveSupport::Cache::Store
37
38
  def self.instrument
38
39
  true
@@ -1,7 +1,15 @@
1
1
  module Skylight
2
2
  module Normalizers
3
+
4
+ # The default normalizer, used if no other is found.
3
5
  class Default
4
6
 
7
+ # @param trace [Skylight::Messages::Trace::Builder] ignored, only present to match API
8
+ # @param name [String]
9
+ # @param payload [Hash]
10
+ # @option payload [String] :title
11
+ # @option payload [String] :description
12
+ # @return [Array, :skip] the normalized array or `:skip` if `name` is not part of a known {Skylight::TIERS tier}
5
13
  def normalize(trace, name, payload)
6
14
  if name =~ TIER_REGEX
7
15
  [
@@ -0,0 +1,36 @@
1
+ module Skylight
2
+ module Normalizers
3
+ module Faraday
4
+ class Request < Normalizer
5
+ register "request.faraday"
6
+
7
+ DISABLED_KEY = :__skylight_faraday_disabled
8
+
9
+ def self.disable
10
+ Thread.current[DISABLED_KEY] = true
11
+ yield
12
+ ensure
13
+ Thread.current[DISABLED_KEY] = false
14
+ end
15
+
16
+ def disabled?
17
+ !!Thread.current[DISABLED_KEY]
18
+ end
19
+
20
+ def normalize(_trace, _name, payload)
21
+ uri = payload[:url]
22
+
23
+ if disabled?
24
+ return :skip
25
+ end
26
+
27
+ opts = Formatters::HTTP.build_opts(payload[:method], uri.scheme,
28
+ uri.host, uri.port, uri.path, uri.query)
29
+ description = opts[:title]
30
+
31
+ [opts[:category], "Faraday", description]
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -6,6 +6,15 @@ module Skylight
6
6
 
7
7
  CAT = "db.mongo.query".freeze
8
8
 
9
+ # Normalizes a Moped operation
10
+ #
11
+ # @param trace [Skylight::Messages::Trace::Builder] ignored, only present to match API
12
+ # @param name [String] ignored, only present to match API
13
+ # @param payload [Hash]
14
+ # @option payload [Array<Moped::Protocol::*>] :ops array of performed operations. Supported operations are
15
+ # `Query`, `GetMore`, `Insert`, `Update`, and `Delete`.
16
+ # @option payload [String] :prefix ignored, provided by Moped
17
+ # @return [Array, :skip] the normalized array or `:skip` if not a known operation type
9
18
  def normalize(trace, name, payload)
10
19
  # payload: { prefix: " MOPED: #{address.resolved}", ops: operations }
11
20
 
@@ -11,10 +11,13 @@ module Skylight
11
11
  method: method,
12
12
  path: path do
13
13
 
14
+
14
15
  # Prevent HTTP-related probes from firing
15
- disable_skylight_probe(:NetHTTP) do
16
- disable_skylight_probe(:HTTPClient) do
17
- perform_request_without_sk(method, path, *args, &block)
16
+ Skylight::Normalizers::Faraday::Request.disable do
17
+ disable_skylight_probe(:NetHTTP) do
18
+ disable_skylight_probe(:HTTPClient) do
19
+ perform_request_without_sk(method, path, *args, &block)
20
+ end
18
21
  end
19
22
  end
20
23
  end
@@ -1,6 +1,7 @@
1
1
  module Skylight
2
2
  module Probes
3
3
  module Excon
4
+ # Probe for instrumenting Excon requests. Installs {Excon::Middleware} to achieve this.
4
5
  class Probe
5
6
  def install
6
7
  if defined?(::Excon::Middleware)
@@ -3,6 +3,8 @@ require 'skylight/formatters/http'
3
3
  module Skylight
4
4
  module Probes
5
5
  module Excon
6
+
7
+ # Middleware for Excon that instruments requests
6
8
  class Middleware < ::Excon::Middleware::Base
7
9
 
8
10
  # This probably won't work since config isn't defined
@@ -0,0 +1,22 @@
1
+ module Skylight
2
+ module Probes
3
+ module Faraday
4
+ class Probe
5
+ def install
6
+ ::Faraday::Connection.class_eval do
7
+ alias initialize_without_sk initialize
8
+
9
+ def initialize(*args, &block)
10
+ initialize_without_sk(*args, &block)
11
+
12
+ @builder.insert 0, ::Faraday::Request::Instrumentation
13
+ end
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+
20
+ register("Faraday", "faraday", Faraday::Probe.new)
21
+ end
22
+ end
@@ -3,6 +3,7 @@ require 'skylight/formatters/http'
3
3
  module Skylight
4
4
  module Probes
5
5
  module NetHTTP
6
+ # Probe for instrumenting Net::HTTP requests. Works by monkeypatching the default Net::HTTP#request method.
6
7
  class Probe
7
8
  DISABLED_KEY = :__skylight_net_http_disabled
8
9
 
@@ -13,9 +13,10 @@ module Skylight
13
13
  config.skylight.config_path = "config/skylight.yml"
14
14
 
15
15
  # The probes to load
16
- # net_http, action_controller, action_view, and grape are on by default
17
- # Also available: excon, redis, sinatra, tilt, sequel
18
- config.skylight.probes = ['net_http', 'action_controller', 'action_view', 'grape']
16
+ # net_http, action_controller, action_view, middleware, and grape are on by default
17
+ # See https://www.skylight.io/support/getting-more-from-skylight#available-instrumentation-options
18
+ # for a full list.
19
+ config.skylight.probes = ['net_http', 'action_controller', 'action_view', 'middleware', 'grape']
19
20
 
20
21
  # The position in the middleware stack to place Skylight
21
22
  # Default is first, but can be `{ after: Middleware::Name }` or `{ before: Middleware::Name }`
@@ -41,12 +42,12 @@ module Skylight
41
42
  end
42
43
  end
43
44
  elsif Rails.env.development?
44
- unless UserConfig.instance.disable_dev_warning?
45
+ unless config.user_config.disable_dev_warning?
45
46
  log_warning config, "[SKYLIGHT] [#{Skylight::VERSION}] Running Skylight in development mode. No data will be reported until you deploy your app.\n" \
46
47
  "(To disable this message for all local apps, run `skylight disable_dev_warning`.)"
47
48
  end
48
49
  elsif !Rails.env.test?
49
- unless UserConfig.instance.disable_env_warning?
50
+ unless config.user_config.disable_env_warning?
50
51
  log_warning config, "[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."
51
52
  end
52
53
  end
@@ -5,24 +5,21 @@ module Skylight
5
5
 
6
6
  attr_accessor :disable_dev_warning, :disable_env_warning
7
7
 
8
- def self.instance
9
- @instance ||= new
10
- end
11
-
12
- def initialize
8
+ def initialize(config)
9
+ @config = config
13
10
  reload
14
11
  end
15
12
 
16
13
  def file_path
17
14
  return @file_path if @file_path
18
15
 
19
- config_path = ENV.fetch("SKYLIGHT_USER_CONFIG_PATH") do
16
+ config_path = @config[:user_config_path] || begin
20
17
  require "etc"
21
18
  home_dir = ENV['HOME'] || Etc.getpwuid.dir || (ENV["USER"] && File.expand_path("~#{ENV['USER']}"))
22
19
  if home_dir
23
20
  File.join(home_dir, ".skylight")
24
21
  else
25
- raise KeyError, "SKYLIGHT_USER_CONFIG_PATH must be defined since the home directory cannot be inferred"
22
+ raise ConfigError, "The Skylight `user_config_path` must be defined since the home directory cannot be inferred"
26
23
  end
27
24
  end
28
25
 
@@ -1,6 +1,15 @@
1
1
  module Skylight
2
2
  module Util
3
+ # Helpers to reduce memory allocation
3
4
  module AllocationFree
5
+
6
+ # Find an item in an array without allocation.
7
+ #
8
+ # @param array [Array] the array to search
9
+ # @yield a block called against each item until a match is found
10
+ # @yieldparam item an item from the array
11
+ # @yieldreturn [Boolean] whether `item` matches the criteria
12
+ # return the found item or nil, if nothing found
4
13
  def array_find(array)
5
14
  i = 0
6
15
 
@@ -1,5 +1,6 @@
1
1
  module Skylight
2
2
  module Util
3
+ # A more precise clock
3
4
  class Clock
4
5
 
5
6
  if Skylight.native?
@@ -2,7 +2,13 @@ require 'zlib'
2
2
 
3
3
  module Skylight
4
4
  module Util
5
+ # Provides Gzip compressing support
5
6
  module Gzip
7
+
8
+ # Compress a string with Gzip
9
+ #
10
+ # @param str [String] uncompressed string
11
+ # @return [String] compressed string
6
12
  def self.compress(str)
7
13
  output = StringIO.new
8
14
  gz = Zlib::GzipWriter.new(output)
@@ -1,10 +1,12 @@
1
1
  module Skylight
2
2
  module Util
3
+
4
+ # String Inflector methods
5
+ #
6
+ # From https://github.com/rails/rails/blob/f8e5022c73679f41db9bb6743179bab4571fb28e/activesupport/lib/active_support/inflector/methods.rb
3
7
  module Inflector
4
8
  extend self
5
9
 
6
- # From https://github.com/rails/rails/blob/f8e5022c73679f41db9bb6743179bab4571fb28e/activesupport/lib/active_support/inflector/methods.rb
7
-
8
10
  # Tries to find a constant with the name specified in the argument string.
9
11
  #
10
12
  # 'Module'.constantize # => Module
@@ -24,11 +24,13 @@ module Skylight
24
24
  end
25
25
 
26
26
  module Logging
27
+
27
28
  def self.trace?
28
29
  ENV[TRACE_ENV_KEY]
29
30
  end
30
31
 
31
32
  if trace?
33
+ # The second set is picked up by YARD
32
34
  def trace(msg, *args)
33
35
  log :debug, msg, *args
34
36
  end
@@ -37,25 +39,44 @@ module Skylight
37
39
  log :debug, yield
38
40
  end
39
41
  else
40
- def trace(*)
42
+ # Logs if `ENV[TRACE_ENV_KEY]` is set.
43
+ #
44
+ # @param (see #debug)
45
+ #
46
+ # See {TRACE_ENV_KEY}.
47
+ def trace(msg, *args)
41
48
  end
42
49
 
50
+ # Evaluates and logs the result of the block if `ENV[TRACE_ENV_KEY]` is set
51
+ #
52
+ # @yield block to be evaluted
53
+ # @yieldreturn arguments for {#debug}
54
+ #
55
+ # See {TRACE_ENV_KEY}.
43
56
  def t
44
57
  end
45
58
  end
46
59
 
60
+ # @param msg (see #log)
61
+ # @param args (see #log)
47
62
  def debug(msg, *args)
48
63
  log :debug, msg, *args
49
64
  end
50
65
 
66
+ # @param msg (see #log)
67
+ # @param args (see #log)
51
68
  def info(msg, *args)
52
69
  log :info, msg, *args
53
70
  end
54
71
 
72
+ # @param msg (see #log)
73
+ # @param args (see #log)
55
74
  def warn(msg, *args)
56
75
  log :warn, msg, *args
57
76
  end
58
77
 
78
+ # @param msg (see #log)
79
+ # @param args (see #log)
59
80
  def error(msg, *args)
60
81
  raise sprintf(msg, *args) if ENV['SKYLIGHT_RAISE_ON_ERROR']
61
82
  log :error, msg, *args
@@ -67,8 +88,15 @@ module Skylight
67
88
  alias log_warn warn
68
89
  alias log_error error
69
90
 
70
- alias fmt sprintf
91
+ # Alias for `Kernel#sprintf`
92
+ # @return [String]
93
+ def fmt(*args)
94
+ sprintf(*args)
95
+ end
71
96
 
97
+ # @param level [String,Symbol] the method on `logger` to use for logging
98
+ # @param msg [String] the message to log
99
+ # @param args [Array] values for `Kernel#sprintf` on `msg`
72
100
  def log(level, msg, *args)
73
101
  c = if respond_to?(:config)
74
102
  config
@@ -9,6 +9,7 @@ require 'skylight/util/proxy'
9
9
  # Used from extconf.rb
10
10
  module Skylight
11
11
  module Util
12
+ # Utility class for fetching the native extension from a URL
12
13
  class NativeExtFetcher
13
14
  BASE_URL = "https://s3.amazonaws.com/skylight-agent-packages/skylight-native"
14
15
  MAX_REDIRECTS = 5
@@ -18,6 +19,8 @@ module Skylight
18
19
 
19
20
  class FetchError < StandardError; end
20
21
 
22
+ # Creates a new fetcher and fetches
23
+ # @param opts [Hash]
21
24
  def self.fetch(opts = {})
22
25
  fetcher = new(
23
26
  opts[:source] || BASE_URL,
@@ -32,6 +35,14 @@ module Skylight
32
35
  fetcher.fetch
33
36
  end
34
37
 
38
+ # @param source [String] the base url to download from
39
+ # @param target [String] file to download as
40
+ # @param version [String] version to download
41
+ # @param checksum [String] checksum of the archive
42
+ # @param arch [String] platform architecture, e.g. `linux-x86_64`
43
+ # @param required [Boolean] whether the download is required to be successful
44
+ # @param platform
45
+ # @param log [Logger]
35
46
  def initialize(source, target, version, checksum, arch, required, platform, log)
36
47
  raise "source required" unless source
37
48
  raise "target required" unless target
@@ -48,6 +59,9 @@ module Skylight
48
59
  @log = log
49
60
  end
50
61
 
62
+ # Fetch the native extension, verify, inflate, and save (if applicable)
63
+ #
64
+ # @return [String] the inflated archive
51
65
  def fetch
52
66
  log "fetching native ext; curr-platform=#{@platform}; " \
53
67
  "requested-arch=#{@arch}; version=#{@version}"
@@ -118,6 +132,15 @@ module Skylight
118
132
  return
119
133
  end
120
134
 
135
+ # Get with `Net::HTTP`
136
+ #
137
+ # @param host [String] host for `Net::HTTP` request
138
+ # @param port [String,Integer] port for `Net::HTTP` request
139
+ # @param use_ssl [Boolean] whether SSL should be used for this request
140
+ # @param path [String] the path to request
141
+ # @param out [IO]
142
+ #
143
+ # If `ENV['HTTP_PROXY']` is set, it will be used as a proxy for this request.
121
144
  def http_get(host, port, use_ssl, path, out)
122
145
  if http_proxy = Proxy.detect_url(ENV)
123
146
  log "connecting with proxy: #{http_proxy}"
@@ -158,6 +181,10 @@ module Skylight
158
181
  end
159
182
  end
160
183
 
184
+ # Verify the checksum of the archive
185
+ #
186
+ # @param actual [String]
187
+ # @return [Boolean] whether the checksum matches
161
188
  def verify_checksum(actual)
162
189
  unless @checksum == actual
163
190
  log "checksum mismatch; expected=#{@checksum}; actual=#{actual}"
@@ -174,15 +201,26 @@ module Skylight
174
201
  "skylight_#{@arch}.tar.gz"
175
202
  end
176
203
 
204
+ # The url that will be fetched
205
+ #
206
+ # @return String
177
207
  def source_uri
178
208
  "#{@source}/#{@version}/#{basename}"
179
209
  end
180
210
 
211
+ # Split the uri string into its component parts
212
+ #
213
+ # @param uri [String] the uri
214
+ # @return [Array<String>] the host, port, scheme, and request_uri
181
215
  def deconstruct_uri(uri)
182
216
  uri = URI(uri)
183
217
  [ uri.host, uri.port, uri.scheme == 'https', uri.request_uri ]
184
218
  end
185
219
 
220
+ # Log an error and raise if `required` is `true`
221
+ #
222
+ # @param err [String]
223
+ # @return [void]
186
224
  def maybe_raise(err)
187
225
  error err
188
226
 
@@ -191,11 +229,20 @@ module Skylight
191
229
  end
192
230
  end
193
231
 
232
+ # Log an `info` to the `logger`
233
+ #
234
+ # @param msg [String]
235
+ # @return [void]
194
236
  def log(msg)
195
237
  msg = "[SKYLIGHT] #{msg}"
196
238
  @log.info msg
197
239
  end
198
240
 
241
+ # Log an `error` to the `logger`
242
+ #
243
+ # @param msg [String]
244
+ # @param e [Exception] the exception associated with the error
245
+ # @return [void]
199
246
  def error(msg, e=nil)
200
247
  msg = "[SKYLIGHT] #{msg}"
201
248
  msg << "\n#{e.backtrace.join("\n")}" if e
@@ -1,4 +1,4 @@
1
1
  module Skylight
2
- VERSION = '1.4.0-beta'
2
+ VERSION = '1.4.0-beta.2'
3
3
  end
4
4
 
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: 1.4.0.beta
4
+ version: 1.4.0.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tilde, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-13 00:00:00.000000000 Z
11
+ date: 2017-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -65,7 +65,9 @@ files:
65
65
  - lib/skylight/normalizers/action_view/render_collection.rb
66
66
  - lib/skylight/normalizers/action_view/render_partial.rb
67
67
  - lib/skylight/normalizers/action_view/render_template.rb
68
+ - lib/skylight/normalizers/active_job/enqueue_at.rb
68
69
  - lib/skylight/normalizers/active_model_serializers/render.rb
70
+ - lib/skylight/normalizers/active_record/instantiation.rb
69
71
  - lib/skylight/normalizers/active_record/sql.rb
70
72
  - lib/skylight/normalizers/active_support/cache.rb
71
73
  - lib/skylight/normalizers/active_support/cache_clear.rb
@@ -81,6 +83,7 @@ files:
81
83
  - lib/skylight/normalizers/couch_potato/query.rb
82
84
  - lib/skylight/normalizers/default.rb
83
85
  - lib/skylight/normalizers/elasticsearch/request.rb
86
+ - lib/skylight/normalizers/faraday/request.rb
84
87
  - lib/skylight/normalizers/grape/endpoint.rb
85
88
  - lib/skylight/normalizers/grape/endpoint_render.rb
86
89
  - lib/skylight/normalizers/grape/endpoint_run.rb
@@ -93,6 +96,7 @@ files:
93
96
  - lib/skylight/probes/elasticsearch.rb
94
97
  - lib/skylight/probes/excon.rb
95
98
  - lib/skylight/probes/excon/middleware.rb
99
+ - lib/skylight/probes/faraday.rb
96
100
  - lib/skylight/probes/grape.rb
97
101
  - lib/skylight/probes/httpclient.rb
98
102
  - lib/skylight/probes/middleware.rb
@@ -172,7 +176,8 @@ files:
172
176
  - lib/skylight/version.rb
173
177
  - lib/skylight/vm/gc.rb
174
178
  homepage: http://www.skylight.io
175
- licenses: []
179
+ licenses:
180
+ - Nonstandard
176
181
  metadata: {}
177
182
  post_install_message:
178
183
  rdoc_options: []