rails_error_dashboard 0.10.0 → 0.11.0

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -3
  3. data/app/controllers/rails_error_dashboard/errors_controller.rb +3 -0
  4. data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +8 -1
  5. data/app/models/rails_error_dashboard/error_log.rb +1 -0
  6. data/app/views/layouts/rails_error_dashboard.html.erb +30 -0
  7. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +5 -0
  8. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +1 -0
  9. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +8 -0
  10. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +9 -0
  11. data/app/views/rails_error_dashboard/errors/analytics.html.erb +51 -1
  12. data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +1 -1
  13. data/app/views/rails_error_dashboard/errors/index.html.erb +8 -1
  14. data/app/views/rails_error_dashboard/errors/overview.html.erb +2 -2
  15. data/app/views/rails_error_dashboard/errors/settings.html.erb +2 -0
  16. data/config/locales/de.yml +19 -2
  17. data/config/locales/en.yml +17 -0
  18. data/config/locales/es.yml +18 -2
  19. data/config/locales/fr.yml +19 -2
  20. data/config/locales/it.yml +27 -3
  21. data/config/locales/ja.yml +17 -3
  22. data/config/locales/pl.yml +19 -2
  23. data/config/locales/pt-BR.yml +18 -2
  24. data/config/locales/ru.yml +18 -2
  25. data/config/locales/uk.yml +18 -2
  26. data/config/locales/zh-CN.yml +15 -3
  27. data/db/migrate/20260826000001_add_environment_to_error_logs.rb +26 -0
  28. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +11 -0
  29. data/lib/rails_error_dashboard/commands/backfill_environments.rb +58 -0
  30. data/lib/rails_error_dashboard/commands/find_or_increment_error.rb +55 -29
  31. data/lib/rails_error_dashboard/commands/flush_storm_counts.rb +40 -9
  32. data/lib/rails_error_dashboard/commands/log_error.rb +17 -0
  33. data/lib/rails_error_dashboard/configuration.rb +52 -0
  34. data/lib/rails_error_dashboard/queries/analytics_stats.rb +9 -0
  35. data/lib/rails_error_dashboard/queries/errors_list.rb +8 -0
  36. data/lib/rails_error_dashboard/queries/filter_options.rb +9 -0
  37. data/lib/rails_error_dashboard/services/discord_payload_builder.rb +8 -0
  38. data/lib/rails_error_dashboard/services/error_broadcaster.rb +6 -2
  39. data/lib/rails_error_dashboard/services/issue_body_formatter.rb +1 -0
  40. data/lib/rails_error_dashboard/services/markdown_error_formatter.rb +1 -0
  41. data/lib/rails_error_dashboard/services/notification_throttler.rb +23 -0
  42. data/lib/rails_error_dashboard/services/pagerduty_payload_builder.rb +1 -0
  43. data/lib/rails_error_dashboard/services/slack_payload_builder.rb +9 -0
  44. data/lib/rails_error_dashboard/services/storm_protection/gate.rb +2 -0
  45. data/lib/rails_error_dashboard/services/webhook_payload_builder.rb +1 -0
  46. data/lib/rails_error_dashboard/version.rb +1 -1
  47. data/lib/rails_error_dashboard.rb +1 -0
  48. data/lib/tasks/rails_error_dashboard_tasks.rake +6 -0
  49. metadata +4 -2
@@ -29,6 +29,29 @@ module RailsErrorDashboard
29
29
  true
30
30
  end
31
31
 
32
+ # Does this error's environment pass config.notification_environments?
33
+ #
34
+ # nil list → everything notifies (the pre-0.11 behaviour). Accepts an
35
+ # ErrorLog, a bare environment name, or nothing (the process
36
+ # environment) — the storm and baseline paths have no row to hand over.
37
+ # A legacy row with a NULL environment is judged as the process
38
+ # environment, so upgrading never silences an error that was notifying
39
+ # before. Fails open: an allowlist bug must not lose a page.
40
+ #
41
+ # @param subject [ErrorLog, String, nil]
42
+ # @return [Boolean]
43
+ def environment_allowed?(subject = nil)
44
+ allowed = RailsErrorDashboard.configuration.notification_environments
45
+ return true if allowed.nil?
46
+
47
+ name = subject.respond_to?(:environment) ? subject.environment : subject
48
+ name = RailsErrorDashboard.configuration.current_environment if name.blank?
49
+ allowed.include?(name.to_s)
50
+ rescue => e
51
+ RailsErrorDashboard::Logger.debug("[RailsErrorDashboard] NotificationThrottler.environment_allowed? failed: #{e.message}")
52
+ true
53
+ end
54
+
32
55
  # Does the error's severity meet the configured minimum?
33
56
  # @param error_log [ErrorLog] The error to check
34
57
  # @return [Boolean] true if severity is at or above minimum
@@ -46,6 +46,7 @@ module RailsErrorDashboard
46
46
  controller: error_log.controller_name,
47
47
  action: error_log.action_name,
48
48
  platform: error_log.platform,
