File: error_handling.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (50 lines) | stat: -rw-r--r-- 1,723 bytes parent folder | download
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
# frozen_string_literal: true

module Packages
  module ErrorHandling
    extend ActiveSupport::Concern

    DEFAULT_STATUS_MESSAGE = 'Unexpected error'

    CONTROLLED_ERRORS = [
      ArgumentError,
      ActiveRecord::RecordInvalid,
      ::Packages::Helm::ExtractFileMetadataService::ExtractionError,
      ::Packages::Nuget::ExtractMetadataFileService::ExtractionError,
      ::Packages::Nuget::UpdatePackageFromMetadataService::InvalidMetadataError,
      ::Packages::Nuget::UpdatePackageFromMetadataService::ZipError,
      ::Packages::Rubygems::ProcessGemService::ExtractionError,
      ::Packages::Rubygems::ProcessGemService::InvalidMetadataError,
      ::Packages::Npm::ProcessPackageFileService::ExtractionError,
      ::Packages::Npm::CheckManifestCoherenceService::MismatchError
    ].freeze

    def process_package_file_error(package_file:, exception:, extra_log_payload: {})
      log_payload = {
        project_id: package_file.project_id,
        package_file_id: package_file.id
      }.merge(extra_log_payload)
      Gitlab::ErrorTracking.log_exception(exception, **log_payload)

      package_file.package.update_columns(
        status: :error,
        status_message: truncated_status_message(exception)
      )
    end

    private

    def controlled_error?(exception)
      CONTROLLED_ERRORS.include?(exception.class)
    end

    def truncated_status_message(exception)
      status_message = exception.message if controlled_error?(exception)

      # Do not save the exception message in case it contains confidential data
      status_message ||= "#{DEFAULT_STATUS_MESSAGE}: #{exception.class}"

      status_message.truncate(::Packages::Package::STATUS_MESSAGE_MAX_LENGTH)
    end
  end
end