wackamole 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -17,4 +17,11 @@
17
17
  * Add set_indexes script. Use to setup mole db indexes
18
18
 
19
19
  === 0.0.5 / 2010-02-08
20
- * Added debug
20
+ * Added debug
21
+
22
+ === 0.0.6 / 2010-02-08
23
+ * Bug fixes
24
+
25
+ === 0.0.7 /2010-02-21
26
+ * Added drilldown on dashboard
27
+ * Bug fixes and clean up
data/lib/app.rb CHANGED
@@ -46,7 +46,7 @@ configure do
46
46
  :server => "%s:%d/%s/%s" % ['localhost', '27017', 'wackamole_ses', 'sessions'],
47
47
  :log_level => :error
48
48
  end
49
- set :con, Wackamole::Control.init_config( default_config, Sinatra::Application.environment.to_s )
49
+ Wackamole::Control.init_config( default_config, Sinatra::Application.environment.to_s )
50
50
  end
51
51
 
52
52
  # -----------------------------------------------------------------------------
@@ -8,7 +8,7 @@ module Dashboard
8
8
  get '/dashboard/:app_name/:stage' do
9
9
  Wackamole::Control.switch_mole_db!( params[:app_name].downcase, params[:stage] )
10
10
 
11
- load_app_details
11
+ @info = Wackamole::MoledInfo.collect_dashboard_info( @updated_on )
12
12
 
13
13
  # Reset app info
14
14
  load_app_info
@@ -22,21 +22,29 @@ module Dashboard
22
22
  # ---------------------------------------------------------------------------
23
23
  # Refresh dashboard
24
24
  get '/dashboard/refresh' do
25
- load_app_details
25
+ @info = Wackamole::MoledInfo.collect_dashboard_info( @updated_on )
26
+
26
27
  erb :'dashboard/refresh_js', :layout => false
27
28
  end
28
-
29
+
29
30
  # ---------------------------------------------------------------------------
30
- get '/dashboard/logs/:app_name/:stage/:type' do
31
- Wackamole::Control.switch_mole_db!( params[:app_name].downcase, params[:stage] )
32
- load_app_details
33
- load_app_info
34
-
31
+ get '/dashboard/logs/:type/:hour/' do
32
+ # Reset filter
35
33
  filter = Wackamole::SearchFilter.new
36
34
  filter.mole_type( params[:type].to_i )
37
- puts "SETTING FILTER", filter.inspect
35
+ filter.hour = params[:hour].to_i
38
36
  session[:filter] = filter
37
+
39
38
  redirect '/logs/1'
40
39
  end
41
40
 
41
+ # ---------------------------------------------------------------------------
42
+ get '/dashboard/users/:hour/' do
43
+ # Reset filter
44
+ filter = Wackamole::SearchFilter.new
45
+ filter.hour = params[:hour].to_i
46
+ session[:filter] = filter
47
+
48
+ redirect '/users/1'
49
+ end
42
50
  end
@@ -3,10 +3,7 @@ module Features
3
3
  # ---------------------------------------------------------------------------
4
4
  # paginate top features
5
5
  get "/features/:page" do
6
- page = params[:page] ? params[:page].to_i : 1
7
-
8
- puts @filter.inspect
9
-
6
+ page = params[:page] ? params[:page].to_i : 1
10
7
  @features = Wackamole::Feature.paginate_tops( @filter.to_conds, page )
11
8
  @search_path = "/features/search"
12
9
  @filter_path = "/features/filter"
@@ -38,7 +35,6 @@ puts @filter.inspect
38
35
  post "/features/filter" do
39
36
  @filter.from_options( params[:filter] )
40
37
  session[:filter] = @filter
41
- puts "Setting #{session[:filter].inspect}"
42
38
  @features = Wackamole::Feature.paginate_tops( @filter.to_conds )
43
39
  erb :"features/filter.js", :layout => false
44
40
  end
@@ -21,7 +21,7 @@ module Logs
21
21
  @filter.search_terms = params[:search_filter][:search_terms]
