diff --git a/app/controllers/concerns/mission_control/jobs/adapter_features.rb b/app/controllers/concerns/mission_control/jobs/adapter_features.rb index e4e09c72..fceea0d4 100644 --- a/app/controllers/concerns/mission_control/jobs/adapter_features.rb +++ b/app/controllers/concerns/mission_control/jobs/adapter_features.rb @@ -2,7 +2,7 @@ module MissionControl::Jobs::AdapterFeatures extend ActiveSupport::Concern included do - helper_method :supported_job_statuses, :queue_pausing_supported?, :workers_exposed?, :recurring_tasks_supported? + helper_method :supported_job_statuses, :queue_pausing_supported?, :workers_exposed?, :supports_dashboard?, :recurring_tasks_supported? end private @@ -21,4 +21,8 @@ def workers_exposed? def recurring_tasks_supported? MissionControl::Jobs::Current.server.queue_adapter.supports_recurring_tasks? end + + def supports_dashboard? + MissionControl::Jobs::Current.server.queue_adapter.supports_dashboard? + end end diff --git a/app/controllers/mission_control/jobs/dashboard_controller.rb b/app/controllers/mission_control/jobs/dashboard_controller.rb new file mode 100644 index 00000000..238bd9c2 --- /dev/null +++ b/app/controllers/mission_control/jobs/dashboard_controller.rb @@ -0,0 +1,4 @@ +class MissionControl::Jobs::DashboardController < MissionControl::Jobs::ApplicationController + def index + end +end diff --git a/app/controllers/mission_control/jobs/internal_api/dashboard_controller.rb b/app/controllers/mission_control/jobs/internal_api/dashboard_controller.rb new file mode 100644 index 00000000..ad626003 --- /dev/null +++ b/app/controllers/mission_control/jobs/internal_api/dashboard_controller.rb @@ -0,0 +1,35 @@ +class MissionControl::Jobs::InternalApi::DashboardController < MissionControl::Jobs.base_controller_class.constantize + include ActionView::Helpers::NumberHelper + + def index + render json: { + uptime: { + label: Time.now.strftime("%H:%M:%S"), + pending: queue_job.pendings.where.not(id: failed_execution.select(:job_id)).size, + failed: failed_execution.where("created_at >= ?", time_to_consult.seconds.ago).size, + finished: queue_job.finisheds.where("finished_at >= ?", time_to_consult.seconds.ago).size, + }, + total: { + failed: number_with_delimiter(ActiveJob.jobs.failed.count), + pending: number_with_delimiter(ActiveJob.jobs.pending.count), + scheduled: number_with_delimiter(ActiveJob.jobs.scheduled.count), + in_progress: number_with_delimiter(ActiveJob.jobs.in_progress.count), + finished: number_with_delimiter(ActiveJob.jobs.finished.count) + } + }, + status: :ok + end + + private + def time_to_consult + params[:uptime].to_i || 5 + end + + def failed_execution + MissionControl::SolidQueueFailedExecution + end + + def queue_job + MissionControl::SolidQueueJob + end +end diff --git a/app/controllers/mission_control/jobs/internal_api/navigation_controller.rb b/app/controllers/mission_control/jobs/internal_api/navigation_controller.rb new file mode 100644 index 00000000..c65be689 --- /dev/null +++ b/app/controllers/mission_control/jobs/internal_api/navigation_controller.rb @@ -0,0 +1,13 @@ +class MissionControl::Jobs::InternalApi::NavigationController < MissionControl::Jobs::ApplicationController + include ActionView::Helpers::NumberHelper + include MissionControl::Jobs::NavigationHelper + + + def index + @navigation_sections = navigation_sections + + render partial: "layouts/mission_control/jobs/navigation_update", locals: { + section: params[:section].to_sym + } + end +end diff --git a/app/helpers/mission_control/jobs/navigation_helper.rb b/app/helpers/mission_control/jobs/navigation_helper.rb index db2a48ed..9bb0f6f0 100644 --- a/app/helpers/mission_control/jobs/navigation_helper.rb +++ b/app/helpers/mission_control/jobs/navigation_helper.rb @@ -2,12 +2,18 @@ module MissionControl::Jobs::NavigationHelper attr_reader :page_title, :current_section def navigation_sections - { queues: [ "Queues", application_queues_path(@application) ] }.tap do |sections| + sections = { } + sections[:dashboard] = [ "Dashboard", application_dashboard_index_path(@application) ] if supports_dashboard? + + sections.tap do |sections| + sections[:queues] = [ "Queues", application_queues_path(@application) ] + supported_job_statuses.without(:pending).each do |status| - sections[navigation_section_for_status(status)] = [ "#{status.to_s.titleize} jobs (#{jobs_count_with_status(status)})", application_jobs_path(@application, status) ] + sections[navigation_section_for_status(status)] = [ "#{status.to_s.titleize} jobs (#{jobs_count_with_status(status)})", application_jobs_path(@application, status) ] end sections[:workers] = [ "Workers", application_workers_path(@application) ] if workers_exposed? + sections[:recurring_tasks] = [ "Recurring tasks", application_recurring_tasks_path(@application) ] if recurring_tasks_supported? end end diff --git a/app/models/mission_control/solid_queue_failed_execution.rb b/app/models/mission_control/solid_queue_failed_execution.rb new file mode 100644 index 00000000..039ae778 --- /dev/null +++ b/app/models/mission_control/solid_queue_failed_execution.rb @@ -0,0 +1,3 @@ +class MissionControl::SolidQueueFailedExecution < MissionControl::SolidQueueRecord + self.table_name = 'solid_queue_failed_executions' +end diff --git a/app/models/mission_control/solid_queue_job.rb b/app/models/mission_control/solid_queue_job.rb new file mode 100644 index 00000000..4c9f92a4 --- /dev/null +++ b/app/models/mission_control/solid_queue_job.rb @@ -0,0 +1,6 @@ +class MissionControl::SolidQueueJob < MissionControl::SolidQueueRecord + self.table_name = 'solid_queue_jobs' + + scope :pendings, -> { where(finished_at: nil) } + scope :finisheds, -> { where.not(finished_at: nil) } +end diff --git a/app/models/mission_control/solid_queue_record.rb b/app/models/mission_control/solid_queue_record.rb new file mode 100644 index 00000000..1da46599 --- /dev/null +++ b/app/models/mission_control/solid_queue_record.rb @@ -0,0 +1,7 @@ +class MissionControl::SolidQueueRecord < ApplicationRecord + self.abstract_class = true + + if !ActiveRecord::Base.connection.data_source_exists?('solid_queue_jobs') + connects_to database: { writing: :queue, reading: :queue } + end +end diff --git a/app/views/layouts/mission_control/jobs/_navigation.html.erb b/app/views/layouts/mission_control/jobs/_navigation.html.erb index 67347fa9..4acdf504 100644 --- a/app/views/layouts/mission_control/jobs/_navigation.html.erb +++ b/app/views/layouts/mission_control/jobs/_navigation.html.erb @@ -1,4 +1,4 @@ -