heroku-unicorn-metrics 1.0.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 ADDED
@@ -0,0 +1,39 @@
1
+ # Heroku Unicorn Metrics
2
+
3
+ Report on Unicorn queued connections using [Raindrops](http://raindrops.bogomips.org/) and the [Raindrops::Linux](http://raindrops.bogomips.org/Raindrops/Linux.html) features.
4
+
5
+ ## Usage
6
+
7
+ First, add `heroku-unicorn-metrics` to your Gemfile:
8
+
9
+ ```
10
+ gem 'heroku-unicorn-metrics'
11
+ ```
12
+
13
+ Then subscribe to the `unicorn.metrics.request` notifcation in your Rails app. For example, to print queue information to your logs, add the following to `config/initializers/notifcations.rb:
14
+
15
+ ```
16
+ # config/initializers/notifications.rb
17
+ ActiveSupport::Notifications.subscribe(/unicorn.metrics.request/) do |*args|
18
+ event = ActiveSupport::Notifications::Event.new(*args)
19
+ payload = event.payload
20
+
21
+ addr = payload[:addr]
22
+ active = payload[:requests][:active]
23
+ queued = payload[:requests][:queued]
24
+ queue_time = payload[:queue_time]
25
+
26
+ puts "STATS addr=#{addr} active=#{active} queued=#{queued} queue_time=#{queue_time} "
27
+ end
28
+ ```
29
+
30
+ For more information, see the [ActiveSupport::Notification](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) docs.
31
+
32
+ ## Data
33
+
34
+ The following information is sent in the notification payload:
35
+
36
+ * `requests[:active]`: Number of requests currently being processed by Unicorn at the start of the request
37
+ * `requests[:queued]`: Number of requests waiting to be processed at the start of the request
38
+ * `queue_time`: Amount of time the current request spent in the queue
39
+ * `addr`: Address of the dyno processing the request
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "heroku/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "heroku-unicorn-metrics"
7
+ s.version = Heroku::UnicornMetrics::VERSION
8
+ s.authors = ["dominic (Dominic Dagradi)"]
9
+ s.email = ["dominic@heroku.com"]
10
+ s.homepage = "http://github.com/heroku/heroku-unicorn-metrics"
11
+ s.summary = %q{Additional metrics for Heroku apps using Unicorn}
12
+ s.description = %q{Additional metrics for Heroku apps using Unicorn}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency 'unicorn'
20
+ s.add_dependency 'rails', ">= 3.0"
21
+ end
@@ -0,0 +1,2 @@
1
+ require 'heroku/middleware'
2
+ require 'heroku/railtie' if defined?(Rails)
@@ -0,0 +1,39 @@
1
+ require 'socket'
2
+
3
+ module Heroku
4
+ module UnicornMetrics
5
+ class Queue
6
+ ADDR = IPSocket.getaddress(Socket.gethostname).to_s+':'+ENV['PORT']
7
+
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ start_time = Time.now.to_f*1000.0
14
+ stats = raindrops_stats
15
+
16
+ status, headers, body = @app.call(env)
17
+
18
+ stats[:addr] = ADDR
19
+ stats[:queue_time] = headers['X-Request-Start'] ? (start_time - headers['X-Request-Start'].to_f).round : 0
20
+
21
+ ActiveSupport::Notifications.instrument("unicorn.metrics.queue", stats)
22
+
23
+ [status, headers, body]
24
+ end
25
+
26
+ private
27
+
28
+ def raindrops_stats
29
+ if defined? Raindrops::Linux.tcp_listener_stats
30
+ stats = Raindrops::Linux.tcp_listener_stats([ '0.0.0.0:'+ENV['PORT'] ])['0.0.0.0:'+ENV['PORT']]
31
+ return { :requests => { :active => stats.active, :queued => stats.queued }}
32
+ else
33
+ return { :requests => { :active => 0, :queued => 0 }}
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,10 @@
1
+ module Heroku
2
+ module UnicornMetrics
3
+ class UnicornMetricsRailtie < Rails::Railtie
4
+ initializer "my_railtie.configure_rails_initialization" do |app|
5
+ app.middleware.use Raindrops::Middleware
6
+ app.middleware.use Heroku::UnicornMetrics::Queue
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Heroku
2
+ module UnicornMetrics
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: heroku-unicorn-metrics
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - dominic (Dominic Dagradi)
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: unicorn
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '3.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
46
+ description: Additional metrics for Heroku apps using Unicorn
47
+ email:
48
+ - dominic@heroku.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - README.md
54
+ - heroku-unicorn-metrics.gemspec
55
+ - lib/heroku-unicorn-metrics.rb
56
+ - lib/heroku/middleware.rb
57
+ - lib/heroku/railtie.rb
58
+ - lib/heroku/version.rb
59
+ homepage: http://github.com/heroku/heroku-unicorn-metrics
60
+ licenses: []
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 1.8.24
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: Additional metrics for Heroku apps using Unicorn
83
+ test_files: []