ganymed 0.3.2 → 0.3.3

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.
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use --create ruby-1.9.3-p125@ganymed
1
+ rvm use --create ruby-1.9.3-p194@ganymed
data/Gemfile CHANGED
@@ -3,13 +3,14 @@ source :rubygems
3
3
  gemspec
4
4
 
5
5
  group :development, :test do
6
- gem 'ganymed-client', :path => '../ganymed-client'
6
+ #gem 'ganymed-client', :path => '../ganymed-client'
7
7
  gem 'bson_ext'
8
8
  gem 'bundler'
9
9
  gem 'debugger'
10
10
  gem 'perftools.rb'
11
11
  gem 'pry'
12
12
  gem 'pry-doc'
13
+ gem 'rake'
13
14
  gem 'redcarpet'
14
15
  gem 'reek'
15
16
  gem 'rspec'
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ $:.unshift(File.join(File.expand_path("../..", __FILE__), 'lib'))
5
+
6
+ $0 = "ganymed-console"
7
+
8
+ require 'madvertise/ext/logging'
9
+ require 'madvertise/ext/environment'
10
+ Env.key = 'GANYMED_ENV'
11
+
12
+ log.level = :debug
13
+
14
+ require 'ganymed/console'
15
+ Ganymed::Console.new
data/ganymed.gemspec CHANGED
@@ -37,4 +37,9 @@ Gem::Specification.new do |s|
37
37
  # collector
38
38
  s.add_dependency "sys-filesystem"
39
39
  s.add_dependency "ohai", ">= 0.6.12"
40
+
41
+ # console
42
+ s.add_dependency "ripl"
43
+ s.add_dependency "ascii_charts"
44
+ s.add_dependency "terminal-table"
40
45
  end
@@ -0,0 +1,147 @@
1
+ require 'ascii_charts'
2
+ require 'digest'
3
+ require 'madvertise/ext/config'
4
+ require 'ripl'
5
+ require 'terminal-table'
6
+
7
+ require 'ganymed'
8
+ require 'ganymed/mongodb'
9
+
10
+ module Ganymed
11
+ class Console
12
+ include Configuration::Helpers
13
+
14
+ attr_accessor :db
15
+
16
+ def initialize
17
+ @cache = {}
18
+
19
+ # load config file
20
+ @default_config_file = File.join(LIB_DIR, 'ganymed/config.yml')
21
+
22
+ # store fqdn for later use
23
+ config.fqdn = ::Socket.gethostbyname(::Socket.gethostname).first
24
+
25
+ # initialize db before loading ripl
26
+ log.silence do
27
+ @db = Ganymed::MongoDB.new(config.processor.mongodb)
28
+ end
29
+
30
+ Ripl.start(binding: binding)
31
+ end
32
+
33
+ def adduser(username, password)
34
+ hashed = Digest::SHA256.hexdigest(password)
35
+ db['users'].find_and_modify(
36
+ query: {_id: username},
37
+ update: {password: hashed},
38
+ new: true
39
+ )
40
+ end
41
+
42
+ def origins
43
+ headings = ["Origin"]
44
+ rows = db['metadata'].find.to_a.map do |row|
45
+ [row['_id']]
46
+ end
47
+ puts Terminal::Table.new(rows: rows, headings: headings)
48
+ end
49
+
50
+ alias_method :o, :origins
51
+
52
+ def list
53
+ db.collection_names.reject do |col|
54
+ %w(
55
+ metadata
56
+ system.indexes
57
+ users
58
+ ).include?(col)
59
+ end.sort.each do |col|
60
+ puts col
61
+ end
62
+ nil
63
+ end
64
+
65
+ alias_method :ls, :list
66
+ alias_method :l, :list
67
+
68
+ def drop
69
+ db.connection.drop_database(config.processor.mongodb.database)
70
+ end
71
+
72
+ def method_missing(method, *args)
73
+ pattern = /^#{method}\./
74
+
75
+ namespaces = db.collection_names.select do |col|
76
+ col =~ pattern
77
+ end
78
+
79
+ if namespaces.empty?
80
+ super
81
+ else
82
+ @cache[method] ||= CollectionProxy.new(method, db, config)
83
+ end
84
+ end
85
+
86
+ class CollectionProxy
87
+ attr_reader :ns, :db, :config
88
+
89
+ def initialize(ns, db, config)
90
+ @ns, @db, @config = ns, db, config
91
+ @cache = {}
92
+ @consolidation = "avg"
93
+
94
+ metaclass = class << self; self; end
95
+ config.sampler.consolidations.each do |key, _|
96
+ metaclass.send(:define_method, key.to_sym) do
97
+ @consolidation = key
98
+ self
99
+ end
100
+ end
101
+ end
102
+
103
+ def top(limit=10, selector={})
104
+ selector.merge!({c: { :$in => [nil, @consolidation]}})
105
+ opts = {limit: limit, sort: [:t, -1]}
106
+ db[ns].find(selector, opts).to_a.map do |row|
107
+ row.delete('_id')
108
+ row.delete('c')
109
+ row['t'] = Time.at(row['t'])
110
+ row
111
+ end
112
+ end
113
+
114
+ def to_s
115
+ headings = ["Time", "Origin", "Value"]
116
+ rows = top.map do |row|
117
+ [row['t'], row['o'], row['v']]
118
+ end
119
+ table = Terminal::Table.new(rows: rows, headings: headings)
120
+ "top-10 most recent events:\n" + table.to_s
121
+ end
122
+
123
+ def chart(limit=10, origin=nil)
124
+ origin ||= config.fqdn
125
+ values = top(limit, {o: origin}).reverse.map do |event|
126
+ [event['t'].strftime("%H:%M"), event['v']]
127
+ end
128
+ puts AsciiCharts::Cartesian.new(values, bar: true).draw
129
+ end
130
+
131
+ def method_missing(method, *args)
132
+ subns = "#{@ns}.#{method}"
133
+ pattern = /^#{subns}(\.|$)/
134
+
135
+ namespaces = db.collection_names.select do |col|
136
+ col =~ pattern
137
+ end
138
+
139
+ if namespaces.empty?
140
+ db[ns].send(method, *args)
141
+ else
142
+ @cache[method] ||= CollectionProxy.new(subns, db, config)
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -36,5 +36,9 @@ module Ganymed
36
36
  def [](*args)
