rails_pulse 0.2.4 → 0.2.5.pre.pre.2

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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +269 -12
  3. data/Rakefile +142 -8
  4. data/app/assets/stylesheets/rails_pulse/components/table.css +16 -1
  5. data/app/assets/stylesheets/rails_pulse/components/tags.css +7 -2
  6. data/app/assets/stylesheets/rails_pulse/components/utilities.css +3 -0
  7. data/app/controllers/concerns/chart_table_concern.rb +2 -1
  8. data/app/controllers/rails_pulse/application_controller.rb +11 -1
  9. data/app/controllers/rails_pulse/assets_controller.rb +18 -2
  10. data/app/controllers/rails_pulse/job_runs_controller.rb +37 -0
  11. data/app/controllers/rails_pulse/jobs_controller.rb +80 -0
  12. data/app/controllers/rails_pulse/operations_controller.rb +43 -31
  13. data/app/controllers/rails_pulse/queries_controller.rb +1 -1
  14. data/app/controllers/rails_pulse/requests_controller.rb +3 -9
  15. data/app/controllers/rails_pulse/routes_controller.rb +1 -1
  16. data/app/controllers/rails_pulse/tags_controller.rb +31 -5
  17. data/app/helpers/rails_pulse/application_helper.rb +32 -1
  18. data/app/helpers/rails_pulse/breadcrumbs_helper.rb +15 -1
  19. data/app/helpers/rails_pulse/status_helper.rb +16 -0
  20. data/app/helpers/rails_pulse/tags_helper.rb +39 -1
  21. data/app/javascript/rails_pulse/controllers/chart_controller.js +112 -8
  22. data/app/models/concerns/rails_pulse/taggable.rb +25 -2
  23. data/app/models/rails_pulse/charts/operations_chart.rb +33 -0
  24. data/app/models/rails_pulse/dashboard/charts/p95_response_time.rb +1 -2
  25. data/app/models/rails_pulse/dashboard/tables/slow_routes.rb +1 -1
  26. data/app/models/rails_pulse/job.rb +85 -0
  27. data/app/models/rails_pulse/job_run.rb +76 -0
  28. data/app/models/rails_pulse/jobs/cards/average_duration.rb +85 -0
  29. data/app/models/rails_pulse/jobs/cards/base.rb +70 -0
  30. data/app/models/rails_pulse/jobs/cards/failure_rate.rb +85 -0
  31. data/app/models/rails_pulse/jobs/cards/total_jobs.rb +74 -0
  32. data/app/models/rails_pulse/jobs/cards/total_runs.rb +48 -0
  33. data/app/models/rails_pulse/operation.rb +16 -3
  34. data/app/models/rails_pulse/queries/cards/average_query_times.rb +3 -3
  35. data/app/models/rails_pulse/queries/cards/execution_rate.rb +1 -1
  36. data/app/models/rails_pulse/queries/cards/percentile_query_times.rb +1 -1
  37. data/app/models/rails_pulse/queries/tables/index.rb +2 -1
  38. data/app/models/rails_pulse/query.rb +10 -1
  39. data/app/models/rails_pulse/routes/cards/average_response_times.rb +3 -2
  40. data/app/models/rails_pulse/routes/cards/error_rate_per_route.rb +1 -1
  41. data/app/models/rails_pulse/routes/cards/percentile_response_times.rb +1 -1
  42. data/app/models/rails_pulse/routes/cards/request_count_totals.rb +1 -1
  43. data/app/models/rails_pulse/routes/tables/index.rb +2 -1
  44. data/app/models/rails_pulse/summary.rb +10 -3
  45. data/app/services/rails_pulse/summary_service.rb +46 -0
  46. data/app/views/layouts/rails_pulse/_menu_items.html.erb +7 -0
  47. data/app/views/layouts/rails_pulse/application.html.erb +23 -0
  48. data/app/views/rails_pulse/components/_active_filters.html.erb +7 -6
  49. data/app/views/rails_pulse/components/_page_header.html.erb +8 -7
  50. data/app/views/rails_pulse/components/_table.html.erb +7 -4
  51. data/app/views/rails_pulse/dashboard/index.html.erb +1 -1
  52. data/app/views/rails_pulse/job_runs/_operations.html.erb +78 -0
  53. data/app/views/rails_pulse/job_runs/index.html.erb +3 -0
  54. data/app/views/rails_pulse/job_runs/show.html.erb +51 -0
  55. data/app/views/rails_pulse/jobs/_job_runs_table.html.erb +35 -0
  56. data/app/views/rails_pulse/jobs/_table.html.erb +43 -0
  57. data/app/views/rails_pulse/jobs/index.html.erb +34 -0
  58. data/app/views/rails_pulse/jobs/show.html.erb +49 -0
  59. data/app/views/rails_pulse/operations/_operation_analysis_application.html.erb +29 -27
  60. data/app/views/rails_pulse/operations/_operation_analysis_view.html.erb +11 -9
  61. data/app/views/rails_pulse/operations/show.html.erb +10 -8
  62. data/app/views/rails_pulse/queries/_table.html.erb +3 -3
  63. data/app/views/rails_pulse/requests/_table.html.erb +6 -6
  64. data/app/views/rails_pulse/routes/_table.html.erb +3 -3
  65. data/app/views/rails_pulse/routes/show.html.erb +1 -1
  66. data/app/views/rails_pulse/tags/_tag_manager.html.erb +7 -14
  67. data/config/brakeman.ignore +213 -0
  68. data/config/brakeman.yml +68 -0
  69. data/config/initializers/rails_pulse.rb +52 -0
  70. data/config/routes.rb +6 -0
  71. data/db/rails_pulse_migrate/20250113000000_add_jobs_to_rails_pulse.rb +95 -0
  72. data/db/rails_pulse_migrate/20250122000000_add_query_fingerprinting.rb +150 -0
  73. data/db/rails_pulse_migrate/20250202000000_add_index_to_request_uuid.rb +14 -0
  74. data/db/rails_pulse_schema.rb +186 -103
  75. data/lib/generators/rails_pulse/templates/db/rails_pulse_schema.rb +186 -103
  76. data/lib/generators/rails_pulse/templates/migrations/install_rails_pulse_tables.rb +30 -1
  77. data/lib/generators/rails_pulse/templates/rails_pulse.rb +31 -0
  78. data/lib/rails_pulse/active_job_extensions.rb +13 -0
  79. data/lib/rails_pulse/adapters/delayed_job_plugin.rb +25 -0
  80. data/lib/rails_pulse/adapters/sidekiq_middleware.rb +41 -0
  81. data/lib/rails_pulse/cleanup_service.rb +65 -0
  82. data/lib/rails_pulse/configuration.rb +80 -7
  83. data/lib/rails_pulse/engine.rb +34 -3
  84. data/lib/rails_pulse/extensions/active_record.rb +82 -0
  85. data/lib/rails_pulse/job_run_collector.rb +172 -0
  86. data/lib/rails_pulse/middleware/request_collector.rb +20 -43
  87. data/lib/rails_pulse/subscribers/operation_subscriber.rb +11 -5
  88. data/lib/rails_pulse/tracker.rb +82 -0
  89. data/lib/rails_pulse/version.rb +1 -1
  90. data/lib/rails_pulse.rb +2 -0
  91. data/lib/rails_pulse_server.ru +107 -0
  92. data/lib/tasks/rails_pulse_benchmark.rake +382 -0
  93. data/public/rails-pulse-assets/rails-pulse-icons.js +3 -2
  94. data/public/rails-pulse-assets/rails-pulse-icons.js.map +1 -1
  95. data/public/rails-pulse-assets/rails-pulse.css +1 -1
  96. data/public/rails-pulse-assets/rails-pulse.css.map +1 -1
  97. data/public/rails-pulse-assets/rails-pulse.js +1 -1
  98. data/public/rails-pulse-assets/rails-pulse.js.map +3 -3
  99. metadata +35 -7
  100. data/app/models/rails_pulse/requests/charts/operations_chart.rb +0 -35
  101. data/db/migrate/20250930105043_install_rails_pulse_tables.rb +0 -23
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_pulse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5.pre.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rails Pulse
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-11-05 00:00:00.000000000 Z
10
+ date: 2025-12-18 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -112,19 +112,19 @@ dependencies:
112
112
  - !ruby/object:Gem::Version