22
22
  @logs = Wackamole::Log.paginate( @filter.to_conds )
23
23
  rescue => boom
24
- puts boom
24
+ # puts boom
25
25
  flash_it!( :error, boom )
26
26
  @logs = [].paginate
27
27
  end
@@ -43,16 +43,7 @@ module Logs
43
43
  @filter.from_options( params[:filter] )
44
44
  session[:filter] = @filter
45
45
 
46
- # elapsed = Benchmark.realtime do
47
- @logs = Wackamole::Log.paginate( @filter.to_conds )
48
- # end
49
- # puts "Filter logs %5.4f" % elapsed
50
-
51
- out = nil
52
- # elapsed = Benchmark.realtime do
53
- out = erb :"logs/filter.js", :layout => false
54
- # end
55
- # puts "Render logs %5.4f" % elapsed
56
- out
46
+ @logs = Wackamole::Log.paginate( @filter.to_conds )
47
+ erb :"logs/filter.js", :layout => false
57
48
  end
58
49
  end
@@ -26,6 +26,21 @@ module Mission
26
26
  erb :'/mission/refresh_js', :layout => false
27
27
  end
28
28
 
29
+ get '/mission/logs/:app_name/:stage/:type' do
30
+ Wackamole::Control.switch_mole_db!( params[:app_name].downcase, params[:stage] )
31
+
32
+ # Set app info
33
+ @app_info = Wackamole::Feature.get_app_info
34
+ session[:app_info] = @app_info
35
+
36
+ # Reset filter
37
+ filter = Wackamole::SearchFilter.new
38
+ filter.mole_type( params[:type].to_i )
39
+ session[:filter] = filter
40
+
41
+ redirect '/logs/1'
42
+ end
43
+
29
44
  # # ---------------------------------------------------------------------------
30
45
  # get '/mission/fixed/:app/:env/:type' do
31
46
  # Wackamole::Mission.reset!( params[:app], params[:env], params[:type] )
@@ -4,12 +4,7 @@ module Users
4
4
  # Paginate top users
5
5
  get "/users/:page" do
6
6
  page = params[:page] ? params[:page].to_i : 1
7
-
8
- puts "User filter", @filter.inspect
9
- elapsed = Benchmark.realtime do
10
- @users = Wackamole::User.paginate_tops( @filter.to_conds, page )
11
- end
12
- puts "Find users %5.4f" % elapsed
7
+ @users = Wackamole::User.paginate_tops( @filter.to_conds, page )
13
8
 
14
9
  @search_path = "/users/search"
15
10
  @filter_path = "/users/filter"
@@ -41,7 +36,6 @@ puts "Find users %5.4f" % elapsed
41
36
  post "/users/filter" do
42
37
  @filter.from_options( params[:filter] )
43
38
  session[:filter] = @filter
44
- puts "Setting user filter #{session[:filter].inspect}"
45
39
  @users = Wackamole::User.paginate_tops( @filter.to_conds )
46
40
  erb :"users/filter.js", :layout => false
47
41
  end
@@ -15,10 +15,7 @@ module MissionHelper
15
15
  last_tick = last_tick || Chronic.parse( '1 minute ago' )
16
16
  session[:last_tick] = Time.now
17
17
 
18
- elapsed = Benchmark.realtime do
19
- @reports = Wackamole::Mission.rollups( last_tick.utc, reset )
20
- end
21
- puts "Rollups %5.4f" % elapsed
18
+ @reports = Wackamole::Mission.rollups( last_tick.utc, reset )
22
19
  end
23
20
 
24
21
  # -------------------------------------------------------------------------
@@ -31,27 +31,25 @@ module Wackamole
31
31
  def self.count_logs( now=nil, single_day=false )
32
32
  counts = {}
33
33
  conds = gen_conds( now, single_day )
