class Kraftwerk::Middleware::RequestTelemetry

Constants

METHOD
PATH
QUERY_STRING
RACK_INPUT
ROUTER_PARAMS

Attributes

app[R]
kraftwerk_app[R]
telemetry[R]

Public Class Methods

new(app, kraftwerk_app, telemetry: nil) click to toggle source
# File lib/kraftwerk/middleware/request_telemetry.rb, line 14
def initialize(app, kraftwerk_app, telemetry: nil)
  @app = app
  @kraftwerk_app = kraftwerk_app
  @telemetry ||= kraftwerk_app::Components['telemetry']
end

Public Instance Methods

call(env) click to toggle source
# File lib/kraftwerk/middleware/request_telemetry.rb, line 20
def call(env)
  metadata = { app: kraftwerk_app, time: Time.now }
  start_data = request_start_data(env)
  telemetry.execute([:kraftwerk, :request, :start], start_data, metadata)

  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  app.call(env).tap do |response|
    telemetry.execute(
      [:kraftwerk, :request, :finish],
      request_finish_data(start_data, response, start_time),
      metadata
    )
  end
end

Private Instance Methods

request_finish_data(start_data, response, start_time) click to toggle source
# File lib/kraftwerk/middleware/request_telemetry.rb, line 45
def request_finish_data(start_data, response, start_time)
  duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
  code, _headers, body = response

  start_data.merge(
    {
      duration: duration,
      code: code,
      body: body[0]
    }
  )
end
request_params(env) click to toggle source

Combines params from query string and body into a single hash

# File lib/kraftwerk/middleware/request_telemetry.rb, line 59
def request_params(env)
  params_from_query_string = env[QUERY_STRING] ? CGI.parse(env[QUERY_STRING]) : {}
  rack_input = env[RACK_INPUT].dup.read
  params_from_input = rack_input.length > 0 ? CGI.parse(rack_input) : {}
  params_from_router = env[ROUTER_PARAMS] || {}
  params_from_query_string.merge(params_from_input).merge(params_from_router)
end
request_start_data(env) click to toggle source
# File lib/kraftwerk/middleware/request_telemetry.rb, line 37
def request_start_data(env)
  {
    method: env[METHOD],
    path: env[PATH],
    params: request_params(env)
  }
end