mongodb_logger 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -103,7 +103,7 @@ It:
103
103
 
104
104
  Now you can see web interface by url "http://localhost:3000/mongodb"
105
105
 
106
- If you've installed Resque as a gem and want running the front end without Rails application, you can do it by this command:
106
+ If you've installed MongodbLogger as a gem and want running the front end without Rails application, you can do it by this command:
107
107
 
108
108
  mongodb_logger_web config.yml
109
109
 
data/Rakefile CHANGED
@@ -71,6 +71,9 @@ end
71
71
  GEM_ROOT = File.dirname(__FILE__).freeze
72
72
  LOCAL_GEM_ROOT = File.join(GEM_ROOT, 'tmp', 'local_gems').freeze
73
73
  RAILS_VERSIONS = IO.read('SUPPORTED_RAILS_VERSIONS').strip.split("\n")
74
+ # for ci testing only major rails versions
75
+ RAILS_VERSIONS = ['3.0.11', '3.1.3'] if ENV['CI']
76
+
74
77
  LOCAL_GEMS = [['sqlite3', nil], ['shoulda', nil], ["rspec", nil], ["mocha", nil], ["cucumber", nil], ["bundler", "1.0.21"]] +
75
78
  RAILS_VERSIONS.collect { |version| ['rails', version] }
76
79
 
@@ -79,12 +79,6 @@ MongodbLoggerJS =
79
79
  $(event.target).parents('li').remove()
80
80
  return false
81
81
 
82
- $('div.filter_values input').datepicker
83
- dateFormat: "yy-mm-dd"
84
- changeMonth: true
85
- changeYear: true
86
- yearRange: 'c-50:c+10'
87
-
88
82
  # message tabs
89
83
  $(document).on 'click', 'li.message_tab', (event) =>
90
84
  elm_obj = $(event.target)
@@ -94,6 +88,13 @@ MongodbLoggerJS =
94
88
  $('pre.tab_content').addClass('hidden')
95
89
  elm_obj.addClass('active')
96
90
  $('.' + tab).removeClass('hidden')
91
+
92
+ $(document).on 'submit', '#analyticForm', (event) =>
93
+ element = $('#analyticForm')
94
+ url = element.attr('action')
95
+ data = element.serializeArray()
96
+ $('#analyticData').load url, data
97
+ return false
97
98
 
98
99
  # init pjax
99
100
  this.init_pjax()
@@ -117,6 +118,12 @@ MongodbLoggerJS =
117
118
  # code highlight
118
119
  $('pre code').each (i, e) ->
119
120
  hljs.highlightBlock(e, ' ')
121
+
122
+ $( ".datepicker, .filter_values input.date" ).datepicker
123
+ dateFormat: "yy-mm-dd"
124
+ changeMonth: true
125
+ changeYear: true
126
+ yearRange: 'c-50:c+10'
120
127
 
121
128
  # log info window
122
129
  if $("#log_info").length > 0
