skylight 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/skylight/normalizers.rb +2 -1
- data/lib/skylight/normalizers/moped.rb +139 -0
- data/lib/skylight/normalizers/sql.rb +23 -7
- data/lib/skylight/railtie.rb +1 -1
- data/lib/skylight/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54d9a76b353b8d0a2a6fecce094a8a32802a1b9d
|
4
|
+
data.tar.gz: c773bed69979daa2fe511a1fef1698699aa6ba42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad2f6c9f9edec7ec1417a89faa026cafbb5b36b9adc6e47c35063793178b8ff4bd75d683c404463fb37e0581be526eeeb7443e9df2314be060fd78d9419a51b6
|
7
|
+
data.tar.gz: f4b98d9d9b50b111b7c5f33ae57343c7985be52bcaa0cced2781c322bc1231b2186dd8f1ffda1a3b9eb098afec2c98e3572ed3492e21c39b4c8693acd3399dc8
|
data/CHANGELOG.md
CHANGED
data/lib/skylight/normalizers.rb
CHANGED
@@ -0,0 +1,139 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
class Moped < Normalizer
|
4
|
+
register "query.moped"
|
5
|
+
|
6
|
+
CAT = "db.mongo.query".freeze
|
7
|
+
|
8
|
+
def normalize(trace, name, payload)
|
9
|
+
# payload: { prefix: " MOPED: #{address.resolved}", ops: operations }
|
10
|
+
|
11
|
+
# We can sometimes have multiple operations. However, it seems like this only happens when doing things
|
12
|
+
# like an insert, followed by a get last error, so we can probably ignore all but the first.
|
13
|
+
operation = payload[:ops] ? payload[:ops].first : nil
|
14
|
+
type = operation && operation.class.to_s =~ /^Moped::Protocol::(.+)$/ ? $1 : nil
|
15
|
+
|
16
|
+
case type
|
17
|
+
when "Query" then normalize_query(operation)
|
18
|
+
when "GetMore" then normalize_get_more(operation)
|
19
|
+
when "Insert" then normalize_insert(operation)
|
20
|
+
when "Update" then normalize_update(operation)
|
21
|
+
when "Delete" then normalize_delete(operation)
|
22
|
+
else :skip
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def normalize_query(operation)
|
29
|
+
title = normalize_title("QUERY", operation)
|
30
|
+
|
31
|
+
hash, binds = extract_binds(operation.selector)
|
32
|
+
description = hash.to_json
|
33
|
+
|
34
|
+
annotations = build_annotations(operation)
|
35
|
+
annotations[:skip] = operation.skip
|
36
|
+
if operation.fields
|
37
|
+
annotations[:fields] = operation.fields.select{|k,v| v == 1 }.keys.map(&:to_s)
|
38
|
+
end
|
39
|
+
annotations[:binds] = binds unless binds.empty?
|
40
|
+
|
41
|
+
[CAT, title, description, annotations]
|
42
|
+
end
|
43
|
+
|
44
|
+
def normalize_get_more(operation)
|
45
|
+
title = normalize_title("GET_MORE", operation)
|
46
|
+
|
47
|
+
annotations = build_annotations(operation)
|
48
|
+
annotations[:limit] = operation.limit
|
49
|
+
|
50
|
+
[CAT, title, nil, annotations]
|
51
|
+
end
|
52
|
+
|
53
|
+
def normalize_insert(operation)
|
54
|
+
title = normalize_title("INSERT", operation)
|
55
|
+
|
56
|
+
annotations = build_annotations(operation)
|
57
|
+
annotations[:count] = operation.documents.count
|
58
|
+
|
59
|
+
[CAT, title, nil, annotations]
|
60
|
+
end
|
61
|
+
|
62
|
+
def normalize_update(operation)
|
63
|
+
title = normalize_title("UPDATE", operation)
|
64
|
+
|
65
|
+
selector_hash, selector_binds = extract_binds(operation.selector)
|
66
|
+
update_hash, update_binds = extract_binds(operation.update)
|
67
|
+
|
68
|
+
description = { selector: selector_hash, update: update_hash }.to_json
|
69
|
+
|
70
|
+
annotations = build_annotations(operation)
|
71
|
+
|
72
|
+
binds = {}
|
73
|
+
binds[:selector] = selector_binds unless selector_binds.empty?
|
74
|
+
binds[:update] = update_binds unless update_binds.empty?
|
75
|
+
annotations[:binds] = binds unless binds.empty?
|
76
|
+
|
77
|
+
[CAT, title, description, annotations]
|
78
|
+
end
|
79
|
+
|
80
|
+
def normalize_delete(operation)
|
81
|
+
title = normalize_title("DELETE", operation)
|
82
|
+
|
83
|
+
hash, binds = extract_binds(operation.selector)
|
84
|
+
description = hash.to_json
|
85
|
+
|
86
|
+
annotations = build_annotations(operation)
|
87
|
+
annotations[:binds] = binds unless binds.empty?
|
88
|
+
|
89
|
+
[CAT, title, description, annotations]
|
90
|
+
end
|
91
|
+
|
92
|
+
def normalize_title(type, operation)
|
93
|
+
"#{type} #{operation.collection}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def build_annotations(operation)
|
97
|
+
annotations = {}
|
98
|
+
|
99
|
+
if operation.respond_to?(:flags)
|
100
|
+
flags = operation.flags.map{|f| flag_name(f) }
|
101
|
+
annotations[:flags] = flags unless flags.empty?
|
102
|
+
end
|
103
|
+
|
104
|
+
annotations
|
105
|
+
end
|
106
|
+
|
107
|
+
# Some flags used by Moped don't map directly to the Mongo docs
|
108
|
+
# See http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/
|
109
|
+
FLAG_MAP = {
|
110
|
+
tailable: "TailableCursor",
|
111
|
+
multi: "MultiUpdate"
|
112
|
+
}
|
113
|
+
|
114
|
+
def flag_name(flag)
|
115
|
+
FLAG_MAP[flag] || flag.to_s.sub(/^[a-z\d]*/) { $&.capitalize }.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }
|
116
|
+
end
|
117
|
+
|
118
|
+
def extract_binds(hash, binds=[])
|
119
|
+
hash = hash.dup
|
120
|
+
|
121
|
+
hash.each do |k,v|
|
122
|
+
if v.is_a?(Hash)
|
123
|
+
hash[k] = extract_binds(v, binds)[0]
|
124
|
+
else
|
125
|
+
binds << stringify(hash[k])
|
126
|
+
hash[k] = '?'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
[hash, binds]
|
131
|
+
end
|
132
|
+
|
133
|
+
def stringify(value)
|
134
|
+
value.is_a?(Regexp) ? value.inspect : value.to_s
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -17,16 +17,18 @@ module Skylight
|
|
17
17
|
title = payload[:name] || "SQL"
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
binds = payload[:binds]
|
21
|
+
|
22
|
+
if binds && !binds.empty?
|
23
|
+
binds = binds.map { |col, val| val.inspect }
|
22
24
|
end
|
23
25
|
|
24
|
-
extracted_title,
|
26
|
+
extracted_title, sql, binds, error = extract_binds(payload, binds)
|
25
27
|
title = extracted_title if extracted_title
|
26
28
|
|
27
|
-
if
|
29
|
+
if sql
|
28
30
|
annotations = {
|
29
|
-
sql:
|
31
|
+
sql: sql,
|
30
32
|
binds: binds,
|
31
33
|
}
|
32
34
|
else
|
@@ -35,7 +37,7 @@ module Skylight
|
|
35
37
|
}
|
36
38
|
end
|
37
39
|
|
38
|
-
[ name, title,
|
40
|
+
[ name, title, sql, annotations ]
|
39
41
|
end
|
40
42
|
|
41
43
|
private
|
@@ -43,7 +45,21 @@ module Skylight
|
|
43
45
|
title, sql, binds = SqlLexer::Lexer.bindify(payload[:sql], precalculated)
|
44
46
|
[ title, sql, binds, nil ]
|
45
47
|
rescue
|
46
|
-
|
48
|
+
# Encode this since we may have improperly incoded strings that can't be to_json'ed
|
49
|
+
encoded = encode(payload: payload, precalculated: precalculated)
|
50
|
+
[ nil, nil, nil, ["sql_parse", encoded.to_json] ]
|
51
|
+
end
|
52
|
+
|
53
|
+
def encode(body)
|
54
|
+
if body.is_a?(Hash)
|
55
|
+
body.each{|k,v| body[k] = encode(v) }
|
56
|
+
elsif body.is_a?(Array)
|
57
|
+
body.each_with_index{|v,i| body[i] = encode(v) }
|
58
|
+
elsif body.respond_to?(:encoding) && (body.encoding == Encoding::BINARY || !body.valid_encoding?)
|
59
|
+
Base64.encode64(body)
|
60
|
+
else
|
61
|
+
body
|
62
|
+
end
|
47
63
|
end
|
48
64
|
end
|
49
65
|
end
|
data/lib/skylight/railtie.rb
CHANGED
data/lib/skylight/version.rb
CHANGED
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.2.
|
4
|
+
version: 0.2.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: 2013-12-
|
11
|
+
date: 2013-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/skylight/middleware.rb
|
56
56
|
- lib/skylight/normalizers.rb
|
57
57
|
- lib/skylight/normalizers/default.rb
|
58
|
+
- lib/skylight/normalizers/moped.rb
|
58
59
|
- lib/skylight/normalizers/process_action.rb
|
59
60
|
- lib/skylight/normalizers/render_collection.rb
|
60
61
|
- lib/skylight/normalizers/render_partial.rb
|
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
161
|
version: '0'
|
161
162
|
requirements: []
|
162
163
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.1.
|
164
|
+
rubygems_version: 2.1.11
|
164
165
|
signing_key:
|
165
166
|
specification_version: 4
|
166
167
|
summary: Skylight is a ruby application monitoring tool. Currently in closed beta.
|