Class: Tina4::RequestInspector

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

Overview

Thread-safe request capture for dev dashboard

Defined Under Namespace

Classes: CapturedRequest

Instance Method Summary collapse

Constructor Details

#initializeRequestInspector

Returns a new instance of RequestInspector.



68
69
70
71
# File 'lib/tina4/dev_admin.rb', line 68

def initialize
  @requests = []
  @mutex = Mutex.new
end

Instance Method Details

#capture(method:, path:, status:, duration:) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/tina4/dev_admin.rb', line 73

def capture(method:, path:, status:, duration:)
  @mutex.synchronize do
    @requests << CapturedRequest.new(
      timestamp: Time.now.utc.iso8601(3),
      method: method.to_s,
      path: path.to_s,
      status: status.to_i,
      duration: duration.to_f.round(3)
    )
    # Keep last 200 entries
    @requests.shift if @requests.size > 200
  end
end

#clearObject



111
112
113
# File 'lib/tina4/dev_admin.rb', line 111

def clear
  @mutex.synchronize { @requests.clear }
end

#get(limit: 50) ⇒ Object



87
88
89
90
91
92
93
# File 'lib/tina4/dev_admin.rb', line 87

def get(limit: 50)
  @mutex.synchronize do
    @requests.last([limit, @requests.size].min).reverse.map do |r|
      { timestamp: r.timestamp, method: r.method, path: r.path, status: r.status, duration_ms: r.duration }
    end
  end
end

#statsObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/tina4/dev_admin.rb', line 95

def stats
  @mutex.synchronize do
    return { total: 0, avg_ms: 0.0, errors: 0, slowest_ms: 0.0 } if @requests.empty?

    durations = @requests.map(&:duration)
    error_count = @requests.count { |r| r.status >= 400 }

    {
      total: @requests.size,
      avg_ms: (durations.sum / durations.size).round(2),
      errors: error_count,
      slowest_ms: durations.max.round(2)
    }
  end
end