garelic 0.0.2 → 0.1.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 +13 -9
- data/garelic.gemspec +1 -1
- data/lib/garelic/dispatcher.rb +3 -1
- data/lib/garelic/version.rb +1 -1
- data/lib/garelic.rb +60 -8
- metadata +3 -4
data/README.md
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
-
# Garelic: Google Analytics
|
1
|
+
# Garelic: Use Google Analytics as "New Relic" performance monitoring for your Rails app
|
2
2
|
|
3
3
|
This gem uses Google Analytics User Timing API to report application performance statistics directly to Google Analytics, where you can slice & dice your data as you wish.
|
4
4
|
|
5
5
|
Here are some features with pictures:
|
6
6
|
|
7
|
-
- [Showing average response times for each action](http://twitpic.com/b0gwkx/full)
|
8
|
-
- [Identify slow page loads & drill down to different actions](http://twitpic.com/b0gump/full)
|
9
|
-
- [Histogram of response times for an actions](http://twitpic.com/b0gv6e/full)
|
10
7
|
- [Performance reports as a nice dashboard](http://twitpic.com/b0gt4j/full)
|
11
|
-
|
8
|
+
- [Histogram of response times for action](http://twitpic.com/b0gv6e/full)
|
9
|
+
- [Identify slow page loads & drill down to different actions](http://twitpic.com/b0gump/full)
|
10
|
+
- [Showing average response times for each action](http://twitpic.com/b0gwkx/full)
|
11
|
+
- [How much is spent in database & view generation for an action?](http://twitpic.com/b0h062/full)
|
12
|
+
- [How has the switch to Ruby 1.9.3 affected response time?](http://twitpic.com/b11mxm/full)
|
13
|
+
- [In which action do we spent most time globaly?](http://twitpic.com/b15l7j/full)
|
12
14
|
|
13
15
|
*This is a proof of concept and will probably break things. Use it at your own risk.*
|
14
16
|
|
@@ -31,18 +33,20 @@ It's easy as 1-2-3.
|
|
31
33
|
|
32
34
|
<%= Garelic::Timing %>
|
33
35
|
|
34
|
-
|
36
|
+
(function() {
|
35
37
|
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
36
38
|
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
37
39
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
38
|
-
|
40
|
+
})();
|
39
41
|
</script>
|
42
|
+
|
43
|
+
(Please note the `_gaq.push(['_setSiteSpeedSampleRate', 100]);` code for better testing.)
|
40
44
|
|
41
|
-
*Step 3.* Go to Google Analytics > Content > Site
|
45
|
+
*Step 3.* Go to Google Analytics > Content > Site Speed > User Timings
|
42
46
|
|
43
47
|
Enjoy!
|
44
48
|
|
45
|
-
##
|
49
|
+
## Known advantages
|
46
50
|
|
47
51
|
- it's free
|
48
52
|
- shows slow performing pages (not only actions)
|
data/garelic.gemspec
CHANGED
@@ -4,7 +4,7 @@ require File.expand_path('../lib/garelic/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Jan Suchal"]
|
6
6
|
gem.email = ["johno@jsmf.net"]
|
7
|
-
gem.description = %q{Google Analytics
|
7
|
+
gem.description = %q{Use Google Analytics for Rails App Performance Monitoring}
|
8
8
|
gem.summary = %q{}
|
9
9
|
gem.homepage = "https://github.com/jsuchal/garelic"
|
10
10
|
|
data/lib/garelic/dispatcher.rb
CHANGED
@@ -3,9 +3,11 @@ module ActionController
|
|
3
3
|
alias :dispatch_without_garelic :dispatch
|
4
4
|
|
5
5
|
def dispatch(*args)
|
6
|
+
Garelic::Metrics.reset!
|
7
|
+
|
6
8
|
response = dispatch_without_garelic(*args)
|
7
9
|
|
8
|
-
timing_data = Garelic.
|
10
|
+
timing_data = Garelic.report_user_timing_from_metrics(Garelic::Metrics)
|
9
11
|
|
10
12
|
_, _, chunks = response
|
11
13
|
chunks.each do |chunk|
|
data/lib/garelic/version.rb
CHANGED
data/lib/garelic.rb
CHANGED
@@ -4,13 +4,27 @@ require "garelic/dispatcher"
|
|
4
4
|
class Garelic
|
5
5
|
Timing = '<!-- /* GARELIC DATA */ -->'.html_safe
|
6
6
|
|
7
|
-
def self.
|
8
|
-
|
7
|
+
def self.report_user_timing_from_metrics(metrics)
|
8
|
+
reports = report_user_timing_for_action(metrics[:action], metrics.action_identifier)
|
9
|
+
reports += report_user_timing_for_active_record(metrics[:active_record], metrics.action_identifier)
|
10
|
+
|
11
|
+
reports.join("\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.report_user_timing_for_action(metrics, action_identifier)
|
9
15
|
[
|
10
|
-
track_timing('Garelic', 'Response (Total)',
|
11
|
-
track_timing('Garelic', 'Response (Views)',
|
12
|
-
track_timing('Garelic', 'Response (ActiveRecord)',
|
13
|
-
]
|
16
|
+
track_timing('Garelic (Controller)', 'Response time (Total)', metrics[:total_runtime], action_identifier),
|
17
|
+
track_timing('Garelic (Controller)', 'Response time (Views)', metrics[:view_runtime], action_identifier),
|
18
|
+
track_timing('Garelic (Controller)', 'Response time (ActiveRecord)', metrics[:db_runtime], action_identifier),
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.report_user_timing_for_active_record(metrics, action_identifier)
|
23
|
+
timings = []
|
24
|
+
metrics.each do |call_type, time|
|
25
|
+
timings << track_timing('Garelic (ActiveRecord)', call_type, time, action_identifier)
|
26
|
+
end
|
27
|
+
timings
|
14
28
|
end
|
15
29
|
|
16
30
|
def self.track_timing(category, variable, time, opt_label = nil, opt_sample = nil)
|
@@ -22,10 +36,48 @@ class Garelic
|
|
22
36
|
|
23
37
|
class Railtie < Rails::Railtie
|
24
38
|
initializer 'garelic.install_instrumentation' do
|
39
|
+
Garelic::Metrics.reset!
|
40
|
+
|
25
41
|
ActiveSupport::Notifications.subscribe('process_action.action_controller') do |_, start, finish, _, payload|
|
26
|
-
payload[:
|
27
|
-
|
42
|
+
Garelic::Metrics.report(:action, :db_runtime, payload[:db_runtime] || 0)
|
43
|
+
Garelic::Metrics.report(:action, :view_runtime, payload[:view_runtime] || 0)
|
44
|
+
Garelic::Metrics.report(:action, :total_runtime, (finish - start) * 1000)
|
45
|
+
Garelic::Metrics.action_identifier = "#{payload[:controller]}##{payload[:action]}"
|
46
|
+
end
|
47
|
+
|
48
|
+
ActiveSupport::Notifications.subscribe('sql.active_record') do |_, start, finish, _, payload|
|
49
|
+
type = payload[:name] || 'Other SQL'
|
50
|
+
Garelic::Metrics.report(:active_record, type, (finish - start) * 1000) if type != 'CACHE'
|
28
51
|
end
|
29
52
|
end
|
30
53
|
end
|
54
|
+
|
55
|
+
class Metrics
|
56
|
+
def self.reset!
|
57
|
+
Thread.current[:garelic] = {}
|
58
|
+
Thread.current[:garelic_action] = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.action_identifier=(value)
|
62
|
+
Thread.current[:garelic_action] = value
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.action_identifier
|
66
|
+
Thread.current[:garelic_action]
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.report(category, variable, runtime, payload = nil)
|
70
|
+
metrics[category] ||= Hash.new(0)
|
71
|
+
metrics[category][variable] += runtime
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.[](category)
|
75
|
+
metrics[category]
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
def self.metrics
|
80
|
+
Thread.current[:garelic]
|
81
|
+
end
|
82
|
+
end
|
31
83
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garelic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,10 +9,9 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-09 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description: Google Analytics
|
15
|
-
your Rails app
|
14
|
+
description: Use Google Analytics for Rails App Performance Monitoring
|
16
15
|
email:
|
17
16
|
- johno@jsmf.net
|
18
17
|
executables: []
|