rack-honeycomb 0.0.16 → 0.0.17

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd607cec0d5aee31890fe76f0a053315e767f6f2be87ebe0dab906194372649e
4
- data.tar.gz: 455582fb49afd1fd9d191a00689a29080a98d859ee138e3341997ff2b4554019
3
+ metadata.gz: 46fc6f3a8fbb4c2bb926c92bcd101313e3ec79795735664c851e230e55579bea
4
+ data.tar.gz: ed408d7ce0baf8aa98eeff6ae6461527692199a1c7685739acf794e36f42d122
5
5
  SHA512:
6
- metadata.gz: 24a61539ccbd7908a35f6335b66893451044aa4a7b34f642d792cfc721b506a7489cd8c7fdc18435bacfca37ddc54bce09c9789bf9014be64d6788e0b3a6ea95
7
- data.tar.gz: ed0535c26cc1734cc49464b24fa374ca10845f0c6b2acb696260d4b24d989a4db3cecc28fc14b421afa5c8c3351a38c2e145fd254ea574f9d149cded31e2e664
6
+ metadata.gz: aa105613b9fcd20e15bee4e52c17e1917bce0cd5220cc95c4966f3db51b1b86529296d6647209c4be5f9a8f92148c5f386e5003119b3f2507558cc771a3c4dbb
7
+ data.tar.gz: ed4bc78029b0e442ea125284791ed92e806deaa1018630481a341aa0fc359a64dd486824c1f8904261a03abca89ec64d75948e427a462efac899dac7cdb2d548
@@ -0,0 +1,7 @@
1
+ begin
2
+ gem 'rack'
3
+
4
+ require 'rack/honeycomb'
5
+ rescue Gem::LoadError
6
+ warn 'Rack not detected, not enabling rack-honeycomb'
7
+ end
@@ -0,0 +1,53 @@
1
+ module Rack
2
+ module Honeycomb
3
+ # @api private
4
+ module AutoInstall
5
+ class << self
6
+ def available?(logger: nil)
7
+ gem 'rack'
8
+ gem 'sinatra'
9
+ true
10
+ rescue Gem::LoadError => e
11
+ if e.name == 'sinatra'
12
+ logger.debug "Couldn't detect web framework, not autoinitialising rack-honeycomb" if logger
13
+ end
14
+ false
15
+ end
16
+
17
+ def auto_install!(honeycomb_client:, logger: nil)
18
+ require 'rack'
19
+ require 'sinatra/base'
20
+
21
+ require 'rack-honeycomb'
22
+
23
+ class << ::Sinatra::Base
24
+ alias build_without_honeycomb build
25
+ end
26
+
27
+ ::Sinatra::Base.define_singleton_method(:build) do |*args, &block|
28
+ if !AutoInstall.already_added
29
+ self.use Rack::Honeycomb::Middleware, client: honeycomb_client
30
+ AutoInstall.already_added = true
31
+ else
32
+ # In the case of nested Sinatra apps - apps composed of other apps
33
+ # (in addition to just handlers and middleware) - our .build hook
34
+ # above will fire multiple times, for the parent app and also for
35
+ # each child app. In that case, it's hard to hook in our
36
+ # middleware reliably - so instead, we just want to warn the user
37
+ # and avoid doing anything silly.
38
+
39
+ unless AutoInstall.already_warned
40
+ warn "Honeycomb auto-instrumentation of Sinatra will probably not work, try manual installation"
41
+ AutoInstall.already_warned = true
42
+ end
43
+ end
44
+ build_without_honeycomb(*args, &block)
45
+ end
46
+ end
47
+
48
+ attr_accessor :already_added
49
+ attr_accessor :already_warned
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,4 +1,5 @@
1
1
  require "libhoney"
2
+
2
3
  require "rack/honeycomb/version"
3
4
 
4
5
  module Rack
@@ -23,7 +24,15 @@ module Rack
23
24
  def initialize(app, options = {})
24
25
  @app, @options = app, options
25
26
 
