Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

finished_at_start/end job filters #111

Merged
merged 25 commits into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
704cb86
jobs_relation finished_at_start and finished_at_end filters
Xeitor Apr 5, 2024
5ca0682
natively_supported finished_at_* filters for solid_queue
Xeitor Apr 5, 2024
b469206
added filters to _filters partial and params
Xeitor Apr 6, 2024
2e4291d
added timezone
Xeitor Apr 6, 2024
5b41d16
show finished_at filters if jobs_status is 'finished'
Xeitor Apr 7, 2024
60eec4d
added comments to jobs_relation where method
Xeitor Apr 10, 2024
b2c0808
clean finished_at_* filter values when clear button clicked
Xeitor Apr 10, 2024
f0753a9
double instead of single quoted strings (rubocop)
Xeitor Apr 10, 2024
62d5b3b
enhacements set filters
Xeitor Jun 10, 2024
ef2e964
Merge branch 'main' into jobs_finished_at_filters
Xeitor Nov 12, 2024
a8073e7
finished_at range enhacement
Xeitor Nov 17, 2024
3525169
enhace date_with_time_zone method
Xeitor Nov 17, 2024
5503402
back to @job_filters in _filters
Xeitor Nov 17, 2024
38b3bf3
god bye presence
Xeitor Nov 17, 2024
25142b7
bye collect arguments with to_s for values
Xeitor Nov 17, 2024
9d95d16
fix tests
Xeitor Nov 17, 2024
4d7cb3e
bringed back .to_s for queue_name parameters (JobsRelation#where)
Xeitor Nov 24, 2024
02547a2
queue_name back to symbol
Xeitor Nov 25, 2024
2d17d1e
bye finished_at from FILTERS
Xeitor Nov 25, 2024
4295a3d
bye comment
Xeitor Nov 25, 2024
0b07af3
added finished_at in supported_job_filters (SolidQueue)
Xeitor Nov 25, 2024
a82d2d8
Update app/views/mission_control/jobs/jobs/_filters.html.erb
Xeitor Nov 26, 2024
7b10cf4
Update lib/active_job/jobs_relation.rb
Xeitor Nov 26, 2024
ae91239
finished_at_range_params method
Xeitor Nov 27, 2024
e0bcd98
double quotes
Xeitor Nov 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion app/controllers/concerns/mission_control/jobs/job_filters.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,18 @@ 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: date_with_time_zone(params.dig(:filter, :finished_at_start))..date_with_time_zone(params.dig(:filter, :finished_at_end)) }.compact
Xeitor marked this conversation as resolved.
Show resolved Hide resolved
end

def active_filters?
@job_filters.any?
end

# TODO: move to helpers ?
def date_with_time_zone(date)
if date.present?
DateTime.parse(date).in_time_zone
end
end
end
12 changes: 11 additions & 1 deletion app/views/mission_control/jobs/jobs/_filters.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@
<%= form.text_field :queue_name, value: @job_filters[:queue_name], class: "input", list: "queue-names", placeholder: "Filter by queue name..." %>
</div>

<% if jobs_status == 'finished' %>
Xeitor marked this conversation as resolved.
Show resolved Hide resolved
<div class="select is-rounded">
<%= form.datetime_field :finished_at_start, value: @job_filters[:finished_at].begin, class: "input", placeholder: "Finished from" %>
</div>

<div class="select is-rounded">
<%= form.datetime_field :finished_at_end, value: @job_filters[:finished_at].end, class: "input", placeholder: "Finished to" %>
</div>
<% end %>

<%= hidden_field_tag :server_id, MissionControl::Jobs::Current.server.id %>

<datalist id="job-classes" class="is-hidden">
Expand All @@ -29,7 +39,7 @@
</div>

<div class="control">
<%= link_to "Clear", application_jobs_path(MissionControl::Jobs::Current.application, jobs_status, job_class_name: nil, queue_name: nil), class: "button" %>
<%= link_to "Clear", application_jobs_path(MissionControl::Jobs::Current.application, jobs_status, job_class_name: nil, queue_name: nil, finished_at: nil..nil), class: "button" %>
</div>
</div>
</div>
12 changes: 7 additions & 5 deletions lib/active_job/jobs_relation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class ActiveJob::JobsRelation
STATUSES = %i[ pending failed in_progress blocked scheduled finished ]
FILTERS = %i[ queue_name job_class_name ]

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 ]
attr_reader *PROPERTIES, :default_page_size

delegate :last, :[], :reverse, to: :to_a
Expand All @@ -51,13 +51,15 @@ def initialize(queue_adapter: ActiveJob::Base.queue_adapter, default_page_size:
# * <tt>:queue_name</tt> - To only include the jobs in the provided queue.
# * <tt>:worker_id</tt> - To only include the jobs processed by the provided worker.
# * <tt>:recurring_task_id</tt> - 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)
# * <tt>:finished_at</tt> - (Range) To only include the jobs finished between de provided range
Xeitor marked this conversation as resolved.
Show resolved Hide resolved
def where(job_class_name: nil, queue_name: nil, worker_id: nil, recurring_task_id: nil, finished_at: nil)
# Remove nil arguments to avoid overriding parameters when concatenating +where+ clauses
arguments = { job_class_name: job_class_name,
queue_name: queue_name,
queue_name: queue_name&.to_s,
Xeitor marked this conversation as resolved.
Show resolved Hide resolved
worker_id: worker_id,
recurring_task_id: recurring_task_id
}.compact.collect { |key, value| [ key, value.to_s ] }.to_h
recurring_task_id: recurring_task_id,
finished_at: finished_at
}.compact

clone_with **arguments
end
Expand Down
9 changes: 7 additions & 2 deletions lib/active_job/queue_adapters/solid_queue_ext.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 ]
end

def jobs_count(jobs_relation)
Expand Down Expand Up @@ -173,7 +173,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, to: :jobs_relation

def executions
execution_class_by_status
Expand All @@ -190,6 +190,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
Expand Down Expand Up @@ -271,6 +272,10 @@ 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)
finished_at.present? ? jobs.where(finished_at: finished_at) : jobs
end

def limit(executions_or_jobs)
limit_value.present? ? executions_or_jobs.limit(limit_value) : executions_or_jobs
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ module ActiveJob::QueueAdapters::AdapterTesting::QueryJobs
10.times { |index| WithPaginationDummyJob.perform_later(index) }
4.times { |index| WithPaginationFailingJob.perform_later(index) }

jobs = ActiveJob.jobs.pending.where(queue_name: :default, job_class_name: WithPaginationDummyJob).to_a
jobs = ActiveJob.jobs.pending.where(queue_name: :default, job_class_name: 'WithPaginationDummyJob').to_a
assert_equal 10, jobs.size
end

Expand Down