Class: RailsPulse::Jobs::Cards::FailureRate

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

Constant Summary

Constants inherited from Base

Base::RANGE_DAYS, Base::WINDOW_DAYS

Instance Method Summary collapse

Constructor Details

#initialize(job: nil) ⇒ FailureRate

Returns a new instance of FailureRate.



5
6
7
# File 'app/models/rails_pulse/jobs/cards/failure_rate.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/failure_rate.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(count) AS total_count",
    "SUM(error_count) AS total_errors",
    "SUM(CASE WHEN period_start >= #{quote(current_window_start)} THEN count ELSE 0 END) AS current_count",
    "SUM(CASE WHEN period_start >= #{quote(current_window_start)} THEN error_count ELSE 0 END) AS current_errors",
    "SUM(CASE WHEN period_start >= #{quote(range_start)} AND period_start < #{quote(current_window_start)} THEN count ELSE 0 END) AS previous_count",
    "SUM(CASE WHEN period_start >= #{quote(range_start)} AND period_start < #{quote(current_window_start)} THEN error_count ELSE 0 END) AS previous_errors"
  ).take

  total_runs = metrics&.total_count.to_i
  total_errors = metrics&.total_errors.to_i
  current_runs = metrics&.current_count.to_i
  current_errors = metrics&.current_errors.to_i
  previous_runs = metrics&.previous_count.to_i
  previous_errors = metrics&.previous_errors.to_i

  failure_rate = rate_for(total_errors, total_runs)
  current_rate = rate_for(current_errors, current_runs)
  previous_rate = rate_for(previous_errors, previous_runs)

  trend_icon, trend_amount = trend_for(current_rate, previous_rate)

  grouped_errors = base_query
    .group_by_date(:period_start)
    .sum(:error_count)

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

  sparkline_data = sparkline_from_failure_rates(grouped_errors, grouped_counts)

  {
    id: "jobs_failure_rate",
    context: "jobs",
    title: "Failure Rate",
    summary: "#{format_percentage(failure_rate, 1)}",
    chart_data: sparkline_data,
    trend_icon: trend_icon,
    trend_amount: trend_amount,
    trend_text: "Compared to previous week"
  }
end