@@ -0,0 +1,82 @@
1
+ module MongodbLogger
2
+ module ServerModel
3
+ class Analytic
4
+
5
+ FIXED_PARAMS_ON_FORM = ['type', 'start_date', 'end_date']
6
+ ANALYTIC_TYPES = [[0, "Count of requests"], [1, "Count of errors"]]
7
+ ANALYTIC_HEADERS = [
8
+ {
9
+ :key => ["year", "month", "day"],
10
+ :value => ["count"]
11
+ },
12
+ {
13
+ :key => ["year", "month", "day"],
14
+ :value => ["count"]
15
+ }
16
+ ]
17
+ attr_reader :params, :collection
18
+ FORM_NAME = "analytic"
19
+
20
+
21
+ def initialize(collection, params)
22
+ FIXED_PARAMS_ON_FORM.each do |key|
23
+ create_variable(key, nil)
24
+ end
25
+ @collection = collection
26
+ @params = params
27
+ @params.each do |k,v|
28
+ self.send("#{k}=", v) if self.respond_to?(k) && v && !v.blank?
29
+ end unless @params.blank?
30
+
31
+ # def values
32
+ self.start_date ||= Time.now.strftime('%Y-%m-%d')
33
+ self.end_date ||= Time.now.strftime('%Y-%m-%d')
34
+ end
35
+
36
+ def create_variable(k, v)
37
+ self.instance_variable_set("@#{k}", v) ## create instance variable
38
+ self.class.send(:define_method, k, proc{self.instance_variable_get("@#{k}")}) ## method to return instance variable
39
+ self.class.send(:define_method, "#{k}=", proc{|v| self.instance_variable_set("@#{k}", v)}) ## method to set instance variable
40
+ end
41
+
42
+ def form_name
43
+ FORM_NAME
44
+ end
45
+
46
+ def count_of_requests(conditions, is_errors = false)
47
+ collection_name = "mongodb_logger_count_of_requests"
48
+ map = "function() { var key = {year: this.request_time.getFullYear(), month: this.request_time.getMonth(), day: this.request_time.getDate()}; emit(key, {count: 1});}"
49
+ reduce_count = "function(key, values) { var sum = 0; values.forEach(function(f) { sum += f.count; }); return {count: sum};}"
50
+ if is_errors
51
+ collection_name = "mongodb_logger_count_of_errors"
52
+ conditions.merge!({:is_exception => true})
53
+ end
54
+ @collection.map_reduce(map, reduce_count, {:out => collection_name, :query => conditions, :sort => ['$natural', -1]})
55
+ end
56
+
57
+ def get_data
58
+ m_start= Date.parse(self.start_date) rescue nil
59
+ m_start = Date.today if m_start.nil?
60
+ m_end = Date.parse(self.end_date) rescue nil
61
+ m_end = Date.today if m_end.nil?
62
+
63
+ conditions = { :request_time => {
64
+ '$gte' => Time.utc(m_start.year, m_start.month, m_start.day, 0, 0, 0),
65
+ '$lte' => Time.utc(m_end.year, m_end.month, m_end.day, 23, 59, 59)
66
+ }}
67
+
68
+ mapreduce_collection = case self.type.to_i
69
+ when 0
70
+ count_of_requests(conditions)
71
+ when 1
72
+ count_of_requests(conditions, true)
73
+ else
74
+ count_of_requests(conditions)
75
+ end
76
+
77
+ {:data => mapreduce_collection.find(), :headers => ANALYTIC_HEADERS[self.type.to_i]}
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -1 +1 @@
1
- ((function(){var a;$(function(){return a.init()}),a={tail_logs_url:null,tail_log_started:!1,log_info_offset:null,log_info_padding:15,init:function(){var b=this;return $(document).ajaxStart(function(){return $("#ajax_loader").show()}),$(document).ajaxStop(function(){return $("#ajax_loader").hide()}),$(document).on("click","#tail_logs_link",function(b){return a.tail_logs_url=$(b.target).attr("data-url"),$("#tail_logs_block").addClass("started"),a.tail_logs(null),!1}),$(document).on("click","#tail_logs_stop_link",function(b){return a.tail_log_started=!1,$("#tail_logs_block").removeClass("started"),!1}),$(document).on("click",".log_info",function(a){var b,c;return b=$(a.target),c=b.attr("data-url"),c==null&&(c=b.parents("tr").attr("data-url")),c!=null&&(b.parents("table").find("tr").removeClass("current"),b.parents("tr").addClass("current"),$("#log_info").load(c)),!1}),$(document).on("click","div.filter-toggle",function(a){return $("div.filter").slideToggle(),$("div.filter-toggle span.arrow-down").toggleClass("rotate")}),$(document).on("click","#add_more_filter",function(a){var b;return b=$(a.target).attr("href"),$.ajax({url:b,success:function(a){var b;return b=$("<li></li>").html(a),$("#more_filter_list").append(b)}}),!1}),$(document).on("change","select.filter_type",function(a){var b,c;return b=$(a.target),c=b.attr("rel")+"/"+b.val(),$.ajax({url:c,dataType:"json",success:function(a){var c,d,e=this;c="",d="",$.each(a.conditions,function(a,b){return c+='<option value="'+b+'">'+b+"</option>"}),b.parents("div.filter_block").find("select.filter_conditions").empty().append(c),a.values.length>0?(d='<select id="filter[more][]_value" name="filter[more][][value]">',$.each(a.values,function(a,b){return d+='<option value="'+b+'">'+b+"</option>"}),d+="</select>"):d='<input type="text" name="filter[more][][value]" value="" placeholder="value">',b.parents("div.filter_block").find("div.filter_values").html(d);if("date"===b.val())return b.parents("div.filter_block").find("div.filter_values input").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"})}}),!1}),$(document).on("click",".close_more_filter",function(a){return $(a.target).parents("li").remove(),!1}),$("div.filter_values input").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"}),$(document).on("click","li.message_tab",function(a){var b,c;b=$(a.target),c=b.attr("data-tab");if(c!=null)return $("li.message_tab").removeClass("active"),$("pre.tab_content").addClass("hidden"),b.addClass("active"),$("."+c).removeClass("hidden")}),this.init_pjax(),this.init_on_pages()},init_pjax:function(){var b=this;return $("a[data-pjax]").pjax(),$("body").bind("pjax:start",function(){return $("#ajax_loader").show()}),$("body").bind("pjax:end",function(){return $("#ajax_loader").hide(),a.tail_log_started=!1,$(window).scrollTop()>100&&$("html, body").stop().animate({scrollTop:0},"slow"),a.init_on_pages()})},init_on_pages:function(){var b=this;$("pre code").each(function(a,b){return hljs.highlightBlock(b," ")});if($("#log_info").length>0)return a.log_info_offset=$("#log_info").offset(),$(window).scroll(function(){return $(window).scrollTop()>a.log_info_offset.top?$("#log_info").stop().animate({marginTop:$(window).scrollTop()-a.log_info_offset.top+a.log_info_padding}):$("#log_info").stop().animate({marginTop:0})})},tail_logs:function(b){var c;c=a.tail_logs_url,b!=null&&b.length>0?c=a.tail_logs_url+"/"+b:(a.tail_log_started=!0,b="");if(a.tail_log_started)return $.ajax({url:c,dataType:"json",success:function(c){var d,e;c.time&&($("#tail_logs_time").text(c.time),c.log_last_id!=null&&(b=c.log_last_id),c.content!=null&&c.content.length>0&&(d=$(c.content),d.addClass("newlog"),$("#logs_list tr:first").after(d).effect("highlight",{},1e3)),c.collection_stats&&$("#collection_stats").length>0&&$("#collection_stats").html(c.collection_stats));if(a.tail_log_started)return e=function(){return a.tail_logs(b)},setTimeout(e,2e3)}})}}})).call(this)
1
+ ((function(){var a;$(function(){return a.init()}),a={tail_logs_url:null,tail_log_started:!1,log_info_offset:null,log_info_padding:15,init:function(){var b=this;return $(document).ajaxStart(function(){return $("#ajax_loader").show()}),$(document).ajaxStop(function(){return $("#ajax_loader").hide()}),$(document).on("click","#tail_logs_link",function(b){return a.tail_logs_url=$(b.target).attr("data-url"),$("#tail_logs_block").addClass("started"),a.tail_logs(null),!1}),$(document).on("click","#tail_logs_stop_link",function(b){return a.tail_log_started=!1,$("#tail_logs_block").removeClass("started"),!1}),$(document).on("click",".log_info",function(a){var b,c;return b=$(a.target),c=b.attr("data-url"),c==null&&(c=b.parents("tr").attr("data-url")),c!=null&&(b.parents("table").find("tr").removeClass("current"),b.parents("tr").addClass("current"),$("#log_info").load(c)),!1}),$(document).on("click","div.filter-toggle",function(a){return $("div.filter").slideToggle(),$("div.filter-toggle span.arrow-down").toggleClass("rotate")}),$(document).on("click","#add_more_filter",function(a){var b;return b=$(a.target).attr("href"),$.ajax({url:b,success:function(a){var b;return b=$("<li></li>").html(a),$("#more_filter_list").append(b)}}),!1}),$(document).on("change","select.filter_type",function(a){var b,c;return b=$(a.target),c=b.attr("rel")+"/"+b.val(),$.ajax({url:c,dataType:"json",success:function(a){var c,d,e=this;c="",d="",$.each(a.conditions,function(a,b){return c+='<option value="'+b+'">'+b+"</option>"}),b.parents("div.filter_block").find("select.filter_conditions").empty().append(c),a.values.length>0?(d='<select id="filter[more][]_value" name="filter[more][][value]">',$.each(a.values,function(a,b){return d+='<option value="'+b+'">'+b+"</option>"}),d+="</select>"):d='<input type="text" name="filter[more][][value]" value="" placeholder="value">',b.parents("div.filter_block").find("div.filter_values").html(d);if("date"===b.val())return b.parents("div.filter_block").find("div.filter_values input").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"})}}),!1}),$(document).on("click",".close_more_filter",function(a){return $(a.target).parents("li").remove(),!1}),$(document).on("click","li.message_tab",function(a){var b,c;b=$(a.target),c=b.attr("data-tab");if(c!=null)return $("li.message_tab").removeClass("active"),$("pre.tab_content").addClass("hidden"),b.addClass("active"),$("."+c).removeClass("hidden")}),$(document).on("submit","#analyticForm",function(a){var b,c,d;return c=$("#analyticForm"),d=c.attr("action"),b=c.serializeArray(),$("#analyticData").load(d,b),!1}),this.init_pjax(),this.init_on_pages()},init_pjax:function(){var b=this;return $("a[data-pjax]").pjax(),$("body").bind("pjax:start",function(){return $("#ajax_loader").show()}),$("body").bind("pjax:end",function(){return $("#ajax_loader").hide(),a.tail_log_started=!1,$(window).scrollTop()>100&&$("html, body").stop().animate({scrollTop:0},"slow"),a.init_on_pages()})},init_on_pages:function(){var b=this;$("pre code").each(function(a,b){return hljs.highlightBlock(b," ")}),$(".datepicker, .filter_values input.date").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"});if($("#log_info").length>0)return a.log_info_offset=$("#log_info").offset(),$(window).scroll(function(){return $(window).scrollTop()>a.log_info_offset.top?$("#log_info").stop().animate({marginTop:$(window).scrollTop()-a.log_info_offset.top+a.log_info_padding}):$("#log_info").stop().animate({marginTop:0})})},tail_logs:function(b){var c;c=a.tail_logs_url,b!=null&&b.length>0?c=a.tail_logs_url+"/"+b:(a.tail_log_started=!0,b="");if(a.tail_log_started)return $.ajax({url:c,dataType:"json",success:function(c){var d,e;c.time&&($("#tail_logs_time").text(c.time),c.log_last_id!=null&&(b=c.log_last_id),c.content!=null&&c.content.length>0&&(d=$(c.content),d.addClass("newlog"),$("#logs_list tr:first").after(d).effect("highlight",{},1e3)),c.collection_stats&&$("#collection_stats").length>0&&$("#collection_stats").html(c.collection_stats));if(a.tail_log_started)return e=function(){return a.tail_logs(b)},setTimeout(e,2e3)}})}}})).call(this)
@@ -51,7 +51,7 @@ body {
51
51
 
52
52
  .header {
53
53
  height: 50px;
54
- background-color: #402817;
54
+ background-color: #363636;
55
55
  }
56
56
 
57
57
  .topline {
@@ -0,0 +1,61 @@
1
+ <%= partial(:"shared/top_panel") %>
2
+
3
+ <div class="outer">
4
+ <div class="unit size3of4">
5
+ <div class="filter phm pvs">
6
+ <form id="analyticForm" action="<%=h url_path("analytics") %>" method="post" accept-charset="UTF-8">
7
+ <div class="outer mvs">
8
+ <div class="unit size1of2">
9
+ <div class="unit size1of2">
10
+ <div class="prm">
11
+ <%= select_tag @analytic, :type, MongodbLogger::ServerModel::Analytic::ANALYTIC_TYPES %>
12
+ </div> <!-- prm -->
13
+ </div>
14
+ <div class="unit size1of2">
15
+ <div class="prm">
16
+ <%#= text_field_tag @filter, :action, :placeholder => "Action" %>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ <div class="unit size1of2">
21
+ <div class="unit size1of2">
22
+ <div class="prm">
23
+ <%= text_field_tag @analytic, :start_date, :placeholder => "Start date", :class => "datepicker" %>
24
+ </div> <!-- prm -->
25
+ </div> <!-- unit -->
26
+ <div class="unit size1of2">
27
+ <div class="prm">
28
+ <%= text_field_tag @analytic, :end_date, :placeholder => "End date", :class => "datepicker" %>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div> <!-- outer -->
33
+
34
+ <div class="outer">
35
+ <%= submit_tag :submit, "Analyze", :class => "button primary mrs" %> <a href="<%=h url_path("analytics") %>">Clear</a>
36
+ </div> <!-- outer -->
37
+
38
+ </form>
39
+ </div> <!-- filter -->
40
+
41
+ <div class="filter-toggle"><span class="arrow-down">Analyze</span></div>
42
+
43
+ <div id="analyticData">
44
+ <div class="pal txtC">
45
+ Select what to analyze
46
+ </div>
47
+ </div>
48
+
49
+ </div> <!-- unit size3of4 -->
50
+
51
+ <div class="unit size1of4">
52
+ <div class="details">
53
+
54
+ <div id="log_info">
55
+ <div class="pale h2 pal txtC">
56
+ Comming soon...
57
+ </div> <!-- pale h2 -->
58
+ </div>
59
+ </div> <!-- details -->
60
+ </div> <!-- unit size1of4 -->
61
+ </div> <!-- outer -->
@@ -17,7 +17,7 @@
17
17
  <%= partial(:"shared/collection_stats", :object => @collection_stats) %>
18
18
  </div>
19
19
  </div>
20
- <a href="<%=h url_path("overview") %>" class="logo" data-pjax='#main_pjax'><img src="<%=u 'images/logo.png'%>" alt="MongoDB Logger"></a> <span class="logger ">logger</span>
20
+ <a href="<%=h url_path("overview") %>" class="logo" data-pjax='#main_pjax'><img src="<%=u 'images/logo.png'%>" alt="MongoDB Logger"></a>
21
21
  </div> <!-- wrapper -->
22
22
  </div> <!-- header -->
23
23
  <div class="content">
@@ -0,0 +1,24 @@
1
+ <% if analytic_table[:data].count > 0 %>
2
+ <table>
3
+ <tr>
4
+ <% analytic_table[:headers][:key].each do |header| %>
5
+ <th><%=h header%></th>
6
+ <% end %>
7
+ <% analytic_table[:headers][:value].each do |header| %>
8
+ <th><%=h header%></th>
9
+ <% end %>
10
+ </tr>
11
+ <% analytic_table[:data].each do |analytic_data| %>
12
+ <tr>
13
+ <% analytic_table[:headers][:key].each do |header| %>
14
+ <td><%=h analytic_data['_id'][header].try(:to_i) %></td>
15
+ <% end %>
16
+ <% analytic_table[:headers][:value].each do |header| %>
17
+ <td><%=h analytic_data['value'][header].try(:to_i) %></td>
18
+ <% end %>
19
+ </tr>
20
+ <% end %>
21
+ </table>
22
+ <% else %>
23
+ <div class="pale pal txtC">No data found, try another filter</div>
24
+ <% end %>
@@ -22,7 +22,7 @@
22
22
  <% if dynamic_filter.is_selected_values? %>
23
23
  <%= select_tag dynamic_filter, :value, dynamic_filter.selected_values %>
24
24
  <% else %>
25
- <%= text_field_tag dynamic_filter, :value, :placeholder => "value" %>
25
+ <%= text_field_tag dynamic_filter, :value, :placeholder => "value", :class => dynamic_filter.type %>
26
26
  <% end %>
27
27
  </div> <!-- prm -->
28
28
  </div>
@@ -1,4 +1,4 @@
1
1
  <ul class="unit">
2
2
  <li <%= class_if_current(url_path("overview")) %>><a href="<%=h url_path("overview") %>" data-pjax='#main_pjax'>Logs</a></li>
3
- <li><a href="#" title="Comming soon..." class="not-implemented">Graphs</a></li>
3
+ <li <%= class_if_current(url_path("analytics")) %>><a href="<%=h url_path("analytics") %>" data-pjax='#main_pjax'>Analytics</a></li>
4
4
  </ul>
@@ -6,8 +6,11 @@ require 'active_support'
6
6
  require 'mongodb_logger/server/view_helpers'
7
7
  require 'mongodb_logger/server/partials'
8
8
  require 'mongodb_logger/server/content_for'
9
+
9
10
  require 'mongodb_logger/server/model/additional_filter'
10
11
  require 'mongodb_logger/server/model/filter'
12
+ require 'mongodb_logger/server/model/analytic'
13
+
11
14
  require 'mongodb_logger/server_config'
12
15
 
13
16
  if defined? Encoding
@@ -131,11 +134,13 @@ module MongodbLogger
131
134
  }.to_json
132
135
  end
133
136
 
137
+ # log info
134
138
  get "/log/:id" do
135
139
  @log = @collection.find_one(BSON::ObjectId(params[:id]))
136
140
  show :show_log, !request.xhr?
137
141
  end
138
142
 
143
+ # log info right
139
144
  get "/log_info/:id" do
140
145
  @log = @collection.find_one(BSON::ObjectId(params[:id]))
141
146
  partial(:"shared/log_info", :object => @log)
@@ -147,6 +152,19 @@ module MongodbLogger
147
152
  partial(:"shared/dynamic_filter", :object => @filter_more)
148
153
  end
149
154
 
155
+ # analytics
156
+ %w( analytics ).each do |page|
157
+ get "/#{page}/?" do
158
+ @analytic = ServerModel::Analytic.new(@collection, params[:analytic])
159
+ show page, !request.xhr?
160
+ end
161
+ post "/#{page}/?" do
162
+ @analytic = ServerModel::Analytic.new(@collection, params[:analytic])
163
+ @analytic_data = @analytic.get_data
164
+ partial(:"shared/analytic_table", :object => @analytic_data)
165
+ end
166
+ end
167
+
150
168
  error do
151
169
  erb :error, {:layout => false}, :error => 'Sorry there was a nasty error. Maybe no connection to MongoDB. Debug: ' + env['sinatra.error'].inspect
152
170
  end
@@ -1,3 +1,3 @@
1
1
  module MongodbLogger
2
- VERSION = "0.1.9"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
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: 2011-12-06 00:00:00.000000000 Z
12
+ date: 2011-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70259042692840 !ruby/object:Gem::Requirement
16
+ requirement: &70236498382540 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.7.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70259042692840
24
+ version_requirements: *70236498382540
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: shoulda
27
- requirement: &70259042690680 !ruby/object:Gem::Requirement
27
+ requirement: &70236498381820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70259042690680
35
+ version_requirements: *70236498381820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mocha
38
- requirement: &70259046358980 !ruby/object:Gem::Requirement
38
+ requirement: &70236498381060 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.10.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70259046358980
46
+ version_requirements: *70236498381060
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cucumber
49
- requirement: &70259046358420 !ruby/object:Gem::Requirement
49
+ requirement: &70236498380320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.1.2
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70259046358420
57
+ version_requirements: *70236498380320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: coffee-script
60
- requirement: &70259046357840 !ruby/object:Gem::Requirement
60
+ requirement: &70236498379600 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 2.2.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70259046357840
68
+ version_requirements: *70236498379600
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: uglifier
71
- requirement: &70259046357300 !ruby/object:Gem::Requirement
71
+ requirement: &70236498378660 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.1.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70259046357300
79
+ version_requirements: *70236498378660
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: therubyracer
82
- requirement: &70259046356680 !ruby/object:Gem::Requirement
82
+ requirement: &70236498366040 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.9.9
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70259046356680
90
+ version_requirements: *70236498366040
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rake
93
- requirement: &70259046355920 !ruby/object:Gem::Requirement
93
+ requirement: &70236498365300 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.9.0
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70259046355920
101
+ version_requirements: *70236498365300
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: mongo
104
- requirement: &70259046355220 !ruby/object:Gem::Requirement
104
+ requirement: &70236498363400 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 1.4.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70259046355220
112
+ version_requirements: *70236498363400
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: bson_ext
115
- requirement: &70259046354080 !ruby/object:Gem::Requirement
115
+ requirement: &70236498362460 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 1.4.0
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70259046354080
123
+ version_requirements: *70236498362460
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: i18n
126
- requirement: &70259046353140 !ruby/object:Gem::Requirement
126
+ requirement: &70236498361540 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 0.4.1
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70259046353140
134
+ version_requirements: *70236498361540
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: json
137
- requirement: &70259046351560 !ruby/object:Gem::Requirement
137
+ requirement: &70236498360580 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.6.1
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *70259046351560
145
+ version_requirements: *70236498360580
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: activesupport
148
- requirement: &70259046390020 !ruby/object:Gem::Requirement
148
+ requirement: &70236498359920 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 3.0.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *70259046390020
156
+ version_requirements: *70236498359920
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: sinatra
159
- requirement: &70259046389320 !ruby/object:Gem::Requirement
159
+ requirement: &70236498359080 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 1.2.0
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *70259046389320
167
+ version_requirements: *70236498359080
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: erubis
170
- requirement: &70259046388460 !ruby/object:Gem::Requirement
170
+ requirement: &70236498334320 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: 2.6.6
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *70259046388460
178
+ version_requirements: *70236498334320
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: vegas
181
- requirement: &70259046387500 !ruby/object:Gem::Requirement
181
+ requirement: &70236498328440 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ~>
@@ -186,7 +186,7 @@ dependencies:
186
186
  version: 0.1.2
187
187
  type: :runtime
188
188
  prerelease: false
189
- version_requirements: *70259046387500
189
+ version_requirements: *70236498328440
190
190
  description: MongoDB logger for Rails 3
191
191
  email:
192
192
  - leopard.not.a@gmail.com
@@ -223,6 +223,7 @@ files:
223
223
  - lib/mongodb_logger/server/coffee/logs.coffee
224
224
  - lib/mongodb_logger/server/content_for.rb
225
225
  - lib/mongodb_logger/server/model/additional_filter.rb
226
+ - lib/mongodb_logger/server/model/analytic.rb
226
227
  - lib/mongodb_logger/server/model/filter.rb
227
228
  - lib/mongodb_logger/server/partials.rb
228
229
  - lib/mongodb_logger/server/public/images/arrow-down.png
@@ -231,6 +232,7 @@ files:
231
232
  - lib/mongodb_logger/server/public/images/external.png
232
233
  - lib/mongodb_logger/server/public/images/failure.png
233
234
  - lib/mongodb_logger/server/public/images/logo.png
235
+ - lib/mongodb_logger/server/public/images/mongodb.png
234
236
  - lib/mongodb_logger/server/public/images/newlog.png
235
237
  - lib/mongodb_logger/server/public/images/play-icon.png
236
238
  - lib/mongodb_logger/server/public/images/spinner.gif
@@ -269,9 +271,11 @@ files:
269
271
  - lib/mongodb_logger/server/public/stylesheets/reset.css
270
272
  - lib/mongodb_logger/server/public/stylesheets/spaces.css
271
273
  - lib/mongodb_logger/server/view_helpers.rb
274
+ - lib/mongodb_logger/server/views/analytics.erb
272
275
  - lib/mongodb_logger/server/views/error.erb
273
276
  - lib/mongodb_logger/server/views/layout.erb
274
277
  - lib/mongodb_logger/server/views/overview.erb
278
+ - lib/mongodb_logger/server/views/shared/_analytic_table.erb
275
279
  - lib/mongodb_logger/server/views/shared/_collection_stats.erb
276
280
  - lib/mongodb_logger/server/views/shared/_dynamic_filter.erb
277
281
  - lib/mongodb_logger/server/views/shared/_log.erb