lib/wackamole/models/mission.rb in wackamole-0.0.3 vs lib/wackamole/models/mission.rb in wackamole-0.0.4
- old
+ new
@@ -2,77 +2,61 @@
module Wackamole
class Mission
extend ::SingleForwardable
- def self.rollups_cltn() @rollups ||= Wackamole::Control.collection( 'rollups', 'wackamole_mdb', :strict => false ); end
-
- def_delegators :rollups_cltn, :find, :find_one
-
- # -------------------------------------------------------------------------
- # Allows user to clear out perf or fault state til the next tick...
- def self.reset!( app, env, type )
- rollups_cltn.update( { :app => app }, { '$set' => { "envs.#{env}.#{type}" => 0 } } )
+ # -----------------------------------------------------------------------
+ # Pick up moled application pulse
+ def self.pulse( last_tick )
+ to_date = count_logs
+ today = count_logs( last_tick, true )
+ last_tick = count_logs( last_tick )
+ { :to_date => to_date, :today => today, :last_tick => last_tick }
end
-
- # -------------------------------------------------------------------------
- # Clean up rollups. Check if mole_db is still around
- def self.clean_up!
- databases = Wackamole::Control.mole_databases
- con = Wackamole::Control.connection
- rollups = rollups_cltn.find( {} )
- delete_list = []
- rollups.each do |rollup|
- app = rollup['app']
- envs_info = rollup[envs].keys
- envs_info.each do |env|
- db_name = Wackamole::Control.to_mole_db( app, env )
- delete_list << env unless databases.include?( db_name )
- end
- # if app is no longer around blow away the rollup
- if delete_list.size == envs_info.size
- rollups_cltn.remove( { :_id => rollup['_id'] } )
- else
- delete_list.each do |env|
- rollup[envs].delete( env )
- end
- rollups_cltn.save( rollup, :safe => true ) unless delete_list.empty?
- end
+
+ # -----------------------------------------------------------------------
+ # generates mole logs conditons
+ def self.gen_conds( now, single_day )
+ conds = {}
+ if now
+ date_id = now.to_date_id.to_s
+ time_id = now.to_time_id
+ conds[:did] = date_id
+ conds[:tid] = {'$gte' => time_id} unless single_day
end
+ conds
end
- # -------------------------------------------------------------------------
- # Retrieve reports if any...
- # BOZO !! Handle case where report is no longer valid - ie no mole db
- def self.rollups( now, reset )
- clean_up!
- rollups = comb_applications( now, reset )
- rollups.each_pair do |app_name, env_info|
- env_info[envs].each_pair do |env, info|
- info.each_pair do |mole_type, count|
- rollup = rollups_cltn.find_one( { :app => app_name } )
- type_name = to_type_name( mole_type )
- if rollup
- rollup_info = rollup[envs]
- if rollup_info and rollup_info[env]
- (rollup_info[env][type_name] and !reset) ? rollup_info[env][type_name] += count : rollup_info[env][type_name] = count
- elsif rollup_info
- rollup_info[env] = { type_name => count }
- # else
- # rollup_info[envs] = { env => { type_name => count } }
- end
- rollups_cltn.save( rollup, :safe => true )
- else
- row = { :app => app_name, envs => { env => { type_name => count } } }
- rollups_cltn.insert( row, :safe => true )
- end
+ # -----------------------------------------------------------------------
+ # Compute mole counts for each moled apps
+ def self.count_logs( now=nil, single_day=false )
+ counts = {}
+ conds = gen_conds( now, single_day )
+ # elapsed = Benchmark.realtime do
+ Wackamole::Control.mole_databases.each do |db_name|
+ db = Wackamole::Control.db( db_name )
+ app_name, env = Wackamole::Control.extract_app_info( db_name )
+ logs_cltn = db['logs']
+
+ totals = { Rackamole.feature => 0, Rackamole.perf => 0, Rackamole.fault => 0 }
+ if counts[app_name]
+ counts[app_name][env] = totals
+ else
+ counts[app_name] = { env => totals }
end
+ row = counts[app_name][env]
+ [Rackamole.feature, Rackamole.perf, Rackamole.fault].each do |t|
+ conds[:typ] = t
+ logs = logs_cltn.find( conds, :fields => [:_id] )
+ row[t] = logs.count
+ end
end
- end
- find( {}, :sort => [ [:app, Mongo::ASCENDING], [:env, Mongo::ASCENDING] ] ).to_a
+ # end
+ # puts "Computing counts %d -- %5.4f" % [counts.size, elapsed]
+ counts
end
-
+
# =========================================================================
private
# -----------------------------------------------------------------------
# Map rackamole types to report types
@@ -85,80 +69,8 @@
when Rackamole.feature
"features"
else
raise "Invalid mole log type `#{type}"
end
- end
-
- # ---------------------------------------------------------------------------
- # Check moled apps status - reports any perf/excep that occurred since the
- # last check
- def self.comb_applications( now, reset )
- report = {}
- Wackamole::Control.mole_databases.each do |db_name|
- db = Wackamole::Control.db( db_name )
-
- app_name, env = Wackamole::Control.extract_app_info( db_name )
- totals = analyse_logs( db, now, reset )
-
- if report[app_name]
- report[app_name][envs][env] = totals
- else
- report[app_name] = { envs => { env => totals } }
- end
- end
- report
- end
-
- # -------------------------------------------------------------------------
- # Report on possible application issues
- def self.amend_report( report, app_name, env, log )
- type = log['typ']
-
- if report[app_name]
- env_info = report[app_name][envs]
- if env_info[env]
- env_info[env][type] ? env_info[env][type] += 1 : env_info[env][type] = 1
- else
- env_info[ env ] = { type => 1 }
- end
- else
- report[app_name] = { envs => { env => { type => 1 } } }
- end
- end
-
- # -------------------------------------------------------------------------
- # envs key
- def self.envs() @envs ||= 'envs'; end
-
- # -------------------------------------------------------------------------
- # computes counts for each mole types
- def self.analyse_logs( db, now, reset )
- check_types = [Rackamole.perf, Rackamole.fault, Rackamole.feature]
- date_id = now.to_date_id.to_s
- time_id = now.to_time_id
-
- if reset
- conds = {
- :did => date_id,
- :typ => { '$in' => check_types }
- }
- else
- conds = {
- :did => { '$gte' => date_id },
- :tid => { '$gte' => time_id },
- :typ => { '$in' => check_types }
- }
- end
-
- logs = db['logs'].find( conds, :fields => ['typ', 'rti', 'fault', 'fid'] )
- totals =
- {
- Rackamole.feature => 0,
- Rackamole.perf => 0,
- Rackamole.fault => 0
- }
- logs.each { |log| totals[log['typ']] += 1 }
- totals
end
end
end
\ No newline at end of file