debian-mirror-gitlab/lib/gitlab/memory/upload_and_cleanup_reports.rb
2022-11-25 23:54:43 +05:30

72 lines
1.7 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Memory
class UploadAndCleanupReports
DEFAULT_SLEEP_TIME_SECONDS = 900 # 15 minutes
def initialize(
uploader:,
reports_path:,
logger:,
sleep_time_seconds: ENV['GITLAB_DIAGNOSTIC_REPORTS_UPLOADER_SLEEP_S']&.to_i || DEFAULT_SLEEP_TIME_SECONDS)
@uploader = uploader
@reports_path = reports_path
@sleep_time_seconds = sleep_time_seconds
@alive = true
@logger = logger
end
attr_reader :uploader, :reports_path, :sleep_time_seconds, :logger
def call
log_started
loop do
sleep(sleep_time_seconds)
files_to_process.each { |path| upload_and_cleanup!(path) }
end
end
private
def upload_and_cleanup!(path)
uploader.upload(path)
rescue StandardError, Errno::ENOENT => error
log_exception(error)
ensure
cleanup!(path)
end
def cleanup!(path)
File.unlink(path) if File.exist?(path)
rescue Errno::ENOENT
# Path does not exist: Ignore. We already check `File.exist?`. Rescue to be extra safe.
end
def files_to_process
Dir.entries(reports_path)
.map { |path| File.join(reports_path, path) }
.select { |path| File.file?(path) }
end
def log_started
logger.info(log_labels.merge(perf_report_status: "started"))
end
def log_exception(error)
logger.error(log_labels.merge(perf_report_status: "error", error: error.message))
end
def log_labels
{
message: "Diagnostic reports",
class: self.class.name,
pid: $$
}
end
end
end
end