34
- # elapsed = Benchmark.realtime do
35
- Wackamole::Control.mole_databases.each do |db_name|
36
- db = Wackamole::Control.db( db_name )
37
- app_name, env = Wackamole::Control.extract_app_info( db_name )
38
- logs_cltn = db['logs']
39
-
40
- totals = { Rackamole.feature => 0, Rackamole.perf => 0, Rackamole.fault => 0 }
41
- if counts[app_name]
42
- counts[app_name][env] = totals
43
- else
44
- counts[app_name] = { env => totals }
45
- end
46
- row = counts[app_name][env]
47
- [Rackamole.feature, Rackamole.perf, Rackamole.fault].each do |t|
48
- conds[:typ] = t
49
- logs = logs_cltn.find( conds, :fields => [:_id] )
50
- row[t] = logs.count
51
- end
34
+
35
+ Wackamole::Control.mole_databases.each do |db_name|
36
+ db = Wackamole::Control.db( db_name )
37
+ app_name, env = Wackamole::Control.extract_app_info( db_name )
38
+ logs_cltn = db['logs']
39
+
40
+ totals = { Rackamole.feature => 0, Rackamole.perf => 0, Rackamole.fault => 0 }
41
+ if counts[app_name]
42
+ counts[app_name][env] = totals
43
+ else
44
+ counts[app_name] = { env => totals }
52
45
  end
53
- # end
54
- # puts "Computing counts %d -- %5.4f" % [counts.size, elapsed]
46
+ row = counts[app_name][env]
47
+ [Rackamole.feature, Rackamole.perf, Rackamole.fault].each do |t|
48
+ conds[:typ] = t
49
+ logs = logs_cltn.find( conds, :fields => [:_id] )
50
+ row[t] = logs.count
51
+ end
52
+ end
55
53
  counts
56
54
  end
57
55
 
@@ -12,52 +12,40 @@ module Wackamole
12
12
  # TODO - PERF - try just using cursor vs to_a
13
13
  def self.collect_dashboard_info( now )
14
14
  info = {}
15
- day_logs = logs_cltn.find( { :did => now.to_date_id.to_s },
16
- :fields => [:typ, :fid, :tid, :did, :uid],
17
- :sort => [ [:tid => Mongo::ASCENDING] ] ).to_a
15
+
16
+ info[:total_users] = users_cltn.count
17
+ info[:total_features] = features_cltn.count
18
+ info[:perf_load] = 0
19
+ info[:fault_load] = 0
18
20
 
19
- # Fetch user count for this hour
20
- users = day_logs.inject( Set.new ) do |set,log|
21
- set << log['uid'] if log['tid'] =~ /^#{"%02d" % now.hour}/
22
- set
23
- end
24
- info[:total_users] = users_cltn.count
25
- info[:user_load] = users.size
21
+ # Fetch day logs
22
+ day_logs = logs_cltn.find( { :did => now.utc.to_date_id.to_s },
23
+ :fields => [:typ, :fid, :tid, :did, :uid],
24
+ :sort => [ [:tid => Mongo::ASCENDING] ] )
26
25
 
27
- # Fetch features for this hour
28
- features = day_logs.inject( Set.new ) do |set,log|
29
- set << log['fid'].to_s if log['tid'] =~ /^#{"%02d" % now.hour}/
30
- set
31
- end
32
- info[:total_features] = features_cltn.count
33
- info[:feature_load] = features.size
34
-
35
- info[:perf_load] = day_logs.inject(0) do |count,log|
36
- if log['tid'] =~ /^#{"%02d" % now.hour}/
37
- count += (log['typ'] == Rackamole.perf ? 1 : 0 )
38
- end
39
- count
40
- end
41
- info[:fault_load] = day_logs.inject(0) do |count,log|
42
- if log['tid'] =~ /^#{"%02d" % now.hour}/
43
- count += (log['typ'] == Rackamole.fault ? 1 : 0 )
44
- end
45
- count
46
- end
47
-
48
26
  # Count all logs per hourly time period
27
+ users = Set.new
28
+ features = Set.new
29
+ local_time = now.clone.localtime
49
30
  hours = (0...24).to_a
50
31
  hour_info = hours.inject(OrderedHash.new) { |res,hour| res[hour] = { :user => 0, :feature => 0, :perf => 0, :fault => 0 };res }
