ganymed 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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