Class: RailsPulse::Routes::Tables::Index

Inherits:
Object
  • Object
show all
Defined in:
app/models/rails_pulse/routes/tables/index.rb

Instance Method Summary collapse

Constructor Details

#initialize(ransack_query:, start_time:, params:) ⇒ Index

Returns a new instance of Index.



5
6
7
8
9
# File 'app/models/rails_pulse/routes/tables/index.rb', line 5

def initialize(ransack_query:, start_time:, params:)
  @ransack_query = ransack_query
  @start_time = start_time
  @params = params
end

Instance Method Details

#to_tableObject



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'app/models/rails_pulse/routes/tables/index.rb', line 11

def to_table
  # Pre-calculate values to avoid SQL injection and improve readability
  minutes_elapsed = calculate_minutes_elapsed

  # Get thresholds with safe defaults to avoid nil access errors
  config = RailsPulse.configuration rescue nil
  thresholds = config&.route_thresholds || { slow: 500, very_slow: 1500, critical: 3000 }

  requests_per_minute_divisor = minutes_elapsed > 0 ? minutes_elapsed : 1

  status_sql = build_status_sql(thresholds)

  @ransack_query.result(distinct: false)
    .left_joins(:requests)
    .group("rails_pulse_routes.id")
    .select(
      "rails_pulse_routes.*",
      "COALESCE(AVG(rails_pulse_requests.duration), 0) AS average_response_time_ms",
      "COUNT(rails_pulse_requests.id) AS request_count",
      "COALESCE(COUNT(rails_pulse_requests.id) / #{requests_per_minute_divisor}, 0) AS requests_per_minute",
      "COALESCE(SUM(CASE WHEN rails_pulse_requests.is_error = true THEN 1 ELSE 0 END), 0) AS error_count",
      "CASE WHEN COUNT(rails_pulse_requests.id) > 0 THEN ROUND((COALESCE(SUM(CASE WHEN rails_pulse_requests.is_error = true THEN 1 ELSE 0 END), 0) * 100.0) / COUNT(rails_pulse_requests.id), 2) ELSE 0 END AS error_rate_percentage",
      "COALESCE(MAX(rails_pulse_requests.duration), 0) AS max_response_time_ms",
      "#{status_sql} AS status_indicator"
    )
end