51
32
  user_per_hour = {}
52
33
  day_logs.each do |log|
53
34
  date_tokens = log['did'].match( /(\d{4})(\d{2})(\d{2})/ ).captures
54
- time_tokens = log['tid'].match( /(\d{2})(\d{2})(\d{2})/ ).captures
55
-
56
- utc = Time.utc( date_tokens[0], date_tokens[1], date_tokens[2], time_tokens[0], time_tokens[1], time_tokens[2] )
57
- local = utc.localtime
35
+ time_tokens = log['tid'].match( /(\d{2})(\d{2})(\d{2})/ ).captures
36
+ log_utc = Time.utc( date_tokens[0], date_tokens[1], date_tokens[2], time_tokens[0], time_tokens[1], time_tokens[2] )
37
+ local = log_utc.clone.localtime
58
38
  hour = local.hour
59
- current_day = local.day
60
- next if local.day != current_day
39
+
40
+ next if hour > local_time.hour
41
+
42
+ if log_utc.hour == now.hour
43
+ users << log['uid']
44
+ features << log['fid']
45
+ info[:fault_load] += 1 if log['typ'] == Rackamole.fault
46
+ info[:perf_load] += 1 if log['typ'] == Rackamole.perf
47
+ end
48
+
61
49
  if user_per_hour[hour]
62
50
  unless user_per_hour[hour].include? log['uid']
63
51
  hour_info[hour][:user] += 1
@@ -68,33 +56,22 @@ module Wackamole
68
56
  hour_info[hour][:user] += 1
69
57
  end
70
58
  case log['typ']
71
- when Rackamole.feature : hour_info[hour][:feature] += 1 if features.add?( log['fid'])
59
+ when Rackamole.feature : hour_info[hour][:feature] += 1
72
60
  when Rackamole.perf : hour_info[hour][:perf] += 1
73
61
  when Rackamole.fault : hour_info[hour][:fault] += 1
74
62
  end
75
63
  end
76
-
77
- # BOZO !! LAME ASS...
78
- info[:user_series] = []
79
- info[:fault_series] = []
80
- info[:perf_series] = []
81
- info[:feature_series] = []
82
- hour_info.values.map do |hash|
83
- info[:user_series] << hash[:user]
84
- info[:fault_series] << hash[:fault]
85
- info[:perf_series] << hash[:perf]
86
- info[:feature_series] << hash[:feature]
64
+
65
+ info[:user_load] = users.size
66
+ info[:feature_load] = features.size
67
+ %w(user fault perf feature).each do |s|
68
+ k = "#{s}_series".to_sym
69
+ info[k] = []
70
+ hour_info.values.map do |hash|
71
+ info[k] << hash[s.to_sym]
72
+ end
87
73
  end
88
74
  info
89
- end
90
-
91
- # ===========================================================================
92
- private
93
-
94
- # -------------------------------------------------------------------------
95
- # Makes sure we have some indexes set
96
- # BOZO !! Create script to set these up ?
97
- def self.ensure_indexes
98
- end
75
+ end
99
76
  end
100
77
  end
@@ -3,7 +3,7 @@ require 'chronic'
3
3
  module Wackamole
4
4
  class SearchFilter
5
5
 
6
- attr_accessor :time_frame, :feature_id, :type, :browser_type, :search_terms
6
+ attr_accessor :time_frame, :feature_id, :type, :browser_type, :search_terms, :hour
7
7
 
8
8
  # ---------------------------------------------------------------------------
9
9
  # Ctor
@@ -18,6 +18,7 @@ module Wackamole
18
18
  @time_frame = SearchFilter.time_frames.first
19
19
  @browser_type = SearchFilter.browser_types.first
20
20
  @type = SearchFilter.mole_types.first
21
+ @hour = SearchFilter.hourlies.first
21
22
  @search_terms = ""
22
23
  end
23
24
 
@@ -33,6 +34,12 @@ module Wackamole
33
34
  @time_frames ||= ['today', '2 days', '1 week', '2 weeks', '1 month', '3 months', '6 months', '1 year' ]
