skylight 1.4.0.beta → 1.4.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.
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: []