skylight 0.5.2 → 0.6.0.beta.1

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: 298cf9d0f31b9d3dcb480039c94900a954263549
4
- data.tar.gz: 776b66cdce89e49c98bc12662a40865af657af2d
3
+ metadata.gz: a5fe0175d64d6a4fa8ee48ee5fb11f7c12229419
4
+ data.tar.gz: 57bc045e5555aae042471c7920854ac1c022fcfa
5
5
  SHA512:
6
- metadata.gz: 45a4f7c2396dc01028e6df143ba618ff327191ae99cbf00dedfbf2e4fee8436c545b84a18e7cbfe47709dec4c7ac49180627abd22eb92c60c7762c1d1da44c3b
7
- data.tar.gz: fb9506358d97811463238d7363e730636657f96989f6c04c3ab3c0d8f43a9ab656df3c14f711db106361b8456111c4ee77c6ce0b3111dad04bb272712ca6134a
6
+ metadata.gz: a1f45b52db2a62340ab610b4fa5658032105212950cf8bf8a40fad751930b7b4d63690b799b5fd88af959674017ce08e9fe03b017007e76c187ee6393edaa49e
7
+ data.tar.gz: 172582d67e1c2ad1420f02a63b32874feee80eb19cacfd7565509de8aa5df9437daa7543096cac8b0ffcad846660e2573d025958850aaebf5007bea7c47bb54e
@@ -1,3 +1,15 @@
1
+ ## 0.6.0 - Beta 1 (January 5, 2014)
2
+
3
+ * [IMPROVEMENT] Eliminates runtime dependency on the Rails
4
+ constant across the entire codebase
5
+ * [FEATURE] Support for Sinatra applications. During the
6
+ beta period, this requires an opt-in via
7
+ `require "skylight/sinatra". See http://docs.skylight.io/sinatra/
8
+ * [FEATURE] Support for the Sequel ORM (off by default for Rails apps
9
+ during the beta)
10
+ * [FEATURE] Support for Tilt templates (off by default for Rails apps
11
+ during the beta)
12
+
1
13
  ## 0.5.2 (December 15, 2014)
2
14
 
3
15
  * [IMPROVEMENT] Support ignoring multiple heartbeat endpoints
@@ -1,124 +1,2 @@
1
- require 'skylight/version'
2
-
3
- module Skylight
4
- # @api private
5
- TRACE_ENV_KEY = 'SKYLIGHT_ENABLE_TRACE_LOGS'.freeze
6
-
7
- # Load the native agent
8
- require 'skylight/native'
9
-
10
- if defined?(Rails)
11
- require 'skylight/railtie'
12
- end
13
-
14
- require 'active_support/notifications'
15
- require 'skylight/compat' # Require after AS::N
16
-
17
- # Require VM specific things
18
- require 'skylight/config'
19
- require 'skylight/gc'
20
- require 'skylight/helpers'
21
- require 'skylight/instrumenter'
22
- require 'skylight/middleware'
23
- require 'skylight/trace'
24
- require 'skylight/vm/gc'
25
- require 'skylight/util'
26
-
27
- # Used from the CLI
28
- autoload :Api, 'skylight/api'
29
- autoload :CLI, 'skylight/cli'
30
- autoload :Normalizers, 'skylight/normalizers'
31
- autoload :Subscriber, 'skylight/subscriber'
32
-
33
- # @api private
34
- class ConfigError < RuntimeError; end
35
-
36
- # @api private
37
- TIERS = %w(
38
- api
39
- app
40
- view
41
- db
42
- noise
43
- other)
44
-
45
- # @api private
46
- TIER_REGEX = /^(?:#{TIERS.join('|')})(?:\.|$)/u
47
-
48
- # @api private
49
- CATEGORY_REGEX = /^[a-z0-9_-]+(?:\.[a-z0-9_-]+)*$/iu
50
-
51
- # @api private
52
- DEFAULT_CATEGORY = "app.block".freeze
53
-
54
- # @api private
55
- DEFAULT_OPTIONS = { category: DEFAULT_CATEGORY }
56
-
57
- # Start instrumenting
58
- def self.start!(*args)
59
- Instrumenter.start!(*args)
60
- end
61
-
62
- # Stop instrumenting
63
- def self.stop!(*args)
64
- Instrumenter.stop!(*args)
65
- end
66
-
67
- # Start a trace
68
- def self.trace(endpoint=nil, cat=nil, title=nil)
69
- unless inst = Instrumenter.instance
70
- return yield if block_given?
71
- return
72
- end
73
-
74
- if block_given?
75
- inst.trace(endpoint, cat || DEFAULT_CATEGORY, title) { yield }
76
- else
77
- inst.trace(endpoint, cat || DEFAULT_CATEGORY, title)
78
- end
79
- end
80
-
81
- # End a trace
82
- def self.done(span)
83
- return unless inst = Instrumenter.instance
84
- inst.done(span)
85
- end
86
-
87
- # Instrument
88
- def self.instrument(opts = DEFAULT_OPTIONS)
89
- unless inst = Instrumenter.instance
90
- return yield if block_given?
91
- return
92
- end
93
-
94
- if Hash === opts
95
- category = opts[:category] || DEFAULT_CATEGORY
96
- title = opts[:title]
97
- desc = opts[:description]
98
- annotations = opts[:annotations]
99
- else
100
- category = DEFAULT_CATEGORY
101
- title = opts.to_s
102
- desc = nil
103
- annotations = nil
104
- end
105
-
106
- if block_given?
107
- inst.instrument(category, title, desc, annotations) { yield }
108
- else
109
- inst.instrument(category, title, desc, annotations)
110
- end
111
- end
112
-
113
- # Temporarily disable
114
- def self.disable
115
- unless inst = Instrumenter.instance
116
- return yield if block_given?
117
- return
118
- end
119
-
120
- inst.disable { yield }
121
- end
122
-
123
- require 'skylight/probes'
124
- end
1
+ require 'skylight/core'
2
+ require 'skylight/probes'
@@ -41,6 +41,11 @@ repository and deploy from there. You can learn more about the process at:
41
41
 
42
42
  http://docs.skylight.io/getting-started/#deploy
43
43
 
44
+ If you want to specify the authentication token as an environment variable,
45
+ you should set the `SKYLIGHT_AUTHENTICATION` variable to:
46
+
47
+ #{config[:authentication]}
48
+
44
49
  OUT
45
50
  rescue Api::CreateFailed => e
46
51
  say "Could not create the application", :red
@@ -387,9 +387,6 @@ module Skylight
387
387
  File.open(path, 'w') do |f|
388
388
  f.puts <<-YAML
389
389
  ---
390
- # The Skylight ID for the application.
391
- application: #{self[:application]}
392
-
393
390
  # The authentication token for the application.
394
391
  authentication: #{self[:authentication]}
395
392
  YAML
@@ -0,0 +1,122 @@
1
+ require 'skylight/version'
2
+
3
+ module Skylight
4
+ # @api private
5
+ TRACE_ENV_KEY = 'SKYLIGHT_ENABLE_TRACE_LOGS'.freeze
6
+
7
+ # Load the native agent
8
+ require 'skylight/native'
9
+
10
+ if defined?(Rails)
11
+ require 'skylight/railtie'
12
+ end
13
+
14
+ require 'active_support/notifications'
15
+ require 'skylight/compat' # Require after AS::N
16
+
17
+ # Require VM specific things
18
+ require 'skylight/config'
19
+ require 'skylight/gc'
20
+ require 'skylight/helpers'
21
+ require 'skylight/instrumenter'
22
+ require 'skylight/middleware'
23
+ require 'skylight/trace'
24
+ require 'skylight/vm/gc'
25
+ require 'skylight/util'
26
+
27
+ # Used from the CLI
28
+ autoload :Api, 'skylight/api'
29
+ autoload :CLI, 'skylight/cli'
30
+ autoload :Normalizers, 'skylight/normalizers'
31
+ autoload :Subscriber, 'skylight/subscriber'
32
+
33
+ # @api private
34
+ class ConfigError < RuntimeError; end
35
+
36
+ # @api private
37
+ TIERS = %w(
38
+ api
39
+ app
40
+ view
41
+ db
42
+ noise
43
+ other)
44
+
45
+ # @api private
46
+ TIER_REGEX = /^(?:#{TIERS.join('|')})(?:\.|$)/u
47
+
48
+ # @api private
49
+ CATEGORY_REGEX = /^[a-z0-9_-]+(?:\.[a-z0-9_-]+)*$/iu
50
+
51
+ # @api private
52
+ DEFAULT_CATEGORY = "app.block".freeze
53
+
54
+ # @api private
55
+ DEFAULT_OPTIONS = { category: DEFAULT_CATEGORY }
56
+
57
+ # Start instrumenting
58
+ def self.start!(*args)
59
+ Instrumenter.start!(*args)
60
+ end
61
+
62
+ # Stop instrumenting
63
+ def self.stop!(*args)
64
+ Instrumenter.stop!(*args)
65
+ end
66
+
67
+ # Start a trace
68
+ def self.trace(endpoint=nil, cat=nil, title=nil)
69
+ unless inst = Instrumenter.instance
70
+ return yield if block_given?
71
+ return
72
+ end
73
+
74
+ if block_given?
75
+ inst.trace(endpoint, cat || DEFAULT_CATEGORY, title) { yield }
76
+ else
77
+ inst.trace(endpoint, cat || DEFAULT_CATEGORY, title)
78
+ end
79
+ end
80
+
81
+ # End a trace
82
+ def self.done(span)
83
+ return unless inst = Instrumenter.instance
84
+ inst.done(span)
85
+ end
86
+
87
+ # Instrument
88
+ def self.instrument(opts = DEFAULT_OPTIONS)
89
+ unless inst = Instrumenter.instance
90
+ return yield if block_given?
91
+ return
92
+ end
93
+
94
+ if Hash === opts
95
+ category = opts[:category] || DEFAULT_CATEGORY
96
+ title = opts[:title]
97
+ desc = opts[:description]
98
+ annotations = opts[:annotations]
99
+ else
100
+ category = DEFAULT_CATEGORY
101
+ title = opts.to_s
102
+ desc = nil
103
+ annotations = nil
104
+ end
105
+
106
+ if block_given?
107
+ inst.instrument(category, title, desc, annotations) { yield }
108
+ else
109
+ inst.instrument(category, title, desc, annotations)
110
+ end
111
+ end
112
+
113
+ # Temporarily disable
114
+ def self.disable
115
+ unless inst = Instrumenter.instance
116
+ return yield if block_given?
117
+ return
118
+ end
119
+
120
+ inst.disable { yield }
121
+ end
122
+ end
@@ -6,6 +6,8 @@ module Skylight
6
6
  module ActiveRecord
7
7
  class SQL < Normalizer
8
8
  register "sql.active_record"
9
+ register "sql.sequel"
10
+ register "sql.data_mapper"
9
11
 
10
12
  CAT = "db.sql.query".freeze
11
13
 
@@ -24,7 +26,7 @@ module Skylight
24
26
  binds = binds.map { |col, val| val.inspect }
25
27
  end
26
28
 
27
- extracted_title, sql, binds, error = extract_binds(payload, binds)
29
+ extracted_title, sql, binds, _ = extract_binds(payload, binds)
28
30
  title = extracted_title if extracted_title
29
31
 
30
32
  if sql
@@ -0,0 +1,29 @@
1
+ module Skylight
2
+ module Probes
3
+ module Sequel
4
+ class Probe
5
+ def install
6
+ require 'sequel/database/logging'
7
+ ::Sequel::Database.class_eval do
8
+ alias log_yield_without_sk log_yield
9
+
10
+ def log_yield(sql, args=nil, &block)
11
+ log_yield_without_sk(sql, *args) do
12
+ ::ActiveSupport::Notifications.instrument(
13
+ "sql.sequel",
14
+ sql: sql,
15
+ name: "SQL",
16
+ binds: args
17
+ ) do
18
+ block.call
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ register("Sequel", "sequel", Sequel::Probe.new)
28
+ end
29
+ end
@@ -0,0 +1,74 @@
1
+ module Skylight
2
+ module Probes
3
+ module Sinatra
4
+ class Probe
5
+ def install
6
+ class << ::Sinatra::Base
7
+ alias build_without_sk build
8
+ alias compile_without_sk! compile!
9
+
10
+ def compile!(verb, path, *args, &block)
11
+ compile_without_sk!(verb, path, *args, &block).tap do |_, _, _, wrapper|
12
+ # Deal with the situation where the path is a regex, and the default behavior
13
+ # of Ruby stringification produces an unreadable mess
14
+ if path.is_a?(Regexp)
15
+ human_readable = "<sk-regex>%r{#{path.source}}</sk-regex>"
16
+ wrapper.instance_variable_set(:@route_name, "#{verb} #{human_readable}")
17
+ else
18
+ wrapper.instance_variable_set(:@route_name, "#{verb} #{path}")
19
+ end
20
+
21
+ # Newer versions of Sinatra populate env['sinatra.route']. Polyfill older
22
+ # versions in a targeted but hackish way.
23
+ if ::Sinatra::VERSION < '1.4.0'
24
+ def wrapper.[](app, args)
25
+ app.env['sinatra.route'] = @route_name
26
+ super
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def build(*args, &block)
33
+ self.use Skylight::Middleware
34
+ build_without_sk(*args, &block)
35
+ end
36
+ end
37
+
38
+ ::Sinatra::Base.class_eval do
39
+ alias dispatch_without_sk! dispatch!
40
+ alias compile_template_without_sk compile_template
41
+
42
+ def dispatch!(*args, &block)
43
+ dispatch_without_sk!(*args, &block).tap do
44
+ instrumenter = Skylight::Instrumenter.instance
45
+ next unless instrumenter
46
+ trace = instrumenter.current_trace
47
+ next unless trace
48
+
49
+ # Set the endpoint name to the route name
50
+ route = env['sinatra.route']
51
+ trace.endpoint = route if route
52
+ end
53
+ end
54
+
55
+ def compile_template(engine, data, options, *args, &block)
56
+ # Pass along a useful "virtual path" to Tilt. The Tilt probe will handle
57
+ # instrumenting correctly.
58
+ case data
59
+ when Symbol
60
+ options[:sky_virtual_path] = data.to_s
61
+ else
62
+ options[:sky_virtual_path] = "Inline template (#{engine})"
63
+ end
64
+
65
+ compile_template_without_sk(engine, data, options, *args, &block)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ register("Sinatra::Base", "sinatra/base", Sinatra::Probe.new)
73
+ end
74
+ end
@@ -0,0 +1,26 @@
1
+ module Skylight
2
+ module Probes
3
+ module Tilt
4
+ class Probe
5
+ def install
6
+ ::Tilt::Template.class_eval do
7
+ alias render_without_sk render
8
+
9
+ def render(*args, &block)
10
+ opts = {
11
+ category: "view.render.template",
12
+ title: options[:sky_virtual_path] || "Unknown template name"
13
+ }
14
+
15
+ Skylight.instrument(opts) do
16
+ render_without_sk(*args, &block)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ register("Tilt::Template", "tilt/template", Tilt::Probe.new)
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ require 'skylight'
2
+ require 'skylight/probes/sinatra'
3
+ require 'skylight/probes/tilt'
4
+ require 'skylight/probes/sequel'
@@ -1,4 +1,4 @@
1
1
  module Skylight
2
- VERSION = '0.5.2'
2
+ VERSION = '0.6.0-beta.1'
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: 0.5.2
4
+ version: 0.6.0.beta.1
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-12-15 00:00:00.000000000 Z
11
+ date: 2015-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -49,6 +49,7 @@ files:
49
49
  - lib/skylight/cli.rb
50
50
  - lib/skylight/compat.rb
51
51
  - lib/skylight/config.rb
52
+ - lib/skylight/core.rb
52
53
  - lib/skylight/data/cacert.pem
53
54
  - lib/skylight/formatters/http.rb
54
55
  - lib/skylight/gc.rb
@@ -81,7 +82,11 @@ files:
81
82
  - lib/skylight/probes/excon/middleware.rb
82
83
  - lib/skylight/probes/net_http.rb
83
84
  - lib/skylight/probes/redis.rb
85
+ - lib/skylight/probes/sequel.rb
86
+ - lib/skylight/probes/sinatra.rb
87
+ - lib/skylight/probes/tilt.rb
84
88
  - lib/skylight/railtie.rb
89
+ - lib/skylight/sinatra.rb
85
90
  - lib/skylight/subscriber.rb
86
91
  - lib/skylight/trace.rb
87
92
  - lib/skylight/util.rb
@@ -162,9 +167,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
162
167
  version: 1.9.2
163
168
  required_rubygems_version: !ruby/object:Gem::Requirement
164
169
  requirements:
165
- - - ">="
170
+ - - ">"
166
171
  - !ruby/object:Gem::Version
167
- version: '0'
172
+ version: 1.3.1
168
173
  requirements: []
169
174
  rubyforge_project:
170
175
  rubygems_version: 2.2.2
@@ -172,4 +177,3 @@ signing_key:
172
177
  specification_version: 4
173
178
  summary: Skylight is a smart profiler for Rails apps
174
179
  test_files: []
175
- has_rdoc: