Class: Whoosh::Middleware::RequestLogger

Inherits:
Object
  • Object
show all
Defined in:
lib/whoosh/middleware/request_logger.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, logger:, metrics: nil) ⇒ RequestLogger

Returns a new instance of RequestLogger.



8
9
10
11
12
# File 'lib/whoosh/middleware/request_logger.rb', line 8

def initialize(app, logger:, metrics: nil)
  @app = app
  @logger = logger
  @metrics = metrics
end

Instance Method Details

#call(env) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/whoosh/middleware/request_logger.rb', line 14

def call(env)
  request_id = env["HTTP_X_REQUEST_ID"] || SecureRandom.uuid
  env["whoosh.request_id"] = request_id

  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  status, headers, body = @app.call(env)
  duration_ms = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time) * 1000).round(2)

  headers = headers.dup
  headers["x-request-id"] = request_id

  @logger.info("request_complete",
    method: env["REQUEST_METHOD"], path: env["PATH_INFO"],
    status: status, duration_ms: duration_ms, request_id: request_id
  )

  if @metrics
    @metrics.increment("whoosh_requests_total", labels: { method: env["REQUEST_METHOD"], path: env["PATH_INFO"], status: status.to_s })
    @metrics.observe("whoosh_request_duration_seconds", duration_ms / 1000.0, labels: { path: env["PATH_INFO"] })
  end

  [status, headers, body]
end