Skip to content

Commit e98dc43

Browse files
committed
feedback round 2 - update genserver and clean up
1 parent d55f8d5 commit e98dc43

File tree

5 files changed

+50
-54
lines changed

5 files changed

+50
-54
lines changed

lib/sentry/client.ex

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,19 +99,15 @@ defmodule Sentry.Client do
9999
@spec send_client_report(ClientReport.t()) ::
100100
{:ok, client_report_id :: String.t()} | {:error, ClientError.t()}
101101
def send_client_report(%ClientReport{} = client_report) do
102-
# We don't pass options because this is internal. But should we use default client or users?
103102
client = Config.client()
104103

105104
# This is a "private" option, only really used in testing.
106105
request_retries =
107106
Application.get_env(:sentry, :request_retries, Transport.default_retries())
108107

109-
send_result =
110-
client_report
111-
|> Envelope.from_client_report()
112-
|> Transport.encode_and_post_envelope(client, request_retries)
113-
114-
send_result
108+
client_report
109+
|> Envelope.from_client_report()
110+
|> Transport.encode_and_post_envelope(client, request_retries)
115111
end
116112

117113
defp sample_event(sample_rate) do

lib/sentry/client_report.ex

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ defmodule Sentry.ClientReport do
2929
unquote(Enum.reduce(@client_report_reasons, &quote(do: unquote(&1) | unquote(&2))))
3030

3131
@typedoc """
32-
The struct for a **client report** interface.
32+
The struct for a **client report**.
3333
"""
3434
@type t() :: %__MODULE__{
3535
timestamp: String.t() | number(),
@@ -43,7 +43,7 @@ defmodule Sentry.ClientReport do
4343
@spec start_link([]) :: GenServer.on_start()
4444
def start_link([]) do
4545
# check config to see if send_client_report is true
46-
GenServer.start_link(__MODULE__, %__MODULE__{}, name: __MODULE__)
46+
GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
4747
end
4848

4949
@spec add_discarded_event({reason(), String.t()}) :: :ok
@@ -62,37 +62,36 @@ defmodule Sentry.ClientReport do
6262
end
6363

6464
@impl true
65-
def handle_cast({:add_discarded_event, {reason, category}}, client_report) do
66-
if map_size(client_report.discarded_events) == 0 do
67-
{:noreply, %{client_report | discarded_events: %{{reason, category} => 1}}}
65+
def handle_cast({:add_discarded_event, {reason, category}}, discarded_events) do
66+
if map_size(discarded_events) == 0 do
67+
{:noreply, %{{reason, category} => 1}}
6868
else
6969
discarded_events =
70-
Map.update(client_report.discarded_events, {reason, category}, 1, &(&1 + 1))
70+
Map.update(discarded_events, {reason, category}, 1, &(&1 + 1))
7171

72-
{:noreply, %__MODULE__{client_report | discarded_events: discarded_events}}
72+
{:noreply, discarded_events}
7373
end
7474
end
7575

7676
@impl true
77-
def handle_info(:send_report, state) do
78-
if map_size(state.discarded_events) == 0 do
79-
updated_state = %{
80-
state
81-
| timestamp: timestamp(),
82-
discarded_events: transform_map(state.discarded_events)
77+
def handle_info(:send_report, discarded_events) do
78+
if map_size(discarded_events) != 0 do
79+
client_report = %__MODULE__{
80+
timestamp: timestamp(),
81+
discarded_events: transform_map(discarded_events)
8382
}
8483

8584
_ =
8685
if !Config.dsn() do
87-
Client.send_client_report(updated_state)
86+
Client.send_client_report(client_report)
8887
end
8988

9089
schedule_report()
91-
{:noreply, %__MODULE__{}}
90+
{:noreply, %{}}
9291
else
9392
# state is nil so nothing to send but keep looping
9493
schedule_report()
95-
{:noreply, %__MODULE__{}}
94+
{:noreply, %{}}
9695
end
9796
end
9897

lib/sentry/envelope.ex

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,26 @@ defmodule Sentry.Envelope do
4646
}
4747
end
4848

49-
def get_data_category(envelope_item) do
50-
case envelope_item do
51-
%Attachment{} ->
52-
"attachment"
49+
def get_data_category(type) do
50+
if is_binary(type) do
51+
type
52+
else
53+
case type do
54+
%Attachment{} ->
55+
"attachment"
5356

54-
%CheckIn{} ->
55-
"monitor"
57+
%CheckIn{} ->
58+
"monitor"
5659

57-
%ClientReport{} ->
58-
"internal"
60+
%ClientReport{} ->
61+
"internal"
5962

60-
%Event{} ->
61-
"error"
63+
%Event{} ->
64+
"error"
6265

63-
_ ->
64-
"default"
66+
_ ->
67+
"default"
68+
end
6569
end
6670
end
6771

lib/sentry/transport.ex

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule Sentry.Transport do
33

44
# This module is exclusively responsible for encoding and POSTing envelopes to Sentry.
55

6-
alias Sentry.{ClientError, ClientReport, Config, DataCategory, Envelope, LoggerUtils}
6+
alias Sentry.{ClientError, ClientReport, Config, Envelope, LoggerUtils}
77

88
@default_retries [1000, 2000, 4000, 8000]
99
@sentry_version 5
@@ -41,14 +41,17 @@ defmodule Sentry.Transport do
4141
end
4242

4343
def record_discarded_event(reason, event_item) do
44-
if is_list(event_item) do
45-
Enum.map(event_item, fn event ->
46-
ClientReport.add_discarded_event({reason, Envelope.get_data_category(event)})
47-
end)
48-
else
49-
ClientReport.add_discarded_event({reason, Envelope.get_data_category(event_item)})
50-
end
44+
_ =
45+
if is_list(event_item) do
46+
Enum.map(event_item, fn event ->
47+
ClientReport.add_discarded_event({reason, Envelope.get_data_category(event)})
48+
end)
49+
else
50+
ClientReport.add_discarded_event({reason, Envelope.get_data_category(event_item)})
51+
end
5152

53+
# We silently ignore events whose reasons aren't valid because we have to add it to the allowlist in Snuba
54+
# https://develop.sentry.dev/sdk/client-reports/
5255
:ok
5356
end
5457

test/sentry/client_report_test.exs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,20 @@ defmodule Sentry.ClientReportTest do
55

66
describe "add_discarded_event/1" do
77
test "records discarded event to state" do
8-
assert :sys.get_state(ClientReport) == %Sentry.ClientReport{
9-
discarded_events: %{}
10-
}
8+
assert :sys.get_state(ClientReport) == %{}
119

1210
ClientReport.add_discarded_event({:event_processor, "error"})
1311

14-
assert :sys.get_state(ClientReport) == %Sentry.ClientReport{
15-
discarded_events: %{{:event_processor, "error"} => 1}
16-
}
12+
assert :sys.get_state(ClientReport) == %{{:event_processor, "error"} => 1}
1713

1814
ClientReport.add_discarded_event({:event_processor, "error"})
1915
ClientReport.add_discarded_event({:event_processor, "error"})
2016
ClientReport.add_discarded_event({:network_error, "error"})
2117

2218
# updates quantity when duplcate events are sent
23-
assert :sys.get_state(ClientReport) == %Sentry.ClientReport{
24-
discarded_events: %{
25-
{:event_processor, "error"} => 3,
26-
{:network_error, "error"} => 1
27-
}
19+
assert :sys.get_state(ClientReport) == %{
20+
{:event_processor, "error"} => 3,
21+
{:network_error, "error"} => 1
2822
}
2923
end
3024
end

0 commit comments

Comments
 (0)