skylight 0.2.1 → 0.2.2

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 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.