rails_error_dashboard 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +305 -703
  3. data/app/assets/stylesheets/rails_error_dashboard/_catppuccin_mocha.scss +107 -0
  4. data/app/assets/stylesheets/rails_error_dashboard/_components.scss +625 -0
  5. data/app/assets/stylesheets/rails_error_dashboard/_layout.scss +257 -0
  6. data/app/assets/stylesheets/rails_error_dashboard/_theme_variables.scss +203 -0
  7. data/app/assets/stylesheets/rails_error_dashboard/application.css +926 -15
  8. data/app/assets/stylesheets/rails_error_dashboard/application.css.map +7 -0
  9. data/app/assets/stylesheets/rails_error_dashboard/application.scss +61 -0
  10. data/app/controllers/rails_error_dashboard/application_controller.rb +18 -0
  11. data/app/controllers/rails_error_dashboard/errors_controller.rb +140 -4
  12. data/app/helpers/rails_error_dashboard/application_helper.rb +55 -0
  13. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +91 -0
  14. data/app/helpers/rails_error_dashboard/overview_helper.rb +78 -0
  15. data/app/helpers/rails_error_dashboard/user_agent_helper.rb +118 -0
  16. data/app/jobs/rails_error_dashboard/application_job.rb +19 -0
  17. data/app/jobs/rails_error_dashboard/async_error_logging_job.rb +48 -0
  18. data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +263 -0
  19. data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +4 -8
  20. data/app/jobs/rails_error_dashboard/email_error_notification_job.rb +2 -1
  21. data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +5 -5
  22. data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +10 -6
  23. data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +5 -6
  24. data/app/mailers/rails_error_dashboard/application_mailer.rb +1 -1
  25. data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +1 -1
  26. data/app/models/rails_error_dashboard/cascade_pattern.rb +74 -0
  27. data/app/models/rails_error_dashboard/error_baseline.rb +100 -0
  28. data/app/models/rails_error_dashboard/error_comment.rb +27 -0
  29. data/app/models/rails_error_dashboard/error_log.rb +471 -3
  30. data/app/models/rails_error_dashboard/error_occurrence.rb +49 -0
  31. data/app/views/layouts/rails_error_dashboard.html.erb +816 -178
  32. data/app/views/layouts/rails_error_dashboard_old_backup.html.erb +383 -0
  33. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +3 -10
  34. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +1 -2
  35. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +78 -0
  36. data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +209 -0
  37. data/app/views/rails_error_dashboard/errors/_stats.html.erb +34 -0
  38. data/app/views/rails_error_dashboard/errors/_timeline.html.erb +167 -0
  39. data/app/views/rails_error_dashboard/errors/analytics.html.erb +152 -56
  40. data/app/views/rails_error_dashboard/errors/correlation.html.erb +373 -0
  41. data/app/views/rails_error_dashboard/errors/index.html.erb +294 -138
  42. data/app/views/rails_error_dashboard/errors/overview.html.erb +253 -0
  43. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +399 -0
  44. data/app/views/rails_error_dashboard/errors/show.html.erb +781 -65
  45. data/config/routes.rb +9 -0
  46. data/db/migrate/20251225071314_add_optimized_indexes_to_error_logs.rb +66 -0
  47. data/db/migrate/20251225074653_remove_environment_from_error_logs.rb +26 -0
  48. data/db/migrate/20251225085859_add_enhanced_metrics_to_error_logs.rb +12 -0
  49. data/db/migrate/20251225093603_add_similarity_tracking_to_error_logs.rb +9 -0
  50. data/db/migrate/20251225100236_create_error_occurrences.rb +31 -0
  51. data/db/migrate/20251225101920_create_cascade_patterns.rb +33 -0
  52. data/db/migrate/20251225102500_create_error_baselines.rb +38 -0
  53. data/db/migrate/20251226020000_add_workflow_fields_to_error_logs.rb +27 -0
  54. data/db/migrate/20251226020100_create_error_comments.rb +18 -0
  55. data/lib/generators/rails_error_dashboard/install/install_generator.rb +276 -1
  56. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +272 -37
  57. data/lib/generators/rails_error_dashboard/solid_queue/solid_queue_generator.rb +36 -0
  58. data/lib/generators/rails_error_dashboard/solid_queue/templates/queue.yml +55 -0
  59. data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +1 -1
  60. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +2 -2
  61. data/lib/rails_error_dashboard/commands/log_error.rb +272 -7
  62. data/lib/rails_error_dashboard/commands/resolve_error.rb +16 -0
  63. data/lib/rails_error_dashboard/configuration.rb +90 -5
  64. data/lib/rails_error_dashboard/error_reporter.rb +15 -7
  65. data/lib/rails_error_dashboard/logger.rb +105 -0
  66. data/lib/rails_error_dashboard/middleware/error_catcher.rb +17 -10
  67. data/lib/rails_error_dashboard/plugin.rb +6 -3
  68. data/lib/rails_error_dashboard/plugin_registry.rb +2 -2
  69. data/lib/rails_error_dashboard/plugins/audit_log_plugin.rb +0 -1
  70. data/lib/rails_error_dashboard/plugins/jira_integration_plugin.rb +3 -4
  71. data/lib/rails_error_dashboard/plugins/metrics_plugin.rb +1 -3
  72. data/lib/rails_error_dashboard/queries/analytics_stats.rb +44 -6
  73. data/lib/rails_error_dashboard/queries/baseline_stats.rb +107 -0
  74. data/lib/rails_error_dashboard/queries/co_occurring_errors.rb +86 -0
  75. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +242 -2
  76. data/lib/rails_error_dashboard/queries/error_cascades.rb +74 -0
  77. data/lib/rails_error_dashboard/queries/error_correlation.rb +375 -0
  78. data/lib/rails_error_dashboard/queries/errors_list.rb +106 -10
  79. data/lib/rails_error_dashboard/queries/filter_options.rb +0 -1
  80. data/lib/rails_error_dashboard/queries/platform_comparison.rb +254 -0
  81. data/lib/rails_error_dashboard/queries/similar_errors.rb +93 -0
  82. data/lib/rails_error_dashboard/services/backtrace_parser.rb +113 -0
  83. data/lib/rails_error_dashboard/services/baseline_alert_throttler.rb +88 -0
  84. data/lib/rails_error_dashboard/services/baseline_calculator.rb +269 -0
  85. data/lib/rails_error_dashboard/services/cascade_detector.rb +95 -0
  86. data/lib/rails_error_dashboard/services/pattern_detector.rb +268 -0
  87. data/lib/rails_error_dashboard/services/similarity_calculator.rb +144 -0
  88. data/lib/rails_error_dashboard/value_objects/error_context.rb +27 -1
  89. data/lib/rails_error_dashboard/version.rb +1 -1
  90. data/lib/rails_error_dashboard.rb +57 -7
  91. metadata +69 -10
  92. data/app/models/rails_error_dashboard/application_record.rb +0 -5
  93. data/lib/rails_error_dashboard/queries/developer_insights.rb +0 -277
  94. data/lib/rails_error_dashboard/queries/errors_list_v2.rb +0 -149
  95. data/lib/tasks/rails_error_dashboard_tasks.rake +0 -4
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsErrorDashboard
4
+ module Services
5
+ # Calculates similarity scores between errors using multiple algorithms
6
+ #
7
+ # Combines:
8
+ # - Backtrace similarity (Jaccard index on stack frames) - 70% weight
9
+ # - Message similarity (Levenshtein distance) - 30% weight
10
+ #
11
+ # Returns a similarity score from 0.0 (completely different) to 1.0 (identical)
12
+ class SimilarityCalculator
13
+ # Calculate similarity between two errors
14
+ #
15
+ # @param error1 [ErrorLog] First error to compare
16
+ # @param error2 [ErrorLog] Second error to compare
17
+ # @return [Float] Similarity score from 0.0 to 1.0
18
+ def self.call(error1, error2)
19
+ new(error1, error2).calculate
20
+ end
21
+
22
+ def initialize(error1, error2)
23
+ @error1 = error1
24
+ @error2 = error2
25
+ end
26
+
27
+ def calculate
28
+ # Quick return for same error
29
+ return 1.0 if @error1.id == @error2.id
30
+
31
+ # Quick return for different platforms (per user config - same platform only)
32
+ return 0.0 if different_platforms?
33
+
34
+ backtrace_score = calculate_backtrace_similarity
35
+ message_score = calculate_message_similarity
36
+
37
+ # Weighted combination: backtrace 70%, message 30%
38
+ (backtrace_score * 0.7) + (message_score * 0.3)
39
+ end
40
+
41
+ private
42
+
43
+ def different_platforms?
44
+ return false if @error1.platform.nil? || @error2.platform.nil?
45
+ @error1.platform != @error2.platform
46
+ end
47
+
48
+ # Calculate Jaccard similarity on backtrace frames
49
+ # Jaccard = intersection / union
50
+ def calculate_backtrace_similarity
51
+ frames1 = extract_frames(@error1.backtrace)
52
+ frames2 = extract_frames(@error2.backtrace)
53
+
54
+ return 0.0 if frames1.empty? || frames2.empty?
55
+
56
+ intersection = (frames1 & frames2).size
57
+ union = (frames1 | frames2).size
58
+
59
+ return 0.0 if union.zero?
60
+
61
+ intersection.to_f / union
62
+ end
63
+
64
+ # Calculate normalized Levenshtein distance on messages
65
+ # Returns 1.0 for identical messages, decreasing as they differ
66
+ def calculate_message_similarity
67
+ msg1 = normalize_message(@error1.message)
68
+ msg2 = normalize_message(@error2.message)
69
+
70
+ return 1.0 if msg1 == msg2
71
+ return 0.0 if msg1.empty? || msg2.empty?
72
+
73
+ distance = levenshtein_distance(msg1, msg2)
74
+ max_length = [ msg1.length, msg2.length ].max
75
+
76
+ return 0.0 if max_length.zero?
77
+
78
+ # Convert distance to similarity (1.0 = identical, 0.0 = completely different)
79
+ 1.0 - (distance.to_f / max_length)
80
+ end
81
+
82
+ # Extract meaningful frames from backtrace
83
+ # Format: "file.rb:123:in `method_name`" => "file.rb:method_name"
84
+ def extract_frames(backtrace)
85
+ return [] if backtrace.blank?
86
+
87
+ lines = backtrace.is_a?(String) ? backtrace.split("\n") : backtrace
88
+ lines.first(20).map do |line| # Only consider first 20 frames
89
+ # Extract file path and method name, ignore line numbers
90
+ if line =~ %r{([^/]+\.rb):.*?in `(.+)'$}
91
+ "#{Regexp.last_match(1)}:#{Regexp.last_match(2)}"
92
+ elsif line =~ %r{([^/]+\.rb)}
93
+ Regexp.last_match(1)
94
+ end
95
+ end.compact.uniq
96
+ end
97
+
98
+ # Normalize message for comparison
99
+ # Already normalized during error logging, but ensure consistency
100
+ def normalize_message(message)
101
+ return "" if message.nil?
102
+
103
+ message
104
+ .gsub(/#<\w+:0x[0-9a-f]+>/i, "__OBJ__") # Object inspections - temp placeholder
105
+ .gsub(/0x[0-9a-f]+/i, "__HEX__") # Hex addresses - temp placeholder
106
+ .gsub(/"[^"]*"/, '""') # Quoted strings to ""
107
+ .gsub(/'[^']*'/, "''") # Single quotes to ''
108
+ .downcase # Convert to lowercase
109
+ .gsub(/\d+/, "n") # Numbers to n (lowercase)
110
+ .gsub(/__hex__/, "0xhex") # Replace placeholder with final value
111
+ .gsub(/__obj__/, "#<obj>") # Replace placeholder with final value
112
+ .strip
113
+ end
114
+
115
+ # Calculate Levenshtein distance (edit distance) between two strings
116
+ # Classic dynamic programming algorithm
117
+ def levenshtein_distance(str1, str2)
118
+ return str2.length if str1.empty?
119
+ return str1.length if str2.empty?
120
+
121
+ # Create matrix
122
+ matrix = Array.new(str1.length + 1) { Array.new(str2.length + 1, 0) }
123
+
124
+ # Initialize first row and column
125
+ (0..str1.length).each { |i| matrix[i][0] = i }
126
+ (0..str2.length).each { |j| matrix[0][j] = j }
127
+
128
+ # Fill matrix
129
+ (1..str1.length).each do |i|
130
+ (1..str2.length).each do |j|
131
+ cost = str1[i - 1] == str2[j - 1] ? 0 : 1
132
+ matrix[i][j] = [
133
+ matrix[i - 1][j] + 1, # deletion
134
+ matrix[i][j - 1] + 1, # insertion
135
+ matrix[i - 1][j - 1] + cost # substitution
136
+ ].min
137
+ end
138
+ end
139
+
140
+ matrix[str1.length][str2.length]
141
+ end
142
+ end
143
+ end
144
+ end
@@ -6,7 +6,7 @@ module RailsErrorDashboard
6
6
  # Extracts and normalizes context information from various sources
7
7
  class ErrorContext
8
8
  attr_reader :user_id, :request_url, :request_params, :user_agent, :ip_address, :platform,
9
- :controller_name, :action_name
9
+ :controller_name, :action_name, :request_id, :session_id
10
10
 
11
11
  def initialize(context, source = nil)
12
12
  @context = context
@@ -20,6 +20,8 @@ module RailsErrorDashboard
20
20
  @platform = detect_platform
21
21
  @controller_name = extract_controller_name
22
22
  @action_name = extract_action_name
23
+ @request_id = extract_request_id
24
+ @session_id = extract_session_id
23
25
  end
24
26
 
25
27
  def to_h
@@ -143,6 +145,30 @@ module RailsErrorDashboard
143
145
 
144
146
  nil
145
147
  end
148
+
149
+ def extract_request_id
150
+ # From Rails request
151
+ return @context[:request]&.request_id if @context[:request]&.respond_to?(:request_id)
152
+
153
+ # From explicit context
154
+ return @context[:request_id] if @context[:request_id]
155
+
156
+ # From job ID (for background jobs)
157
+ return @context[:job]&.job_id if @context[:job]
158
+ return @context[:jid] if @context[:jid]
159
+
160
+ nil
161
+ end
162
+
163
+ def extract_session_id
164
+ # From Rails session
165
+ return @context[:request]&.session&.id if @context[:request]&.session
166
+
167
+ # From explicit context
168
+ return @context[:session_id] if @context[:session_id]
169
+
170
+ nil
171
+ end
146
172
  end
147
173
  end
148
174
  end
@@ -1,3 +1,3 @@
1
1
  module RailsErrorDashboard
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  require "rails_error_dashboard/version"
2
2
  require "rails_error_dashboard/engine"
3
3
  require "rails_error_dashboard/configuration"
4
+ require "rails_error_dashboard/logger"
4
5
 
5
6
  # External dependencies
6
7
  require "pagy"
@@ -11,6 +12,17 @@ require "httparty"
11
12
  # Core library files
12
13
  require "rails_error_dashboard/value_objects/error_context"
13
14
  require "rails_error_dashboard/services/platform_detector"
15
+ require "rails_error_dashboard/services/backtrace_parser"
16
+ require "rails_error_dashboard/services/similarity_calculator"
17
+ require "rails_error_dashboard/services/cascade_detector"
18
+ require "rails_error_dashboard/services/baseline_calculator"
19
+ require "rails_error_dashboard/services/baseline_alert_throttler"
20
+ require "rails_error_dashboard/services/pattern_detector"
21
+ require "rails_error_dashboard/queries/co_occurring_errors"
22
+ require "rails_error_dashboard/queries/error_cascades"
23
+ require "rails_error_dashboard/queries/baseline_stats"
24
+ require "rails_error_dashboard/queries/platform_comparison"
25
+ require "rails_error_dashboard/queries/error_correlation"
14
26
  require "rails_error_dashboard/commands/log_error"
15
27
  require "rails_error_dashboard/commands/resolve_error"
16
28
  require "rails_error_dashboard/commands/batch_resolve_errors"
@@ -19,6 +31,7 @@ require "rails_error_dashboard/queries/errors_list"
19
31
  require "rails_error_dashboard/queries/dashboard_stats"
20
32
  require "rails_error_dashboard/queries/analytics_stats"
21
33
  require "rails_error_dashboard/queries/filter_options"
34
+ require "rails_error_dashboard/queries/similar_errors"
22
35
  require "rails_error_dashboard/error_reporter"
23
36
  require "rails_error_dashboard/middleware/error_catcher"
24
37
 
@@ -28,12 +41,22 @@ require "rails_error_dashboard/plugin_registry"
28
41
 
29
42
  module RailsErrorDashboard
30
43
  class << self
31
- attr_accessor :configuration
32
- end
44
+ attr_writer :configuration
45
+
46
+ # Get or initialize configuration
47
+ def configuration
48
+ @configuration ||= Configuration.new
49
+ end
33
50
 
34
- def self.configure
35
- self.configuration ||= Configuration.new
36
- yield(configuration)
51
+ # Configure the gem
52
+ def configure
53
+ yield(configuration)
54
+ end
55
+
56
+ # Reset configuration to defaults
57
+ def reset_configuration!
58
+ @configuration = Configuration.new
59
+ end
37
60
  end
38
61
 
39
62
  # Register a plugin
@@ -55,6 +78,33 @@ module RailsErrorDashboard
55
78
  PluginRegistry.plugins
56
79
  end
57
80
 
58
- # Initialize with default configuration
59
- self.configuration = Configuration.new
81
+ # Register a callback for when any error is logged
82
+ # @param block [Proc] The callback to execute, receives error_log as parameter
83
+ # @example
84
+ # RailsErrorDashboard.on_error_logged do |error_log|
85
+ # puts "Error logged: #{error_log.error_type}"
86
+ # end
87
+ def self.on_error_logged(&block)
88
+ configuration.notification_callbacks[:error_logged] << block if block_given?
89
+ end
90
+
91
+ # Register a callback for when a critical error is logged
92
+ # @param block [Proc] The callback to execute, receives error_log as parameter
93
+ # @example
94
+ # RailsErrorDashboard.on_critical_error do |error_log|
95
+ # PagerDuty.trigger(error_log)
96
+ # end
97
+ def self.on_critical_error(&block)
98
+ configuration.notification_callbacks[:critical_error] << block if block_given?
99
+ end
100
+
101
+ # Register a callback for when an error is resolved
102
+ # @param block [Proc] The callback to execute, receives error_log as parameter
103
+ # @example
104
+ # RailsErrorDashboard.on_error_resolved do |error_log|
105
+ # Slack.notify("Error #{error_log.id} resolved")
106
+ # end
107
+ def self.on_error_resolved(&block)
108
+ configuration.notification_callbacks[:error_resolved] << block if block_given?
109
+ end
60
110
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_error_dashboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anjan Jagirdar
@@ -79,6 +79,20 @@ dependencies:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0.21'
82
+ - !ruby/object:Gem::Dependency
83
+ name: turbo-rails
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
82
96
  - !ruby/object:Gem::Dependency
83
97
  name: concurrent-ruby
84
98
  requirement: !ruby/object:Gem::Requirement
@@ -225,10 +239,11 @@ dependencies:
225
239
  - - "~>"
226
240
  - !ruby/object:Gem::Version
227
241
  version: '2.5'
228
- description: "⚠️ BETA: Rails Error Dashboard provides error tracking with a beautiful
229
- UI, multi-channel notifications (Slack, Email, Discord, PagerDuty), platform detection
230
- (iOS/Android/Web/API), analytics, and optional separate database support. Works
231
- with Rails 7.0-8.0. API may change before v1.0.0."
242
+ description: 'Own your errors. Own your stack. A fully open-source, self-hosted error
243
+ dashboard for solo founders, indie hackers, and small teams. Professional error
244
+ tracking with beautiful UI, multi-channel notifications (Slack, Email, Discord,
245
+ PagerDuty), platform detection (iOS/Android/Web/API), and analytics. 5-minute setup,
246
+ works out-of-the-box. Rails 7.0-8.1 compatible. ⚠️ BETA: API may change before v1.0.0.'
232
247
  email:
233
248
  - anjan.jagirdar@gmail.com
234
249
  executables: []
@@ -238,11 +253,22 @@ files:
238
253
  - MIT-LICENSE
239
254
  - README.md
240
255
  - Rakefile
256
+ - app/assets/stylesheets/rails_error_dashboard/_catppuccin_mocha.scss
257
+ - app/assets/stylesheets/rails_error_dashboard/_components.scss
258
+ - app/assets/stylesheets/rails_error_dashboard/_layout.scss
259
+ - app/assets/stylesheets/rails_error_dashboard/_theme_variables.scss
241
260
  - app/assets/stylesheets/rails_error_dashboard/application.css
261
+ - app/assets/stylesheets/rails_error_dashboard/application.css.map
262
+ - app/assets/stylesheets/rails_error_dashboard/application.scss
242
263
  - app/controllers/rails_error_dashboard/application_controller.rb
243
264
  - app/controllers/rails_error_dashboard/errors_controller.rb
244
265
  - app/helpers/rails_error_dashboard/application_helper.rb
266
+ - app/helpers/rails_error_dashboard/backtrace_helper.rb
267
+ - app/helpers/rails_error_dashboard/overview_helper.rb
268
+ - app/helpers/rails_error_dashboard/user_agent_helper.rb
245
269
  - app/jobs/rails_error_dashboard/application_job.rb
270
+ - app/jobs/rails_error_dashboard/async_error_logging_job.rb
271
+ - app/jobs/rails_error_dashboard/baseline_alert_job.rb
246
272
  - app/jobs/rails_error_dashboard/discord_error_notification_job.rb
247
273
  - app/jobs/rails_error_dashboard/email_error_notification_job.rb
248
274
  - app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb
@@ -250,23 +276,45 @@ files:
250
276
  - app/jobs/rails_error_dashboard/webhook_error_notification_job.rb
251
277
  - app/mailers/rails_error_dashboard/application_mailer.rb
252
278
  - app/mailers/rails_error_dashboard/error_notification_mailer.rb
253
- - app/models/rails_error_dashboard/application_record.rb
279
+ - app/models/rails_error_dashboard/cascade_pattern.rb
280
+ - app/models/rails_error_dashboard/error_baseline.rb
281
+ - app/models/rails_error_dashboard/error_comment.rb
254
282
  - app/models/rails_error_dashboard/error_log.rb
255
283
  - app/models/rails_error_dashboard/error_logs_record.rb
284
+ - app/models/rails_error_dashboard/error_occurrence.rb
256
285
  - app/views/layouts/rails_error_dashboard.html.erb
257
286
  - app/views/layouts/rails_error_dashboard/application.html.erb
287
+ - app/views/layouts/rails_error_dashboard_old_backup.html.erb
258
288
  - app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb
259
289
  - app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb
290
+ - app/views/rails_error_dashboard/errors/_error_row.html.erb
291
+ - app/views/rails_error_dashboard/errors/_pattern_insights.html.erb
292
+ - app/views/rails_error_dashboard/errors/_stats.html.erb
293
+ - app/views/rails_error_dashboard/errors/_timeline.html.erb
260
294
  - app/views/rails_error_dashboard/errors/analytics.html.erb
295
+ - app/views/rails_error_dashboard/errors/correlation.html.erb
261
296
  - app/views/rails_error_dashboard/errors/index.html.erb
297
+ - app/views/rails_error_dashboard/errors/overview.html.erb
298
+ - app/views/rails_error_dashboard/errors/platform_comparison.html.erb
262
299
  - app/views/rails_error_dashboard/errors/show.html.erb
263
300
  - config/routes.rb
264
301
  - db/migrate/20251224000001_create_rails_error_dashboard_error_logs.rb
265
302
  - db/migrate/20251224081522_add_better_tracking_to_error_logs.rb
266
303
  - db/migrate/20251224101217_add_controller_action_to_error_logs.rb
304
+ - db/migrate/20251225071314_add_optimized_indexes_to_error_logs.rb
305
+ - db/migrate/20251225074653_remove_environment_from_error_logs.rb
306
+ - db/migrate/20251225085859_add_enhanced_metrics_to_error_logs.rb
307
+ - db/migrate/20251225093603_add_similarity_tracking_to_error_logs.rb
308
+ - db/migrate/20251225100236_create_error_occurrences.rb
309
+ - db/migrate/20251225101920_create_cascade_patterns.rb
310
+ - db/migrate/20251225102500_create_error_baselines.rb
311
+ - db/migrate/20251226020000_add_workflow_fields_to_error_logs.rb
312
+ - db/migrate/20251226020100_create_error_comments.rb
267
313
  - lib/generators/rails_error_dashboard/install/install_generator.rb
268
314
  - lib/generators/rails_error_dashboard/install/templates/README
269
315
  - lib/generators/rails_error_dashboard/install/templates/initializer.rb
316
+ - lib/generators/rails_error_dashboard/solid_queue/solid_queue_generator.rb
317
+ - lib/generators/rails_error_dashboard/solid_queue/templates/queue.yml
270
318
  - lib/rails_error_dashboard.rb
271
319
  - lib/rails_error_dashboard/commands/batch_delete_errors.rb
272
320
  - lib/rails_error_dashboard/commands/batch_resolve_errors.rb
@@ -275,6 +323,7 @@ files:
275
323
  - lib/rails_error_dashboard/configuration.rb
276
324
  - lib/rails_error_dashboard/engine.rb
277
325
  - lib/rails_error_dashboard/error_reporter.rb
326
+ - lib/rails_error_dashboard/logger.rb
278
327
  - lib/rails_error_dashboard/middleware/error_catcher.rb
279
328
  - lib/rails_error_dashboard/plugin.rb
280
329
  - lib/rails_error_dashboard/plugin_registry.rb
@@ -282,15 +331,24 @@ files:
282
331
  - lib/rails_error_dashboard/plugins/jira_integration_plugin.rb
283
332
  - lib/rails_error_dashboard/plugins/metrics_plugin.rb
284
333
  - lib/rails_error_dashboard/queries/analytics_stats.rb
334
+ - lib/rails_error_dashboard/queries/baseline_stats.rb
335
+ - lib/rails_error_dashboard/queries/co_occurring_errors.rb
285
336
  - lib/rails_error_dashboard/queries/dashboard_stats.rb
286
- - lib/rails_error_dashboard/queries/developer_insights.rb
337
+ - lib/rails_error_dashboard/queries/error_cascades.rb
338
+ - lib/rails_error_dashboard/queries/error_correlation.rb
287
339
  - lib/rails_error_dashboard/queries/errors_list.rb
288
- - lib/rails_error_dashboard/queries/errors_list_v2.rb
289
340
  - lib/rails_error_dashboard/queries/filter_options.rb
341
+ - lib/rails_error_dashboard/queries/platform_comparison.rb
342
+ - lib/rails_error_dashboard/queries/similar_errors.rb
343
+ - lib/rails_error_dashboard/services/backtrace_parser.rb
344
+ - lib/rails_error_dashboard/services/baseline_alert_throttler.rb
345
+ - lib/rails_error_dashboard/services/baseline_calculator.rb
346
+ - lib/rails_error_dashboard/services/cascade_detector.rb
347
+ - lib/rails_error_dashboard/services/pattern_detector.rb
290
348
  - lib/rails_error_dashboard/services/platform_detector.rb
349
+ - lib/rails_error_dashboard/services/similarity_calculator.rb
291
350
  - lib/rails_error_dashboard/value_objects/error_context.rb
292
351
  - lib/rails_error_dashboard/version.rb
293
- - lib/tasks/rails_error_dashboard_tasks.rake
294
352
  homepage: https://github.com/AnjanJ/rails_error_dashboard
295
353
  licenses:
296
354
  - MIT
@@ -314,5 +372,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
314
372
  requirements: []
315
373
  rubygems_version: 3.7.2
316
374
  specification_version: 4
317
- summary: Beautiful error tracking dashboard for Rails applications (BETA)
375
+ summary: Self-hosted Rails error monitoring free, forever. Zero SaaS fees, zero
376
+ lock-in.
318
377
  test_files: []
@@ -1,5 +0,0 @@
1
- module RailsErrorDashboard
2
- class ApplicationRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- end
5
- end