34
35
  end
35
36
 
37
+ # ---------------------------------------------------------------------------
38
+ # Available hours
39
+ def self.hourlies
40
+ @hourlies ||= ['all'] + (1..23).to_a
41
+ end
42
+
36
43
  # ---------------------------------------------------------------------------
37
44
  # Collection of mole types
38
45
  def self.mole_types
@@ -107,7 +114,6 @@ module Wackamole
107
114
  def from_options( options )
108
115
  return unless options
109
116
  options.each_pair do |k,v|
110
- # value = k.index( /_id$/) ? v.to_i : v
111
117
  self.send( "#{k}=", v )
112
118
  end
113
119
  end
@@ -135,6 +141,13 @@ module Wackamole
135
141
  time = Chronic.parse( time_frame + ( time_frame == SearchFilter.time_frames.first ? "" : " ago" ) )
136
142
  conds[:did] = { '$gte' => time.to_date_id.to_s }
137
143
 
144
+ unless self.hour == 'all'
145
+ now = Time.now
146
+ current = "%4d/%02d/%02d %02d:%02d:%02d" % [now.year, now.month, now.day, self.hour, 0, 0]
147
+ time = Chronic.parse( current ).utc
148
+ conds[:tid] = /^#{"%02d"%time.hour}.+/
149
+ end
150
+
138
151
  unless search_terms.empty?
139
152
  tokens = search_terms.split( ":" ).collect{ |c| c.strip }
140
153
  key = tokens.shift
data/lib/wackamole.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Wackamole
2
2
 
3
3
  # :stopdoc:
4
- VERSION = '0.0.6' unless defined? Wackamole::VERSION
4
+ VERSION = '0.0.7' unless defined? Wackamole::VERSION
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR unless defined? Wackamole::LIBPATH
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR unless defined? Wackamole::PATH
7
7
  # :startdoc:
@@ -17,12 +17,53 @@ function truncate(str, limit)
17
17
  return bits.join('');
18
18
  }
19
19
 
20
-
21
- function blee( url )
20
+ // Graphs...
21
+ function gen_load( name, value, total )
22
22
  {
23
- if( url == "/explore")
24
- window.location = url;
25
- else
26
- $.ajax( {url: url, dataType: 'script', method: 'GET'} );
27
- return false;
23
+ var p = Raphael( name, 300, 20 );
24
+ var range = Math.ceil( ((value/total)*100)/10 );
25
+ var x = 2;
26
+ var y = 2;
27
+ var spacer = 5;
28
+
29
+ for( var i=1; i <= range; i++ )
30
+ {
31
+ var l = p.rect( x, y, 10, 16, 2 );
32
+ l.attr( 'fill', 'green' );
33
+ l.attr( 'gradient', '45-#0f0-#fff' );
34
+ l.attr( 'stroke-width', 0 );
35
+ x += 10 + spacer;
36
+
37
+ }
38
+ var text = p.text( 230, 10, Math.ceil((value/total)*100) + '% (' + value + " of " + total + ')' );
39
+ text.attr( 'fill' , '#434343' );
40
+ text.attr( 'font-size', 15 );
28
41
  }
42
+
43
+ function gen_heat_map( url, id, series, symbol, xs, ys, axisx, axisy )
44
+ {
45
+ var r = Raphael( id );
46
+ var urls = [];
47
+
48
+ for( hour in xs ) {
49
+ var u = url + hour + "/";
50
+ urls[hour] = u;
51
+ }
52
+
53
+ var chart = r.g.dotchart(0, -10, 620, 60, xs, ys, series, {href: urls, symbol: symbol, max: 10, heat: true, axis: "0 0 1 0", axisxstep: 23, axisystep: 1, axisxlabels: axisx, axisxtype: " ", axisytype: " ", axisylabels: axisy})
54
+
55
+ chart.hover( function () {
56
+ this.tag = this.tag || r.g.tag(this.x, this.y, this.value, 0, this.r + 2).insertBefore(this);
57
+ this.tag.show();
58
+ },
59
+ function () {
60
+ this.tag && this.tag.hide();
61
+ }
62
+ );
63
+
64
+ chart.click( function() {
65
+ // this.tag = this.tag || r.g.tag(this.x, this.y, this.value, 0, this.r + 2).insertBefore(this);
66
+ // console.log( "Clicked url " + this.href );
67
+ // return false;
68
+ })
69
+ }
@@ -549,16 +549,16 @@ ul#summary li p{
549
549
 
