system-metrics 0.2.1 → 0.2.2

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.
@@ -15,17 +15,21 @@
15
15
  </head>
16
16
  <body>
17
17
  <div class="container">
18
- <div id="hd">
19
- <h1>System Metrics</h1>
20
- <%= render "menu" %>
18
+ <div id="top">
19
+ <div id="hd">
20
+ <h1>System Metrics</h1>
21
+ <%= render "menu" %>
22
+ </div>
21
23
  </div>
22
- <%= render "title_bar" %>
23
24
  <div id="bd">
24
- <%= yield %>
25
- </div>
26
- <div id="ft">
27
- <span>Developed by <a href="http://www.nearinfinity.com">Near Infinity</a></span>
25
+ <%= render "title_bar" %>
26
+ <div id="content">
27
+ <%= yield %>
28
+ </div>
28
29
  </div>
29
30
  </div>
31
+ <div id="ft">
32
+ <span>Developed by <a href="http://www.nearinfinity.com">Near Infinity</a></span>
33
+ </div>
30
34
  </body>
31
35
  </html>
@@ -4,6 +4,7 @@ module SystemMetrics
4
4
  autoload :Middleware, 'system_metrics/middleware'
5
5
  autoload :NestedEvent, 'system_metrics/nested_event'
6
6
  autoload :Store, 'system_metrics/store'
7
+ autoload :AsyncStore, 'system_metrics/async_store'
7
8
  autoload :Version, 'system_metrics/version'
8
9
 
9
10
  def self.collection_on
@@ -0,0 +1,57 @@
1
+ require 'thread'
2
+
3
+ module SystemMetrics
4
+ class AsyncStore
5
+
6
+ # An instrumenter that does not send notifications. This is used in the
7
+ # AsyncStore so saving events does not send any notifications, not even
8
+ # for logging.
9
+ class VoidInstrumenter < ::ActiveSupport::Notifications::Instrumenter
10
+ def instrument(name, payload={})
11
+ yield(payload) if block_given?
12
+ end
13
+ end
14
+
15
+ def initialize
16
+ @queue = Queue.new
17
+ @thread = Thread.new do
18
+ set_void_instrumenter
19
+ consume
20
+ end
21
+ end
22
+
23
+ def save(events)
24
+ @queue << events
25
+ end
26
+
27
+ protected
28
+ def set_void_instrumenter
29
+ Thread.current[:"instrumentation_#{notifier.object_id}"] = VoidInstrumenter.new(notifier)
30
+ end
31
+
32
+ def notifier
33
+ ActiveSupport::Notifications.notifier
34
+ end
35
+
36
+ def consume
37
+ while events = @queue.pop
38
+ root_event = SystemMetrics::NestedEvent.arrange(events, :presort => false)
39
+ root_model = create_metric(root_event)
40
+ root_model.update_attributes(:request_id => root_model.id)
41
+ save_tree(root_event.children, root_model.id, root_model.id)
42
+ end
43
+ end
44
+
45
+ def save_tree(events, request_id, parent_id)
46
+ events.each do |event|
47
+ model = create_metric(event, :request_id => request_id, :parent_id => parent_id)
48
+ save_tree(event.children, request_id, model.id)
49
+ end
50
+ end
51
+
52
+ def create_metric(event, merge_params={})
53
+ SystemMetrics::Metric.create(event.to_hash.merge(merge_params))
54
+ end
55
+
56
+ end
57
+ end
@@ -3,7 +3,7 @@ module SystemMetrics
3
3
  attr_accessor :store, :instruments, :notification_exclude_patterns, :path_exclude_patterns
4
4
 
5
5
  def initialize
6
- self.store = SystemMetrics::Store.new
6
+ self.store = SystemMetrics::AsyncStore.new
7
7
  self.notification_exclude_patterns = []
8
8
  self.path_exclude_patterns = [/system\/metrics/, /system_metrics/]
9
9
  self.instruments = [
@@ -1,3 +1,3 @@
1
1
  module SystemMetrics
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -3,7 +3,6 @@ body {
3
3
  font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;
4
4
  font-size: 75%;
5
5
  line-height: 150%;
6
- background-color: #FAD08A;
7
6
  margin: 0 auto;
8
7
  max-width: 100%;
9
8
  width: 100%;
@@ -29,14 +28,28 @@ h1, h2, h3, h4, h5, h6 {
29
28
 
30
29
  #container {
31
30
  height: 100%;
31
+ margin-bottom: -46px;
32
32
  min-height: 100%;
33
33
  }
34
34
 
35
+ #top {
36
+ position: fixed;
37
+ top: 0;
38
+ width: 100%;
39
+ z-index: 2;
40
+ }
41
+
35
42
  #bd {
36
- padding: 20px;
43
+ padding-bottom: 46px;
44
+ position: relative;
45
+ top: 40px;
37
46
  background-color: #FAFCFF;
38
47
  }
