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.



64
65
66
67
# File 'lib/tina4/dev_admin.rb', line 64

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

Instance Method Details

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



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/tina4/dev_admin.rb', line 69

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



107
108
109
# File 'lib/tina4/dev_admin.rb', line 107

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

#get(limit: 50) ⇒ Object



83
84
85
86
87
88
89
# File 'lib/tina4/dev_admin.rb', line 83

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



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/tina4/dev_admin.rb', line 91

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