Class: LogBrew::RackMiddleware

Inherits:
Object
  • Object
show all
Defined in:
lib/logbrew.rb

Overview

Rack-compatible middleware for Rails, Sinatra, and other Rack-based Ruby apps.

The middleware captures completed requests as span events and unhandled app exceptions as issue plus error-span events. It does not require the rack or rails gems at runtime; any app object that responds to ‘call(env)` is enough.

Constant Summary collapse

DEFAULT_EVENT_ID_PREFIX =
"ruby_rack"
DEFAULT_SPAN_LOGGER =
"rack"

Instance Method Summary collapse

Constructor Details

#initialize(app, client:, transport: nil, flush_on_response: false, event_id_prefix: DEFAULT_EVENT_ID_PREFIX, metadata: nil, timestamp_provider: nil, include_exception_backtrace: false, on_error: nil, raise_errors: false) ⇒ RackMiddleware

Returns a new instance of RackMiddleware.

Raises:



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# File 'lib/logbrew.rb', line 327

def initialize(
  app,
  client:,
  transport: nil,
  flush_on_response: false,
  event_id_prefix: DEFAULT_EVENT_ID_PREFIX,
  metadata: nil,
  timestamp_provider: nil,
  include_exception_backtrace: false,
  on_error: nil,
  raise_errors: false
)
  raise SdkError.new("validation_error", "rack app must respond to call") unless app.respond_to?(:call)
  Validation.require_non_empty("event id prefix", event_id_prefix)
  raise SdkError.new("validation_error", "metadata must be an object") unless .nil? || .is_a?(Hash)

  @app = app
  @client = client
  @transport = transport
  @flush_on_response = flush_on_response
  @event_id_prefix = event_id_prefix
  @metadata =  || {}
  @timestamp_provider = timestamp_provider
  @include_exception_backtrace = include_exception_backtrace
  @on_error = on_error
  @raise_errors = raise_errors
  @next_event_number = 0
end

Instance Method Details

#call(env) ⇒ Object



356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/logbrew.rb', line 356

def call(env)
  started_at = monotonic_time
  begin
    response = @app.call(env)
  rescue StandardError => error
    safely_capture do
      elapsed_ms = duration_ms(started_at)
      capture_exception_issue(env, error)
      capture_request_span(env, 500, elapsed_ms, "error")
      flush_if_configured
    end
    raise
  end

  status_code = rack_status(response)
  safely_capture do
    capture_request_span(env, status_code, duration_ms(started_at), status_code >= 500 ? "error" : "ok")
    flush_if_configured
  end
  response
end