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,79 @@
|
|
|
1
|
+
require "sql_lexer"
|
|
2
|
+
require "json"
|
|
3
|
+
|
|
4
|
+
module Skylight
|
|
5
|
+
module Normalizers
|
|
6
|
+
module ActiveRecord
|
|
7
|
+
class SQL < Normalizer
|
|
8
|
+
register "sql.active_record"
|
|
9
|
+
register "sql.sequel"
|
|
10
|
+
register "sql.data_mapper"
|
|
11
|
+
|
|
12
|
+
CAT = "db.sql.query".freeze
|
|
13
|
+
|
|
14
|
+
def normalize(trace, name, payload)
|
|
15
|
+
case payload[:name]
|
|
16
|
+
when "SCHEMA", "CACHE"
|
|
17
|
+
return :skip
|
|
18
|
+
else
|
|
19
|
+
name = CAT
|
|
20
|
+
title = payload[:name] || "SQL"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
binds = payload[:binds]
|
|
24
|
+
|
|
25
|
+
if binds && !binds.empty?
|
|
26
|
+
binds = binds.map { |col, val| val.inspect }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
extracted_title, sql, binds, _ = extract_binds(payload, binds)
|
|
30
|
+
title = extracted_title if extracted_title
|
|
31
|
+
|
|
32
|
+
if sql
|
|
33
|
+
annotations = {
|
|
34
|
+
sql: sql,
|
|
35
|
+
binds: binds,
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
[ name, title, sql, annotations ]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
def extract_binds(payload, precalculated)
|
|
44
|
+
title, sql, binds = SqlLexer::Lexer.bindify(payload[:sql], precalculated, true)
|
|
45
|
+
[ title, sql, binds, nil ]
|
|
46
|
+
rescue => e
|
|
47
|
+
group = "sql_parse"
|
|
48
|
+
description = e.inspect
|
|
49
|
+
details = encode(backtrace: e.backtrace,
|
|
50
|
+
original_exception: {
|
|
51
|
+
class_name: e.class.name,
|
|
52
|
+
message: e.message
|
|
53
|
+
},
|
|
54
|
+
payload: payload,
|
|
55
|
+
precalculated: precalculated)
|
|
56
|
+
|
|
57
|
+
error = [group, description, details]
|
|
58
|
+
[ nil, nil, nil, error ]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# While operating in place would save memory, some of these passed in items are re-used elsewhere
|
|
62
|
+
# and, as such, should not be modified.
|
|
63
|
+
def encode(body)
|
|
64
|
+
if body.is_a?(Hash)
|
|
65
|
+
hash = {}
|
|
66
|
+
body.each{|k,v| hash[k] = encode(v) }
|
|
67
|
+
hash
|
|
68
|
+
elsif body.is_a?(Array)
|
|
69
|
+
body.map{|v| encode(v) }
|
|
70
|
+
elsif body.respond_to?(:encoding) && (body.encoding == Encoding::BINARY || !body.valid_encoding?)
|
|
71
|
+
Base64.encode64(body)
|
|
72
|
+
else
|
|
73
|
+
body
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
# NOTE: Instrumentation may not be turned on by default and is possibly buggy
|
|
5
|
+
# https://github.com/mperham/dalli/pull/284
|
|
6
|
+
class Cache < Normalizer
|
|
7
|
+
%w(clear
|
|
8
|
+
decrement
|
|
9
|
+
delete
|
|
10
|
+
exist
|
|
11
|
+
fetch_hit
|
|
12
|
+
generate
|
|
13
|
+
increment
|
|
14
|
+
read
|
|
15
|
+
read_multi
|
|
16
|
+
write).each do |type|
|
|
17
|
+
require "skylight/normalizers/active_support/cache_#{type}"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# See https://github.com/rails/rails/pull/15943
|
|
25
|
+
if defined?(ActiveSupport::Cache::Store.instrument)
|
|
26
|
+
deprecated = false
|
|
27
|
+
|
|
28
|
+
# If it's deprecated, setting to false will cause a deprecation warning
|
|
29
|
+
# and the value will remain true
|
|
30
|
+
ActiveSupport::Deprecation.silence do
|
|
31
|
+
ActiveSupport::Cache::Store.instrument = false
|
|
32
|
+
deprecated = ActiveSupport::Cache::Store.instrument
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
unless deprecated
|
|
36
|
+
class ActiveSupport::Cache::Store
|
|
37
|
+
def self.instrument
|
|
38
|
+
true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.instrument=(val)
|
|
42
|
+
unless val
|
|
43
|
+
Rails.logger.warn "[WARNING] Skylight has patched ActiveSupport::Cache::Store.instrument to always be true. " \
|
|
44
|
+
"In future versions of Rails, this method will no longer be settable. " \
|
|
45
|
+
"See https://github.com/rails/rails/pull/15943 for more information."
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheClear < Cache
|
|
5
|
+
register "cache_clear.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.clear".freeze
|
|
8
|
+
TITLE = "cache clear".freeze
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheDecrement < Cache
|
|
5
|
+
register "cache_decrement.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.decrement".freeze
|
|
8
|
+
TITLE = "cache decrement"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheDelete < Cache
|
|
5
|
+
register "cache_delete.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.delete".freeze
|
|
8
|
+
TITLE = "cache delete"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheExist < Cache
|
|
5
|
+
register "cache_exist?.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.exist".freeze
|
|
8
|
+
TITLE = "cache exist?"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheFetchHit < Cache
|
|
5
|
+
register "cache_fetch_hit.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.fetch_hit".freeze
|
|
8
|
+
TITLE = "cache fetch hit"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheGenerate < Cache
|
|
5
|
+
register "cache_generate.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.generate".freeze
|
|
8
|
+
TITLE = "cache generate"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheIncrement < Cache
|
|
5
|
+
register "cache_increment.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.increment".freeze
|
|
8
|
+
TITLE = "cache increment"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheRead < Cache
|
|
5
|
+
register "cache_read.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.read".freeze
|
|
8
|
+
TITLE = "cache read"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheReadMulti < Cache
|
|
5
|
+
register "cache_read_multi.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.read_multi".freeze
|
|
8
|
+
TITLE = "cache read multi"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module ActiveSupport
|
|
4
|
+
class CacheWrite < Cache
|
|
5
|
+
register "cache_write.active_support"
|
|
6
|
+
|
|
7
|
+
CAT = "app.cache.write".freeze
|
|
8
|
+
TITLE = "cache write"
|
|
9
|
+
|
|
10
|
+
def normalize(trace, name, payload)
|
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
class Default
|
|
4
|
+
|
|
5
|
+
def normalize(trace, name, payload)
|
|
6
|
+
if name =~ TIER_REGEX
|
|
7
|
+
annot = payload.dup
|
|
8
|
+
[
|
|
9
|
+
name,
|
|
10
|
+
annot.delete(:title),
|
|
11
|
+
annot.delete(:description),
|
|
12
|
+
annot
|
|
13
|
+
]
|
|
14
|
+
else
|
|
15
|
+
:skip
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
module Skylight
|
|
2
|
+
module Normalizers
|
|
3
|
+
module Moped
|
|
4
|
+
class Query < Normalizer
|
|
5
|
+
register "query.moped"
|
|
6
|
+
|
|
7
|
+
CAT = "db.mongo.query".freeze
|
|
8
|
+
|
|
9
|
+
def normalize(trace, name, payload)
|
|
10
|
+
# payload: { prefix: " MOPED: #{address.resolved}", ops: operations }
|
|
11
|
+
|
|
12
|
+
# We can sometimes have multiple operations. However, it seems like this only happens when doing things
|
|
13
|
+
# like an insert, followed by a get last error, so we can probably ignore all but the first.
|
|
14
|
+
operation = payload[:ops] ? payload[:ops].first : nil
|
|
15
|
+
type = operation && operation.class.to_s =~ /^Moped::Protocol::(.+)$/ ? $1 : nil
|
|
16
|
+
|
|
17
|
+
case type
|
|
18
|
+
when "Query" then normalize_query(operation)
|
|
19
|
+
when "GetMore" then normalize_get_more(operation)
|
|
20
|
+
when "Insert" then normalize_insert(operation)
|
|
21
|
+
when "Update" then normalize_update(operation)
|
|
22
|
+
when "Delete" then normalize_delete(operation)
|
|
23
|
+
else :skip
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def normalize_query(operation)
|
|
30
|
+
title = normalize_title("QUERY", operation)
|
|
31
|
+
|
|
32
|
+
hash, binds = extract_binds(operation.selector)
|
|
33
|
+
description = hash.to_json
|
|
34
|
+
|
|
35
|
+
annotations = build_annotations(operation)
|
|
36
|
+
annotations[:skip] = operation.skip
|
|
37
|
+
if operation.fields
|
|
38
|
+
annotations[:fields] = operation.fields.select{|k,v| v == 1 }.keys.map(&:to_s)
|
|
39
|
+
end
|
|
40
|
+
annotations[:binds] = binds unless binds.empty?
|
|
41
|
+
|
|
42
|
+
[CAT, title, description, annotations]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def normalize_get_more(operation)
|
|
46
|
+
title = normalize_title("GET_MORE", operation)
|
|
47
|
+
|
|
48
|
+
annotations = build_annotations(operation)
|
|
49
|
+
annotations[:limit] = operation.limit
|
|
50
|
+
|
|
51
|
+
[CAT, title, nil, annotations]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def normalize_insert(operation)
|
|
55
|
+
title = normalize_title("INSERT", operation)
|
|
56
|
+
|
|
57
|
+
annotations = build_annotations(operation)
|
|
58
|
+
annotations[:count] = operation.documents.count
|
|
59
|
+
|
|
60
|
+
[CAT, title, nil, annotations]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def normalize_update(operation)
|
|
64
|
+
title = normalize_title("UPDATE", operation)
|
|
65
|
+
|
|
66
|
+
selector_hash, selector_binds = extract_binds(operation.selector)
|
|
67
|
+
update_hash, update_binds = extract_binds(operation.update)
|
|
68
|
+
|
|
69
|
+
description = { selector: selector_hash, update: update_hash }.to_json
|
|
70
|
+
|
|
71
|
+
annotations = build_annotations(operation)
|
|
72
|
+
|
|
73
|
+
binds = {}
|
|
74
|
+
binds[:selector] = selector_binds unless selector_binds.empty?
|
|
75
|
+
binds[:update] = update_binds unless update_binds.empty?
|
|
76
|
+
annotations[:binds] = binds unless binds.empty?
|
|
77
|
+
|
|
78
|
+
[CAT, title, description, annotations]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def normalize_delete(operation)
|
|
82
|
+
title = normalize_title("DELETE", operation)
|
|
83
|
+
|
|
84
|
+
hash, binds = extract_binds(operation.selector)
|
|
85
|
+
description = hash.to_json
|
|
86
|
+
|
|
87
|
+
annotations = build_annotations(operation)
|
|
88
|
+
annotations[:binds] = binds unless binds.empty?
|
|
89
|
+
|
|
90
|
+
[CAT, title, description, annotations]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def normalize_title(type, operation)
|
|
94
|
+
"#{type} #{operation.collection}"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def build_annotations(operation)
|
|
98
|
+
annotations = {}
|
|
99
|
+
|
|
100
|
+
if operation.respond_to?(:flags)
|
|
101
|
+
flags = operation.flags.map{|f| flag_name(f) }
|
|
102
|
+
annotations[:flags] = flags unless flags.empty?
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
annotations
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Some flags used by Moped don't map directly to the Mongo docs
|
|
109
|
+
# See http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/
|
|
110
|
+
FLAG_MAP = {
|
|
111
|
+
tailable: "TailableCursor",
|
|
112
|
+
multi: "MultiUpdate"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
def flag_name(flag)
|
|
116
|
+
FLAG_MAP[flag] || flag.to_s.sub(/^[a-z\d]*/) { $&.capitalize }.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def extract_binds(hash, binds=[])
|
|
120
|
+
ret = {}
|
|
121
|
+
|
|
122
|
+
hash.each do |k,v|
|
|
123
|
+
if v.is_a?(Hash)
|
|
124
|
+
ret[k] = extract_binds(v, binds)[0]
|
|
125
|
+
else
|
|
126
|
+
binds << stringify(hash[k])
|
|
127
|
+
ret[k] = '?'
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
[ret, binds]
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def stringify(value)
|
|
135
|
+
value.is_a?(Regexp) ? value.inspect : value.to_s
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|