39
48
 
49
+ #content {
50
+ padding: 20px;
51
+ }
52
+
40
53
  tr {
41
54
  height: 45px;
42
55
  }
@@ -50,6 +63,7 @@ div.clear {
50
63
  }
51
64
 
52
65
  #hd {
66
+ clear: both;
53
67
  top: 0;
54
68
  width: 100%;
55
69
  height: 40px;
@@ -147,6 +161,8 @@ div.clear {
147
161
  text-align: center;
148
162
  text-shadow: 0 -1px 0 #FBDAA2;
149
163
  width: 100%;
164
+ position: fixed;
165
+ bottom: 0;
150
166
  z-index: 2;
151
167
  -moz-box-shadow: 0 1px 0 #FCE3BB inset;
152
168
  }
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'system_metrics/metric'
3
+
4
+ describe SystemMetrics::AsyncStore do
5
+ include NotificationsSupport
6
+
7
+ describe '#save' do
8
+ it 'should save an array of events hierarchically' do
9
+ parent = event(:start => Time.now - 10.seconds, :end => Time.now)
10
+ child = event(:start => Time.now - 9.seconds, :end => Time.now - 1.seconds)
11
+ grandchild = event(:start => Time.now - 8.seconds, :end => Time.now - 2.seconds)
12
+
13
+ store = SystemMetrics::AsyncStore.new
14
+
15
+ lambda {
16
+ store.save([grandchild, child, parent])
17
+ sleep(0.1)
18
+ }.should change(SystemMetrics::Metric, :count).by(3)
19
+
20
+ metrics = SystemMetrics::Metric.all
21
+ verify_equal(parent, metrics[0])
22
+ verify_equal(child, metrics[0].children[0])
23
+ verify_equal(grandchild, metrics[0].children[0].children[0])
24
+ end
25
+
26
+ it 'should not attempt to save anything if passed an empty array of events' do
27
+ store = SystemMetrics::AsyncStore.new
28
+ lambda { store.save([]); sleep(0.1) }.should_not change(SystemMetrics::Metric, :count)
29
+ end
30
+
31
+ it 'should not attempt to save anything if passed a nil' do
32
+ store = SystemMetrics::AsyncStore.new
33
+ lambda { store.save(nil); sleep(0.1) }.should_not change(SystemMetrics::Metric, :count)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def verify_equal(event, metric)
40
+ event.name.should == metric.name
41
+ event.action.should == metric.action
42
+ event.category.should == metric.category
43
+ event.transaction_id.should == metric.transaction_id
44
+ event.payload.should == metric.payload
45
+ event.started_at.should be_within(1).of(metric.started_at)
46
+ event.duration.should be_within(1).of(metric.duration)
47
+ event.exclusive_duration.should be_within(1).of(metric.exclusive_duration)
48
+ end
49
+
50
+ end
@@ -11,7 +11,7 @@ describe SystemMetrics::Store do
11
11
  grandchild = event(:start => Time.now - 8.seconds, :end => Time.now - 2.seconds)
12
12
 
13
13
  store = SystemMetrics::Store.new
14
-
14
+
15
15
  lambda {
16
16
  store.save([grandchild, child, parent])
17
17
  }.should change(SystemMetrics::Metric, :count).by(3)
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: system-metrics
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.1
5
+ version: 0.2.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jeff Kunkle
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-08-11 00:00:00 -04:00
13
+ date: 2011-08-18 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -89,6 +89,7 @@ files:
89
89
  - lib/generators/system_metrics/migration/templates/migration.rb
90
90
  - lib/system-metrics.rb
91
91
  - lib/system_metrics.rb
92
+ - lib/system_metrics/async_store.rb
92
93
  - lib/system_metrics/collector.rb
93
94
  - lib/system_metrics/config.rb
94
95
  - lib/system_metrics/engine.rb
@@ -117,6 +118,7 @@ files:
117
118
  - spec/support/test_logger.rb
118
119
  - spec/support/test_store.rb
119
120
  - spec/support/transactional_specs.rb
121
+ - spec/system_metrics/async_store_spec.rb
120
122
  - spec/system_metrics/collector_spec.rb
121
123
  - spec/system_metrics/config_spec.rb
122
124
  - spec/system_metrics/engine_spec.rb
@@ -167,6 +169,7 @@ test_files:
167
169
  - spec/support/test_logger.rb
168
170
  - spec/support/test_store.rb
169
171
  - spec/support/transactional_specs.rb
172
+ - spec/system_metrics/async_store_spec.rb
170
173
  - spec/system_metrics/collector_spec.rb
171
174
  - spec/system_metrics/config_spec.rb
172
175
  - spec/system_metrics/engine_spec.rb