The open-source edition of the coRAN Labs RAN Insights rApp. A Non-RT RIC rApp that collects the PM files a RAN emits each reporting period, turns 3GPP counters into operator-facing KPIs for NR and LTE, and serves them as a live dashboard with threshold alerting.
RAN ──VES notifyFileReady──▶ Kafka ──▶ rApp ──SFTP──▶ RAN / O1 adapter
│ parse TS 32.435 XML
▼
InfluxDB ──▶ dashboard + alerts
The RAN closes a reporting period and publishes a notifyFileReady event naming the PM file it just wrote. The rApp consumes that event, fetches the file over SFTP, parses it as 3GPP TS 32.435 measurement XML, and writes the counters to InfluxDB. The dashboard reads back windowed aggregates; the alert engine evaluates each metric against its thresholds.
Overview, cell metrics, cluster view, network slices, heatmaps, alerts and notifications. A counter the RAN did not report renders as a dash, never a zero, and a window with no data leaves a gap in the chart rather than a dip.
Alert rules are declarative: each names a metric, a comparison, critical/warning/info thresholds, and a message template. They live in a YAML file the rApp reads at startup, so thresholds can be tuned without rebuilding. Alerts deduplicate while a condition persists and clear on recovery. The shipped defaults cover throughput, RSRP, SINR and PRB utilisation.
A single YAML file holds the full configuration, and anything secret can be supplied through the environment instead, which is what the Helm chart does. At startup the rApp reports every field still empty or left at a placeholder, naming the variable that sets it and what stops working without it.
| Variable | Sets |
|---|---|
KAFKA_BROKERS KAFKA_TOPIC |
VES event source |
KAFKA_USERNAME KAFKA_PASSWORD |
SASL/SCRAM credentials |
SFTP_HOST SFTP_USERNAME SFTP_PASSWORD |
PM file retrieval |
INFLUXDB_URL INFLUXDB_TOKEN |
Metric storage |
R1_CLIENT_SECRET |
Keycloak client credentials for R1 |
DASHBOARD_USERNAME DASHBOARD_PASSWORD_HASH DASHBOARD_JWT_SECRET |
Dashboard login, when dashboard.require_auth is on |
LOG_LEVEL LOG_FORMAT |
Logging: debug/info/warn/error/fatal, and text/json |
Logging defaults to info and human-readable text. debug turns on the
per-message, per-connection and per-cell tracing in the Kafka, SFTP and XML
paths. It is the right setting when bringing up a new RAN node, and far too
loud to leave on. json emits one structured object per line for a log
aggregator.
Both are also settable with -log-level and -log-format.
With r1.enabled, the rApp authenticates against Keycloak and serves the R1 callbacks the platform calls: lifecycle, subscription, service info, data delivery and producer supervision. Onboarding is driven by the rApp Manager from the CSAR in rapp-package/, which is also what registers the rApp as a DME producer in ICS. Disabled, the pipeline and dashboard run standalone.
The dashboard is unauthenticated by default. Setting dashboard.require_auth
turns on a single-account login: the username and a bcrypt hash of the password
come from configuration, never from the request, and the signing secret should be
set too so sessions survive a restart and validate across replicas.
htpasswd -nbBC 10 "" 'your-password' | tr -d ':\n' | sed 's/^\$2y/$2a/'| Path | Purpose |
|---|---|
/ |
Dashboard |
/api/metrics/... |
gNB, cell, slice and UE KPIs, and chart history |
/api/alerts/... /api/notifications/... |
Alert and notification feeds |
/api/r1/status |
R1 registration state |
/health /ready /startup /metrics |
Probes and Prometheus |
/r1/callback/... |
R1 callbacks |
go build -o rapp ./cmd/rapp
./rapp -config config/rapp.yamlcmd/preview serves the web assets alone, without the ingestion pipeline, for working on the interface locally.
To deploy onto an SMO over R1, see Build_guide.md. The Helm chart is in deploy/helm/ran-insights-crl with InfluxDB as a dependency; rapp-package/ holds the ASD, ACM composition, DME info types and SME service APIs.
Apache 2.0. See LICENSE. Third-party components are listed in NOTICE.