towerops/lib/towerops/snmp/interface_stat.ex
2026-01-17 15:08:49 -06:00

60 lines
1.6 KiB
Elixir

defmodule Towerops.Snmp.InterfaceStat do
@moduledoc """
Time-series interface statistics schema.
Stores interface counter values (octets, errors, discards) collected
during SNMP polling. Stored in TimescaleDB hypertable.
"""
use Ecto.Schema
import Ecto.Changeset
alias Towerops.Snmp.Interface
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "snmp_interface_stats" do
field :if_in_octets, :integer
field :if_out_octets, :integer
field :if_in_errors, :integer
field :if_out_errors, :integer
field :if_in_discards, :integer
field :if_out_discards, :integer
field :checked_at, :utc_datetime
belongs_to :interface, Interface
timestamps(type: :utc_datetime, updated_at: false)
end
@type t :: %__MODULE__{
id: Ecto.UUID.t(),
if_in_octets: integer() | nil,
if_out_octets: integer() | nil,
if_in_errors: integer() | nil,
if_out_errors: integer() | nil,
if_in_discards: integer() | nil,
if_out_discards: integer() | nil,
checked_at: DateTime.t(),
interface_id: Ecto.UUID.t(),
interface: Ecto.Association.NotLoaded.t() | Interface.t(),
inserted_at: DateTime.t()
}
@doc false
def changeset(stat, attrs) do
stat
|> cast(attrs, [
:interface_id,
:if_in_octets,
:if_out_octets,
:if_in_errors,
:if_out_errors,
:if_in_discards,
:if_out_discards,
:checked_at
])
|> validate_required([:interface_id, :checked_at])
|> foreign_key_constraint(:interface_id)
end
end