mongodb_logger 0.1.9 → 0.2.0

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/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