Current section
Files
Jump to
Current section
Files
lib/backend/ets.ex
defmodule AbsintheFieldTelemetry.Backend.Ets do
@moduledoc """
A AbsintheFieldTelemetry.Backend implementation using ets.
"""
@behaviour AbsintheFieldTelemetry.Backend
@impl AbsintheFieldTelemetry.Backend
def setup() do
:ets.new(__MODULE__, [:set, :public, :named_table])
:ets.new(__MODULE__.TypeHits, [:set, :public, :named_table])
:ok
end
@impl AbsintheFieldTelemetry.Backend
def record_field_hit(schema, path) do
key = {schema, path}
:ets.update_counter(__MODULE__, key, {2, 1}, {key, 0})
:ok
end
@impl AbsintheFieldTelemetry.Backend
def record_field_hit(schema, type, field) do
key = {schema, type, field}
:ets.update_counter(__MODULE__.TypeHits, key, {2, 1}, {key, 0})
:ok
end
@impl AbsintheFieldTelemetry.Backend
def get_all_hits(schema) do
__MODULE__
|> :ets.match_object({{schema, :_}, :_})
|> Enum.map(fn {{_schema, path}, count} -> {path, count} end)
end
@impl AbsintheFieldTelemetry.Backend
def get_all_type_hits(schema) do
__MODULE__.TypeHits
|> :ets.match_object({{schema, :_, :_}, :_})
|> Enum.map(fn {{_schema, type, field}, count} -> {{type, field}, count} end)
end
@impl AbsintheFieldTelemetry.Backend
def reset(schema) do
__MODULE__.TypeHits
|> :ets.match_delete({{schema, :_, :_}, :_})
__MODULE__
|> :ets.match_delete({{schema, :_}, :_})
:ok
end
end