Skip to content

Commit f6a62dc

Browse files
Merge pull request #224 from getsentry/json-event
Event Struct Rendering
2 parents c9aa554 + 679c8c3 commit f6a62dc

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

lib/sentry/client.ex

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ defmodule Sentry.Client do
7171
end
7272

7373
defp encode_and_send(event, result) do
74-
case Poison.encode(event) do
74+
render_event(event)
75+
|> Poison.encode()
76+
|> case do
7577
{:ok, body} ->
7678
do_send_event(event, body, result)
7779
{:error, error} ->
@@ -216,6 +218,42 @@ defmodule Sentry.Client do
216218
@hackney_pool_name
217219
end
218220

221+
@doc """
222+
Transform the Event struct into JSON map.
223+
224+
Most Event attributes map directly to JSON map, with stacktrace being the
225+
exception. If the event does not have stacktrace frames, it should not
226+
be included in the JSON body.
227+
"""
228+
def render_event(%Event{} = event) do
229+
map = %{
230+
event_id: event.event_id,
231+
culprit: event.culprit,
232+
timestamp: event.timestamp,
233+
message: event.message,
234+
tags: event.tags,
235+
level: event.level,
236+
platform: event.platform,
237+
server_name: event.server_name,
238+
environment: event.environment,
239+
exception: event.exception,
240+
release: event.release,
241+
request: event.request,
242+
extra: event.extra,
243+
user: event.user,
244+
breadcrumbs: event.breadcrumbs,
245+
fingerprint: event.fingerprint,
246+
modules: event.modules,
247+
}
248+
249+
case event.stacktrace do
250+
%{frames: [_ | _]} ->
251+
Map.put(map, :stacktrace, event.stacktrace)
252+
_ ->
253+
map
254+
end
255+
end
256+
219257
defp log_api_error(body) do
220258
Logger.warn(fn ->
221259
["Failed to send Sentry event.", ?\n, body]

test/client_test.exs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ defmodule Sentry.ClientTest do
6363
request_map = Poison.decode!(body)
6464
assert request_map["extra"] == %{"key" => "value"}
6565
assert request_map["user"]["id"] == 1
66+
assert is_nil(request_map["stacktrace"]["frames"])
6667
Plug.Conn.resp(conn, 200, ~s<{"id": "340"}>)
6768
end
6869

@@ -163,7 +164,9 @@ defmodule Sentry.ClientTest do
163164
test "sends event with sample_rate of 1" do
164165
bypass = Bypass.open
165166
Bypass.expect bypass, fn conn ->
166-
{:ok, _body, conn} = Plug.Conn.read_body(conn)
167+
{:ok, body, conn} = Plug.Conn.read_body(conn)
168+
request_map = Poison.decode!(body)
169+
assert Enum.count(request_map["stacktrace"]["frames"]) > 0
167170
Plug.Conn.resp(conn, 200, ~s<{"id": "340"}>)
168171
end
169172

@@ -176,7 +179,8 @@ defmodule Sentry.ClientTest do
176179
Event.not_a_function
177180
rescue
178181
e ->
179-
{:ok, _} = Sentry.capture_exception(e, result: :sync, sample_rate: 1)
182+
{:ok, _} = Sentry.capture_exception(e, stacktrace: System.stacktrace,
183+
result: :sync, sample_rate: 1)
180184
end
181185
end
182186

test/support/test_client.exs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ defmodule Sentry.TestClient do
55
def send_event(%Sentry.Event{} = event, _opts \\ []) do
66
{endpoint, _public_key, _secret_key} = Sentry.Client.get_dsn!
77
event = Sentry.Client.maybe_call_before_send_event(event)
8-
case Poison.encode(event) do
8+
Sentry.Client.render_event(event)
9+
|> Poison.encode()
10+
|> case do
911
{:ok, body} ->
1012
Sentry.Client.request(:post, endpoint, [], body)
1113
{:error, error} ->

0 commit comments

Comments
 (0)