Class: RailsPulse::Routes::Cards::PercentileResponseTimes
- Inherits:
-
Object
- Object
- RailsPulse::Routes::Cards::PercentileResponseTimes
- Defined in:
- app/models/rails_pulse/routes/cards/percentile_response_times.rb
Instance Method Summary collapse
-
#initialize(route: nil) ⇒ PercentileResponseTimes
constructor
A new instance of PercentileResponseTimes.
- #to_metric_card ⇒ Object
Constructor Details
#initialize(route: nil) ⇒ PercentileResponseTimes
Returns a new instance of PercentileResponseTimes.
5 6 7 |
# File 'app/models/rails_pulse/routes/cards/percentile_response_times.rb', line 5 def initialize(route: nil) @route = route 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'app/models/rails_pulse/routes/cards/percentile_response_times.rb', line 9 def to_metric_card requests = if @route RailsPulse::Request.where(route: @route) else RailsPulse::Request.all end requests = requests.where("occurred_at >= ?", 2.weeks.ago.beginning_of_day) # Calculate overall 95th percentile response time count = requests.count percentile_95th = if count > 0 requests.select("duration").order("duration").limit(1).offset((count * 0.95).floor).pluck(:duration).first.round(0) || 0 else 0 end # Calculate trend by comparing last 7 days vs previous 7 days for 95th percentile last_7_days = 7.days.ago.beginning_of_day previous_7_days = 14.days.ago.beginning_of_day current_period = requests.where("occurred_at >= ?", last_7_days) current_count = current_period.count current_period_95th = if current_count > 0 current_period.select("duration").order("duration").limit(1).offset((current_count * 0.95).floor).pluck(:duration).first || 0 else 0 end previous_period = requests.where("occurred_at >= ? AND occurred_at < ?", previous_7_days, last_7_days) previous_count = previous_period.count previous_period_95th = if previous_count > 0 previous_period.select("duration").order("duration").limit(1).offset((previous_count * 0.95).floor).pluck(:duration).first || 0 else 0 end percentage = previous_period_95th.zero? ? 0 : ((previous_period_95th - current_period_95th) / previous_period_95th * 100).abs.round(1) trend_icon = percentage < 0.1 ? "move-right" : current_period_95th < previous_period_95th ? "trending-down" : "trending-up" trend_amount = previous_period_95th.zero? ? "0%" : "#{percentage}%" sparkline_data = requests .group_by_week(:occurred_at, time_zone: "UTC") .average(:duration) .each_with_object({}) do |(date, avg), hash| formatted_date = date.strftime("%b %-d") value = avg&.round(0) || 0 hash[formatted_date] = { value: value } end { title: "95th Percentile Response Time", summary: "#{percentile_95th} ms", line_chart_data: sparkline_data, trend_icon: trend_icon, trend_amount: trend_amount, trend_text: "Compared to last week" } end |