From 031387143675d9acb7464c90c63e07ad6079de7c Mon Sep 17 00:00:00 2001 From: Matt Kasa <mkasa@gitlab.com> Date: Wed, 18 Oct 2023 19:57:01 -0700 Subject: [PATCH] Add todos config for multiple partition scan detector Relates to https://gitlab.com/gitlab-org/gitlab/-/issues/428704 --- scripts/database/query_analyzers.rb | 14 +++++++++++++- scripts/database/query_analyzers.yml | 11 +++++++++++ scripts/database/query_analyzers/base.rb | 4 +++- .../multiple_partition_scan_detector.rb | 10 ++++------ 4 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 scripts/database/query_analyzers.yml diff --git a/scripts/database/query_analyzers.rb b/scripts/database/query_analyzers.rb index 390851df81a47..89eae5e6f2cec 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 0000000000000..8f87d96500dff --- /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 4bf47a32da183..e56a61b3c396c 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 3afce51f87a8f..1a1415dd8f228 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| -- GitLab