Class: RailsPulse::Queries::Cards::ExecutionRate
- Inherits:
-
Object
- Object
- RailsPulse::Queries::Cards::ExecutionRate
- Defined in:
- app/models/rails_pulse/queries/cards/execution_rate.rb
Instance Method Summary collapse
-
#initialize(query: nil) ⇒ ExecutionRate
constructor
A new instance of ExecutionRate.
- #to_metric_card ⇒ Object
Constructor Details
#initialize(query: nil) ⇒ ExecutionRate
Returns a new instance of ExecutionRate.
5 6 7 |
# File 'app/models/rails_pulse/queries/cards/execution_rate.rb', line 5 def initialize(query: nil) @query = query end |
Instance Method Details
#to_metric_card ⇒ Object
9 10 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'app/models/rails_pulse/queries/cards/execution_rate.rb', line 9 def to_metric_card operations = if @query RailsPulse::Operation.where(query: @query) else RailsPulse::Operation.all end # Calculate total request count total_request_count = operations.count # Calculate trend by comparing last 7 days vs previous 7 days last_7_days = 7.days.ago.beginning_of_day previous_7_days = 14.days.ago.beginning_of_day current_period_count = operations.where("occurred_at >= ?", last_7_days).count previous_period_count = operations.where("occurred_at >= ? AND occurred_at < ?", previous_7_days, last_7_days).count percentage = previous_period_count.zero? ? 0 : ((previous_period_count - current_period_count) / previous_period_count.to_f * 100).abs.round(1) trend_icon = percentage < 0.1 ? "move-right" : current_period_count < previous_period_count ? "trending-down" : "trending-up" trend_amount = previous_period_count.zero? ? "0%" : "#{percentage}%" sparkline_data = operations .group_by_week(:occurred_at, time_zone: "UTC") .count .each_with_object({}) do |(date, count), hash| formatted_date = date.strftime("%b %-d") hash[formatted_date] = { value: count } end # Calculate average operations per minute min_time = operations.minimum(:occurred_at) max_time = operations.maximum(:occurred_at) total_minutes = min_time && max_time && min_time != max_time ? (max_time - min_time) / 60.0 : 1 average_operations_per_minute = total_request_count / total_minutes { title: "Execution Rate", summary: "#{average_operations_per_minute.round(2)} / min", line_chart_data: sparkline_data, trend_icon: trend_icon, trend_amount: trend_amount, trend_text: "Compared to last week" } end |