Class: RailsPulse::Jobs::Cards::AverageDuration

Inherits:
Base
  • Object
show all
Defined in:
app/models/rails_pulse/jobs/cards/average_duration.rb

Constant Summary

Constants inherited from Base

Base::RANGE_DAYS, Base::WINDOW_DAYS

Instance Method Summary collapse

Constructor Details

#initialize(job: nil) ⇒ AverageDuration

Returns a new instance of AverageDuration.



5
6
7
# File 'app/models/rails_pulse/jobs/cards/average_duration.rb', line 5

def initialize(job: nil)
  @job = job
end

Instance Method Details

#to_metric_cardObject



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
# File 'app/models/rails_pulse/jobs/cards/average_duration.rb', line 9

def to_metric_card
  base_query = RailsPulse::Summary
    .where(
      summarizable_type: "RailsPulse::Job",
      period_type: "day",
      period_start: range_start..now
    )
  base_query = base_query.where(summarizable_id: @job.id) if @job

  metrics = base_query.select(
    "SUM(avg_duration * count) AS total_weighted_duration",
    "SUM(count) AS total_runs",
    "SUM(CASE WHEN period_start >= #{quote(current_window_start)} THEN avg_duration * count ELSE 0 END) AS current_weighted_duration",
    "SUM(CASE WHEN period_start >= #{quote(current_window_start)} THEN count ELSE 0 END) AS current_runs",
    "SUM(CASE WHEN period_start >= #{quote(range_start)} AND period_start < #{quote(current_window_start)} THEN avg_duration * count ELSE 0 END) AS previous_weighted_duration",
    "SUM(CASE WHEN period_start >= #{quote(range_start)} AND period_start < #{quote(current_window_start)} THEN count ELSE 0 END) AS previous_runs"
  ).take

  total_runs = metrics&.total_runs.to_i
  total_weighted_duration = metrics&.total_weighted_duration.to_f
  current_runs = metrics&.current_runs.to_i
  current_weighted_duration = metrics&.current_weighted_duration.to_f
  previous_runs = metrics&.previous_runs.to_i
  previous_weighted_duration = metrics&.previous_weighted_duration.to_f

  average_duration = average_for(total_weighted_duration, total_runs)
  current_average = average_for(current_weighted_duration, current_runs)
  previous_average = average_for(previous_weighted_duration, previous_runs)

  trend_icon, trend_amount = trend_for(current_average, previous_average)

  grouped_weighted = base_query
    .group_by_date(:period_start)
    .sum(Arel.sql("avg_duration * count"))

  grouped_counts = base_query
    .group_by_date(:period_start)
    .sum(:count)

  sparkline_data = sparkline_from_averages(grouped_weighted, grouped_counts)

  {
    id: "jobs_average_duration",
    context: "jobs",
    title: "Average Duration",
    summary: format_duration(average_duration),
    chart_data: sparkline_data,
    trend_icon: trend_icon,
    trend_amount: trend_amount,
    trend_text: "Compared to previous week"
  }
end