vault-tools 0.3.10 → 0.3.11
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/lib/vault-tools/config.rb +5 -1
- data/lib/vault-tools/log.rb +20 -10
- data/lib/vault-tools/version.rb +1 -1
- data/lib/vault-tools/web.rb +1 -1
- data/test/config_test.rb +5 -1
- data/test/helper.rb +4 -0
- data/test/log_test.rb +56 -30
- data/test/web_test.rb +10 -8
- metadata +16 -52
data/lib/vault-tools/config.rb
CHANGED
data/lib/vault-tools/log.rb
CHANGED
@@ -3,9 +3,10 @@ module Vault
|
|
3
3
|
# Log a count metric.
|
4
4
|
#
|
5
5
|
# @param name [String] The name of the metric.
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
# @param value [Integer] The number of items counted. Can be suffixed with a unit.
|
7
|
+
# @param extra_data [Hash] Optional extra data to log.
|
8
|
+
def self.count(name, value = 1, extra_data = {})
|
9
|
+
log(extra_data.merge("count##{Config.app_name}.#{name}" => value))
|
9
10
|
end
|
10
11
|
|
11
12
|
# Log an HTTP status code. Two log metrics are written each time this
|
@@ -20,24 +21,32 @@ module Vault
|
|
20
21
|
#
|
21
22
|
# @param status [Fixnum] The HTTP status code to record.
|
22
23
|
def self.count_status(status)
|
23
|
-
count("
|
24
|
+
count("http.#{status}")
|
24
25
|
if status_prefix = status.to_s.match(/\d/)[0]
|
25
|
-
count("
|
26
|
+
count("http.#{status_prefix}xx")
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
# Log a measurement.
|
31
|
+
#
|
32
|
+
# @param name [String] The name of the metric.
|
33
|
+
# @param value [Float] Value for the metric. A unit may be appended.
|
34
|
+
# @param extra_data [Hash] Optional extra data to log.
|
35
|
+
def self.measure(name, value, extra_data = {})
|
36
|
+
log(extra_data.merge("measure##{Config.app_name}.#{name}" => value))
|
37
|
+
end
|
38
|
+
|
29
39
|
# Log a timing metric.
|
30
40
|
#
|
31
41
|
# @param name [String] A Sinatra-formatted route URL.
|
32
|
-
# @param duration [Fixnum] The duration to record, in
|
33
|
-
# milliseconds.
|
42
|
+
# @param duration [Fixnum] The duration to record, in milliseconds.
|
34
43
|
def self.time(name, duration)
|
35
44
|
if name
|
36
45
|
name.gsub(/\/:\w+/, ''). # Remove param names from path.
|
37
|
-
gsub("/", "
|
46
|
+
gsub("/", "-"). # Replace slash with dash.
|
38
47
|
gsub(/[^A-Za-z0-9\-\_]/, ''). # Only keep subset of chars.
|
39
|
-
|
40
|
-
tap { |name|
|
48
|
+
sub(/^-/, ""). # Strip the leading dash.
|
49
|
+
tap { |name| measure(name, "#{duration}ms") }
|
41
50
|
end
|
42
51
|
end
|
43
52
|
|
@@ -48,6 +57,7 @@ module Vault
|
|
48
57
|
# @param block [Proc] Optionally, a block of code to run before writing
|
49
58
|
# the log message.
|
50
59
|
def self.log(data, &block)
|
60
|
+
data['source'] ||= Config.app_deploy if Config.app_deploy
|
51
61
|
Scrolls.log(data, &block)
|
52
62
|
end
|
53
63
|
end
|
data/lib/vault-tools/version.rb
CHANGED
data/lib/vault-tools/web.rb
CHANGED
@@ -37,7 +37,7 @@ module Vault
|
|
37
37
|
# Log details about the request including how long it took.
|
38
38
|
after do
|
39
39
|
Log.count_status(response.status)
|
40
|
-
Log.time(@action, Time.now - @start_request)
|
40
|
+
Log.time("http.#{@action}", (Time.now - @start_request) * 1000)
|
41
41
|
end
|
42
42
|
|
43
43
|
# Make sure error handler blocks are invoked in tests.
|
data/test/config_test.rb
CHANGED
@@ -39,11 +39,15 @@ class ConfigTest < Vault::TestCase
|
|
39
39
|
# Vault::Config.app_name returns the value of the APP_NAME environment
|
40
40
|
# variable.
|
41
41
|
def test_app_name
|
42
|
-
Vault::Config.app_name.must_equal nil
|
43
42
|
set_env 'APP_NAME', "my-app"
|
44
43
|
Vault::Config.app_name.must_equal 'my-app'
|
45
44
|
end
|
46
45
|
|
46
|
+
def test_app_deploy
|
47
|
+
set_env 'APP_DEPLOY', "test"
|
48
|
+
Vault::Config.app_deploy.must_equal 'test'
|
49
|
+
end
|
50
|
+
|
47
51
|
def test_port_raises
|
48
52
|
assert_raises RuntimeError do
|
49
53
|
Vault::Config.port
|
data/test/helper.rb
CHANGED
data/test/log_test.rb
CHANGED
@@ -1,59 +1,79 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class LogTest < Vault::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
set_env('APP_NAME', 'test-app')
|
7
|
+
set_env('APP_DEPLOY', 'test-deploy')
|
8
|
+
end
|
9
|
+
|
4
10
|
# Vault::Log.count emits a metric, using the specified name, that represents
|
5
11
|
# a countable event.
|
6
12
|
def test_count
|
7
|
-
set_env('APP_NAME', nil)
|
8
13
|
Vault::Log.count('countable')
|
9
|
-
|
14
|
+
assert_equal '1', logged_data['count#test-app.countable']
|
15
|
+
assert_equal 'test-deploy', logged_data['source']
|
10
16
|
end
|
11
17
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
set_env('APP_NAME', 'vault_app')
|
17
|
-
Vault::Log.count('countable')
|
18
|
-
assert_match(/count#vault_app.countable=1/, Scrolls.stream.string)
|
18
|
+
def test_count_with_specified_value
|
19
|
+
Vault::Log.count('countable', 5)
|
20
|
+
assert_equal '5', logged_data['count#test-app.countable']
|
21
|
+
assert_equal 'test-deploy', logged_data['source']
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
24
|
+
def test_count_with_extra_data
|
25
|
+
Vault::Log.count('countable', 1, 'request_id' => 'abc')
|
26
|
+
assert_equal '1', logged_data['count#test-app.countable']
|
27
|
+
assert_equal 'abc', logged_data['request_id']
|
28
|
+
end
|
29
|
+
|
30
|
+
# Vault::Log.count_status emits metrics to measure HTTP responses.
|
23
31
|
def test_count_status
|
24
|
-
set_env('APP_NAME', nil)
|
25
32
|
Vault::Log.count_status(201)
|
26
|
-
|
27
|
-
|
33
|
+
assert_equal '1', logged_data['count#test-app.http.201']
|
34
|
+
assert_equal '1', logged_data['count#test-app.http.2xx']
|
35
|
+
assert_equal 'test-deploy', logged_data['source']
|
28
36
|
end
|
29
37
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
+
def test_measure
|
39
|
+
Vault::Log.measure('thinking', 123.4)
|
40
|
+
assert_equal '123.400', logged_data['measure#test-app.thinking']
|
41
|
+
assert_equal 'test-deploy', logged_data['source']
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_measure_with_units
|
45
|
+
Vault::Log.measure('thinking', '123.4ms')
|
46
|
+
assert_equal '123.4ms', logged_data['measure#test-app.thinking']
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_measure_with_extra_data
|
50
|
+
Vault::Log.measure('thinking', '123.4', 'request_id' => 'abc')
|
51
|
+
assert_equal '123.4', logged_data['measure#test-app.thinking']
|
52
|
+
assert_equal 'abc', logged_data['request_id']
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_time
|
56
|
+
Vault::Log.time('thinking', 123.4)
|
57
|
+
assert_equal '123.4ms', logged_data['measure#test-app.thinking']
|
38
58
|
end
|
39
59
|
|
40
60
|
# Vault::Log.time emits a metric to measure the duration of an HTTP request.
|
41
61
|
# It converts slashes to underscores.
|
42
|
-
def
|
62
|
+
def test_time_replaces_slash_with_dash
|
43
63
|
Vault::Log.time('/some/web/path', 123.4)
|
44
|
-
|
64
|
+
assert_equal '123.4ms', logged_data['measure#test-app.some-web-path']
|
45
65
|
end
|
46
66
|
|
47
67
|
# Vault::Log.time removes parameters.
|
48
68
|
def test_time_removes_parameters
|
49
69
|
Vault::Log.time('/some/:web/path', 123.4)
|
50
|
-
|
70
|
+
assert_equal '123.4ms', logged_data['measure#test-app.some-path']
|
51
71
|
end
|
52
72
|
|
53
73
|
# Vault::Log.time removes non-alphanumeric characters.
|
54
74
|
def test_time_removes_non_alphanumeric_characters
|
55
75
|
Vault::Log.time('/some/web+path', 123.4)
|
56
|
-
|
76
|
+
assert_equal '123.4ms', logged_data['measure#test-app.some-webpath']
|
57
77
|
end
|
58
78
|
|
59
79
|
# Vault::Log.time is a no-op if a nil name is provided.
|
@@ -66,8 +86,12 @@ class LogTest < Vault::TestCase
|
|
66
86
|
# specified hash.
|
67
87
|
def test_log
|
68
88
|
Vault::Log.log(integer: 123, float: 123.4, string: 'string', bool: false)
|
69
|
-
|
70
|
-
|
89
|
+
assert_equal 'test-deploy', logged_data['source']
|
90
|
+
assert_equal '123', logged_data['integer']
|
91
|
+
assert_equal '123.400', logged_data['float']
|
92
|
+
assert_equal 'string', logged_data['string']
|
93
|
+
assert_equal 'false', logged_data['bool']
|
94
|
+
assert_equal '123.400', logged_data['float']
|
71
95
|
end
|
72
96
|
|
73
97
|
# Vault::Log.log can be used to measure the time spent in a block.
|
@@ -75,7 +99,9 @@ class LogTest < Vault::TestCase
|
|
75
99
|
Vault::Log.log(A: true) do
|
76
100
|
Vault::Log.log(B: true)
|
77
101
|
end
|
78
|
-
|
79
|
-
|
102
|
+
assert_equal 'true', logged_data['A']
|
103
|
+
assert_equal 'true', logged_data['B']
|
104
|
+
assert_equal 'test-deploy', logged_data['source']
|
105
|
+
assert_match /\d/, logged_data['elapsed']
|
80
106
|
end
|
81
107
|
end
|
data/test/web_test.rb
CHANGED
@@ -11,6 +11,8 @@ class WebTest < Vault::TestCase
|
|
11
11
|
# Always reload the web class to eliminate test leakage
|
12
12
|
def setup
|
13
13
|
super
|
14
|
+
set_env('APP_NAME', 'test-app')
|
15
|
+
set_env('APP_DEPLOY', 'testing')
|
14
16
|
reload_web!
|
15
17
|
end
|
16
18
|
|
@@ -42,8 +44,8 @@ class WebTest < Vault::TestCase
|
|
42
44
|
# requests.
|
43
45
|
def test_head_status_check
|
44
46
|
head '/'
|
45
|
-
|
46
|
-
|
47
|
+
assert_equal '1', logged_data['count#test-app.http.200']
|
48
|
+
assert_equal '1', logged_data['count#test-app.http.2xx']
|
47
49
|
assert_equal(200, last_response.status)
|
48
50
|
end
|
49
51
|
|
@@ -51,8 +53,8 @@ class WebTest < Vault::TestCase
|
|
51
53
|
# response body.
|
52
54
|
def test_get_health_check
|
53
55
|
get '/health'
|
54
|
-
|
55
|
-
|
56
|
+
assert_equal '1', logged_data['count#test-app.http.200']
|
57
|
+
assert_equal '1', logged_data['count#test-app.http.2xx']
|
56
58
|
assert_equal(200, last_response.status)
|
57
59
|
assert_equal('OK', last_response.body)
|
58
60
|
end
|
@@ -61,8 +63,8 @@ class WebTest < Vault::TestCase
|
|
61
63
|
# match a known resource.
|
62
64
|
def test_head_with_unknown_endpoint
|
63
65
|
head '/unknown'
|
64
|
-
|
65
|
-
|
66
|
+
assert_equal '1', logged_data['count#test-app.http.404']
|
67
|
+
assert_equal '1', logged_data['count#test-app.http.4xx']
|
66
68
|
assert_equal(404, last_response.status)
|
67
69
|
end
|
68
70
|
|
@@ -70,8 +72,8 @@ class WebTest < Vault::TestCase
|
|
70
72
|
# traceback is also written to the response body to ease debugging.
|
71
73
|
def test_error_logs_500
|
72
74
|
get '/boom'
|
73
|
-
|
74
|
-
|
75
|
+
assert_equal '1', logged_data['count#test-app.http.500']
|
76
|
+
assert_equal '1', logged_data['count#test-app.http.5xx']
|
75
77
|
assert_match(/^RuntimeError: An expected error occurred.$/m,
|
76
78
|
last_response.body)
|
77
79
|
assert_equal(500, last_response.status)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vault-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-10-
|
13
|
+
date: 2013-10-24 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: scrolls
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirement: &2156169280 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,15 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements:
|
26
|
-
none: false
|
27
|
-
requirements:
|
28
|
-
- - ! '>='
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
25
|
+
version_requirements: *2156169280
|
31
26
|
- !ruby/object:Gem::Dependency
|
32
27
|
name: sinatra
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
28
|
+
requirement: &2156168860 !ruby/object:Gem::Requirement
|
34
29
|
none: false
|
35
30
|
requirements:
|
36
31
|
- - ! '>='
|
@@ -38,15 +33,10 @@ dependencies:
|
|
38
33
|
version: '0'
|
39
34
|
type: :runtime
|
40
35
|
prerelease: false
|
41
|
-
version_requirements:
|
42
|
-
none: false
|
43
|
-
requirements:
|
44
|
-
- - ! '>='
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
36
|
+
version_requirements: *2156168860
|
47
37
|
- !ruby/object:Gem::Dependency
|
48
38
|
name: uuidtools
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
39
|
+
requirement: &2156168440 !ruby/object:Gem::Requirement
|
50
40
|
none: false
|
51
41
|
requirements:
|
52
42
|
- - ! '>='
|
@@ -54,15 +44,10 @@ dependencies:
|
|
54
44
|
version: '0'
|
55
45
|
type: :runtime
|
56
46
|
prerelease: false
|
57
|
-
version_requirements:
|
58
|
-
none: false
|
59
|
-
requirements:
|
60
|
-
- - ! '>='
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0'
|
47
|
+
version_requirements: *2156168440
|
63
48
|
- !ruby/object:Gem::Dependency
|
64
49
|
name: rack-ssl-enforcer
|
65
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirement: &2156168020 !ruby/object:Gem::Requirement
|
66
51
|
none: false
|
67
52
|
requirements:
|
68
53
|
- - ! '>='
|
@@ -70,15 +55,10 @@ dependencies:
|
|
70
55
|
version: '0'
|
71
56
|
type: :runtime
|
72
57
|
prerelease: false
|
73
|
-
version_requirements:
|
74
|
-
none: false
|
75
|
-
requirements:
|
76
|
-
- - ! '>='
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: '0'
|
58
|
+
version_requirements: *2156168020
|
79
59
|
- !ruby/object:Gem::Dependency
|
80
60
|
name: heroku-api
|
81
|
-
requirement: !ruby/object:Gem::Requirement
|
61
|
+
requirement: &2156167600 !ruby/object:Gem::Requirement
|
82
62
|
none: false
|
83
63
|
requirements:
|
84
64
|
- - ! '>='
|
@@ -86,28 +66,18 @@ dependencies:
|
|
86
66
|
version: '0'
|
87
67
|
type: :runtime
|
88
68
|
prerelease: false
|
89
|
-
version_requirements:
|
90
|
-
none: false
|
91
|
-
requirements:
|
92
|
-
- - ! '>='
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: '0'
|
69
|
+
version_requirements: *2156167600
|
95
70
|
- !ruby/object:Gem::Dependency
|
96
71
|
name: fernet
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirement: &2156167100 !ruby/object:Gem::Requirement
|
98
73
|
none: false
|
99
74
|
requirements:
|
100
|
-
- -
|
75
|
+
- - =
|
101
76
|
- !ruby/object:Gem::Version
|
102
77
|
version: 2.0.rc2
|
103
78
|
type: :runtime
|
104
79
|
prerelease: false
|
105
|
-
version_requirements:
|
106
|
-
none: false
|
107
|
-
requirements:
|
108
|
-
- - '='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 2.0.rc2
|
80
|
+
version_requirements: *2156167100
|
111
81
|
description: Basic tools for Heroku Vault's Ruby projects
|
112
82
|
email:
|
113
83
|
- christopher.continanza@gmail.com
|
@@ -164,21 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
134
|
- - ! '>='
|
165
135
|
- !ruby/object:Gem::Version
|
166
136
|
version: '0'
|
167
|
-
segments:
|
168
|
-
- 0
|
169
|
-
hash: 3536867358711533404
|
170
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
138
|
none: false
|
172
139
|
requirements:
|
173
140
|
- - ! '>='
|
174
141
|
- !ruby/object:Gem::Version
|
175
142
|
version: '0'
|
176
|
-
segments:
|
177
|
-
- 0
|
178
|
-
hash: 3536867358711533404
|
179
143
|
requirements: []
|
180
144
|
rubyforge_project:
|
181
|
-
rubygems_version: 1.8.
|
145
|
+
rubygems_version: 1.8.9
|
182
146
|
signing_key:
|
183
147
|
specification_version: 3
|
184
148
|
summary: Test classes, base web classes, and helpers - oh my!
|