Slice SLA Observe-Only Assurance (Design Note)
July 18, 2026 · View on GitHub
Non-normative prototype. Slice management & assurance align with TS 28.530 / TS 28.541 and the underlying admission state is TS 29.536 (NSAC), but this loop is a research shape for education — observe-only, no remediation, and no frozen closed-loop-assurance Stage-3 applies. Tracking issue: #27.
What it does
A feature-gated (sla-observe, off by default) observer task inside
nextgcore-nsacfd evaluates a configured per-slice SLA descriptor
against the live per-slice KPIs the NSACF already maintains — the
admitted-UE and PDU-session utilization percentages derived from its
TS 29.536 admission sets — and emits an observable signal on breach:
- a
log::warn!breach transition line (andinfoon clear) — transitions only, no per-tick spam; - Prometheus-text metrics (three gauges plus one counter):
nextgcore_slice_sla_ue_utilization_pct,nextgcore_slice_sla_pdu_utilization_pct,nextgcore_slice_sla_breached(0/1),nextgcore_slice_sla_breach_transitions_total— served on/metricsonly ifmetrics_portopts in (reusing the genericnextgcore_metrics::nes_energy::serve_metricshelper; by default no listener is bound).
Admission behavior is untouched: the observer only reads
quotas_snapshot() copies under short locks.
Config (nsacf.yaml, off by default)
nsacf:
sla:
enabled: true # default false
poll_interval_secs: 30
metrics_port: 9090 # 0/absent = no listener (default)
slices:
- sst: 1
sd: "000001" # optional, hex like slice_quotas.sd
max_ue_utilization_pct: 80.0
max_pdu_utilization_pct: 80.0
The sla block is captured as a raw YAML value in the typed config
(same hardening as pcfd's intent block): a malformed block warns and
disables the observer but can never break the slice_quotas provisioning
parse — which would otherwise reject every admission. Invalid slice entries
(missing sst, bad hex sd, no positive threshold) are skipped with a
warning. Slices without a configured SLA are not evaluated (opt-in per
slice); a configured SLA without a provisioned quota is skipped at debug.
Design choices
- KPI source: NSACF admission counters. Per the issue, the first KPI is
what the NSACF already measures (
ue_utilization/pdu_utilization). Slices whose quota is uncapped (max_uesabsent →u64::MAX) evaluate to ~0% utilization — a threshold on an uncapped count is meaningless, so configure SLAs only for capped slices. - Why not
nextgcore_metrics::ai_native::SlaMonitor: itsSlaKpiset (latency/loss/throughput/availability…) contains nothing nsacfd can measure today; mapping admission utilization onto one of them would mislabel the signal. When NWDAF-fed per-slice KPIs exist (NWDAF currently servesNF_LOADonly), this observer is the adoption point. - Observe-only: breach → signal, nothing else. Automatic remediation (EAC activation, quota tuning) is explicitly out of scope here.
Verification
cargo build -p nextgcore-nsacfd # default unchanged
cargo test -p nextgcore-nsacfd --features sla-observe # incl. breach/clear + lenient-config tests