diff --git a/demo/app/jobs/pg_hero_maintenance_job.rb b/demo/app/jobs/pg_hero_maintenance_job.rb new file mode 100644 index 000000000..cbc122229 --- /dev/null +++ b/demo/app/jobs/pg_hero_maintenance_job.rb @@ -0,0 +1,15 @@ +class PgHeroMaintenanceJob < ApplicationJob + include GoodJob::ActiveJobExtensions::Concurrency + + good_job_control_concurrency_with( + key: "pg_hero_maintenance", + total_limit: 1 + ) + + discard_on StandardError + + def perform + PgHero.capture_query_stats + PgHero.clean_query_stats + end +end diff --git a/demo/config/initializers/good_job.rb b/demo/config/initializers/good_job.rb index 41d5aaf6c..29629e367 100644 --- a/demo/config/initializers/good_job.rb +++ b/demo/config/initializers/good_job.rb @@ -82,6 +82,11 @@ complex_schedule: { cron: -> (last_ran) { last_ran ? last_ran + 17.hours : Time.now}, class: "OtherJob", + }, + pg_hero_maintenance: { + cron: "*/10 * * * *", # Every 10 minutes + class: "PgHeroMaintenanceJob", + description: "Runs PG Hero maintenance", } } end diff --git a/demo/db/migrate/20240321162554_create_pghero_query_stats.rb b/demo/db/migrate/20240321162554_create_pghero_query_stats.rb new file mode 100644 index 000000000..0a900862a --- /dev/null +++ b/demo/db/migrate/20240321162554_create_pghero_query_stats.rb @@ -0,0 +1,15 @@ +class CreatePgheroQueryStats < ActiveRecord::Migration[7.1] + def change + create_table :pghero_query_stats do |t| + t.text :database + t.text :user + t.text :query + t.integer :query_hash, limit: 8 + t.float :total_time + t.integer :calls, limit: 8 + t.timestamp :captured_at + end + + add_index :pghero_query_stats, [:database, :captured_at] + end +end diff --git a/demo/db/schema.rb b/demo/db/schema.rb index 2100422ee..740662cc2 100644 --- a/demo/db/schema.rb +++ b/demo/db/schema.rb @@ -10,8 +10,9 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2024_01_14_221613) do +ActiveRecord::Schema.define(version: 2024_03_21_162554) do # These are extensions that must be enabled in order to support this database + enable_extension "pg_stat_statements" enable_extension "pgcrypto" enable_extension "plpgsql" @@ -94,4 +95,15 @@ t.index ["scheduled_at"], name: "index_good_jobs_on_scheduled_at", where: "(finished_at IS NULL)" end + create_table "pghero_query_stats", force: :cascade do |t| + t.text "database" + t.text "user" + t.text "query" + t.bigint "query_hash" + t.float "total_time" + t.bigint "calls" + t.datetime "captured_at", precision: nil + t.index ["database", "captured_at"], name: "index_pghero_query_stats_on_database_and_captured_at" + end + end