Packages
sentry
10.6.0
13.3.0
13.2.0
13.1.0
13.0.1
13.0.0
12.0.3
12.0.2
12.0.1
12.0.0
11.0.4
11.0.3
11.0.2
11.0.1
11.0.0
10.10.0
10.9.0
10.8.1
10.8.0
10.7.1
10.7.0
10.6.2
10.6.1
10.6.0
10.5.0
10.4.0
10.3.0
10.2.1
10.2.0
10.2.0-rc.2
10.2.0-rc.1
10.1.0
10.0.3
10.0.2
10.0.1
10.0.0
9.1.0
9.0.0
8.1.0
8.0.6
8.0.5
8.0.4
8.0.3
8.0.2
8.0.1
8.0.0
8.0.0-rc.2
8.0.0-rc.1
8.0.0-rc.0
retired
7.2.5
7.2.4
7.2.3
7.2.2
7.2.1
7.2.0
7.1.0
7.0.6
7.0.5
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.4.2
6.4.1
6.4.0
6.3.0
6.2.1
6.2.0
6.1.0
6.0.5
6.0.4
6.0.3
6.0.2
6.0.1
6.0.0
5.0.1
5.0.0
4.0.3
4.0.2
4.0.1
4.0.0
3.0.0
2.2.0
2.1.0
2.0.2
2.0.1
2.0.0
1.1.2
1.1.1
1.1.0
1.0.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
The Official Elixir client for Sentry
Current section
Files
Jump to
Current section
Files
lib/sentry/dedupe.ex
defmodule Sentry.Dedupe do
@moduledoc false
use GenServer
alias Sentry.Event
@ets __MODULE__
@sweep_interval_millisec 10_000
@ttl_millisec 30_000
@spec start_link(keyword()) :: GenServer.on_start()
def start_link([] = _opts) do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
end
@spec insert(Event.t()) :: :new | :existing
def insert(%Event{} = event) do
hash = Event.hash(event)
now = System.system_time(:millisecond)
cond do
_found? = :ets.update_element(@ets, hash, {_position = 2, now}) -> :existing
_inserted_new? = :ets.insert_new(@ets, {hash, now}) -> :new
true -> :existing
end
end
## Callbacks
@impl true
def init(nil) do
_table = :ets.new(@ets, [:named_table, :public, :set])
schedule_sweep()
{:ok, :no_state}
end
@impl true
def handle_info({:sweep, ttl_millisec}, state) do
now = System.system_time(:millisecond)
# All rows (which are {hash, inserted_at}) with an inserted_at older than
# now - @ttl_millisec.
match_spec = [{{:"$1", :"$2"}, [], [{:<, :"$2", now - ttl_millisec}]}]
_ = :ets.select_delete(@ets, match_spec)
schedule_sweep()
{:noreply, state}
end
## Helpers
defp schedule_sweep do
Process.send_after(self(), {:sweep, @ttl_millisec}, @sweep_interval_millisec)
end
end