113
113
  version: '44'
114
114
  - !ruby/object:Gem::Dependency
115
- name: groupdate
115
+ name: async
116
116
  requirement: !ruby/object:Gem::Requirement
117
117
  requirements:
118
118
  - - "~>"
119
119
  - !ruby/object:Gem::Version
120
- version: '6.0'
120
+ version: '2.0'
121
121
  type: :runtime
122
122
  prerelease: false
123
123
  version_requirements: !ruby/object:Gem::Requirement
124
124
  requirements:
125
125
  - - "~>"
126
126
  - !ruby/object:Gem::Version
127
- version: '6.0'
127
+ version: '2.0'
128
128
  - !ruby/object:Gem::Dependency
129
129
  name: rails-controller-testing
130
130
  requirement: !ruby/object:Gem::Requirement
@@ -190,6 +190,8 @@ files:
190
190
  - app/controllers/rails_pulse/assets_controller.rb
191
191
  - app/controllers/rails_pulse/csp_test_controller.rb
192
192
  - app/controllers/rails_pulse/dashboard_controller.rb
193
+ - app/controllers/rails_pulse/job_runs_controller.rb
194
+ - app/controllers/rails_pulse/jobs_controller.rb
193
195
  - app/controllers/rails_pulse/operations_controller.rb
