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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# frozen_string_literal: true
module Gitlab
module GithubGistsImport
class ImportGistWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
include Gitlab::NotifyUponDeath
GISTS_ERRORS_BY_ID = 'gitlab:github-gists-import:%{user_id}:errors'
data_consistency :always
queue_namespace :github_gists_importer
feature_category :importers
sidekiq_options dead: false, retry: 5
def perform(user_id, gist_hash, notify_key)
gist = ::Gitlab::GithubGistsImport::Representation::Gist.from_json_hash(gist_hash)
with_logging(user_id, gist.github_identifiers) do
result = importer_class.new(gist, user_id).execute
error(user_id, result.errors, gist.github_identifiers) unless result.success?
JobWaiter.notify(notify_key, jid)
end
rescue StandardError => e
log_and_track_error(user_id, e, gist.github_identifiers)
raise
end
private
def importer_class
::Gitlab::GithubGistsImport::Importer::GistImporter
end
def with_logging(user_id, github_identifiers)
info(user_id, 'start importer', github_identifiers)
yield
info(user_id, 'importer finished', github_identifiers)
end
def log_and_track_error(user_id, exception, github_identifiers)
error(user_id, exception.message, github_identifiers)
Gitlab::ErrorTracking.track_exception(exception,
import_type: :github_gists,
user_id: user_id
)
end
def error(user_id, error_message, github_identifiers)
attributes = {
user_id: user_id,
github_identifiers: github_identifiers,
message: 'importer failed',
'error.message': error_message
}
Gitlab::GithubImport::Logger.error(structured_payload(attributes))
cache_error_for_email(user_id, github_identifiers[:id], error_message)
end
def info(user_id, message, gist_id)
attributes = {
user_id: user_id,
message: message,
github_identifiers: gist_id
}
Gitlab::GithubImport::Logger.info(structured_payload(attributes))
end
def cache_error_for_email(user_id, gist_id, error_message)
key = format(GISTS_ERRORS_BY_ID, user_id: user_id)
::Gitlab::Cache::Import::Caching.hash_add(key, gist_id, error_message)
end
end
end
end
|