model_observer 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -7
- data/lib/model_observer.rb +35 -12
- data/lib/model_observer/active_record3.rb +14 -19
- data/lib/model_observer/active_record4.rb +14 -19
- data/lib/model_observer/analyser.rb +9 -1
- data/lib/model_observer/metric.rb +1 -1
- data/lib/model_observer/querying.rb +7 -11
- data/lib/model_observer/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b2f28ed4ce8f3ca08a0174cffe2efa8f204cc8f
|
4
|
+
data.tar.gz: b7645d137b2c89cf2c62bc402f29d927f53edc95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0971e467136f4ca7d050f78f52b27abe59462a34cf56c347a869ba6d8a99c2c9449ea9daad424ed16f74d244af35bede5fbb6f9fc0bf003ac7d2929fb60c121e
|
7
|
+
data.tar.gz: b0ad80b30466713bd869148efaf71cf039856ccee8e0384f6303647fec5ff9c405e20f2917e87e077010611f50b28d56ab23299ff247ff1f6ef9a2e57a336e67
|
data/README.md
CHANGED
@@ -16,18 +16,18 @@ and bundle
|
|
16
16
|
|
17
17
|
bundle
|
18
18
|
|
19
|
-
##
|
19
|
+
## Configuration
|
20
20
|
|
21
|
-
|
21
|
+
Initialize ModelObserver at `config/environments/development.rb` with the following code:
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
config.after_initialize do
|
24
|
+
ModelObserver.summary = true
|
25
|
+
ModelObserver.instantiation_log = true
|
26
|
+
end
|
27
27
|
|
28
28
|
## Summary Log
|
29
29
|
|
30
|
-
The summary of each request will be
|
30
|
+
The summary of each request will be appended to the end like this:
|
31
31
|
|
32
32
|
===== Model Observer Start =====
|
33
33
|
Author: 1 sum(10.6ms) avg(10.6ms)
|
@@ -42,3 +42,14 @@ The summary of each request will be added to the end like this:
|
|
42
42
|
id(507): 3
|
43
43
|
id(536): 3
|
44
44
|
===== Model Observer End =======
|
45
|
+
|
46
|
+
`id(319): 3` means the models with same class(Book) and same id(319) have been instantiated three times.
|
47
|
+
|
48
|
+
## Instantiation Log
|
49
|
+
|
50
|
+
The duration include query and instantiate models will be logged after each sql log like this:
|
51
|
+
|
52
|
+
Author Load (0.5ms) SELECT `authors`.* FROM `authors` WHERE `authors`.`id` = 1 LIMIT 1
|
53
|
+
Author Instantiate (1.5ms) SELECT `authors`.* FROM `authors` WHERE `authors`.`id` = 1 LIMIT 1
|
54
|
+
|
55
|
+
1.5ms == 0.5ms(DB query) + 1.0ms(model instantiation)
|
data/lib/model_observer.rb
CHANGED
@@ -9,20 +9,43 @@ module ModelObserver
|
|
9
9
|
autoload :Analyser, 'model_observer/analyser'
|
10
10
|
autoload :Rack, 'model_observer/rack'
|
11
11
|
|
12
|
-
|
13
|
-
if active_record4?
|
14
|
-
autoload :ActiveRecord, 'model_observer/active_record4'
|
15
|
-
ModelObserver::ActiveRecord.enable
|
16
|
-
elsif active_record3?
|
17
|
-
autoload :ActiveRecord, 'model_observer/active_record3'
|
18
|
-
ModelObserver::ActiveRecord.enable
|
19
|
-
else
|
20
|
-
raise "Current version of active_record is not supported."
|
21
|
-
end
|
22
|
-
require 'model_observer/log_subscriber'
|
23
|
-
end
|
12
|
+
attr_writer :summary, :instantiation_log
|
24
13
|
|
25
14
|
class << self
|
15
|
+
def summary?
|
16
|
+
@summary
|
17
|
+
end
|
18
|
+
|
19
|
+
def instantiation_log?
|
20
|
+
@instantiation_log
|
21
|
+
end
|
22
|
+
|
23
|
+
def summary=(bool)
|
24
|
+
@summary = bool
|
25
|
+
if summary?
|
26
|
+
if active_record?
|
27
|
+
if active_record4?
|
28
|
+
autoload :ActiveRecord, 'model_observer/active_record4'
|
29
|
+
ModelObserver::ActiveRecord.enable
|
30
|
+
elsif active_record3?
|
31
|
+
autoload :ActiveRecord, 'model_observer/active_record3'
|
32
|
+
ModelObserver::ActiveRecord.enable
|
33
|
+
else
|
34
|
+
raise "Current version of active_record is not supported."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def instantiation_log=(bool)
|
41
|
+
@instantiation_log = bool
|
42
|
+
if instantiation_log?
|
43
|
+
if active_record?
|
44
|
+
require 'model_observer/log_subscriber'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
26
49
|
def start_request
|
27
50
|
end
|
28
51
|
|
@@ -1,27 +1,22 @@
|
|
1
1
|
module ModelObserver
|
2
2
|
module ActiveRecord
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def instantiate(record)
|
10
|
-
started_at = Time.now
|
11
|
-
instance = origin_instantiate(record)
|
12
|
-
ModelObserver::Collector.add_metric(ModelObserver::Metric.new(instance, started_at, Time.now))
|
13
|
-
instance
|
14
|
-
end
|
3
|
+
class << self
|
4
|
+
def enable
|
5
|
+
require 'active_record'
|
6
|
+
require 'model_observer/querying'
|
7
|
+
overwrite_instantiate
|
15
8
|
end
|
16
9
|
|
17
|
-
|
18
|
-
|
10
|
+
def overwrite_instantiate
|
11
|
+
::ActiveRecord::Inheritance::ClassMethods.class_eval do
|
12
|
+
alias_method :origin_instantiate, :instantiate
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
def instantiate(record)
|
15
|
+
started_at = Time.now
|
16
|
+
instance = origin_instantiate(record)
|
17
|
+
ModelObserver::Collector.add_metric(ModelObserver::Metric.new(instance, started_at, Time.now))
|
18
|
+
instance
|
19
|
+
end
|
25
20
|
end
|
26
21
|
end
|
27
22
|
end
|
@@ -1,27 +1,22 @@
|
|
1
1
|
module ModelObserver
|
2
2
|
module ActiveRecord
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def instantiate(record, column_types = {})
|
10
|
-
started_at = Time.now
|
11
|
-
instance = origin_instantiate(record, column_types)
|
12
|
-
ModelObserver::Collector.add_metric(ModelObserver::Metric.new(instance, started_at, Time.now))
|
13
|
-
instance
|
14
|
-
end
|
3
|
+
class << self
|
4
|
+
def enable
|
5
|
+
require 'active_record'
|
6
|
+
require 'model_observer/querying'
|
7
|
+
overwrite_instantiate
|
15
8
|
end
|
16
9
|
|
17
|
-
|
18
|
-
|
10
|
+
def overwrite_instantiate
|
11
|
+
::ActiveRecord::Persistence::ClassMethods.class_eval do
|
12
|
+
alias_method :origin_instantiate, :instantiate
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
def instantiate(record, column_types = {})
|
15
|
+
started_at = Time.now
|
16
|
+
instance = origin_instantiate(record, column_types)
|
17
|
+
ModelObserver::Collector.add_metric(ModelObserver::Metric.new(instance, started_at, Time.now))
|
18
|
+
instance
|
19
|
+
end
|
25
20
|
end
|
26
21
|
end
|
27
22
|
end
|
@@ -6,13 +6,21 @@ module ModelObserver
|
|
6
6
|
Collector.metrics_hash.each do |key, value|
|
7
7
|
sum_duration = value.map(&:duration).sum
|
8
8
|
average_duration = sum_duration / value.count
|
9
|
-
text << "#{key}: #{value.count}
|
9
|
+
text << "#{key}: #{value.count} #{sum_text(sum_duration)} #{average_text(average_duration)}\n"
|
10
10
|
text << analyse_single_class(value)
|
11
11
|
end
|
12
12
|
text.sub!(/\n$/, '')
|
13
13
|
text
|
14
14
|
end
|
15
15
|
|
16
|
+
def sum_text(sum_duration)
|
17
|
+
"sum(#{sum_duration.round(1)}ms)"
|
18
|
+
end
|
19
|
+
|
20
|
+
def average_text(average_duration)
|
21
|
+
"avg(#{average_duration.round(1)}ms)"
|
22
|
+
end
|
23
|
+
|
16
24
|
def analyse_single_class(metrics)
|
17
25
|
return if metrics.empty?
|
18
26
|
primary_key = metrics.first.model_class.primary_key
|
@@ -4,7 +4,7 @@ module ModelObserver
|
|
4
4
|
|
5
5
|
def initialize(model, started_at, ended_at)
|
6
6
|
@model_class = model.class
|
7
|
-
@model_id = model.__send__(model.class.primary_key)
|
7
|
+
@model_id = model.__send__(model.class.primary_key) if model.class.primary_key
|
8
8
|
@started_at = started_at
|
9
9
|
@ended_at = ended_at
|
10
10
|
end
|
@@ -1,14 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
::ActiveRecord::Querying.class_eval do
|
4
|
-
alias_method :origin_find_by_sql, :find_by_sql
|
1
|
+
::ActiveRecord::Querying.class_eval do
|
2
|
+
alias_method :origin_find_by_sql, :find_by_sql
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|
4
|
+
def find_by_sql(sql, binds = [])
|
5
|
+
ActiveSupport::Notifications.instrumenter.instrument(
|
6
|
+
"instantiate.model_observer",
|
7
|
+
:sql => connection.to_sql(sanitize_sql(sql), binds),
|
8
|
+
:name => "#{name} Instantiate") { origin_find_by_sql(sql, binds) }
|
13
9
|
end
|
14
10
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: model_observer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weihu Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
version: '0'
|
82
82
|
requirements: []
|
83
83
|
rubyforge_project:
|
84
|
-
rubygems_version: 2.
|
84
|
+
rubygems_version: 2.0.14
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: Help to find out duplicated model object creations.
|