60 lines
1.6 KiB
Elixir
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
|