librato-rack 0.1.0 → 0.2.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 +2 -2
- data/lib/librato/rack.rb +16 -12
- data/lib/librato/rack/configuration.rb +2 -1
- data/lib/librato/rack/version.rb +1 -1
- data/test/apps/deprecated.ru +14 -0
- data/test/apps/no_stats.ru +18 -0
- data/test/integration/deprecated_test.rb +35 -0
- data/test/integration/no_stats_test.rb +54 -0
- metadata +12 -8
- data/test/apps/heroku.ru +0 -27
- data/test/integration/heroku_test.rb +0 -36
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
librato-rack
|
2
2
|
=======
|
3
3
|
|
4
|
-
[](http://travis-ci.org/librato/librato-rack)
|
4
|
+
[](http://travis-ci.org/librato/librato-rack) [](https://codeclimate.com/github/librato/librato-rack)
|
5
5
|
|
6
6
|
*Note: librato-rack is currently in beta and is currently recommended primarily for early-adopter use*
|
7
7
|
|
@@ -62,7 +62,7 @@ If you want to do more complex configuration, use your own environment variables
|
|
62
62
|
config.token = 'mytoken'
|
63
63
|
# …more configuration
|
64
64
|
|
65
|
-
use Librato::Rack, config
|
65
|
+
use Librato::Rack, :config => config
|
66
66
|
|
67
67
|
See the configuration class for all available options.
|
68
68
|
|
data/lib/librato/rack.rb
CHANGED
@@ -24,13 +24,18 @@ module Librato
|
|
24
24
|
#
|
25
25
|
# app = Rack::Builder.app do
|
26
26
|
# use Librato::Rack
|
27
|
-
# run lambda { |env| [200, {"Content-Type" => 'text/html'}, ["Hello!"]]}
|
27
|
+
# run lambda { |env| [200, {"Content-Type" => 'text/html'}, ["Hello!"]] }
|
28
28
|
# end
|
29
29
|
#
|
30
30
|
class Rack
|
31
31
|
attr_reader :config, :tracker
|
32
32
|
|
33
|
-
def initialize(app,
|
33
|
+
def initialize(app, options={})
|
34
|
+
if options.respond_to?(:tracker) # old-style single argument
|
35
|
+
config = options
|
36
|
+
else
|
37
|
+
config = options.fetch(:config, Configuration.new)
|
38
|
+
end
|
34
39
|
@app, @config = app, config
|
35
40
|
@tracker = Tracker.new(@config)
|
36
41
|
Librato.register_tracker(@tracker) # create global reference
|
@@ -49,7 +54,7 @@ module Librato
|
|
49
54
|
|
50
55
|
def check_log_output(env)
|
51
56
|
return if @log_target
|
52
|
-
if
|
57
|
+
if in_heroku_env?
|
53
58
|
tracker.on_heroku = true
|
54
59
|
default = ::Logger.new($stdout)
|
55
60
|
else
|
@@ -59,6 +64,11 @@ module Librato
|
|
59
64
|
@log_target = config.log_target
|
60
65
|
end
|
61
66
|
|
67
|
+
def in_heroku_env?
|
68
|
+
# don't have any custom http vars anymore, check if hostname is UUID
|
69
|
+
Socket.gethostname =~ /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/i
|
70
|
+
end
|
71
|
+
|
62
72
|
def process_request(env)
|
63
73
|
time = Time.now
|
64
74
|
begin
|
@@ -72,18 +82,11 @@ module Librato
|
|
72
82
|
end
|
73
83
|
|
74
84
|
def record_header_metrics(env)
|
75
|
-
|
76
|
-
|
77
|
-
tracker.group 'rack.heroku' do |group|
|
78
|
-
group.group 'queue' do |q|
|
79
|
-
q.measure 'depth', env['HTTP_X_HEROKU_QUEUE_DEPTH'].to_f
|
80
|
-
q.timing 'wait_time', env['HTTP_X_HEROKU_QUEUE_WAIT_TIME'].to_f
|
81
|
-
end
|
82
|
-
group.measure 'dynos', env['HTTP_X_HEROKU_DYNOS_IN_USE'].to_f
|
83
|
-
end
|
85
|
+
# TODO: track generalized queue wait
|
84
86
|
end
|
85
87
|
|
86
88
|
def record_request_metrics(status, duration)
|
89
|
+
return if config.disable_rack_metrics
|
87
90
|
tracker.group 'rack.request' do |group|
|
88
91
|
group.increment 'total'
|
89
92
|
group.timing 'time', duration
|
@@ -100,6 +103,7 @@ module Librato
|
|
100
103
|
end
|
101
104
|
|
102
105
|
def record_exception(exception)
|
106
|
+
return if config.disable_rack_metrics
|
103
107
|
tracker.increment 'rack.request.exceptions'
|
104
108
|
end
|
105
109
|
|
@@ -11,7 +11,8 @@ module Librato
|
|
11
11
|
#
|
12
12
|
class Configuration
|
13
13
|
attr_accessor :user, :token, :api_endpoint, :tracker, :source_pids,
|
14
|
-
:log_level, :flush_interval, :log_target
|
14
|
+
:log_level, :flush_interval, :log_target,
|
15
|
+
:disable_rack_metrics
|
15
16
|
attr_reader :prefix, :source
|
16
17
|
|
17
18
|
def initialize
|
data/lib/librato/rack/version.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'librato-rack'
|
3
|
+
|
4
|
+
config = Librato::Rack::Configuration.new
|
5
|
+
config.prefix = 'deprecated'
|
6
|
+
|
7
|
+
# old-style single-argument assignment
|
8
|
+
use Librato::Rack, config
|
9
|
+
|
10
|
+
def application(env)
|
11
|
+
[200, {"Content-Type" => 'text/html'}, ["Hello!"]]
|
12
|
+
end
|
13
|
+
|
14
|
+
run method(:application)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'librato-rack'
|
3
|
+
|
4
|
+
config = Librato::Rack::Configuration.new
|
5
|
+
config.disable_rack_metrics = true
|
6
|
+
|
7
|
+
use Librato::Rack, :config => config
|
8
|
+
|
9
|
+
def application(env)
|
10
|
+
case env['PATH_INFO']
|
11
|
+
when '/exception'
|
12
|
+
raise 'exception raised!'
|
13
|
+
else
|
14
|
+
[200, {"Content-Type" => 'text/html'}, ["Hello!"]]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
run method(:application)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
# Tests for deprecated functionality
|
5
|
+
#
|
6
|
+
class DeprecatedTest < MiniTest::Unit::TestCase
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
def app
|
10
|
+
Rack::Builder.parse_file('test/apps/deprecated.ru').first
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
# clear metrics before each run
|
15
|
+
aggregate.delete_all
|
16
|
+
counters.delete_all
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_deprecated_config_form
|
20
|
+
get '/'
|
21
|
+
assert_equal 'deprecated', Librato.tracker.config.prefix
|
22
|
+
assert_equal 1, aggregate['deprecated.rack.request.time'][:count]
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def aggregate
|
28
|
+
Librato.tracker.collector.aggregate
|
29
|
+
end
|
30
|
+
|
31
|
+
def counters
|
32
|
+
Librato.tracker.collector.counters
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
# Tests for universal tracking for all request paths
|
5
|
+
#
|
6
|
+
class NoStatsTest < MiniTest::Unit::TestCase
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
def app
|
10
|
+
Rack::Builder.parse_file('test/apps/no_stats.ru').first
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
# clear metrics before each run
|
15
|
+
aggregate.delete_all
|
16
|
+
counters.delete_all
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_no_standard_counters
|
20
|
+
get '/'
|
21
|
+
assert last_response.ok?
|
22
|
+
|
23
|
+
assert_equal nil, counters["rack.request.total"]
|
24
|
+
assert_equal nil, counters["rack.request.status.200"]
|
25
|
+
assert_equal nil, counters["rack.request.status.2xx"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_no_standard_measures
|
29
|
+
get '/'
|
30
|
+
assert last_response.ok?
|
31
|
+
|
32
|
+
assert_equal nil, aggregate["rack.request.time"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_dont_track_exceptions
|
36
|
+
begin
|
37
|
+
get '/exception'
|
38
|
+
rescue RuntimeError => e
|
39
|
+
raise unless e.message == 'exception raised!'
|
40
|
+
end
|
41
|
+
assert_equal nil, counters["rack.request.exceptions"]
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def aggregate
|
47
|
+
Librato.tracker.collector.aggregate
|
48
|
+
end
|
49
|
+
|
50
|
+
def counters
|
51
|
+
Librato.tracker.collector.counters
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: librato-rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: librato-metrics
|
@@ -69,9 +69,11 @@ files:
|
|
69
69
|
- README.md
|
70
70
|
- test/apps/basic.ru
|
71
71
|
- test/apps/custom.ru
|
72
|
-
- test/apps/
|
72
|
+
- test/apps/deprecated.ru
|
73
|
+
- test/apps/no_stats.ru
|
73
74
|
- test/integration/custom_test.rb
|
74
|
-
- test/integration/
|
75
|
+
- test/integration/deprecated_test.rb
|
76
|
+
- test/integration/no_stats_test.rb
|
75
77
|
- test/integration/request_test.rb
|
76
78
|
- test/remote/tracker_test.rb
|
77
79
|
- test/test_helper.rb
|
@@ -97,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
99
|
version: '0'
|
98
100
|
segments:
|
99
101
|
- 0
|
100
|
-
hash:
|
102
|
+
hash: 2009831152017891350
|
101
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
104
|
none: false
|
103
105
|
requirements:
|
@@ -106,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
108
|
version: '0'
|
107
109
|
segments:
|
108
110
|
- 0
|
109
|
-
hash:
|
111
|
+
hash: 2009831152017891350
|
110
112
|
requirements: []
|
111
113
|
rubyforge_project:
|
112
114
|
rubygems_version: 1.8.25
|
@@ -116,9 +118,11 @@ summary: Use Librato Metrics with your rack application
|
|
116
118
|
test_files:
|
117
119
|
- test/apps/basic.ru
|
118
120
|
- test/apps/custom.ru
|
119
|
-
- test/apps/
|
121
|
+
- test/apps/deprecated.ru
|
122
|
+
- test/apps/no_stats.ru
|
120
123
|
- test/integration/custom_test.rb
|
121
|
-
- test/integration/
|
124
|
+
- test/integration/deprecated_test.rb
|
125
|
+
- test/integration/no_stats_test.rb
|
122
126
|
- test/integration/request_test.rb
|
123
127
|
- test/remote/tracker_test.rb
|
124
128
|
- test/test_helper.rb
|
data/test/apps/heroku.ru
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'bundler/setup'
|
2
|
-
require 'librato-rack'
|
3
|
-
|
4
|
-
# Simulate the environment variables Heroku passes along
|
5
|
-
# with each request
|
6
|
-
#
|
7
|
-
class FakeHeroku
|
8
|
-
def initialize(app)
|
9
|
-
@app = app
|
10
|
-
end
|
11
|
-
|
12
|
-
def call(env)
|
13
|
-
env['HTTP_X_HEROKU_QUEUE_DEPTH'] = rand(4)
|
14
|
-
env['HTTP_X_HEROKU_QUEUE_WAIT_TIME'] = rand(0.1)
|
15
|
-
env['HTTP_X_HEROKU_DYNOS_IN_USE'] = 2
|
16
|
-
@app.call(env)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
use FakeHeroku
|
21
|
-
use Librato::Rack
|
22
|
-
|
23
|
-
def application(env)
|
24
|
-
[200, {"Content-Type" => 'text/html'}, ["Hello!"]]
|
25
|
-
end
|
26
|
-
|
27
|
-
run method(:application)
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'rack/test'
|
3
|
-
|
4
|
-
# Tests for universal tracking for all request paths
|
5
|
-
#
|
6
|
-
class HerokuTest < MiniTest::Unit::TestCase
|
7
|
-
include Rack::Test::Methods
|
8
|
-
|
9
|
-
def app
|
10
|
-
Rack::Builder.parse_file('test/apps/heroku.ru').first
|
11
|
-
end
|
12
|
-
|
13
|
-
def teardown
|
14
|
-
# clear metrics before each run
|
15
|
-
aggregate.delete_all
|
16
|
-
counters.delete_all
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_heroku_metrics
|
20
|
-
get '/'
|
21
|
-
assert_equal 1, aggregate['rack.heroku.queue.depth'][:count]
|
22
|
-
assert_equal 1, aggregate['rack.heroku.queue.wait_time'][:count]
|
23
|
-
assert_equal 1, aggregate['rack.heroku.dynos'][:count]
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def aggregate
|
29
|
-
Librato.tracker.collector.aggregate
|
30
|
-
end
|
31
|
-
|
32
|
-
def counters
|
33
|
-
Librato.tracker.collector.counters
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|