towerops/lib/towerops/preseem/device_baseline.ex
Graham McIntire a4e08b2aca Major codebase cleanup: DRY schemas, remove dead config, consolidate modules
- Created Towerops.Schema base macro (95+ schemas updated to use it)
- Created Towerops.Snmp.Reading macro (7 reading schemas consolidated)
- Created Towerops.Gaiia.BaseSchema macro (4 Gaiia schemas consolidated)
- Created Towerops.SyncLog shared module (UISP + Preseem merge)
- Created Towerops.LogFilters (3 log filter modules merged into 1)
- Created Towerops.OnCall.ChangesetHelpers (9 on-call schemas simplified)
- Created API v1 ResourceController shared helpers (7 controllers)
- Extracted ConnectionHelpers.format_connection_result (2 LiveViews)
- Removed 5 dead config keys (scopes, mib_dirs, stripe_meter_id, etc.)
- Fixed 2 pre-existing broken tests
- All 13,219 tests pass, Credo clean (0 issues)
2026-06-16 15:29:22 -05:00

52 lines
1.4 KiB
Elixir

defmodule Towerops.Preseem.DeviceBaseline do
@moduledoc """
Rolling 14-day baseline for individual Preseem access points.
Computed nightly to detect deviations from normal behavior.
"""
use Towerops.Schema
@valid_periods ~w(busy offpeak all)
@valid_metrics ~w(qoe_score capacity_score rf_score p95_latency avg_latency avg_jitter avg_loss avg_throughput subscriber_count airtime_utilization)
schema "preseem_device_baselines" do
field :metric_name, :string
field :period, :string
field :mean, :float
field :stddev, :float
field :p5, :float
field :p95, :float
field :sample_count, :integer
field :computed_at, :utc_datetime
belongs_to :preseem_access_point, Towerops.Preseem.AccessPoint
end
def changeset(baseline, attrs) do
baseline
|> cast(attrs, [
:preseem_access_point_id,
:metric_name,
:period,
:mean,
:stddev,
:p5,
:p95,
:sample_count,
:computed_at
])
|> validate_required([
:preseem_access_point_id,
:metric_name,
:period,
:mean,
:sample_count,
:computed_at
])
|> validate_inclusion(:period, @valid_periods)
|> validate_inclusion(:metric_name, @valid_metrics)
|> unique_constraint([:preseem_access_point_id, :metric_name, :period],
name: :preseem_device_baselines_ap_metric_period_idx
)
|> foreign_key_constraint(:preseem_access_point_id)
end
end