summaryrefslogtreecommitdiff
path: root/lib/gitlab/memory/reports_uploader.rb
blob: 76c3e0862e2e0a8afebc074000a8144e88be6b21 (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
# 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