slowgrowl 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/Gemfile +7 -0
- data/README.md +30 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/lib/slowgrowl.rb +72 -0
- metadata +77 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
SlowGrowl
|
2
|
+
=========
|
3
|
+
|
4
|
+
Rails 3 plugin which surfaces slow code paths in your Rails application by integrating with the new Notifications API in Rails 3 with your system Growl notification service. By default, any activity which takes longer than one second, will generate a growl alert, with the description of the action, time taken, and other meta data. A preview in action:
|
5
|
+
|
6
|
+

|
7
|
+
|
8
|
+
Integrating with Rails 3
|
9
|
+
------------------------
|
10
|
+
|
11
|
+
# in your Gemfile
|
12
|
+
group :development do
|
13
|
+
gem 'slowgrowl'
|
14
|
+
end
|
15
|
+
|
16
|
+
That's it.
|
17
|
+
|
18
|
+
Optional Configuration for SlowGrowl
|
19
|
+
------------------------------------
|
20
|
+
|
21
|
+
# in your config/environments/development.rb
|
22
|
+
config.slowgrowl.warn = 1000 # growl any action which takes > 1000ms (1s)
|
23
|
+
config.slowgrowl.sticky = true # make really slow (2x warn) alerts sticky
|
24
|
+
|
25
|
+
Resources
|
26
|
+
---------
|
27
|
+
|
28
|
+
* [Rails 3 Internals: Railtie & Creating Plugins](http://www.igvita.com/2010/08/04/rails-3-internals-railtie-creating-plugins/)
|
29
|
+
* [Rails 3 Notifications API](http://edgeapi.rubyonrails.org/classes/ActiveSupport/Notifications.html)
|
30
|
+
* [Railties](http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html)
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gemspec|
|
7
|
+
gemspec.name = 'slowgrowl'
|
8
|
+
gemspec.summary = 'Surface slow code paths in your Rails 3 app via Growl'
|
9
|
+
gemspec.description = gemspec.summary
|
10
|
+
gemspec.email = 'ilya@igvita.com'
|
11
|
+
gemspec.homepage = 'http://github.com/igrigorik/slowgrowl'
|
12
|
+
gemspec.authors = ['Ilya Grigorik']
|
13
|
+
gemspec.add_dependency('growl')
|
14
|
+
gemspec.rubyforge_project = 'slowgrowl'
|
15
|
+
end
|
16
|
+
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts 'Jeweler not available. Install it with: sudo gem install jeweler -s http://gemcutter.org'
|
20
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/slowgrowl.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'growl'
|
2
|
+
|
3
|
+
module SlowGrowl
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
config.slowgrowl = ActiveSupport::OrderedOptions.new
|
6
|
+
config.slowgrowl.warn = 1000 # default slow alert set to 1000ms
|
7
|
+
config.slowgrowl.sticky = false # should error warnings be sticky?
|
8
|
+
|
9
|
+
initializer "slowgrowl.initialize" do |app|
|
10
|
+
|
11
|
+
ActiveSupport::Notifications.subscribe do |*args|
|
12
|
+
if Growl.installed?
|
13
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
14
|
+
|
15
|
+
sticky = false
|
16
|
+
action, type = event.name.split('.')
|
17
|
+
alert = case event.duration
|
18
|
+
when (0...config.slowgrowl.warn) then
|
19
|
+
false
|
20
|
+
when (config.slowgrowl.warn..config.slowgrowl.warn*2) then
|
21
|
+
:warning
|
22
|
+
else
|
23
|
+
sticky = config.slowgrowl.sticky
|
24
|
+
:error
|
25
|
+
end
|
26
|
+
|
27
|
+
e = event.payload
|
28
|
+
message = case type
|
29
|
+
when 'action_controller' then
|
30
|
+
case action
|
31
|
+
when 'process_action' then
|
32
|
+
# {:controller=>"WidgetsController", :action=>"index", :params=>{"controller"=>"widgets", "action"=>"index"},
|
33
|
+
# :formats=>[:html], :method=>"GET", :path=>"/widgets", :status=>200, :view_runtime=>52.25706100463867,
|
34
|
+
# :db_runtime=>0}
|
35
|
+
|
36
|
+
if e[:exception]
|
37
|
+
"%s#%s.\n\n%s" % [
|
38
|
+
e[:controller], e[:action], e[:exception].join(', ')
|
39
|
+
]
|
40
|
+
else
|
41
|
+
"%s#%s (%s).\nDB: %.1f, View: %.1f" % [
|
42
|
+
e[:controller], e[:action], e[:status], e[:db_runtime], e[:view_runtime]
|
43
|
+
]
|
44
|
+
end
|
45
|
+
|
46
|
+
else
|
47
|
+
'%s#%s (%s)' % [e[:controller], e[:action], e[:status]]
|
48
|
+
end
|
49
|
+
|
50
|
+
when 'action_view' then
|
51
|
+
# {:identifier=>"text template", :layout=>nil }
|
52
|
+
'%s, layout: %s' % [e[:identifier], e[:layout].nil? ? 'none' : e[:layout]]
|
53
|
+
|
54
|
+
when 'active_record' then
|
55
|
+
# {:sql=>"SELECT "widgets".* FROM "widgets", :name=>"Widget Load", :connection_id=>2159415800}
|
56
|
+
"%s\n\n%s" % [e[:name], e[:sql].gsub("\n", ' ').squeeze(' ')]
|
57
|
+
else
|
58
|
+
'Duration: %.1f' % [event.duration]
|
59
|
+
end
|
60
|
+
|
61
|
+
if alert
|
62
|
+
Growl.send("notify_#{alert}", message, {
|
63
|
+
:title => "%1.fms - %s : %s" % [event.duration, action.humanize, type.camelize],
|
64
|
+
:sticky => sticky
|
65
|
+
})
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: slowgrowl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Ilya Grigorik
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-08-04 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: growl
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
description: Surface slow code paths in your Rails 3 app via Growl
|
33
|
+
email: ilya@igvita.com
|
34
|
+
executables: []
|
35
|
+
|
36
|
+
extensions: []
|
37
|
+
|
38
|
+
extra_rdoc_files:
|
39
|
+
- README.md
|
40
|
+
files:
|
41
|
+
- Gemfile
|
42
|
+
- README.md
|
43
|
+
- Rakefile
|
44
|
+
- VERSION
|
45
|
+
- lib/slowgrowl.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://github.com/igrigorik/slowgrowl
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options:
|
52
|
+
- --charset=UTF-8
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project: slowgrowl
|
72
|
+
rubygems_version: 1.3.6
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Surface slow code paths in your Rails 3 app via Growl
|
76
|
+
test_files: []
|
77
|
+
|