Class: Rack::Honeycomb::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/honeycomb/middleware.rb

Constant Summary collapse

ENV_REGEX =
/^#{ Regexp.escape ENV_PREFIX }/
USER_AGENT_SUFFIX =
"rack-honeycomb/#{VERSION}"
EVENT_TYPE =
'http_server'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Middleware

Returns a new instance of Middleware.

Parameters:

  • app (#call)
  • options (Hash{Symbol => Object}) (defaults to: {})

Options Hash (options):

  • :writekey (String) — default: nil
  • :dataset (String) — default: nil
  • :api_host (String) — default: nil


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rack/honeycomb/middleware.rb', line 29

def initialize(app, options = {})
  @app, @options = app, options

  @logger = options.delete(:logger)
  @logger ||= ::Honeycomb.logger if defined?(::Honeycomb.logger)

  honeycomb = if client = options.delete(:client)
                 debug "initialized with #{client.class.name} via :client option"
                 client
               elsif defined?(::Honeycomb.client)
                 debug "initialized with #{::Honeycomb.client.class.name} from honeycomb-beeline"
                 ::Honeycomb.client
               else
                 debug "initializing new Libhoney::Client"
                 Libhoney::Client.new(options.merge(user_agent_addition: USER_AGENT_SUFFIX))
               end
  @builder = honeycomb.builder.
    add(
      'meta.package' => 'rack',
      'meta.package_version' => RACK_VERSION,
      'type' => EVENT_TYPE,
      'meta.local_hostname' => Socket.gethostname,
    )

  @service_name = options.delete(:service_name) || :rack
end

Instance Method Details

#call(env) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/rack/honeycomb/middleware.rb', line 56

def call(env)
  ev = @builder.event

  add_request_fields(ev, env)

  start = Time.now
  status, headers, body = (ev, env) do
    @app.call(env)
  end

  add_app_fields(ev, env)

  add_response_fields(ev, status, headers, body)

  [status, headers, body]
rescue Exception => e
  if ev
    ev.add_field('request.error', e.class.name)
    ev.add_field('request.error_detail', e.message)
  end
  raise
ensure
  if ev && start
    finish = Time.now
    ev.add_field('duration_ms', (finish - start) * 1000)

    ev.send
  end
end