194
196
  - app/controllers/rails_pulse/queries_controller.rb
195
197
  - app/controllers/rails_pulse/requests_controller.rb
@@ -230,10 +232,18 @@ files:
230
232
  - app/mailers/rails_pulse/application_mailer.rb
231
233
  - app/models/concerns/rails_pulse/taggable.rb
232
234
  - app/models/rails_pulse/application_record.rb
235
+ - app/models/rails_pulse/charts/operations_chart.rb
233
236
  - app/models/rails_pulse/dashboard/charts/average_response_time.rb
234
237
  - app/models/rails_pulse/dashboard/charts/p95_response_time.rb
235
238
  - app/models/rails_pulse/dashboard/tables/slow_queries.rb
236
239
  - app/models/rails_pulse/dashboard/tables/slow_routes.rb
240
+ - app/models/rails_pulse/job.rb
241
+ - app/models/rails_pulse/job_run.rb
242
+ - app/models/rails_pulse/jobs/cards/average_duration.rb
243
+ - app/models/rails_pulse/jobs/cards/base.rb
244
+ - app/models/rails_pulse/jobs/cards/failure_rate.rb
245
+ - app/models/rails_pulse/jobs/cards/total_jobs.rb
246
+ - app/models/rails_pulse/jobs/cards/total_runs.rb
237
247
  - app/models/rails_pulse/operation.rb
238
248
  - app/models/rails_pulse/queries/cards/average_query_times.rb
239
249
  - app/models/rails_pulse/queries/cards/execution_rate.rb
@@ -243,7 +253,6 @@ files:
243
253
  - app/models/rails_pulse/query.rb
244
254
  - app/models/rails_pulse/request.rb
245
255
  - app/models/rails_pulse/requests/charts/average_response_times.rb
246
- - app/models/rails_pulse/requests/charts/operations_chart.rb
247
256
  - app/models/rails_pulse/requests/tables/index.rb
248
257
  - app/models/rails_pulse/route.rb
249
258
  - app/models/rails_pulse/routes/cards/average_response_times.rb
@@ -285,6 +294,13 @@ files:
285
294
  - app/views/rails_pulse/dashboard/index.html.erb
286
295
  - app/views/rails_pulse/dashboard/tables/_routes_table.html.erb
287
296
  - app/views/rails_pulse/dashboard/tables/_standard_table.html.erb
297
+ - app/views/rails_pulse/job_runs/_operations.html.erb
298
+ - app/views/rails_pulse/job_runs/index.html.erb
299
+ - app/views/rails_pulse/job_runs/show.html.erb
300
+ - app/views/rails_pulse/jobs/_job_runs_table.html.erb
301
+ - app/views/rails_pulse/jobs/_table.html.erb
302
+ - app/views/rails_pulse/jobs/index.html.erb
303
+ - app/views/rails_pulse/jobs/show.html.erb
288
304
  - app/views/rails_pulse/operations/_operation_analysis_application.html.erb
289
305
  - app/views/rails_pulse/operations/_operation_analysis_database.html.erb
290
306
  - app/views/rails_pulse/operations/_operation_analysis_generic.html.erb
@@ -312,10 +328,14 @@ files:
312
328
  - app/views/rails_pulse/skeletons/_panel.html.erb
313
329
  - app/views/rails_pulse/skeletons/_table.html.erb
314
330
  - app/views/rails_pulse/tags/_tag_manager.html.erb
331
+ - config/brakeman.ignore
332
+ - config/brakeman.yml
315
333
  - config/importmap.rb
316
334
  - config/initializers/rails_pulse.rb
