52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative '../metrics/system'
|
|
|
|
module Gitlab
|
|
module Memory
|
|
class ReportsUploader
|
|
def initialize(gcs_key:, gcs_project:, gcs_bucket:, logger:)
|
|
@gcs_bucket = gcs_bucket
|
|
@fog = Fog::Storage::Google.new(google_project: gcs_project, google_json_key_location: gcs_key)
|
|
@logger = logger
|
|
end
|
|
|
|
def upload(path)
|
|
log_upload_requested(path)
|
|
start_monotonic_time = Gitlab::Metrics::System.monotonic_time
|
|
|
|
File.open(path.to_s) { |file| fog.put_object(gcs_bucket, File.basename(path), file) }
|
|
|
|
duration_s = Gitlab::Metrics::System.monotonic_time - start_monotonic_time
|
|
log_upload_success(path, duration_s)
|
|
rescue StandardError, Errno::ENOENT => error
|
|
log_exception(error)
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :gcs_bucket, :fog, :logger
|
|
|
|
def log_upload_requested(path)
|
|
logger.info(log_labels.merge(perf_report_status: 'upload requested', perf_report_path: path))
|
|
end
|
|
|
|
def log_upload_success(path, duration_s)
|
|
logger.info(log_labels.merge(perf_report_status: 'upload success', perf_report_path: path,
|
|
duration_s: duration_s))
|
|
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
|