truex-skylight 0.6.0
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 +7 -0
- data/CHANGELOG.md +277 -0
- data/CLA.md +9 -0
- data/CONTRIBUTING.md +1 -0
- data/LICENSE.md +79 -0
- data/README.md +4 -0
- data/bin/skylight +3 -0
- data/ext/extconf.rb +186 -0
- data/ext/libskylight.yml +6 -0
- data/ext/skylight_memprof.c +115 -0
- data/ext/skylight_native.c +416 -0
- data/ext/skylight_native.h +20 -0
- data/lib/skylight.rb +2 -0
- data/lib/skylight/api.rb +79 -0
- data/lib/skylight/cli.rb +146 -0
- data/lib/skylight/compat.rb +47 -0
- data/lib/skylight/config.rb +498 -0
- data/lib/skylight/core.rb +122 -0
- data/lib/skylight/data/cacert.pem +3894 -0
- data/lib/skylight/formatters/http.rb +17 -0
- data/lib/skylight/gc.rb +107 -0
- data/lib/skylight/helpers.rb +137 -0
- data/lib/skylight/instrumenter.rb +290 -0
- data/lib/skylight/middleware.rb +75 -0
- data/lib/skylight/native.rb +69 -0
- data/lib/skylight/normalizers.rb +133 -0
- data/lib/skylight/normalizers/action_controller/process_action.rb +35 -0
- data/lib/skylight/normalizers/action_controller/send_file.rb +76 -0
- data/lib/skylight/normalizers/action_view/render_collection.rb +18 -0
- data/lib/skylight/normalizers/action_view/render_partial.rb +18 -0
- data/lib/skylight/normalizers/action_view/render_template.rb +18 -0
- data/lib/skylight/normalizers/active_record/sql.rb +79 -0
- data/lib/skylight/normalizers/active_support/cache.rb +50 -0
- data/lib/skylight/normalizers/active_support/cache_clear.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_decrement.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_delete.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_exist.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_fetch_hit.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_generate.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_increment.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_read.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_read_multi.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_write.rb +16 -0
- data/lib/skylight/normalizers/default.rb +21 -0
- data/lib/skylight/normalizers/moped/query.rb +141 -0
- data/lib/skylight/probes.rb +91 -0
- data/lib/skylight/probes/excon.rb +25 -0
- data/lib/skylight/probes/excon/middleware.rb +65 -0
- data/lib/skylight/probes/net_http.rb +44 -0
- data/lib/skylight/probes/redis.rb +30 -0
- data/lib/skylight/probes/sequel.rb +30 -0
- data/lib/skylight/probes/sinatra.rb +74 -0
- data/lib/skylight/probes/tilt.rb +27 -0
- data/lib/skylight/railtie.rb +122 -0
- data/lib/skylight/sinatra.rb +4 -0
- data/lib/skylight/subscriber.rb +92 -0
- data/lib/skylight/trace.rb +191 -0
- data/lib/skylight/util.rb +16 -0
- data/lib/skylight/util/allocation_free.rb +17 -0
- data/lib/skylight/util/clock.rb +53 -0
- data/lib/skylight/util/gzip.rb +15 -0
- data/lib/skylight/util/hostname.rb +17 -0
- data/lib/skylight/util/http.rb +218 -0
- data/lib/skylight/util/inflector.rb +110 -0
- data/lib/skylight/util/logging.rb +87 -0
- data/lib/skylight/util/multi_io.rb +21 -0
- data/lib/skylight/util/native_ext_fetcher.rb +205 -0
- data/lib/skylight/util/platform.rb +67 -0
- data/lib/skylight/util/ssl.rb +50 -0
- data/lib/skylight/vendor/active_support/notifications.rb +207 -0
- data/lib/skylight/vendor/active_support/notifications/fanout.rb +159 -0
- data/lib/skylight/vendor/active_support/notifications/instrumenter.rb +72 -0
- data/lib/skylight/vendor/active_support/per_thread_registry.rb +52 -0
- data/lib/skylight/vendor/cli/highline.rb +1034 -0
- data/lib/skylight/vendor/cli/highline/color_scheme.rb +134 -0
- data/lib/skylight/vendor/cli/highline/compatibility.rb +16 -0
- data/lib/skylight/vendor/cli/highline/import.rb +41 -0
- data/lib/skylight/vendor/cli/highline/menu.rb +381 -0
- data/lib/skylight/vendor/cli/highline/question.rb +481 -0
- data/lib/skylight/vendor/cli/highline/simulate.rb +48 -0
- data/lib/skylight/vendor/cli/highline/string_extensions.rb +111 -0
- data/lib/skylight/vendor/cli/highline/style.rb +181 -0
- data/lib/skylight/vendor/cli/highline/system_extensions.rb +242 -0
- data/lib/skylight/vendor/cli/thor.rb +473 -0
- data/lib/skylight/vendor/cli/thor/actions.rb +318 -0
- data/lib/skylight/vendor/cli/thor/actions/create_file.rb +105 -0
- data/lib/skylight/vendor/cli/thor/actions/create_link.rb +60 -0
- data/lib/skylight/vendor/cli/thor/actions/directory.rb +119 -0
- data/lib/skylight/vendor/cli/thor/actions/empty_directory.rb +137 -0
- data/lib/skylight/vendor/cli/thor/actions/file_manipulation.rb +314 -0
- data/lib/skylight/vendor/cli/thor/actions/inject_into_file.rb +109 -0
- data/lib/skylight/vendor/cli/thor/base.rb +652 -0
- data/lib/skylight/vendor/cli/thor/command.rb +136 -0
- data/lib/skylight/vendor/cli/thor/core_ext/hash_with_indifferent_access.rb +80 -0
- data/lib/skylight/vendor/cli/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/skylight/vendor/cli/thor/core_ext/ordered_hash.rb +100 -0
- data/lib/skylight/vendor/cli/thor/error.rb +28 -0
- data/lib/skylight/vendor/cli/thor/group.rb +282 -0
- data/lib/skylight/vendor/cli/thor/invocation.rb +172 -0
- data/lib/skylight/vendor/cli/thor/parser.rb +4 -0
- data/lib/skylight/vendor/cli/thor/parser/argument.rb +74 -0
- data/lib/skylight/vendor/cli/thor/parser/arguments.rb +171 -0
- data/lib/skylight/vendor/cli/thor/parser/option.rb +121 -0
- data/lib/skylight/vendor/cli/thor/parser/options.rb +218 -0
- data/lib/skylight/vendor/cli/thor/rake_compat.rb +72 -0
- data/lib/skylight/vendor/cli/thor/runner.rb +322 -0
- data/lib/skylight/vendor/cli/thor/shell.rb +88 -0
- data/lib/skylight/vendor/cli/thor/shell/basic.rb +393 -0
- data/lib/skylight/vendor/cli/thor/shell/color.rb +148 -0
- data/lib/skylight/vendor/cli/thor/shell/html.rb +127 -0
- data/lib/skylight/vendor/cli/thor/util.rb +270 -0
- data/lib/skylight/vendor/cli/thor/version.rb +3 -0
- data/lib/skylight/vendor/thread_safe.rb +126 -0
- data/lib/skylight/vendor/thread_safe/non_concurrent_cache_backend.rb +133 -0
- data/lib/skylight/vendor/thread_safe/synchronized_cache_backend.rb +76 -0
- data/lib/skylight/version.rb +4 -0
- data/lib/skylight/vm/gc.rb +70 -0
- data/lib/sql_lexer.rb +6 -0
- data/lib/sql_lexer/lexer.rb +579 -0
- data/lib/sql_lexer/string_scanner.rb +11 -0
- data/lib/sql_lexer/version.rb +3 -0
- metadata +179 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
# @api private
|
|
3
|
+
class Middleware
|
|
4
|
+
|
|
5
|
+
class BodyProxy
|
|
6
|
+
def initialize(body, &block)
|
|
7
|
+
@body, @block, @closed = body, block, false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def respond_to?(*args)
|
|
11
|
+
return false if args.first.to_s =~ /^to_ary$/
|
|
12
|
+
super or @body.respond_to?(*args)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def close
|
|
16
|
+
return if @closed
|
|
17
|
+
@closed = true
|
|
18
|
+
begin
|
|
19
|
+
@body.close if @body.respond_to? :close
|
|
20
|
+
ensure
|
|
21
|
+
@block.call
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def closed?
|
|
26
|
+
@closed
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# N.B. This method is a special case to address the bug described by #434.
|
|
30
|
+
# We are applying this special case for #each only. Future bugs of this
|
|
31
|
+
# class will be handled by requesting users to patch their ruby
|
|
32
|
+
# implementation, to save adding too many methods in this class.
|
|
33
|
+
def each(*args, &block)
|
|
34
|
+
@body.each(*args, &block)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def method_missing(*args, &block)
|
|
38
|
+
super if args.first.to_s =~ /^to_ary$/
|
|
39
|
+
@body.__send__(*args, &block)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
include Util::Logging
|
|
44
|
+
|
|
45
|
+
# For Util::Logging
|
|
46
|
+
attr_reader :config
|
|
47
|
+
|
|
48
|
+
def initialize(app, opts={})
|
|
49
|
+
@app = app
|
|
50
|
+
@config = opts[:config]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def call(env)
|
|
54
|
+
if env["REQUEST_METHOD"] == "HEAD"
|
|
55
|
+
t { "middleware skipping HEAD" }
|
|
56
|
+
@app.call(env)
|
|
57
|
+
else
|
|
58
|
+
begin
|
|
59
|
+
t { "middleware beginning trace" }
|
|
60
|
+
trace = Skylight.trace "Rack", 'app.rack.request'
|
|
61
|
+
resp = @app.call(env)
|
|
62
|
+
resp[2] = BodyProxy.new(resp[2]) { trace.submit } if trace
|
|
63
|
+
resp
|
|
64
|
+
rescue Exception
|
|
65
|
+
t { "middleware exception: #{trace}"}
|
|
66
|
+
trace.submit if trace
|
|
67
|
+
raise
|
|
68
|
+
ensure
|
|
69
|
+
t { "middleware release: #{trace}"}
|
|
70
|
+
trace.release if trace
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'skylight/util/platform'
|
|
2
|
+
|
|
3
|
+
module Skylight
|
|
4
|
+
# @api private
|
|
5
|
+
# Whether or not the native extension is present
|
|
6
|
+
@@has_native_ext = false
|
|
7
|
+
|
|
8
|
+
def self.native?
|
|
9
|
+
@@has_native_ext
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.libskylight_path
|
|
13
|
+
ENV['SKYLIGHT_LIB_PATH'] || File.expand_path("../native/#{Util::Platform.tuple}", __FILE__)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
skylight_required = ENV.key?("SKYLIGHT_REQUIRED") && ENV['SKYLIGHT_REQUIRED'] !~ /^false$/i
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
unless ENV.key?("SKYLIGHT_DISABLE_AGENT") && ENV['SKYLIGHT_DISABLE_AGENT'] !~ /^false$/i
|
|
20
|
+
lib = "#{libskylight_path}/libskylight.#{Util::Platform.libext}"
|
|
21
|
+
|
|
22
|
+
if File.exist?(lib)
|
|
23
|
+
# First attempt to require the native extension
|
|
24
|
+
require "skylight_native"
|
|
25
|
+
|
|
26
|
+
# Attempt to link the dylib
|
|
27
|
+
load_libskylight(lib)
|
|
28
|
+
|
|
29
|
+
# If nothing was thrown, then the native extension is present
|
|
30
|
+
@@has_native_ext = true
|
|
31
|
+
elsif skylight_required
|
|
32
|
+
raise LoadError, "Cannot find native extensions in #{libskylight_path}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
rescue LoadError => e
|
|
36
|
+
raise if skylight_required
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
unless Skylight.native?
|
|
40
|
+
class Instrumenter
|
|
41
|
+
def self.native_new(*args)
|
|
42
|
+
allocate
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @api private
|
|
48
|
+
def self.check_install_errors(config)
|
|
49
|
+
# Note: An unsupported arch doesn't count as an error.
|
|
50
|
+
install_log = File.expand_path("../../ext/install.log", __FILE__)
|
|
51
|
+
|
|
52
|
+
if File.exist?(install_log) && File.read(install_log) =~ /ERROR/
|
|
53
|
+
config.alert_logger.error \
|
|
54
|
+
"[SKYLIGHT] [#{Skylight::VERSION}] The Skylight native extension failed to install. " \
|
|
55
|
+
"Please check #{install_log} and notify support@skylight.io." \
|
|
56
|
+
"The missing extension will not affect the functioning of your application."
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @api private
|
|
61
|
+
def self.warn_skylight_native_missing(config)
|
|
62
|
+
config.alert_logger.error \
|
|
63
|
+
"[SKYLIGHT] [#{Skylight::VERSION}] The Skylight native extension for " \
|
|
64
|
+
"your platform wasn't found. Supported operating systems are " \
|
|
65
|
+
"Linux 2.6.18+ and Mac OS X 10.8+. The missing extension will not " \
|
|
66
|
+
"affect the functioning of your application. If you are on a " \
|
|
67
|
+
"supported platform, please contact support at support@skylight.io."
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require 'skylight/normalizers/default'
|
|
2
|
+
|
|
3
|
+
module Skylight
|
|
4
|
+
# @api private
|
|
5
|
+
# Convert AS::N events to Skylight events
|
|
6
|
+
module Normalizers
|
|
7
|
+
|
|
8
|
+
DEFAULT = Default.new
|
|
9
|
+
|
|
10
|
+
def self.register(name, klass)
|
|
11
|
+
(@registry ||= {})[name] = klass
|
|
12
|
+
klass
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.build(config)
|
|
16
|
+
normalizers = {}
|
|
17
|
+
|
|
18
|
+
(@registry || {}).each do |k, klass|
|
|
19
|
+
unless klass.method_defined?(:normalize)
|
|
20
|
+
# TODO: Warn
|
|
21
|
+
next
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
normalizers[k] = klass.new(config)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
Container.new(normalizers)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Normalizer
|
|
31
|
+
def self.register(name)
|
|
32
|
+
Normalizers.register(name, self)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
attr_reader :config
|
|
36
|
+
|
|
37
|
+
def initialize(config)
|
|
38
|
+
@config = config
|
|
39
|
+
setup if respond_to?(:setup)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class RenderNormalizer < Normalizer
|
|
44
|
+
include Util::AllocationFree
|
|
45
|
+
|
|
46
|
+
def setup
|
|
47
|
+
@paths = config['normalizers.render.view_paths'] || []
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def normalize_render(category, payload, annotations)
|
|
51
|
+
if path = payload[:identifier]
|
|
52
|
+
title = relative_path(path, annotations)
|
|
53
|
+
path = nil if path == title
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
[ category, title, nil, annotations ]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def relative_path(path, annotations)
|
|
60
|
+
return path if relative_path?(path)
|
|
61
|
+
|
|
62
|
+
root = array_find(@paths) { |p| path.start_with?(p) }
|
|
63
|
+
type = :project
|
|
64
|
+
|
|
65
|
+
unless root
|
|
66
|
+
root = array_find(Gem.path) { |p| path.start_with?(p) }
|
|
67
|
+
type = :gem
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if root
|
|
71
|
+
start = root.size
|
|
72
|
+
start += 1 if path.getbyte(start) == SEPARATOR_BYTE
|
|
73
|
+
if type == :gem
|
|
74
|
+
"$GEM_PATH/#{path[start, path.size]}"
|
|
75
|
+
else
|
|
76
|
+
path[start, path.size]
|
|
77
|
+
end
|
|
78
|
+
else
|
|
79
|
+
"Absolute Path"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
def relative_path?(path)
|
|
85
|
+
!absolute_path?(path)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
SEPARATOR_BYTE = File::SEPARATOR.ord
|
|
89
|
+
|
|
90
|
+
if File.const_defined?(:NULL) ? File::NULL == "NUL" : RbConfig::CONFIG['host_os'] =~ /mingw|mswin32/
|
|
91
|
+
# This is a DOSish environment
|
|
92
|
+
ALT_SEPARATOR_BYTE = File::ALT_SEPARATOR && File::ALT_SEPARATOR.ord
|
|
93
|
+
COLON_BYTE = ":".ord
|
|
94
|
+
def absolute_path?(path)
|
|
95
|
+
if alpha?(path.getbyte(0)) && path.getbyte(1) == COLON_BYTE
|
|
96
|
+
byte2 = path.getbyte(2)
|
|
97
|
+
byte2 == SEPARATOR_BYTE || byte2 == ALT_SEPARATOR_BYTE
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def alpha?(byte)
|
|
102
|
+
byte >= 65 and byte <= 90 || byte >= 97 and byte <= 122
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
def absolute_path?(path)
|
|
106
|
+
path.getbyte(0) == SEPARATOR_BYTE
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
class Container
|
|
112
|
+
def initialize(normalizers)
|
|
113
|
+
@normalizers = normalizers
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def normalize(trace, name, payload)
|
|
117
|
+
normalizer = @normalizers[name] || DEFAULT
|
|
118
|
+
normalizer.normalize(trace, name, payload)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
%w( action_controller/process_action
|
|
123
|
+
action_controller/send_file
|
|
124
|
+
action_view/render_collection
|
|
125
|
+
action_view/render_partial
|
|
126
|
+
action_view/render_template
|
|
127
|
+
active_record/sql
|
|
128
|
+
active_support/cache
|
|
129
|
+
moped/query).each do |file|
|
|
130
|
+
require "skylight/normalizers/#{file}"
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActionController
|
|
4
|
+
class ProcessAction < Normalizer
|
|
5
|
+
register "process_action.action_controller"
|
|
6
|
+
|
|
7
|
+
CAT = "app.controller.request".freeze
|
|
8
|
+
PAYLOAD_KEYS = %w[ controller action params format method path ].map(&:to_sym).freeze
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
trace.endpoint = controller_action(payload)
|
|
12
|
+
[ CAT, trace.endpoint, nil, normalize_payload(payload) ]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def controller_action(payload)
|
|
18
|
+
"#{payload[:controller]}##{payload[:action]}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def normalize_payload(payload)
|
|
22
|
+
normalized = {}
|
|
23
|
+
|
|
24
|
+
PAYLOAD_KEYS.each do |key|
|
|
25
|
+
val = payload[key]
|
|
26
|
+
val = val.inspect unless val.is_a?(String) || val.is_a?(Numeric)
|
|
27
|
+
normalized[key] = val
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
normalized
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActionController
|
|
4
|
+
|
|
5
|
+
# Temporary hacks
|
|
6
|
+
begin
|
|
7
|
+
require "action_dispatch/http/mime_type"
|
|
8
|
+
require "action_dispatch/http/mime_types"
|
|
9
|
+
require "rack/utils"
|
|
10
|
+
|
|
11
|
+
class SendFile < Normalizer
|
|
12
|
+
register "send_file.action_controller"
|
|
13
|
+
|
|
14
|
+
CAT = "app.controller.send_file".freeze
|
|
15
|
+
TITLE = "send file".freeze
|
|
16
|
+
|
|
17
|
+
def normalize(trace, name, payload)
|
|
18
|
+
path = payload[:path]
|
|
19
|
+
|
|
20
|
+
annotations = {
|
|
21
|
+
path: path,
|
|
22
|
+
filename: payload[:filename],
|
|
23
|
+
type: normalize_type(payload),
|
|
24
|
+
disposition: normalize_disposition(payload),
|
|
25
|
+
status: normalize_status(payload) }
|
|
26
|
+
|
|
27
|
+
title = TITLE
|
|
28
|
+
|
|
29
|
+
# depending on normalization, we probably want this to eventually
|
|
30
|
+
# include the full path, but we need to make sure we have a good
|
|
31
|
+
# deduping strategy first.
|
|
32
|
+
desc = nil
|
|
33
|
+
|
|
34
|
+
[ CAT, title, desc, annotations ]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
OCTET_STREAM = "application/octet-stream".freeze
|
|
40
|
+
ATTACHMENT = "attachment".freeze
|
|
41
|
+
|
|
42
|
+
def initialize(*)
|
|
43
|
+
super
|
|
44
|
+
|
|
45
|
+
@mimes = Mime::SET.reduce({}) do |hash, mime|
|
|
46
|
+
hash[mime.symbol] = mime.to_s.dup.freeze
|
|
47
|
+
hash
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def normalize_type(payload)
|
|
52
|
+
type = payload[:type] || OCTET_STREAM
|
|
53
|
+
type = @mimes[type] if type.is_a?(Symbol)
|
|
54
|
+
type
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def mime_for(type)
|
|
58
|
+
@mimes[type] ||= Mime[type].to_s.freeze
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def normalize_status(payload)
|
|
62
|
+
status = payload[:status] || 200
|
|
63
|
+
Rack::Utils.status_code(status)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def normalize_disposition(payload)
|
|
67
|
+
payload[:disposition] || ATTACHMENT
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
rescue LoadError
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActionView
|
|
4
|
+
class RenderCollection < RenderNormalizer
|
|
5
|
+
register "render_collection.action_view"
|
|
6
|
+
|
|
7
|
+
CAT = "view.render.collection".freeze
|
|
8
|
+
|
|
9
|
+
def normalize(trace, name, payload)
|
|
10
|
+
normalize_render(
|
|
11
|
+
CAT,
|
|
12
|
+
payload,
|
|
13
|
+
count: payload[:count])
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActionView
|
|
4
|
+
class RenderPartial < RenderNormalizer
|
|
5
|
+
register "render_partial.action_view"
|
|
6
|
+
|
|
7
|
+
CAT = "view.render.template".freeze
|
|
8
|
+
|
|
9
|
+
def normalize(trace, name, payload)
|
|
10
|
+
normalize_render(
|
|
11
|
+
CAT,
|
|
12
|
+
payload,
|
|
13
|
+
partial: 1)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActionView
|
|
4
|
+
class RenderTemplate < RenderNormalizer
|
|
5
|
+
register "render_template.action_view"
|
|
6
|
+
|
|
7
|
+
CAT = "view.render.template".freeze
|
|
8
|
+
|
|
9
|
+
def normalize(trace, name, payload)
|
|
10
|
+
normalize_render(
|
|
11
|
+
CAT,
|
|
12
|
+
payload,
|
|
13
|
+
partial: 0)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|