Class: RailsPulse::Queries::Cards::DatabaseLoad
- Inherits:
-
Cards::Base
- Object
- Cards::Base
- RailsPulse::Queries::Cards::DatabaseLoad
- Defined in:
- app/models/rails_pulse/queries/cards/database_load.rb
Instance Method Summary collapse
-
#initialize(disabled_tags: [], show_non_tagged: true, period: 7, period_type: "day") ⇒ DatabaseLoad
constructor
A new instance of DatabaseLoad.
- #to_metric_card ⇒ Object
Constructor Details
#initialize(disabled_tags: [], show_non_tagged: true, period: 7, period_type: "day") ⇒ DatabaseLoad
Returns a new instance of DatabaseLoad.
5 6 7 8 9 10 |
# File 'app/models/rails_pulse/queries/cards/database_load.rb', line 5 def initialize(disabled_tags: [], show_non_tagged: true, period: 7, period_type: "day") @disabled_tags = @show_non_tagged = show_non_tagged @period = period @period_type = period_type end |
Instance Method Details
#to_metric_card ⇒ Object
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'app/models/rails_pulse/queries/cards/database_load.rb', line 12 def to_metric_card # Use base class time period helpers last_n_units = current_window_start previous_n_units = range_start # Get query summaries (DB time) - use base class helper pattern query_summaries = RailsPulse::Summary .with_tag_filters(@disabled_tags, @show_non_tagged) .where( summarizable_type: "RailsPulse::Query", period_type: @period_type, period_start: previous_n_units..now ) # Get route summaries (total request time) route_summaries = RailsPulse::Summary .with_tag_filters(@disabled_tags, @show_non_tagged) .where( summarizable_type: "RailsPulse::Route", period_type: @period_type, period_start: previous_n_units..now ) # Calculate totals total_query_time = query_summaries.sum(:total_duration) total_request_time = route_summaries.sum(:total_duration) has_data = total_request_time > 0 overall_db_percentage = has_data ? (total_query_time.to_f / total_request_time * 100).round(1) : 0 # Calculate current and previous period percentages using base class quote helper current_query_time = query_summaries.where("period_start >= ?", last_n_units).sum(:total_duration) current_request_time = route_summaries.where("period_start >= ?", last_n_units).sum(:total_duration) current_percentage = current_request_time > 0 ? (current_query_time.to_f / current_request_time * 100) : 0 if show_trend? previous_query_time = query_summaries.where("period_start >= ? AND period_start < ?", previous_n_units, last_n_units).sum(:total_duration) previous_request_time = route_summaries.where("period_start >= ? AND period_start < ?", previous_n_units, last_n_units).sum(:total_duration) previous_percentage = previous_request_time > 0 ? (previous_query_time.to_f / previous_request_time * 100) : 0 if has_data percentage = previous_percentage.zero? ? 0 : ((current_percentage - previous_percentage) / previous_percentage * 100).abs.round(1) # For DB load, trending UP is bad (more time in DB), trending DOWN is good trend_icon = percentage < 0.1 ? "move-right" : current_percentage > previous_percentage ? "trending-up" : "trending-down" trend_amount = previous_percentage.zero? ? "0%" : "#{percentage}%" else trend_icon = "move-right" trend_amount = "—" end end # Sparkline data - group by hour or day depending on period_type if period_type_hours? start_time = current_window_start end_time = now.beginning_of_hour # Create separate queries for sparkline data using only the current period sparkline_query_summaries = RailsPulse::Summary .with_tag_filters(@disabled_tags, @show_non_tagged) .where( summarizable_type: "RailsPulse::Query", period_type: @period_type, period_start: start_time..end_time ) sparkline_route_summaries = RailsPulse::Summary .with_tag_filters(@disabled_tags, @show_non_tagged) .where( summarizable_type: "RailsPulse::Route", period_type: @period_type, period_start: start_time..end_time ) # Group by hour hourly_query_time = sparkline_query_summaries.group_by { |s| s.period_start } .transform_values { |summaries| summaries.sum { |s| s.total_duration || 0 } } hourly_request_time = sparkline_route_summaries.group_by { |s| s.period_start } .transform_values { |summaries| summaries.sum { |s| s.total_duration || 0 } } sparkline_data = {} current_time = start_time while current_time <= end_time query_time = hourly_query_time[current_time] || 0 request_time = hourly_request_time[current_time] || 0 percentage = request_time > 0 ? (query_time.to_f / request_time * 100).round(1) : 0 # Color based on threshold color = if percentage < 25 "rgb(34, 197, 94)" # green elsif percentage < 40 "rgb(234, 179, 8)" # yellow else "rgb(239, 68, 68)" # red end # Use timestamp in milliseconds as key to preserve uniqueness sparkline_data[current_time.to_i * 1000] = { value: percentage, itemStyle: { color: color } } current_time += 1.hour end else start_day = current_window_start.to_date end_day = now.to_date # Group by day daily_query_time = query_summaries.group_by { |s| s.period_start.to_date } .transform_values { |summaries| summaries.sum { |s| s.total_duration || 0 } } daily_request_time = route_summaries.group_by { |s| s.period_start.to_date } .transform_values { |summaries| summaries.sum { |s| s.total_duration || 0 } } sparkline_data = {} (start_day..end_day).each do |day| query_time = daily_query_time[day] || 0 request_time = daily_request_time[day] || 0 percentage = request_time > 0 ? (query_time.to_f / request_time * 100).round(1) : 0 # Color based on threshold color = if percentage < 25 "rgb(34, 197, 94)" # green elsif percentage < 40 "rgb(234, 179, 8)" # yellow else "rgb(239, 68, 68)" # red end label = day.strftime("%b %-d") sparkline_data[label] = { value: percentage, itemStyle: { color: color } } end end { id: "database_load", context: "queries", title: "Database Load", summary: has_data ? format_percentage(overall_db_percentage) : "—", chart_data: sparkline_data, trend_icon: trend_icon, trend_amount: trend_amount, trend_text: (show_trend? ? comparison_period_text : nil), period_stat: period_date_range, help_heading: "Database Load", help_text: "Percentage of total response time spent executing database queries. <25% is healthy (Ruby/views are the bottleneck, as expected). >40% means your database is your bottleneck — focus on query optimization, indexes, and N+1 elimination." } end |