37
37
  db.collection(*args)
38
38
  end
39
+
40
+ def method_missing(method, *args)
41
+ db.send(method, *args)
42
+ end
39
43
  end
40
44
  end
@@ -50,6 +50,7 @@ module Ganymed
50
50
  def flush
51
51
  datasources.each do |_, datasource|
52
52
  datasource.flush do |ns, origin, values|
53
+ next if values.empty?
53
54
  emit(ns, origin, values)
54
55
  end
55
56
  end
@@ -1,4 +1,4 @@
1
1
  module Ganymed
2
2
  # @private
3
- VERSION = '0.3.2'
3
+ VERSION = '0.3.3'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ganymed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-28 00:00:00.000000000 Z
12
+ date: 2012-07-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &10346400 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *10346400
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: eventmachine
27
- requirement: &10345340 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 0.12.10
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *10345340
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.12.10
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: ganymed-client
38
- requirement: &10344700 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 0.2.0
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *10344700
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.0
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: madvertise-ext
49
- requirement: &10343960 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: 0.1.2
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *10343960
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.1.2
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: madvertise-logging
60
- requirement: &10362800 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: 0.3.2
66
86
  type: :runtime
67
87
  prerelease: false
68
- version_requirements: *10362800
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 0.3.2
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: mixlib-cli
71
- requirement: &10362360 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :runtime
78
103
  prerelease: false
79
- version_requirements: *10362360
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: RubyInline
82
- requirement: &10361580 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :runtime
89
119
  prerelease: false
90
- version_requirements: *10361580
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: servolux
93
- requirement: &10361080 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,10 +133,15 @@ dependencies:
98
133
  version: '0'
99
134
  type: :runtime
100
135
  prerelease: false
101
- version_requirements: *10361080
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: msgpack
104
- requirement: &10383460 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
@@ -109,10 +149,15 @@ dependencies:
109
149
  version: '0'
110
150
  type: :runtime
111
151
  prerelease: false
112
- version_requirements: *10383460
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
113
158
  - !ruby/object:Gem::Dependency
114
159
  name: mongo
115
- requirement: &10381520 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
116
161
  none: false
117
162
  requirements:
118
163
  - - ! '>='
@@ -120,10 +165,15 @@ dependencies:
120
165
  version: '1.6'
121
166
  type: :runtime
122
167
  prerelease: false