317
335
  - config/routes.rb
318
- - db/migrate/20250930105043_install_rails_pulse_tables.rb
336
+ - db/rails_pulse_migrate/20250113000000_add_jobs_to_rails_pulse.rb
337
+ - db/rails_pulse_migrate/20250122000000_add_query_fingerprinting.rb
338
+ - db/rails_pulse_migrate/20250202000000_add_index_to_request_uuid.rb
319
339
  - db/rails_pulse_schema.rb
320
340
  - lib/generators/rails_pulse/convert_to_migrations_generator.rb
321
341
  - lib/generators/rails_pulse/install_generator.rb
@@ -325,14 +345,22 @@ files:
325
345
  - lib/generators/rails_pulse/templates/rails_pulse.rb
326
346
  - lib/generators/rails_pulse/upgrade_generator.rb
327
347
  - lib/rails_pulse.rb
348
+ - lib/rails_pulse/active_job_extensions.rb
349
+ - lib/rails_pulse/adapters/delayed_job_plugin.rb
350
+ - lib/rails_pulse/adapters/sidekiq_middleware.rb
328
351
  - lib/rails_pulse/cleanup_service.rb
329
352
  - lib/rails_pulse/configuration.rb
330
353
  - lib/rails_pulse/engine.rb
354
+ - lib/rails_pulse/extensions/active_record.rb
355
+ - lib/rails_pulse/job_run_collector.rb
331
356
  - lib/rails_pulse/middleware/asset_server.rb
332
357
  - lib/rails_pulse/middleware/request_collector.rb
333
358
  - lib/rails_pulse/subscribers/operation_subscriber.rb
359
+ - lib/rails_pulse/tracker.rb
334
360
  - lib/rails_pulse/version.rb
361
+ - lib/rails_pulse_server.ru
335
362
  - lib/tasks/rails_pulse.rake
363
+ - lib/tasks/rails_pulse_benchmark.rake
336
364
  - lib/tasks/rails_pulse_tasks.rake
337
365
  - public/rails-pulse-assets/csp-test.js
338
366
  - public/rails-pulse-assets/rails-pulse-icons.js
@@ -1,35 +0,0 @@
1
- module RailsPulse
2
- module Requests
3
- module Charts
4
- class OperationsChart
5
- OperationBar = Struct.new(:operation, :duration, :left_pct, :width_pct)
6
-
7
- attr_reader :bars, :min_start, :max_end, :total_duration
8
-
9
- HORIZONTAL_OFFSET_PX = 20
10
-
11
- def initialize(operations)
12
- @operations = operations
13
- @min_start = @operations.map(&:start_time).min || 0
14
- @max_end = @operations.map { |op| op.start_time + op.duration }.max || 1
15
- @total_duration = (@max_end - @min_start).nonzero? || 1
16
- @bars = build_bars
17
- end
18
-
19
- private
20
-
21
- def build_bars
22
- @operations.map do |operation|
23
- left_pct = ((operation.start_time - @min_start).to_f / @total_duration) * (100 - px_to_pct) + px_to_pct / 2
24
- width_pct = (operation.duration.to_f / @total_duration) * (100 - px_to_pct)
25
- OperationBar.new(operation, operation.duration.round(0), left_pct, width_pct)
26
- end
27
- end
28
-
29
- def px_to_pct
30
- (HORIZONTAL_OFFSET_PX.to_f / 1000) * 100
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,23 +0,0 @@
1
- # Generated from Rails Pulse schema - automatically loads current schema definition
2
- class InstallRailsPulseTables < ActiveRecord::Migration["#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}".to_f]
3
- def change
4
- # Load and execute the Rails Pulse schema directly
5
- # This ensures the migration is always in sync with the schema file
6
- schema_file = File.join(File.dirname(__FILE__), "..", "rails_pulse_schema.rb")
7
-
8
- if File.exist?(schema_file)
9
- say "Loading Rails Pulse schema from db/rails_pulse_schema.rb"
10
-
11
- # Load the schema file to define RailsPulse::Schema
12
- load schema_file
13
-
14
- # Execute the schema in the context of this migration
15
- RailsPulse::Schema.call(connection)
16
-
17
- say "Rails Pulse tables created successfully"
18
- say "The schema file db/rails_pulse_schema.rb remains as your single source of truth"
19
- else
20
- raise "Rails Pulse schema file not found at db/rails_pulse_schema.rb"
21
- end
22
- end
23
- end