49
+ environment: error_log.environment,
49
50
  occurrences: error_log.occurrence_count,
50
51
  first_seen_at: error_log.first_seen_at&.iso8601,
51
52
  last_seen_at: error_log.last_seen_at&.iso8601,
@@ -64,6 +64,7 @@ module RailsErrorDashboard
64
64
  locale
65
65
  )
66
66
  },
67
+ *environment_fields(error_log, locale),
67
68
  {
68
69
  type: "mrkdwn",
69
70
  text: NotificationHelpers.field(
@@ -74,6 +75,14 @@ module RailsErrorDashboard
74
75
  }
75
76
  end
76
77
 
78
+ # One field when the error carries an environment, none for a legacy
79
+ # row — so pre-0.11 notifications render exactly as they did.
80
+ def self.environment_fields(error_log, locale)
81
+ return [] unless error_log.respond_to?(:environment) && error_log.environment.present?
82
+
83
+ [ { type: "mrkdwn", text: NotificationHelpers.field(:environment, error_log.environment, locale) } ]
84
+ end
85
+
77
86
  def self.message_block(error_log, locale)
78
87
  {
79
88
  type: "section",
@@ -232,6 +232,8 @@ module RailsErrorDashboard
232
232
  def maybe_storm_notification(state)
233
233
  return if state == :closed
234
234
  return unless RailsErrorDashboard.configuration.storm_notification
235
+ # A storm on staging should not page whoever is on call for production.
236
+ return unless RailsErrorDashboard::Services::NotificationThrottler.environment_allowed?
235
237
 
236
238
  episode = breaker.episode_snapshot
237
239
  return unless episode
@@ -37,6 +37,7 @@ module RailsErrorDashboard
37
37
  message: error_log.message,
38
38
  severity: error_log.severity.to_s,
39
39
  platform: error_log.platform,
40
+ environment: error_log.environment,
40
41
  controller: error_log.controller_name,
41
42
  action: error_log.action_name,
42
43
  occurrence_count: error_log.occurrence_count,
@@ -1,3 +1,3 @@
1
1
  module RailsErrorDashboard
2
- VERSION = "0.10.0"
2
+ VERSION = "0.11.0"
3
3
  end
@@ -109,6 +109,7 @@ require "rails_error_dashboard/commands/resolve_error"
109
109
  require "rails_error_dashboard/commands/create_issue"
110
110
  require "rails_error_dashboard/commands/link_existing_issue"
111
111
  require "rails_error_dashboard/commands/flush_storm_counts"
112
+ require "rails_error_dashboard/commands/backfill_environments"
112
113
  require "rails_error_dashboard/services/issue_body_formatter"
113
114
  require "rails_error_dashboard/commands/batch_resolve_errors"
114
115
  require "rails_error_dashboard/commands/batch_delete_errors"
@@ -1,6 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  namespace :rails_error_dashboard do
4
+ desc "Fill in environment on error logs captured before the column existed (from environment_info.rails_env)"
5
+ task backfill_environments: :environment do
6
+ updated = RailsErrorDashboard::Commands::BackfillEnvironments.call
7
+ puts "rails_error_dashboard: backfilled environment on #{updated} error log(s)."
8
+ end
9
+
4
10
  namespace :db do
5
11
  desc "Drop all Rails Error Dashboard database tables (⚠️ DESTRUCTIVE - deletes all error data)"
6
12
  task drop: :environment do
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.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anjan Jagirdar
@@ -392,6 +392,7 @@ files:
392
392
  - db/migrate/20260613000001_create_storm_events.rb
393
393
  - db/migrate/20260730000001_create_rails_error_dashboard_rack_attack_events.rb
394
394
  - db/migrate/20260824000001_add_user_agent_to_rack_attack_events.rb
395
+ - db/migrate/20260826000001_add_environment_to_error_logs.rb
395
396
  - lib/generators/rails_error_dashboard/install/install_generator.rb
396
397
  - lib/generators/rails_error_dashboard/install/templates/README
397
398
  - lib/generators/rails_error_dashboard/install/templates/initializer.rb
@@ -401,6 +402,7 @@ files:
401
402
  - lib/rails_error_dashboard.rb
402
403
  - lib/rails_error_dashboard/commands/add_error_comment.rb
403
404
  - lib/rails_error_dashboard/commands/assign_error.rb
405
+ - lib/rails_error_dashboard/commands/backfill_environments.rb
404
406
  - lib/rails_error_dashboard/commands/batch_delete_errors.rb
405
407
  - lib/rails_error_dashboard/commands/batch_mute_errors.rb
406
408
  - lib/rails_error_dashboard/commands/batch_resolve_errors.rb
@@ -559,7 +561,7 @@ metadata:
559
561
  funding_uri: https://github.com/sponsors/AnjanJ
560
562
  post_install_message: |
561
563
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
562
- RED (Rails Error Dashboard) v0.10.0
564
+ RED (Rails Error Dashboard) v0.11.0
563
565
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
564
566
 
565
567
  First install: