notice_parser.rb
2.42 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
module AirbrakeApi
module V3
class NoticeParser
class ParamsError < StandardError; end
attr_reader :params, :error
def initialize(params)
@params = params || {}
end
def attributes
{
error_class: error['type'],
message: error['message'],
backtrace: backtrace,
request: request,
server_environment: server_environment,
api_key: params['key'].present? ? params['key'] : params['project_id'],
notifier: context['notifier'] || params['notifier'],
user_attributes: user_attributes
}
end
def report
ErrorReport.new(attributes)
end
private
def error
fail AirbrakeApi::ParamsError unless params.key?('errors') && params['errors'].any?
@error ||= params['errors'].first
end
def backtrace
(error['backtrace'] || []).map do |backtrace_line|
{
method: backtrace_line['function'],
file: backtrace_line['file'],
number: backtrace_line['line'],
column: backtrace_line['column']
}
end
end
def server_environment
{
'environment-name' => context['environment'],
'hostname' => hostname,
'project-root' => context['rootDirectory'],
'app-version' => context['version']
}
end
def request
environment = params['environment'].merge(
'HTTP_USER_AGENT' => context['userAgent']
)
{
'cgi-data' => environment,
'session' => params['session'],
'params' => params['params'],
'url' => url,
'component' => context['component'],
'action' => context['action']
}
end
def user_attributes
return context['user'] if context['user']
{
'id' => context['userId'],
'name' => context['userName'],
'email' => context['userEmail'],
'username' => context['userUsername']
}.compact
end
def url
context['url']
end
def hostname
context['hostname'] || URI.parse(url).hostname
rescue URI::InvalidURIError
''
end
def context
@context = params['context'] || {}
end
end
end
end