123
- version_requirements: *10381520
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '1.6'
124
174
  - !ruby/object:Gem::Dependency
125
175
  name: em-websocket
126
- requirement: &10380040 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
127
177
  none: false
128
178
  requirements:
129
179
  - - ! '>='
@@ -131,10 +181,15 @@ dependencies:
131
181
  version: '0'
132
182
  type: :runtime
133
183
  prerelease: false
134
- version_requirements: *10380040
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
135
190
  - !ruby/object:Gem::Dependency
136
191
  name: yajl-ruby
137
- requirement: &10377140 !ruby/object:Gem::Requirement
192
+ requirement: !ruby/object:Gem::Requirement
138
193
  none: false
139
194
  requirements:
140
195
  - - ! '>='
@@ -142,10 +197,15 @@ dependencies:
142
197
  version: '0'
143
198
  type: :runtime
144
199
  prerelease: false
145
- version_requirements: *10377140
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
146
206
  - !ruby/object:Gem::Dependency
147
207
  name: sys-filesystem
148
- requirement: &10398540 !ruby/object:Gem::Requirement
208
+ requirement: !ruby/object:Gem::Requirement
149
209
  none: false
150
210
  requirements:
151
211
  - - ! '>='
@@ -153,10 +213,15 @@ dependencies:
153
213
  version: '0'
154
214
  type: :runtime
155
215
  prerelease: false
156
- version_requirements: *10398540
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
157
222
  - !ruby/object:Gem::Dependency
158
223
  name: ohai
159
- requirement: &10394740 !ruby/object:Gem::Requirement
224
+ requirement: !ruby/object:Gem::Requirement
160
225
  none: false
161
226
  requirements:
162
227
  - - ! '>='
@@ -164,12 +229,66 @@ dependencies:
164
229
  version: 0.6.12
165
230
  type: :runtime
166
231
  prerelease: false
167
- version_requirements: *10394740
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: 0.6.12
238
+ - !ruby/object:Gem::Dependency
239
+ name: ripl
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ! '>='
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ type: :runtime
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ! '>='
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ - !ruby/object:Gem::Dependency
255
+ name: ascii_charts
256
+ requirement: !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ! '>='
260
+ - !ruby/object:Gem::Version
261
+ version: '0'
262
+ type: :runtime
263
+ prerelease: false
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ! '>='
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
270
+ - !ruby/object:Gem::Dependency
271
+ name: terminal-table
272
+ requirement: !ruby/object:Gem::Requirement
273
+ none: false
274
+ requirements:
275
+ - - ! '>='
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ type: :runtime
279
+ prerelease: false
280
+ version_requirements: !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ! '>='
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
168
286
  description: Ganymed is an event collection daemon
169
287
  email:
170
288
  - bb@xnull.de
171
289
  executables:
172
290
  - ganymed
291
+ - ganymed-console
173
292
  extensions: []
174
293
  extra_rdoc_files: []
175
294
  files:
@@ -182,6 +301,7 @@ files:
182
301
  - README.md
183
302
  - Rakefile
184
303
  - bin/ganymed
304
+ - bin/ganymed-console
185
305
  - contrib/cpuhog
186
306
  - contrib/cpuhog.c
187
307
  - ganymed.gemspec
@@ -196,6 +316,7 @@ files:
196
316
  - lib/ganymed/collectors/process.rb
197
317
  - lib/ganymed/collectors/uptime.rb
198
318
  - lib/ganymed/config.yml
319
+ - lib/ganymed/console.rb
199
320
  - lib/ganymed/event.rb
200
321
  - lib/ganymed/ext/array.rb
201
322
  - lib/ganymed/master.rb
@@ -239,7 +360,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
239
360
  version: '0'
240
361
  segments:
241
362
  - 0
242
- hash: -2621061982868671869
363
+ hash: 1876738508877696512
243
364
  required_rubygems_version: !ruby/object:Gem::Requirement
244
365
  none: false
245
366
  requirements:
@@ -248,10 +369,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
369
  version: '0'
249
370
  segments:
250
371
  - 0
251
- hash: -2621061982868671869
372
+ hash: 1876738508877696512
252
373
  requirements: []
253
374
  rubyforge_project:
254
- rubygems_version: 1.8.17
375
+ rubygems_version: 1.8.24
255
376
  signing_key:
256
377
  specification_version: 3
257
378
  summary: Ganymed is an event collection daemon