550
550
 
551
551
  p#perfs {
552
- background: transparent url(/images/perf_small.png) no-repeat 2px 2px;
552
+ background: transparent url(/images/perf_small.png) no-repeat 1px 2px;
553
553
  }
554
554
  p#faults {
555
- background: transparent url(/images/fault_small.png) no-repeat 2px 2px;
555
+ background: transparent url(/images/fault_small.png) no-repeat 1px 2px;
556
556
  }
557
557
  p#users {
558
- background: transparent url(/images/users.png) no-repeat 2px 2px;
558
+ background: transparent url(/images/users.png) no-repeat 1px 2px;
559
559
  }
560
560
  p#features {
561
- background: transparent url(/images/feature.png) no-repeat 2px 2px;
561
+ background: transparent url(/images/feature.png) no-repeat 1px 2px;
562
562
  }
563
563
 
564
564
  div.section ul li p.result {
@@ -6,7 +6,7 @@ describe Wackamole::MoledInfo do
6
6
  Wackamole::Control.init_config( File.join(File.dirname(__FILE__), %w[.. config test.yml]), 'test' )
7
7
  Wackamole::Control.connection.should_not be_nil
8
8
  Wackamole::Control.db( "mole_fred_test_mdb" )
9
- @test_time = Chronic.parse( "2010/01/01 01:00:00" ).utc
9
+ @test_time = Chronic.parse( "2010/01/01 01:00:00" )
10
10
  end
11
11
 
12
12
  it "should gather dashboard info correctly" do
@@ -10,11 +10,23 @@
10
10
  <div id="feature_load" class="load"></div>
11
11
  <li>
12
12
  <p class="status">Performance</p>
13
- <p class="result"><%=pluralize( @info[:perf_load], 'issue' )%></p>
13
+ <p class="result">
14
+ <% if @info[:perf_load] > 0 %>
15
+ <%= link_to pluralize( @info[:perf_load], 'issue' ), "/dashboard/logs/#{Rackamole.perf}/", :class => "site_link" %>
16
+ <% else %>
17
+ <%=pluralize( @info[:perf_load], 'issue' )%>
18
+ <% end %>
19
+ </p>
14
20
  </li>
15
21
  <li>
16
22
  <p class="status">Uncaught Exceptions</p>
17
- <p class="result"><%=pluralize( @info[:fault_load], 'issue' )%></p>
23
+ <p class="result">
24
+ <% if @info[:fault_load] > 0 %>
25
+ <%= link_to pluralize( @info[:fault_load], 'issue' ), "/dashboard/logs/#{Rackamole.fault}/", :class => "site_link" %>
26
+ <% else %>
27
+ <%=pluralize( @info[:fault_load], 'issue' )%>
28
+ <% end %>
29
+ </p>
18
30
  </li>
19
31
  </ul>
20
32
  </div>
@@ -47,72 +59,43 @@
47
59
  <% end %>
48
60
  </li>
49
61
  <li>
50
- <p id="features">Features</p>
62
+ <p id="features">Logs</p>
51
63
  <% unless zeroed_series?( @info[:feature_series] ) %>
52
64
  <div class="heat" id="svg_features"></div>
53
65
  <% else %>
54
- <p class="no_report">No Features reported.</p>
66
+ <p class="no_report">No Logs reported.</p>
55
67
  <% end %>
56
68
  </li>
57
69
  </ul>
58
70
  </div>
59
71
 
60
- <script>
61
- function gen_load( name, value, total )
62
- {
63
- var p = Raphael( name, 300, 20 );
64
- var range = Math.ceil( ((value/total)*100)/10 );
65
- var x = 2;
66
- var y = 2;
67
- var spacer = 5;
68
-
69
- for( var i=1; i <= range; i++ )
70
- {
71
- var l = p.rect( x, y, 10, 16, 2 );
72
- l.attr( 'fill', 'green' );
73
- l.attr( 'gradient', '45-#0f0-#fff' );
74
- l.attr( 'stroke-width', 0 );
75
- x += 10 + spacer;
76
-
77
- }
78
- var text = p.text( 230, 10, Math.ceil((value/total)*100) + '% (' + value + " of " + total + ')' );
79
- text.attr( 'fill' , '#434343' );
80
- text.attr( 'font-size', 15 );
81
- }
82
-
83
- function gen_heat_map( id, series, symbol )
84
- {
85
- var r = Raphael( id ),
86
- xs = <%= (0..23).to_a.to_json %>,
72
+ <script>
73
+ $( function() {
74
+ $('a.dash').addClass( 'current' );
75
+
76
+ var xs = <%= (0..23).to_a.to_json %>,
87
77
  ys = <%= y = [];24.times{ y << 1 };y.to_json %>,
88
78
  axisy = <%= %w[Mon].to_json %>,
89
79
  axisx = <%= %w[12am 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11].to_json %>;
90
-
91
- r.g.dotchart(0, -10, 620, 60, xs, ys, series, {symbol: symbol, max: 10, heat: true, axis: "0 0 1 0", axisxstep: 23, axisystep: 1, axisxlabels: axisx, axisxtype: " ", axisytype: " ", axisylabels: axisy}).hover(function () {
92
- this.tag = this.tag || r.g.tag(this.x, this.y, this.value, 0, this.r + 2).insertBefore(this);
93
- this.tag.show();
94
- }, function () {
95
- this.tag && this.tag.hide();
96
- });
97
- }
98
-
99
- $( function() {
100
- $('a.dash').addClass( 'current' );
101
80
 
102
81
  gen_load( 'user_load' , <%=@info[:user_load]%>, <%=@info[:total_users]%> );
103
82
  gen_load( 'feature_load', <%=@info[:feature_load]%>, <%=@info[:total_features]%> );
104
-
83
+
105
84
  <% unless zeroed_series?( @info[:fault_series] ) %>
106
- gen_heat_map( 'svg_faults' , <%=@info[:fault_series].to_json%> , 'cross' );
85
+ var url = "/dashboard/logs/<%=Rackamole.fault%>/";
86
+ gen_heat_map( url, 'svg_faults', <%=@info[:fault_series].to_json%>, 'cross' , xs, ys, axisx, axisy );
107
87
  <% end %>
108
88
  <% unless zeroed_series?( @info[:perf_series] ) %>
109
- gen_heat_map( 'svg_perf' , <%=@info[:perf_series].to_json%> , 'diamond' );
89
+ var url = "/dashboard/logs/<%=Rackamole.perf%>/";
90
+ gen_heat_map( url, 'svg_perf', <%=@info[:perf_series].to_json%>, 'diamond', xs, ys, axisx, axisy );
110
91
  <% end %>
111
92
  <% unless zeroed_series?( @info[:user_series] ) %>
112
- gen_heat_map( 'svg_users' , <%=@info[:user_series].to_json%> , 'disc' );
93
+ var url = "/dashboard/users/";
94
+ gen_heat_map( url, 'svg_users', <%=@info[:user_series].to_json%>, 'disc', xs, ys, axisx, axisy );
113
95
  <% end %>
114
- <% unless zeroed_series?( @info[:user_series] ) %>
115
- gen_heat_map( 'svg_features', <%=@info[:feature_series].to_json%>, 'flower' );
96
+ <% unless zeroed_series?( @info[:feature_series] ) %>
97
+ var url = "/dashboard/logs/<%=Rackamole.feature%>/";
98
+ gen_heat_map( url, 'svg_features', <%=@info[:feature_series].to_json%>, 'flower', xs, ys, axisx, axisy );
116
99
  <% end %>
117
100
  });
118
101
  </script>
@@ -1,4 +1,4 @@
1
- <%= javascripts %w[raphael.min g.raphael.min g.dot.min] %>
1
+ <%= javascripts %w[application raphael.min g.raphael.min g.dot.min] %>
2
2
 
3
3
  <div id="dash">
4
4
  <%= partial :'dashboard/report' %>
@@ -1,3 +1,4 @@
1
- $('p#timestamp').html( "<%=escape_javascript(partial(:'shared/timestamp'))%>" );
1
+ $('span#timestamp').html( "<%=escape_javascript(partial(:'shared/timestamp'))%>" );
2
+ $("span#timestamp").effect( 'pulsate', { times:1 }, 500 );
2
3
 
3
4
  $('div#dash').html( "<%=escape_javascript(partial(:'dashboard/report'))%>" );
@@ -28,7 +28,7 @@ table#mission tr.div {
28
28
  <th width="25%">application</th>
29
29
  <th width="10%">environment</th>
30
30
  <th width="20%">to date</th>
31
- <th width="20%">today</th>
31
+ <th width="20%">24 hours</th>
32
32
  <th width="20%">last tick</th>
33
33
  </tr>
34
34
  </thead>
@@ -48,7 +48,7 @@ table#mission tr.div {
48
48
  <% clazz = ( (count > 0 and %w(last_tick today).include?(period)) ? assign_class( type, count ) : nil) %>
49
49
  <td width="25px">
50
50
  <% if( %w(last_tick today).include?( period ) and count > 0 ) %>
51
- <%= link_to Wackamole::Mission.to_type_name(type), "/dashboard/logs/#{app_name}/#{env}/#{type}", :class => "site_link" %>:
51
+ <%= link_to Wackamole::Mission.to_type_name(type), "/mission/logs/#{app_name}/#{env}/#{type}", :class => "site_link" %>:
52
52
  <% else %>
53
53
  <%=Wackamole::Mission.to_type_name(type)%>:
54
54
  <% end %>
@@ -1,5 +1,13 @@
1
1
  <div id="filters" class="corners">
2
2
  <form id="filter_form">
3
+ <fieldset id="submit">
4
+ <label>
5
+ &nbsp;
6
+ <input type="submit" name="commit" value="Filter"/>
7
+ <%= image_tag 'loading.gif', :border => '0', :size => '24x24', :id => 'loading' %>
8
+ </label>
9
+ </fieldset>
10
+
3
11
  <fieldset class="inline">
4
12
  <label for="time_frame">
5
13
  Time range:
@@ -9,6 +17,15 @@
9
17
  </label>
10
18
  </fieldset>
11
19
 
20
+ <fieldset class="inline">
21
+ <label for="hourly_frame">
22
+ Hour of Day:
23
+ <select id="hourly_frame" name="filter[hour]">
24
+ <%= options_for_select Wackamole::SearchFilter.hourlies, @filter.hour %>
25
+ </select>
26
+ </label>
27
+ </fieldset>
28
+
12
29
  <fieldset class="inline">
13
30
  <label for="type">
14
31
  Type:
@@ -35,13 +52,6 @@
35
52
  </select>
36
53
  </label>
37
54
  </fieldset>
38
- <fieldset id="submit">
39
- <label>
40
- &nbsp;
41
- <input type="submit" name="commit" value="Filter"/>
42
- <%= image_tag 'loading.gif', :border => '0', :size => '24x24', :id => 'loading' %>
43
- </label>
44
- </fieldset>
45
55
  </form>
46
56
  </div>
47
57
 
@@ -1 +1 @@
1
- <%= @updated_on.strftime( "%m/%d/%y %H:%M:%S") %>
1
+ <%= @updated_on.clone.localtime.strftime( "%m/%d/%y %H:%M:%S") %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wackamole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fernand Galiana
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-08 00:00:00 -07:00
12
+ date: 2010-02-21 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency