diff --git a/scripts/database/query_analyzers.rb b/scripts/database/query_analyzers.rb index 390851df81a47441fb9107cf299b063f922e8a23..89eae5e6f2cec44a9711c730209292da4797d080 100644 --- a/scripts/database/query_analyzers.rb +++ b/scripts/database/query_analyzers.rb @@ -1,11 +1,17 @@ # frozen_string_literal: true +require 'yaml' + class Database class QueryAnalyzers attr_reader :analyzers def initialize - @analyzers = ObjectSpace.each_object(::Class).select { |c| c < Base }.map(&:new) + config = YAML.safe_load_file(File.expand_path('query_analyzers.yml', __dir__)) + @analyzers = self.class.all.map do |subclass| + subclass_name = subclass.to_s.split('::').last + subclass.new(config[subclass_name]) + end end def analyze(query) @@ -15,6 +21,12 @@ def analyze(query) def save! analyzers.each(&:save!) end + + class << self + def all + ObjectSpace.each_object(::Class).select { |c| c < Base } + end + end end end diff --git a/scripts/database/query_analyzers.yml b/scripts/database/query_analyzers.yml new file mode 100644 index 0000000000000000000000000000000000000000..8f87d96500dff64242dac9bd528f04e4917e9f45 --- /dev/null +++ b/scripts/database/query_analyzers.yml @@ -0,0 +1,11 @@ +MultiplePartitionScanDetector: + tables: + - p_ci_builds + - p_ci_builds_metadata + - p_ci_job_annotations + - p_ci_runner_machine_builds + todos: + # List query fingerprints which should be ignored until they are fixed. + # These fingerprints can be found in the auto_explain pipeline artifacts. + # Example: + # - c2cfe803a497101b diff --git a/scripts/database/query_analyzers/base.rb b/scripts/database/query_analyzers/base.rb index 4bf47a32da1837aac2c73688e7d0eb42aef8db5d..e56a61b3c396cbcd7a36aa82e3be58ab8c998625 100644 --- a/scripts/database/query_analyzers/base.rb +++ b/scripts/database/query_analyzers/base.rb @@ -7,9 +7,11 @@ class Database class QueryAnalyzers class Base attr_accessor :output + attr_reader :config - def initialize + def initialize(config) @output = {} + @config = config end def filename diff --git a/scripts/database/query_analyzers/multiple_partition_scan_detector.rb b/scripts/database/query_analyzers/multiple_partition_scan_detector.rb index 3afce51f87a8ff29d5c3583f48e462f0ec643d41..1a1415dd8f228c7f666f63241dc658e59b1577c3 100644 --- a/scripts/database/query_analyzers/multiple_partition_scan_detector.rb +++ b/scripts/database/query_analyzers/multiple_partition_scan_detector.rb @@ -5,14 +5,12 @@ class Database class QueryAnalyzers class MultiplePartitionScanDetector < Database::QueryAnalyzers::Base - TABLES = %w[ - p_ci_builds p_ci_builds_metadata p_ci_job_annotations p_ci_runner_machine_builds - ].freeze - def analyze(query) super - TABLES.each do |table_name| + return if config['todos']&.include?(query['fingerprint']) + + config['tables'].each do |table_name| if query['query'].include?(table_name) && query['plan'].to_s.include?('"Subplans Removed"=>0') (output[table_name] ||= []) << query end @@ -20,7 +18,7 @@ def analyze(query) end def save! - TABLES.each do |table_name| + config['tables'].each do |table_name| next unless output[table_name] Zlib::GzipWriter.open(output_path("#{table_name}_multiple_partition_scans.ndjson")) do |file|