From 704cb8682dd26ad333f18be475ecb6f7609ce5b5 Mon Sep 17 00:00:00 2001 From: Ezequiel Salas Date: Fri, 5 Apr 2024 18:52:16 -0300 Subject: [PATCH 01/24] jobs_relation finished_at_start and finished_at_end filters --- lib/active_job/jobs_relation.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/active_job/jobs_relation.rb b/lib/active_job/jobs_relation.rb index 60cb1abc..d773c691 100644 --- a/lib/active_job/jobs_relation.rb +++ b/lib/active_job/jobs_relation.rb @@ -23,9 +23,9 @@ class ActiveJob::JobsRelation include Enumerable STATUSES = %i[ pending failed in_progress blocked scheduled finished ] - FILTERS = %i[ queue_name job_class_name ] + FILTERS = %i[ queue_name job_class_name finished_at_start finished_at_end ] - PROPERTIES = %i[ queue_name status offset_value limit_value job_class_name worker_id recurring_task_id ] + PROPERTIES = %i[ queue_name status offset_value limit_value job_class_name worker_id recurring_task_id finished_at_start finished_at_end ] attr_reader *PROPERTIES, :default_page_size delegate :last, :[], :reverse, to: :to_a @@ -51,12 +51,14 @@ def initialize(queue_adapter: ActiveJob::Base.queue_adapter, default_page_size: # * :queue_name - To only include the jobs in the provided queue. # * :worker_id - To only include the jobs processed by the provided worker. # * :recurring_task_id - To only include the jobs corresponding to runs of a recurring task. - def where(job_class_name: nil, queue_name: nil, worker_id: nil, recurring_task_id: nil) + def where(job_class_name: nil, queue_name: nil, worker_id: nil, recurring_task_id: nil, finished_at_start: nil, finished_at_end: nil) # Remove nil arguments to avoid overriding parameters when concatenating +where+ clauses arguments = { job_class_name: job_class_name, queue_name: queue_name, worker_id: worker_id, - recurring_task_id: recurring_task_id + recurring_task_id: recurring_task_id, + finished_at_start: finished_at_start, + finished_at_end: finished_at_end }.compact.collect { |key, value| [ key, value.to_s ] }.to_h clone_with **arguments From 5ca06820488000920ddbe20e023ebf7f67509bdc Mon Sep 17 00:00:00 2001 From: Ezequiel Salas Date: Fri, 5 Apr 2024 18:52:29 -0300 Subject: [PATCH 02/24] natively_supported finished_at_* filters for solid_queue --- .../queue_adapters/solid_queue_ext.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/active_job/queue_adapters/solid_queue_ext.rb b/lib/active_job/queue_adapters/solid_queue_ext.rb index 25ec93bc..b69dc2cd 100644 --- a/lib/active_job/queue_adapters/solid_queue_ext.rb +++ b/lib/active_job/queue_adapters/solid_queue_ext.rb @@ -40,7 +40,7 @@ def supported_job_statuses end def supported_job_filters(*) - [ :queue_name, :job_class_name ] + [ :queue_name, :job_class_name, :finished_at_start, :finished_at_end ] end def jobs_count(jobs_relation) @@ -169,7 +169,7 @@ def retry_all attr_reader :jobs_relation delegate :queue_name, :limit_value, :limit_value_provided?, :offset_value, :job_class_name, - :default_page_size, :worker_id, :recurring_task_id, to: :jobs_relation + :default_page_size, :worker_id, :recurring_task_id, :finished_at_start, :finished_at_end, to: :jobs_relation def executions execution_class_by_status @@ -186,6 +186,7 @@ def finished_jobs SolidQueue::Job.finished .then { |jobs| filter_jobs_by_queue(jobs) } .then { |jobs| filter_jobs_by_class(jobs) } + .then { |jobs| filter_jobs_by_finished_at(jobs) } .then { |jobs| limit(jobs) } .then { |jobs| offset(jobs) } end @@ -267,6 +268,18 @@ def filter_jobs_by_class(jobs) job_class_name.present? ? jobs.where(class_name: job_class_name) : jobs end + def filter_jobs_by_finished_at(jobs) + if finished_at_start.present? && finished_at_end.present? + jobs.where('finished_at >= ? AND finished_at <= ?', finished_at_start, finished_at_end) + elsif finished_at_start.present? + jobs.where('finished_at >= ?', finished_at_start) + elsif finished_at_end.present? + jobs.where('finished_at <= ?', finished_at_end) + else + jobs + end + end + def limit(executions_or_jobs) limit_value.present? ? executions_or_jobs.limit(limit_value) : executions_or_jobs end From b4692060ae8d0fb4d479fa9a56ab610513c7455a Mon Sep 17 00:00:00 2001 From: Ezequiel Salas Date: Fri, 5 Apr 2024 21:56:24 -0300 Subject: [PATCH 03/24] added filters to _filters partial and params --- .../concerns/mission_control/jobs/job_filters.rb | 4 +++- app/views/mission_control/jobs/jobs/_filters.html.erb | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/controllers/concerns/mission_control/jobs/job_filters.rb b/app/controllers/concerns/mission_control/jobs/job_filters.rb index 01a171d4..b14ac159 100644 --- a/app/controllers/concerns/mission_control/jobs/job_filters.rb +++ b/app/controllers/concerns/mission_control/jobs/job_filters.rb @@ -9,7 +9,9 @@ module MissionControl::Jobs::JobFilters private def set_filters - @job_filters = { job_class_name: params.dig(:filter, :job_class_name).presence, queue_name: params.dig(:filter, :queue_name).presence }.compact + @job_filters = { job_class_name: params.dig(:filter, :job_class_name).presence, queue_name: params.dig(:filter, :queue_name).presence, + finished_at_start: params.dig(:filter, :finished_at_start).presence, finished_at_end: params.dig(:filter, :finished_at_end) }.compact + end end def active_filters? diff --git a/app/views/mission_control/jobs/jobs/_filters.html.erb b/app/views/mission_control/jobs/jobs/_filters.html.erb index 5421762f..8cde0e92 100644 --- a/app/views/mission_control/jobs/jobs/_filters.html.erb +++ b/app/views/mission_control/jobs/jobs/_filters.html.erb @@ -12,6 +12,14 @@ <%= form.text_field :queue_name, value: @job_filters[:queue_name], class: "input", list: "queue-names", placeholder: "Filter by queue name..." %> +
+ <%= form.datetime_field :finished_at_start, value: @job_filters[:finished_at_start], class: "input", placeholder: "Finished from" %> +
+ +
+ <%= form.datetime_field :finished_at_end, value: @job_filters[:finished_at_end], class: "input", placeholder: "Finished to" %> +
+ <%= hidden_field_tag :server_id, MissionControl::Jobs::Current.server.id %>