rack-honeycomb 0.0.18 → 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.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/Rakefile +9 -0
- data/lib/rack/honeycomb/middleware.rb +64 -59
- data/lib/rack/honeycomb/version.rb +1 -1
- data/rack-honeycomb.gemspec +1 -3
- metadata +16 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e14df43e7812c1c6c4943e872d9fc71f653336d46ba04d97e15dcad5c8ef1b55
|
4
|
+
data.tar.gz: 58e4a3cb98d1e9ecdcbf4f4175693d0783c175810e317b9dc80f10952abee9d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68d18614019d1d0d16a95c8bd09b0a0f137ae7c838ebd2a0377d9c2d4a455a9f330eba458521ebd4fba836b328c89fd5b1aca79c8fcc7fc988a660873fe08ec3
|
7
|
+
data.tar.gz: 8fd87ec1879faf03a28e85ece8a27a58de2a8d777f8d1df45ca9c7126c9b962a613cd3f42e8f1082d342a01f217e3df80c6c8a00b491cd499e8651f5ac299a7f
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/Rakefile
ADDED
@@ -1,19 +1,24 @@
|
|
1
1
|
require "libhoney"
|
2
2
|
|
3
|
+
require 'rack'
|
3
4
|
require "rack/honeycomb/version"
|
4
5
|
|
5
6
|
module Rack
|
6
7
|
module Honeycomb
|
7
|
-
# Prefix for attaching
|
8
|
+
# Prefix for attaching custom fields to the `env`. Will be deleted from
|
8
9
|
# the `env` once it's pulled off of the `env` and onto a Honeycomb event.
|
9
10
|
ENV_PREFIX = "honeycomb."
|
10
11
|
|
12
|
+
# Custom fields added via the `env` will be added to the Honeycomb
|
13
|
+
# event under this namespace prefix
|
14
|
+
APP_FIELD_NAMESPACE = 'app'.freeze
|
15
|
+
|
16
|
+
RACK_VERSION = ::Rack::VERSION.join('.').freeze
|
17
|
+
|
11
18
|
class Middleware
|
12
19
|
ENV_REGEX = /^#{ Regexp.escape ENV_PREFIX }/
|
13
20
|
USER_AGENT_SUFFIX = "rack-honeycomb/#{VERSION}"
|
14
|
-
|
15
|
-
attr_reader :app
|
16
|
-
attr_reader :options
|
21
|
+
EVENT_TYPE = 'http_request'.freeze
|
17
22
|
|
18
23
|
##
|
19
24
|
# @param [#call] app
|
@@ -24,88 +29,88 @@ module Rack
|
|
24
29
|
def initialize(app, options = {})
|
25
30
|
@app, @options = app, options
|
26
31
|
|
27
|
-
|
32
|
+
honeycomb = if client = options.delete(:client)
|
28
33
|
client
|
29
34
|
elsif defined?(::Honeycomb.client)
|
30
35
|
::Honeycomb.client
|
31
36
|
else
|
32
37
|
Libhoney::Client.new(options.merge(user_agent_addition: USER_AGENT_SUFFIX))
|
33
38
|
end
|
39
|
+
@builder = honeycomb.builder.
|
40
|
+
add(
|
41
|
+
'meta.package' => 'rack',
|
42
|
+
'meta.package_version' => RACK_VERSION,
|
43
|
+
'type' => EVENT_TYPE,
|
44
|
+
'local_hostname' => Socket.gethostname,
|
45
|
+
)
|
34
46
|
|
35
47
|
@service_name = options.delete(:service_name) || :rack
|
36
48
|
end
|
37
49
|
|
38
|
-
def
|
39
|
-
ev
|
40
|
-
end
|
50
|
+
def call(env)
|
51
|
+
ev = @builder.event
|
41
52
|
|
42
|
-
|
43
|
-
add_field(ev, field, env[field])
|
44
|
-
end
|
53
|
+
add_request_fields(ev, env)
|
45
54
|
|
46
|
-
|
47
|
-
|
48
|
-
request_started_at = Time.now
|
49
|
-
status, headers, response = adding_span_metadata_if_available(ev, env) do
|
55
|
+
start = Time.now
|
56
|
+
status, headers, body = adding_span_metadata_if_available(ev, env) do
|
50
57
|
@app.call(env)
|
51
58
|
end
|
52
|
-
request_ended_at = Time.now
|
53
59
|
|
54
|
-
ev
|
55
|
-
if headers['Content-Length'] != nil
|
56
|
-
# Content-Length (if present) is a string. let's change it to an int.
|
57
|
-
ev.add_field('Content-Length', headers['Content-Length'].to_i)
|
58
|
-
end
|
59
|
-
add_field(ev, 'HTTP_STATUS', status)
|
60
|
-
add_field(ev, 'durationMs', (request_ended_at - request_started_at) * 1000)
|
60
|
+
add_app_fields(ev, env)
|
61
61
|
|
62
|
-
|
63
|
-
# inside the Rack handler.
|
64
|
-
env.each_pair do |k, v|
|
65
|
-
if k.is_a?(String) && k.match(ENV_REGEX)
|
66
|
-
add_field(ev, k.sub(ENV_REGEX, ''), v)
|
67
|
-
env.delete(k)
|
68
|
-
end
|
69
|
-
end
|
62
|
+
add_response_fields(ev, status, headers, body)
|
70
63
|
|
71
|
-
|
72
|
-
# pull out some interesting and potentially useful fields.
|
73
|
-
add_env(ev, env, 'rack.version')
|
74
|
-
add_env(ev, env, 'rack.multithread')
|
75
|
-
add_env(ev, env, 'rack.multiprocess')
|
76
|
-
add_env(ev, env, 'rack.run_once')
|
77
|
-
add_env(ev, env, 'SCRIPT_NAME')
|
78
|
-
add_env(ev, env, 'QUERY_STRING')
|
79
|
-
add_env(ev, env, 'SERVER_PROTOCOL')
|
80
|
-
add_env(ev, env, 'SERVER_SOFTWARE')
|
81
|
-
add_env(ev, env, 'GATEWAY_INTERFACE')
|
82
|
-
add_env(ev, env, 'REQUEST_METHOD')
|
83
|
-
add_env(ev, env, 'REQUEST_PATH')
|
84
|
-
add_env(ev, env, 'REQUEST_URI')
|
85
|
-
add_env(ev, env, 'HTTP_VERSION')
|
86
|
-
add_env(ev, env, 'HTTP_HOST')
|
87
|
-
add_env(ev, env, 'HTTP_CONNECTION')
|
88
|
-
add_env(ev, env, 'HTTP_CACHE_CONTROL')
|
89
|
-
add_env(ev, env, 'HTTP_UPGRADE_INSECURE_REQUESTS')
|
90
|
-
add_env(ev, env, 'HTTP_USER_AGENT')
|
91
|
-
add_env(ev, env, 'HTTP_ACCEPT')
|
92
|
-
add_env(ev, env, 'HTTP_ACCEPT_LANGUAGE')
|
93
|
-
add_env(ev, env, 'REMOTE_ADDR')
|
94
|
-
|
95
|
-
[status, headers, response]
|
64
|
+
[status, headers, body]
|
96
65
|
rescue Exception => e
|
97
66
|
if ev
|
98
|
-
ev.add_field('
|
99
|
-
ev.add_field('
|
67
|
+
ev.add_field('request.error', e.class.name)
|
68
|
+
ev.add_field('request.error_detail', e.message)
|
100
69
|
end
|
101
70
|
raise
|
102
71
|
ensure
|
103
|
-
if ev
|
72
|
+
if ev && start
|
73
|
+
finish = Time.now
|
74
|
+
ev.add_field('duration_ms', (finish - start) * 1000)
|
75
|
+
|
104
76
|
ev.send
|
105
77
|
end
|
106
78
|
end
|
107
79
|
|
108
80
|
private
|
81
|
+
def add_request_fields(event, env)
|
82
|
+
event.add_field('name', "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}")
|
83
|
+
|
84
|
+
event.add_field('request.method', env['REQUEST_METHOD'])
|
85
|
+
event.add_field('request.path', env['PATH_INFO'])
|
86
|
+
event.add_field('request.protocol', env['rack.url_scheme'])
|
87
|
+
|
88
|
+
if env['QUERY_STRING'] && !env['QUERY_STRING'].empty?
|
89
|
+
event.add_field('request.query_string', env['QUERY_STRING'])
|
90
|
+
end
|
91
|
+
|
92
|
+
event.add_field('request.http_version', env['HTTP_VERSION'])
|
93
|
+
event.add_field('request.host', env['HTTP_HOST'])
|
94
|
+
event.add_field('request.remote_addr', env['REMOTE_ADDR'])
|
95
|
+
event.add_field('request.header.user_agent', env['HTTP_USER_AGENT'])
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_app_fields(event, env)
|
99
|
+
# Pull arbitrary metadata off `env` if the caller attached
|
100
|
+
# anything inside the Rack handler.
|
101
|
+
env.each_pair do |k, v|
|
102
|
+
if k.is_a?(String) && k.match(ENV_REGEX)
|
103
|
+
namespaced_k = "#{APP_FIELD_NAMESPACE}.#{k.sub(ENV_REGEX, '')}"
|
104
|
+
event.add_field(namespaced_k, v)
|
105
|
+
env.delete(k)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def add_response_fields(event, status, headers, body)
|
111
|
+
event.add_field('response.status_code', status)
|
112
|
+
end
|
113
|
+
|
109
114
|
def adding_span_metadata_if_available(event, env)
|
110
115
|
return yield unless defined?(::Honeycomb.with_trace_id)
|
111
116
|
|
data/rack-honeycomb.gemspec
CHANGED
@@ -31,11 +31,9 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "bump"
|
32
32
|
spec.add_development_dependency "bundler", "~> 1.7"
|
33
33
|
spec.add_development_dependency "rake", "~> 10.0"
|
34
|
-
spec.add_development_dependency "webmock", "~> 2.1"
|
35
|
-
spec.add_development_dependency "minitest", "~> 5.0"
|
36
|
-
spec.add_development_dependency "yardstick", "~> 0.9"
|
37
34
|
spec.add_development_dependency 'rack', '>= 1.0.0'
|
38
35
|
spec.add_runtime_dependency 'libhoney', '>= 1.5.0'
|
36
|
+
spec.add_development_dependency 'rspec'
|
39
37
|
spec.add_development_dependency 'rack-test'
|
40
38
|
spec.add_development_dependency 'yard'
|
41
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-honeycomb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Honeycomb.io Team
|
@@ -53,75 +53,47 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '2.1'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '2.1'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: minitest
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '5.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '5.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: yardstick
|
56
|
+
name: rack
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
86
58
|
requirements:
|
87
|
-
- - "
|
59
|
+
- - ">="
|
88
60
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
61
|
+
version: 1.0.0
|
90
62
|
type: :development
|
91
63
|
prerelease: false
|
92
64
|
version_requirements: !ruby/object:Gem::Requirement
|
93
65
|
requirements:
|
94
|
-
- - "
|
66
|
+
- - ">="
|
95
67
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
68
|
+
version: 1.0.0
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
70
|
+
name: libhoney
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
100
72
|
requirements:
|
101
73
|
- - ">="
|
102
74
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.
|
104
|
-
type: :
|
75
|
+
version: 1.5.0
|
76
|
+
type: :runtime
|
105
77
|
prerelease: false
|
106
78
|
version_requirements: !ruby/object:Gem::Requirement
|
107
79
|
requirements:
|
108
80
|
- - ">="
|
109
81
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.
|
82
|
+
version: 1.5.0
|
111
83
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
84
|
+
name: rspec
|
113
85
|
requirement: !ruby/object:Gem::Requirement
|
114
86
|
requirements:
|
115
87
|
- - ">="
|
116
88
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
118
|
-
type: :
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
119
91
|
prerelease: false
|
120
92
|
version_requirements: !ruby/object:Gem::Requirement
|
121
93
|
requirements:
|
122
94
|
- - ">="
|
123
95
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
96
|
+
version: '0'
|
125
97
|
- !ruby/object:Gem::Dependency
|
126
98
|
name: rack-test
|
127
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,11 +129,13 @@ extensions: []
|
|
157
129
|
extra_rdoc_files: []
|
158
130
|
files:
|
159
131
|
- ".gitignore"
|
132
|
+
- ".rspec"
|
160
133
|
- ".travis.yml"
|
161
134
|
- CONTRIBUTORS
|
162
135
|
- Gemfile
|
163
136
|
- LICENSE
|
164
137
|
- README.md
|
138
|
+
- Rakefile
|
165
139
|
- lib/rack-honeycomb.rb
|
166
140
|
- lib/rack-honeycomb/auto_install.rb
|
167
141
|
- lib/rack/honeycomb.rb
|