Class: RailsErrorDashboard::Queries::BaselineStats

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_error_dashboard/queries/baseline_stats.rb

Overview

Calculate and retrieve baseline statistics for error types

Provides methods to get hourly, daily, and weekly baselines for error types. Baselines help establish “normal” error behavior for anomaly detection.

Examples:

baseline = BaselineStats.hourly_baseline("NoMethodError", "iOS")
# => { mean: 5.2, std_dev: 2.1, percentile_95: 9.0, ... }

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(error_type, platform) ⇒ BaselineStats

Returns a new instance of BaselineStats.



26
27
28
29
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 26

def initialize(error_type, platform)
  @error_type = error_type
  @platform = platform
end

Class Method Details

.daily_baseline(error_type, platform) ⇒ Object



18
19
20
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 18

def self.daily_baseline(error_type, platform)
  new(error_type, platform).daily_baseline
end

.hourly_baseline(error_type, platform) ⇒ Object



14
15
16
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 14

def self.hourly_baseline(error_type, platform)
  new(error_type, platform).hourly_baseline
end

.weekly_baseline(error_type, platform) ⇒ Object



22
23
24
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 22

def self.weekly_baseline(error_type, platform)
  new(error_type, platform).weekly_baseline
end

Instance Method Details

#all_baselinesHash

Get all baselines for an error type and platform

Returns:

  • (Hash)

    Hash with :hourly, :daily, :weekly keys



75
76
77
78
79
80
81
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 75

def all_baselines
  {
    hourly: hourly_baseline,
    daily: daily_baseline,
    weekly: weekly_baseline
  }
end

#check_anomaly(current_count, sensitivity: 2) ⇒ Hash

Check if current count is anomalous based on best available baseline Uses hourly baseline if available, falls back to daily, then weekly

Parameters:

  • current_count (Integer)

    Current error count

  • sensitivity (Integer) (defaults to: 2)

    Standard deviations threshold (default: 2)

Returns:

  • (Hash)

    { anomaly: true/false, level: Symbol, baseline_type: String }



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 88

def check_anomaly(current_count, sensitivity: 2)
  baseline = hourly_baseline || daily_baseline || weekly_baseline

  if baseline.nil?
    return { anomaly: false, level: nil, baseline_type: nil, message: "No baseline available" }
  end

  level = baseline.anomaly_level(current_count, sensitivity: sensitivity)

  {
    anomaly: level.present?,
    level: level,
    baseline_type: baseline.baseline_type,
    threshold: baseline.threshold(sensitivity: sensitivity),
    std_devs_above: baseline.std_devs_above_mean(current_count)
  }
end

#daily_baselineErrorBaseline?

Get the most recent daily baseline Covers last 12 weeks of data, aggregated by day of week

Returns:



48
49
50
51
52
53
54
55
56
57
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 48

def daily_baseline
  return nil unless defined?(ErrorBaseline) && ErrorBaseline.table_exists?

  ErrorBaseline
    .for_error_type(@error_type)
    .for_platform(@platform)
    .daily
    .recent
    .first
end

#hourly_baselineErrorBaseline?

Get the most recent hourly baseline Covers last 4 weeks of data, aggregated by hour of day

Returns:



34
35
36
37
38
39
40
41
42
43
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 34

def hourly_baseline
  return nil unless defined?(ErrorBaseline) && ErrorBaseline.table_exists?

  ErrorBaseline
    .for_error_type(@error_type)
    .for_platform(@platform)
    .hourly
    .recent
    .first
end

#weekly_baselineErrorBaseline?

Get the most recent weekly baseline Covers last 1 year of data, aggregated by week

Returns:



62
63
64
65
66
67
68
69
70
71
# File 'lib/rails_error_dashboard/queries/baseline_stats.rb', line 62

def weekly_baseline
  return nil unless defined?(ErrorBaseline) && ErrorBaseline.table_exists?

  ErrorBaseline
    .for_error_type(@error_type)
    .for_platform(@platform)
    .weekly
    .recent
    .first
end