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.
- checksums.yaml +4 -4
- data/README.md +305 -703
- data/app/assets/stylesheets/rails_error_dashboard/_catppuccin_mocha.scss +107 -0
- data/app/assets/stylesheets/rails_error_dashboard/_components.scss +625 -0
- data/app/assets/stylesheets/rails_error_dashboard/_layout.scss +257 -0
- data/app/assets/stylesheets/rails_error_dashboard/_theme_variables.scss +203 -0
- data/app/assets/stylesheets/rails_error_dashboard/application.css +926 -15
- data/app/assets/stylesheets/rails_error_dashboard/application.css.map +7 -0
- data/app/assets/stylesheets/rails_error_dashboard/application.scss +61 -0
- data/app/controllers/rails_error_dashboard/application_controller.rb +18 -0
- data/app/controllers/rails_error_dashboard/errors_controller.rb +140 -4
- data/app/helpers/rails_error_dashboard/application_helper.rb +55 -0
- data/app/helpers/rails_error_dashboard/backtrace_helper.rb +91 -0
- data/app/helpers/rails_error_dashboard/overview_helper.rb +78 -0
- data/app/helpers/rails_error_dashboard/user_agent_helper.rb +118 -0
- data/app/jobs/rails_error_dashboard/application_job.rb +19 -0
- data/app/jobs/rails_error_dashboard/async_error_logging_job.rb +48 -0
- data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +263 -0
- data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +4 -8
- data/app/jobs/rails_error_dashboard/email_error_notification_job.rb +2 -1
- data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +5 -5
- data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +10 -6
- data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +5 -6
- data/app/mailers/rails_error_dashboard/application_mailer.rb +1 -1
- data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +1 -1
- data/app/models/rails_error_dashboard/cascade_pattern.rb +74 -0
- data/app/models/rails_error_dashboard/error_baseline.rb +100 -0
- data/app/models/rails_error_dashboard/error_comment.rb +27 -0
- data/app/models/rails_error_dashboard/error_log.rb +471 -3
- data/app/models/rails_error_dashboard/error_occurrence.rb +49 -0
- data/app/views/layouts/rails_error_dashboard.html.erb +816 -178
- data/app/views/layouts/rails_error_dashboard_old_backup.html.erb +383 -0
- data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +3 -10
- data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +1 -2
- data/app/views/rails_error_dashboard/errors/_error_row.html.erb +78 -0
- data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +209 -0
- data/app/views/rails_error_dashboard/errors/_stats.html.erb +34 -0
- data/app/views/rails_error_dashboard/errors/_timeline.html.erb +167 -0
- data/app/views/rails_error_dashboard/errors/analytics.html.erb +152 -56
- data/app/views/rails_error_dashboard/errors/correlation.html.erb +373 -0
- data/app/views/rails_error_dashboard/errors/index.html.erb +294 -138
- data/app/views/rails_error_dashboard/errors/overview.html.erb +253 -0
- data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +399 -0
- data/app/views/rails_error_dashboard/errors/show.html.erb +781 -65
- data/config/routes.rb +9 -0
- data/db/migrate/20251225071314_add_optimized_indexes_to_error_logs.rb +66 -0
- data/db/migrate/20251225074653_remove_environment_from_error_logs.rb +26 -0
- data/db/migrate/20251225085859_add_enhanced_metrics_to_error_logs.rb +12 -0
- data/db/migrate/20251225093603_add_similarity_tracking_to_error_logs.rb +9 -0
- data/db/migrate/20251225100236_create_error_occurrences.rb +31 -0
- data/db/migrate/20251225101920_create_cascade_patterns.rb +33 -0
- data/db/migrate/20251225102500_create_error_baselines.rb +38 -0
- data/db/migrate/20251226020000_add_workflow_fields_to_error_logs.rb +27 -0
- data/db/migrate/20251226020100_create_error_comments.rb +18 -0
- data/lib/generators/rails_error_dashboard/install/install_generator.rb +276 -1
- data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +272 -37
- data/lib/generators/rails_error_dashboard/solid_queue/solid_queue_generator.rb +36 -0
- data/lib/generators/rails_error_dashboard/solid_queue/templates/queue.yml +55 -0
- data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +1 -1
- data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +2 -2
- data/lib/rails_error_dashboard/commands/log_error.rb +272 -7
- data/lib/rails_error_dashboard/commands/resolve_error.rb +16 -0
- data/lib/rails_error_dashboard/configuration.rb +90 -5
- data/lib/rails_error_dashboard/error_reporter.rb +15 -7
- data/lib/rails_error_dashboard/logger.rb +105 -0
- data/lib/rails_error_dashboard/middleware/error_catcher.rb +17 -10
- data/lib/rails_error_dashboard/plugin.rb +6 -3
- data/lib/rails_error_dashboard/plugin_registry.rb +2 -2
- data/lib/rails_error_dashboard/plugins/audit_log_plugin.rb +0 -1
- data/lib/rails_error_dashboard/plugins/jira_integration_plugin.rb +3 -4
- data/lib/rails_error_dashboard/plugins/metrics_plugin.rb +1 -3
- data/lib/rails_error_dashboard/queries/analytics_stats.rb +44 -6
- data/lib/rails_error_dashboard/queries/baseline_stats.rb +107 -0
- data/lib/rails_error_dashboard/queries/co_occurring_errors.rb +86 -0
- data/lib/rails_error_dashboard/queries/dashboard_stats.rb +242 -2
- data/lib/rails_error_dashboard/queries/error_cascades.rb +74 -0
- data/lib/rails_error_dashboard/queries/error_correlation.rb +375 -0
- data/lib/rails_error_dashboard/queries/errors_list.rb +106 -10
- data/lib/rails_error_dashboard/queries/filter_options.rb +0 -1
- data/lib/rails_error_dashboard/queries/platform_comparison.rb +254 -0
- data/lib/rails_error_dashboard/queries/similar_errors.rb +93 -0
- data/lib/rails_error_dashboard/services/backtrace_parser.rb +113 -0
- data/lib/rails_error_dashboard/services/baseline_alert_throttler.rb +88 -0
- data/lib/rails_error_dashboard/services/baseline_calculator.rb +269 -0
- data/lib/rails_error_dashboard/services/cascade_detector.rb +95 -0
- data/lib/rails_error_dashboard/services/pattern_detector.rb +268 -0
- data/lib/rails_error_dashboard/services/similarity_calculator.rb +144 -0
- data/lib/rails_error_dashboard/value_objects/error_context.rb +27 -1
- data/lib/rails_error_dashboard/version.rb +1 -1
- data/lib/rails_error_dashboard.rb +57 -7
- metadata +69 -10
- data/app/models/rails_error_dashboard/application_record.rb +0 -5
- data/lib/rails_error_dashboard/queries/developer_insights.rb +0 -277
- data/lib/rails_error_dashboard/queries/errors_list_v2.rb +0 -149
- 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,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
|
-
|
|
32
|
-
|
|
44
|
+
attr_writer :configuration
|
|
45
|
+
|
|
46
|
+
# Get or initialize configuration
|
|
47
|
+
def configuration
|
|
48
|
+
@configuration ||= Configuration.new
|
|
49
|
+
end
|
|
33
50
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
#
|
|
59
|
-
|
|
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.
|
|
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:
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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/
|
|
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/
|
|
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:
|
|
375
|
+
summary: Self-hosted Rails error monitoring — free, forever. Zero SaaS fees, zero
|
|
376
|
+
lock-in.
|
|
318
377
|
test_files: []
|