Mercurial > prosody-modules
annotate mod_sentry/sentry.lib.lua @ 4283:2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 08 Dec 2020 15:34:53 +0000 |
parents | |
children | b7045af1e5b7 |
rev | line source |
---|---|
4283
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 local hex = require "util.hex"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 local random = require "util.random"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 local url = require "socket.url"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 local datetime = require "util.datetime".datetime; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 local http = require 'net.http' |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 local json = require "util.json"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 local errors = require "util.error"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local promise = require "util.promise"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 local unpack = unpack or table.unpack -- luacheck: ignore |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local user_agent = ("prosody-mod-%s/%s"):format((module.name:gsub("%W", "-")), (prosody.version:gsub("[^%w.-]", "-"))); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 local function generate_event_id() |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 return hex.to(random.bytes(16)); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 local function get_endpoint(server, name) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 return ("%s/api/%d/%s/"):format(server.base_uri, server.project_id, name); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 -- Parse a DSN string |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 -- https://develop.sentry.dev/sdk/overview/#parsing-the-dsn |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 local function parse_dsn(dsn_string) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 local parsed = url.parse(dsn_string); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 if not parsed then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 return nil, "unable to parse dsn (url)"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 local path, project_id = parsed.path:match("^(.*)/(%d+)$"); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 if not path then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 return nil, "unable to parse dsn (path)"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 local base_uri = url.build({ |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 scheme = parsed.scheme; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 host = parsed.host; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 port = parsed.port; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 path = path; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 }); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 return { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 base_uri = base_uri; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 public_key = parsed.user; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 project_id = project_id; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 local function get_error_data(instance_id, context) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 local data = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 instance_id = instance_id; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 for k, v in pairs(context) do |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 data[k] = tostring(v); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 return data; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 local function error_to_sentry_exception(e) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 return { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 type = e.condition or (e.code and tostring(e.code)) or nil; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 value = e.text or tostring(e); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 context = e.source; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 mechanism = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 type = "generic"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 description = "Prosody error object"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 synthetic = not not e.context.wrapped_error; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 data = get_error_data(e.instance_id, e.context); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 local sentry_event_methods = {}; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 local sentry_event_mt = { __index = sentry_event_methods }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 function sentry_event_methods:set(key, value) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 self.event[key] = value; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 return self; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 function sentry_event_methods:tag(tag_name, tag_value) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 local tags = self.event.tags; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 if not tags then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 tags = {}; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 self.event.tags = tags; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 if type(tag_name) == "string" then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 tags[tag_name] = tag_value; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 else |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 for k, v in pairs(tag_name) do |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 tags[k] = v; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 return self; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 function sentry_event_methods:extra(key, value) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 local extra = self.event.extra; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 if not extra then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 extra = {}; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 self.event.extra = extra; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 if type(key) == "string" then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 extra[key] = tostring(value); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 else |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 for k, v in pairs(key) do |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 extra[k] = tostring(v); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 return self; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 function sentry_event_methods:message(text) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 return self:set("message", { formatted = text }); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 function sentry_event_methods:add_exception(e) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 if errors.is_error(e) then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 e = error_to_sentry_exception(e); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 elseif type(e) ~= "table" or not (e.type and e.value) then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 e = error_to_sentry_exception(errors.coerce(nil, e)); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 local exception = self.event.exception; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 if not exception or not exception.values then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 exception = { values = {} }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 self.event.exception = exception; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 table.insert(exception.values, e); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 return self; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 function sentry_event_methods:add_breadcrumb(crumb_timestamp, crumb_type, crumb_category, message, data) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 local crumbs = self.event.breadcrumbs; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 if not crumbs then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 crumbs = { values = {} }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 self.event.breadcrumbs = crumbs; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 local crumb = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 timestamp = crumb_timestamp and datetime(crumb_timestamp) or self.timestamp; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 type = crumb_type; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 category = crumb_category; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 message = message; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 data = data; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 table.insert(crumbs.values, crumb); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 return self; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 function sentry_event_methods:add_http_request_breadcrumb(http_request, message) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 local request_id_message = ("[Request %s]"):format(http_request.id); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 message = message and (request_id_message.." "..message) or request_id_message; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 return self:add_breadcrumb(http_request.time, "http", "net.http", message, { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 url = http_request.url; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 method = http_request.method or "GET"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 status_code = http_request.response and http_request.response.code or nil; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 }); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 function sentry_event_methods:set_request(http_request) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 return self:set("request", { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 method = http_request.method; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 url = url.build(http_request.url); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 headers = http_request.headers; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 env = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 REMOTE_ADDR = http_request.ip; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 }); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 function sentry_event_methods:send() |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 return self.server:send(self.event); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 local sentry_mt = { } |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 sentry_mt.__index = sentry_mt |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 local function new(conf) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 local server = assert(parse_dsn(conf.dsn)); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 return setmetatable({ |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 server = server; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 endpoints = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 store = get_endpoint(server, "store"); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 insecure = conf.insecure; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 tags = conf.tags or nil, |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 extra = conf.extra or nil, |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 server_name = conf.server_name or "undefined"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 logger = conf.logger; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 }, sentry_mt); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 local function resolve_sentry_response(response) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 if response.code == 200 and response.body then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 local data = json.decode(response.body); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 return data; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 return promise.reject(response); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 function sentry_mt:send(event) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 local json_payload = json.encode(event); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 local response_promise, err = self:_request(self.endpoints.store, "application/json", json_payload); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 if not response_promise then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 module:log("warn", "Failed to submit to Sentry: %s %s", err, json); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 return nil, err; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 return response_promise:next(resolve_sentry_response), event.event_id; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 function sentry_mt:_request(endpoint_url, body_type, body) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 local auth_header = ("Sentry sentry_version=7, sentry_client=%s, sentry_timestamp=%s, sentry_key=%s") |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 :format(user_agent, datetime(), self.server.public_key); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 return http.request(endpoint_url, { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 headers = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 ["X-Sentry-Auth"] = auth_header; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 ["Content-Type"] = body_type; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 ["User-Agent"] = user_agent; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
223 insecure = self.insecure; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
224 body = body; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
225 }); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
228 function sentry_mt:event(level, source) |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
229 local event = setmetatable({ |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
230 server = self; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
231 event = { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
232 event_id = generate_event_id(); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
233 timestamp = datetime(); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
234 platform = "lua"; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
235 server_name = self.server_name; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
236 logger = source or self.logger; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
237 level = level; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
238 }; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
239 }, sentry_event_mt); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
240 if self.tags then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
241 event:tag(self.tags); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
242 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
243 if self.extra then |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
244 event:extra(self.extra); |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
245 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
246 return event; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
247 end |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
248 |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
249 return { |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
250 new = new; |
2ae71126e379
mod_sentry: New module to forward errors to a Sentry server
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
251 }; |