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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f303f463e38c3a4a0b657f62c56d3b5a2fdf6785
4
- data.tar.gz: 0ea102881e7ee7b4ee433c3b2a6fb3108157bf6c
3
+ metadata.gz: 54d9a76b353b8d0a2a6fecce094a8a32802a1b9d
4
+ data.tar.gz: c773bed69979daa2fe511a1fef1698699aa6ba42
5
5
  SHA512:
6
- metadata.gz: d0d314ceea96ff2f558b47ce7acbee8f4715c63010bb3fd8500af19882996e117c159c01d94536e904ba3a3d5fd3ec0d23b5cf3fb51f9147ce08575fee5da532
7
- data.tar.gz: d11114eb4997d558bb88d9da123dff43b26e2d0ca23883c9402ad2cf466fe10c3545c46de212e75889f668d8926968bffd800b0f84c271d80f87710b29bc5db5
6
+ metadata.gz: ad2f6c9f9edec7ec1417a89faa026cafbb5b36b9adc6e47c35063793178b8ff4bd75d683c404463fb37e0581be526eeeb7443e9df2314be060fd78d9419a51b6
7
+ data.tar.gz: f4b98d9d9b50b111b7c5f33ae57343c7985be52bcaa0cced2781c322bc1231b2186dd8f1ffda1a3b9eb098afec2c98e3572ed3492e21c39b4c8693acd3399dc8
@@ -1,3 +1,10 @@
1
+ ## 0.2.2 (December 10, 2013)
2
+
3
+ * Added support for Mongoid/Moped
4
+ * Fix probe enabling
5
+ * Improved error reporting
6
+ * Fix bug with multiple subscribers to same notification
7
+
1
8
  ## 0.2.1 (December 4, 2013)
2
9
 
3
10
  * Fix bin/skylight
@@ -110,7 +110,8 @@ module Skylight
110
110
  end
111
111
  end
112
112
 
113
- %w( process_action
113
+ %w( moped
114
+ process_action
114
115
  render_collection
115
116
  render_partial
116
117
  render_template
@@ -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
- unless payload[:binds].empty?
21
- payload[:binds] = payload[:binds].map { |col, val| val.inspect }
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, payload[:sql], binds, error = extract_binds(payload, payload[:binds])
26
+ extracted_title, sql, binds, error = extract_binds(payload, binds)
25
27
  title = extracted_title if extracted_title
26
28
 
27
- if payload[:sql]
29
+ if sql
28
30
  annotations = {
29
- sql: payload[: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, payload[:sql], annotations ]
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
- [ nil, nil, nil, ["sql_parse", payload[:sql]] ]
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
@@ -94,7 +94,7 @@ module Skylight
94
94
  def load_probes
95
95
  probes = config.skylight.probes || []
96
96
  probes.each do |p|
97
- require 'skylight/probes/#{p}'
97
+ require "skylight/probes/#{p}"
98
98
  end
99
99
  end
100
100
  end
@@ -1,4 +1,4 @@
1
1
  module Skylight
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.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: 0.2.1
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-04 00:00:00.000000000 Z
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.0
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.