Kylone Headend · for network operations
Monitoring
For the people who run a network management system or a metrics stack and want every Kylone headend in it. The unit speaks SNMP and serves a Prometheus endpoint; both report the same figures, so you pick the one your tooling speaks. Everything here is served by the headend as installed.
Version: October 2026 (Kylone Headend v4.2). Replace headend in the examples with the
headend's host name or address. Outputs are from real units with the names changed.
1. Two ways to watch a unit
| You want | Use | Notes |
|---|---|---|
| The unit in a network management system, alarms on lock, load and restarts | SNMP | Standard agent, KYLONE-MIB, v1/v2c/v3. Polling only; the headend sends no traps. |
| Time series, dashboards and alert rules | The metrics endpoint | Prometheus text format over HTTPS with a read-only API key; one label set per stream, tuner, node, interface and volume. |
| Configure, scan, switch, script the unit | The XML Management API v2 | Signed requests, named fields, every page of the web UI. Guide and clients on GitHub. |
SNMP and the metrics endpoint read the same engine status, so a figure you see in one you can cross-check in the other. The difference is shape: SNMP gives tables indexed by row, Prometheus gives samples with labels.
2. SNMP: what the agent exposes
The headend runs a standard SNMP agent (net-snmp, v1, v2c and v3). Besides the usual system,
interface and host-resources groups it answers an enterprise subtree, 1.3.6.1.4.1.51009,
described by the KYLONE-MIB file. The subtree is served by one
resident process, so a full walk of a loaded unit takes well under a second and a single get about a
millisecond: every table can be polled every minute without a thought for the agent's cost.
| Group | Objects | What it tells you |
|---|---|---|
productInfo | name, version, build | The unit's brand and edition, the software version and build. Alarm on a build change after an upgrade window closes. |
sysResource | CPU, memory | Load in percent, as the dashboard shows it. |
tpStatus | receiver table | One row per tuned transponder: signal, sync and lock, strength and signal-to-noise, bit rate, invalid, error and discontinuity counters, configured and delivered services, restarts. |
mptStatus | MPTS input table | Transport streams arriving over IP, SRT or ASI, with lock, bit rate, counters and restarts; for an SRT source the link figures too: state, round-trip time, lost, retransmitted and dropped packets, bandwidth estimate (revision 2.3). |
muxStatus | multiplexer table | Transport streams the unit builds, with lock, bit rate, counters and restarts. |
dvmStatus | modulator table | RF outputs: type, lock, start time, running time, bit rate, restarts. |
exmStatus | processing module table | Transcoders, pre-processors, CDN and HLS publishers: type, lock, restarts, running time, output rate, processing speed, frame rate, dropped frames, input and output services. |
mulStatus | multicast output table | Every multicast service: lock, start time, running time, bit rate, buffer, restarts. |
lfStatus | local file table | File channels: loop mode, loop count, running time, bit rate, restarts. |
inpStatus | input stream table | Single-programme sources: unicast, multicast, HTTP, RTSP, HLS, SRT, radio receivers, HDMI and SDI capture, each with its type, lock, start time, throughput, buffer, restarts, output rate and services; an SRT source adds its link figures (revision 2.3). |
peerStatus | peer table | Devices currently pulling from the unit: name, MAC and IP address, start time, running time, bit rate; a device on the SRT port adds its link figures: round-trip time, lost, retransmitted and dropped packets, bandwidth estimate (revision 2.3). |
engStatus | engine and unit | Engine up, uptime, endpoints served, streams handled, total output rate, system uptime and clock, CPU temperature, memory installed and available. |
peStatus | processing node table | Each GPU or encoder board of the processing modules: processes, memory, GPU, decoder and encoder utilisation, power draw, temperature. |
stdStatus | stand-in table | Protection switches: mode, trigger, armed, state, the fall-back feed, lock, start time, bit rate, services covered. |
netStatus | network interface table | Link state and speed, bytes and errors in and out, per interface. |
stoStatus | storage table | Size and use of every volume the dashboard shows. |
Each table comes with a row count scalar (tpNumber, peerNumber and so on), so a
collector can size its work before walking.
3. SNMP: getting started
- On the headend, open System → SNMP Server. Turn the service on, set the location and contact, choose the community and the network allowed to read, or create a v3 user. The default read scope is the system group only; choose full to expose the enterprise subtree and host resources.
- Download the MIB with the MIB File button on that page, or from here,
and load it into your management system. The module name is
KYLONE-MIB. - Walk the subtree once to see what the unit has:
snmpwalk -v2c -c public -m +KYLONE-MIB headend 1.3.6.1.4.1.51009
A unit with sixteen receivers answers about 360 objects in 0.8 seconds on the first walk and in under 0.1 seconds afterwards; a transcoder with forty modules and forty multicast outputs answers about 1000 objects in 0.9 seconds. Poll every minute for the tables, every ten seconds if you want the bit rates as a graph; the agent refreshes the stream figures every three seconds and the node and temperature figures every fifteen.
4. SNMP: examples
Product, load, engine
$ snmpwalk -v2c -c public -m +KYLONE-MIB headend productInfo sysResource engStatus
KYLONE-MIB::productName.0 = STRING: Kylone Headend EE
KYLONE-MIB::productVersion.0 = STRING: v4.2.0
KYLONE-MIB::productBuild.0 = STRING: 2026101500
KYLONE-MIB::sysResourceCPU.0 = INTEGER: 42
KYLONE-MIB::sysResourceMEM.0 = INTEGER: 22
KYLONE-MIB::engUp.0 = INTEGER: 1
KYLONE-MIB::engUptime.0 = Timeticks: (26100) 0:04:21.00
KYLONE-MIB::engEndpoints.0 = INTEGER: 12
KYLONE-MIB::engServices.0 = INTEGER: 91
KYLONE-MIB::engOutputRate.0 = Gauge32: 61237095
KYLONE-MIB::engSystemUptime.0 = Timeticks: (25806576) 2 days, 23:41:05.76
KYLONE-MIB::engSystemTime.0 = STRING: 2026-10-2,17:53:27.0,+3:0
KYLONE-MIB::engTemperature.0 = INTEGER: 73
KYLONE-MIB::engMemoryTotal.0 = Gauge32: 63644
KYLONE-MIB::engMemoryAvailable.0 = Gauge32: 49406
One receiver
The first row of the receiver table on a satellite unit. Strength and signal-to-noise are hundredths
of the receiver's native unit, here dBm and dB; a lost lock shows as false and the
bit rate drops to zero.
$ snmpwalk -v2c -c public -m +KYLONE-MIB headend tpEntry | grep '\.1 = '
KYLONE-MIB::tpIndex.1 = INTEGER: 1
KYLONE-MIB::tpName.1 = STRING: NILE PACKAGE 12226 VH
KYLONE-MIB::tpSignal.1 = STRING: true
KYLONE-MIB::tpSync.1 = STRING: true
KYLONE-MIB::tpLock.1 = STRING: true
KYLONE-MIB::tpStrength.1 = INTEGER: -2724
KYLONE-MIB::tpSnr.1 = INTEGER: 1130
KYLONE-MIB::tpBitrate.1 = Gauge32: 2282328
KYLONE-MIB::tpInvalid.1 = INTEGER: 0
KYLONE-MIB::tpError.1 = INTEGER: 0
KYLONE-MIB::tpDiscont.1 = INTEGER: 0
KYLONE-MIB::tpNumConfig.1 = INTEGER: 10
KYLONE-MIB::tpNumService.1 = INTEGER: 3
KYLONE-MIB::tpRestarts.1 = INTEGER: 0
A transcoder and the node it runs on
On a transcoder the module table shows each transcoder with its restart count, processing speed and frame rate, and the node table the GPU board behind it. A module that restarts, or a speed falling below realtime, is the first thing to alarm on.
KYLONE-MIB::exmName.1 = STRING: Harbour News HD
KYLONE-MIB::exmType.1 = STRING: postproc
KYLONE-MIB::exmLock.1 = STRING: true
KYLONE-MIB::exmDrop.1 = INTEGER: 0
KYLONE-MIB::exmDuration.1 = Timeticks: (39600) 0:06:36.00
KYLONE-MIB::exmBitrate.1 = Gauge32: 224018
KYLONE-MIB::exmSpeed.1 = INTEGER: 101
KYLONE-MIB::exmFps.1 = INTEGER: 2517
KYLONE-MIB::exmDroppedFrames.1 = INTEGER: 0
KYLONE-MIB::exmNumInput.1 = INTEGER: 1
KYLONE-MIB::exmNumService.1 = INTEGER: 1
KYLONE-MIB::peModule.1 = STRING: hwtcnv
KYLONE-MIB::peNode.1 = STRING: Node 1, P2
KYLONE-MIB::peProcesses.1 = INTEGER: 18
KYLONE-MIB::peMemory.1 = INTEGER: 70
KYLONE-MIB::peGpu.1 = INTEGER: 66
KYLONE-MIB::peDecoder.1 = INTEGER: 100
KYLONE-MIB::peEncoder.1 = INTEGER: 27
KYLONE-MIB::pePower.1 = INTEGER: 44
KYLONE-MIB::peTemperature.1 = INTEGER: 47
A stand-in
A protection switch that guards thirty-seven services: armed, automatic, and in pass while
the primary feed runs. When the state leaves pass, the fall-back feed is on air.
KYLONE-MIB::stdName.1 = STRING: No-Signal Fall Back
KYLONE-MIB::stdMode.1 = STRING: guard
KYLONE-MIB::stdTrigger.1 = STRING: aut
KYLONE-MIB::stdArmed.1 = INTEGER: 1
KYLONE-MIB::stdState.1 = STRING: pass
KYLONE-MIB::stdFeed.1 = STRING: No Signal Feed
KYLONE-MIB::stdLock.1 = STRING: true
KYLONE-MIB::stdStart.1 = STRING: 2026-10-2,17:49:7.0,+3:0
KYLONE-MIB::stdDuration.1 = Timeticks: (25800) 0:04:18.00
KYLONE-MIB::stdBitrate.1 = Gauge32: 8325717
KYLONE-MIB::stdNumService.1 = INTEGER: 37
KYLONE-MIB::stdRestarts.1 = INTEGER: 0
Interfaces, volumes, peers
KYLONE-MIB::netName.1 = STRING: lan1
KYLONE-MIB::netLinkUp.1 = INTEGER: 1
KYLONE-MIB::netSpeed.1 = Gauge32: 1000
KYLONE-MIB::netRxMBytes.1 = Counter32: 11647
KYLONE-MIB::netTxMBytes.1 = Counter32: 7299378
KYLONE-MIB::netRxErrors.1 = Counter32: 0
KYLONE-MIB::netTxErrors.1 = Counter32: 0
KYLONE-MIB::stoVolume.2 = STRING: /srv
KYLONE-MIB::stoDevice.2 = STRING: nvme0n1p4
KYLONE-MIB::stoSize.2 = Gauge32: 217890
KYLONE-MIB::stoUsed.2 = Gauge32: 3848
KYLONE-MIB::peerNumber.0 = INTEGER: 4
KYLONE-MIB::peerMacAddr.1 = STRING: 02:00:5e:10:7b:b1
KYLONE-MIB::peerIPAddr.1 = STRING: 192.0.2.28
KYLONE-MIB::peerStart.1 = STRING: 2026-10-2,17:26:3.0,+3:0
KYLONE-MIB::peerDuration.1 = Timeticks: (39600) 0:06:36.00
KYLONE-MIB::peerBitrate.1 = Gauge32: 10302299
5. Prometheus: the metrics endpoint
The same figures, in the Prometheus text format, from one URL on the unit:
GET https://headend/portal/?app=metrics
Authentication is HTTP basic auth with a Management API key: user name = the key's name,
password = its secret as displayed, HTTPS only. Create a read-only key for it on
System → API Keys; it cannot change anything on the unit. No session and no signing,
so any scraper that can do basic auth works. Forty-one metric families come back, each with its
HELP and TYPE lines:
| Family | Labels | SNMP counterpart |
|---|---|---|
kylone_info | product, version, build, host | productInfo, sysName |
kylone_cpu_*, kylone_memory_*, kylone_temperature_celsius, kylone_system_* | sensor | sysResource, engStatus |
kylone_engine_* | – | engStatus |
kylone_service_* | section, service, key | every stream table: up, bit rate, buffer, invalid, errors, discontinuities, restarts, start time, inputs, outputs, speed, fps, dropped frames |
kylone_tuner_* | key, transponder, band | tpStatus: lock, CNR in dB, level in dBm, or the _percent variants |
kylone_standin_state | service, key, state | stdStatus |
kylone_srt_* | section, service, key, role | the SRT columns of mptStatus, inpStatus and peerStatus: connected, round-trip time, lost, retransmitted and dropped packets, bandwidth, packets in flight, buffer span; role says whether the unit receives or sends on the link |
kylone_pe_* | module, node | peStatus |
kylone_network_* | interface | netStatus, in bytes rather than megabytes |
kylone_storage_* | volume, device | stoStatus, in bytes |
The scrape configuration, one job for all your units:
scrape_configs:
- job_name: kylone
scheme: https
metrics_path: /portal/
params:
app: [metrics]
basic_auth:
username: monitor
password: <the secret as displayed>
tls_config:
insecure_skip_verify: true # or the unit's CA
static_configs:
- targets: ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
A scrape every fifteen to sixty seconds is right; the endpoint reads the engine's status cache and
costs the unit nothing noticeable. Engine counters (_total) restart with the stream, so pair a
rate with kylone_service_restarts_total to tell a restart from a reset.
6. Prometheus: examples
A scrape by hand
$ curl -u monitor:<secret> https://headend/portal/?app=metrics
# HELP kylone_info The unit's product, version, build and host name.
# TYPE kylone_info gauge
kylone_info{product="Kylone Headend",version="v4.2.0",build="2026101500",host="hub-01.example.net"} 1
kylone_cpu_utilisation_percent 42
kylone_memory_utilisation_percent 22
kylone_temperature_celsius{sensor="cpu"} 73
kylone_engine_up 1
kylone_engine_uptime_seconds 418
kylone_engine_services 91
kylone_engine_transmit_bits_per_second 480808144
kylone_network_link_up{interface="lan1"} 1
kylone_storage_used_bytes{volume="/srv",device="nvme0n1p4"} 4035903488
kylone_service_up{section="dvb",service="NILE PACKAGE 12226 VH",key="NILE12226VH"} 1
kylone_service_bitrate_bits_per_second{section="mcx",service="Harbour News HD",key="hub_t100_mcx"} 1504304
kylone_service_restarts_total{section="mcx",service="Harbour News HD",key="hub_t100_mcx"} 4
kylone_service_speed_ratio{section="cod",service="Harbour News HD",key="hub_t100_cod"} 1.01
kylone_service_fps{section="cod",service="Harbour News HD",key="hub_t100_cod"} 25.17
kylone_tuner_lock{key="NILE12226VH",transponder="NILE PACKAGE 12226 VH",band="Ku-V"} 1
kylone_tuner_cnr_db{key="NILE12226VH",transponder="NILE PACKAGE 12226 VH",band="Ku-V"} 11.3
kylone_tuner_signal_dbm{key="NILE12226VH",transponder="NILE PACKAGE 12226 VH",band="Ku-V"} -27.24
kylone_standin_state{service="No-Signal Fall Back",key="NoSignalFallBack",state="pass"} 1
kylone_pe_gpu_utilisation_percent{module="hwtcnv",node="Node 1, P2"} 66
kylone_pe_temperature_celsius{module="hwtcnv",node="Node 1, P2"} 47
Alert rules worth having
Five rules cover most of what goes wrong on a headend. Names are yours to choose; the expressions are the point.
groups:
- name: kylone
rules:
- alert: HeadendDown
expr: up{job="kylone"} == 0 or kylone_engine_up == 0
for: 2m
- alert: ReceiverLost
expr: kylone_tuner_lock == 0
for: 1m
- alert: StreamRestarting
expr: increase(kylone_service_restarts_total[10m]) > 2
- alert: TranscoderBehindRealtime
expr: kylone_service_speed_ratio < 0.98
for: 5m
- alert: StandInOnAir
expr: kylone_standin_state{state!="pass"} == 1
For a dashboard, sum by (instance) (kylone_engine_transmit_bits_per_second) is the
fleet's output in one panel, and kylone_pe_gpu_utilisation_percent by node tells you
when a transcoder needs another board.
7. Units and conventions
| SNMP column | Type | Meaning, and the Prometheus form |
|---|---|---|
*Lock, tpSignal, tpSync | DisplayString | true or false. Prometheus: kylone_service_up and kylone_tuner_lock as 1 or 0. |
tpStrength, tpSnr | Integer32 | Hundredths of the receiver's unit: dBm and dB on most cards, percent on some. -2724 is −27.24 dBm. Prometheus gives the decimal, in the _db/_dbm or _percent family. |
*Bitrate, engOutputRate | Gauge32 | Bytes per second over the last few seconds. Prometheus: bits per second. |
*Invalid, *Error, *Discont | Integer32 | Counters since the stream started. Graph the rate, alarm on the slope. |
tpBer, tpBerType, tpUncorrected | Integer32 | Bit error ratio in units of 10-9 with its kind (post-FEC, pre-FEC, or the demodulator's own figure), and uncorrected blocks since the stream started; -1 where the receiver card reports none. Prometheus: kylone_tuner_bit_error_ratio and kylone_tuner_uncorrected_blocks_total. |
*Restarts, exmDrop | Integer32 | Restarts of the stream since the engine started; the module table's counter keeps its 2018 name. Prometheus: kylone_service_restarts_total. |
exmSpeed, exmFps | Integer32 | Hundredths: 101 is 1.01 times realtime, 2517 is 25.17 frames per second; 0 when the module does not report them. Prometheus gives the decimals. |
*Start, engSystemTime | DateAndTime | Local time with the unit's UTC offset. Prometheus: Unix seconds. |
*Duration, engUptime | Timeticks | Running time. Prometheus: seconds. |
*Buffer | Integer32 (d-2) | Seconds of buffered content, in hundredths. |
pe* utilisations, power, temperature | Integer32 | Percent, watts and degrees Celsius; -1 when the node does not report the figure. Prometheus omits the sample instead. |
netRxMBytes, netTxMBytes, sto*, engMemory* | Counter32 / Gauge32 | Megabytes, so that terabyte volumes and 10 Gbit links fit a 32-bit value. Prometheus: bytes. |
*NumConfig, *NumService | Integer32 | Services configured on the stream and services currently delivered from it. |
SNMP rows are indexed in the order the unit lists them; the name column is the stable key, since a
receiver added in the middle shifts the indices below it. Prometheus carries the same stable name in
the key label. SNMP tables are read-only; the agent refuses sets.
8. Naming the unit
A fleet of headends needs a name on each. The Host Name field on the SNMP Server page
sets the unit's host name, which the agent reports as sysName, the metrics endpoint
as the host label of kylone_info, and which syslog and the management API
use as well. Left empty, the unit keeps its stock name, which is right for a single unit. Location
and contact on the same page become sysLocation and sysContact.
9. Availability
The resident SNMP agent, the .0 instances on scalars, decoded start times, SRT in the input
table, the five new groups and the KYLONE-MIB module are in Kylone Headend v4.2.0; the metrics endpoint and
read-only keys from v4.1.1. The SNMP object identifiers are the same as in the 2018 module this file
replaces, so templates built on it keep working after the upgrade; only the module name in your MIB
loader changes.