26
- @honeycomb = Libhoney::Client.new(options.merge(user_agent_addition: USER_AGENT_SUFFIX))
27
+ @honeycomb = if client = options.delete(:client)
28
+ client
29
+ elsif defined?(::Honeycomb.client)
30
+ ::Honeycomb.client
31
+ else
32
+ Libhoney::Client.new(options.merge(user_agent_addition: USER_AGENT_SUFFIX))
33
+ end
34
+
35
+ @service_name = options.delete(:service_name) || :rack
27
36
  end
28
37
 
29
38
  def add_field(ev, field, value)
@@ -37,7 +46,9 @@ module Rack
37
46
  def call(env)
38
47
  ev = @honeycomb.event
39
48
  request_started_at = Time.now
40
- status, headers, response = @app.call(env)
49
+ status, headers, response = adding_span_metadata_if_available(ev, env) do
50
+ @app.call(env)
51
+ end
41
52
  request_ended_at = Time.now
42
53
 
43
54
  ev.add(headers)
@@ -46,7 +57,7 @@ module Rack
46
57
  ev.add_field('Content-Length', headers['Content-Length'].to_i)
47
58
  end
48
59
  add_field(ev, 'HTTP_STATUS', status)
49
- add_field(ev, 'REQUEST_TIME_MS', (request_ended_at - request_started_at) * 1000)
60
+ add_field(ev, 'durationMs', (request_ended_at - request_started_at) * 1000)
50
61
 
51
62
  # Pull arbitrary metadata off `env` if the caller attached anything
52
63
  # inside the Rack handler.
@@ -80,9 +91,34 @@ module Rack
80
91
  add_env(ev, env, 'HTTP_ACCEPT')
81
92
  add_env(ev, env, 'HTTP_ACCEPT_LANGUAGE')
82
93
  add_env(ev, env, 'REMOTE_ADDR')
83
- ev.send
84
94
 
85
95
  [status, headers, response]
96
+ rescue Exception => e
97
+ if ev
98
+ ev.add_field('exception_class', e.class.name)
99
+ ev.add_field('exception_message', e.message)
100
+ end
101
+ raise
102
+ ensure
103
+ if ev
104
+ ev.send
105
+ end
106
+ end
107
+
108
+ private
109
+ def adding_span_metadata_if_available(event, env)
110
+ return yield unless defined?(::Honeycomb.with_trace_id)
111
+
112
+ ::Honeycomb.with_trace_id do |trace_id|
113
+ event.add_field :traceId, trace_id
114
+ event.add_field :serviceName, @service_name
115
+ event.add_field :name, "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']}"
116
+ span_id = trace_id # so this shows up as a root span
117
+ event.add_field :id, span_id
118
+ ::Honeycomb.with_span_id(span_id) do
119
+ yield
120
+ end
121
+ end
86
122
  end
87
123
  end
88
124
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Honeycomb
3
- VERSION="0.0.16"
3
+ VERSION="0.0.17"
4
4
  end
5
5
  end
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency "webmock", "~> 2.1"
35
35
  spec.add_development_dependency "minitest", "~> 5.0"
36
36
  spec.add_development_dependency "yardstick", "~> 0.9"
37
- spec.add_runtime_dependency 'rack', '>= 1.0.0'
37
+ spec.add_development_dependency 'rack', '>= 1.0.0'
38
38
  spec.add_runtime_dependency 'libhoney', '>= 1.5.0'
39
39
  spec.add_development_dependency 'rack-test'
40
40
  spec.add_development_dependency 'yard'
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.16
4
+ version: 0.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Honeycomb.io Team
@@ -101,7 +101,7 @@ dependencies:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: 1.0.0
104
- type: :runtime
104
+ type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
@@ -162,6 +162,8 @@ files:
162
162
  - Gemfile
163
163
  - LICENSE
164
164
  - README.md
165
+ - lib/rack-honeycomb.rb
166
+ - lib/rack-honeycomb/auto_install.rb
165
167
  - lib/rack/honeycomb.rb
166
168
  - lib/rack/honeycomb/middleware.rb
167
169
  - lib/rack/honeycomb/version.rb