blob: 63b4fbb8c1d449dedf5899499db3797d31f1235e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
# frozen_string_literal: true
module Gitlab
module Database
module QueryAnalyzers
class QueryRecorder < Base
LOG_PATH = 'query_recorder/'
LIST_PARAMETER_REGEX = %r{\$\d+(?:\s*,\s*\$\d+)+}.freeze
SINGLE_PARAMETER_REGEX = %r{\$\d+}.freeze
class << self
def enabled?
# Only enable QueryRecorder in CI on database MRs or default branch
ENV['CI_MERGE_REQUEST_LABELS']&.include?('database') ||
(ENV['CI_COMMIT_REF_NAME'].present? && ENV['CI_COMMIT_REF_NAME'] == ENV['CI_DEFAULT_BRANCH'])
end
def analyze(parsed)
payload = {
normalized: normalize_query(parsed.sql)
}
log_query(payload)
end
def log_file
Rails.root.join(LOG_PATH, "#{ENV.fetch('CI_JOB_NAME_SLUG', 'rspec')}.ndjson")
end
private
def log_query(payload)
log_dir = Rails.root.join(LOG_PATH)
# Create log directory if it does not exist since it is only created
# ahead of time by certain CI jobs
FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
log_line = "#{Gitlab::Json.dump(payload)}\n"
File.write(log_file, log_line, mode: 'a')
end
def normalize_query(query)
query
.gsub(LIST_PARAMETER_REGEX, '?,?,?') # Replace list parameters with ?,?,?
.gsub(SINGLE_PARAMETER_REGEX, '?') # Replace single parameters with ?
end
end
end
end
end
end
|