Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/memory/upload_and_cleanup_reports.rb')
-rw-r--r--lib/gitlab/memory/upload_and_cleanup_reports.rb72
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/gitlab/memory/upload_and_cleanup_reports.rb b/lib/gitlab/memory/upload_and_cleanup_reports.rb
new file mode 100644
index 00000000000..27d94df478c
--- /dev/null
+++ b/lib/gitlab/memory/upload_and_cleanup_reports.rb
@@ -0,0 +1,72 @@
+# 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