73 lines
1.7 KiB
Ruby
73 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
|