model_observer 0.3.0 → 0.4.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.
- 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.
|