o
Kylone

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 restartsSNMPStandard agent, KYLONE-MIB, v1/v2c/v3. Polling only; the headend sends no traps.
Time series, dashboards and alert rulesThe metrics endpointPrometheus 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 unitThe XML Management API v2Signed 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
productInfoname, version, buildThe unit's brand and edition, the software version and build. Alarm on a build change after an upgrade window closes.
sysResourceCPU, memoryLoad in percent, as the dashboard shows it.
tpStatusreceiver tableOne 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.
mptStatusMPTS input tableTransport 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).
muxStatusmultiplexer tableTransport streams the unit builds, with lock, bit rate, counters and restarts.
dvmStatusmodulator tableRF outputs: type, lock, start time, running time, bit rate, restarts.
exmStatusprocessing module tableTranscoders, pre-processors, CDN and HLS publishers: type, lock, restarts, running time, output rate, processing speed, frame rate, dropped frames, input and output services.
mulStatusmulticast output tableEvery multicast service: lock, start time, running time, bit rate, buffer, restarts.
lfStatuslocal file tableFile channels: loop mode, loop count, running time, bit rate, restarts.
inpStatusinput stream tableSingle-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).
peerStatuspeer tableDevices 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).
engStatusengine and unitEngine up, uptime, endpoints served, streams handled, total output rate, system uptime and clock, CPU temperature, memory installed and available.
peStatusprocessing node tableEach GPU or encoder board of the processing modules: processes, memory, GPU, decoder and encoder utilisation, power draw, temperature.
stdStatusstand-in tableProtection switches: mode, trigger, armed, state, the fall-back feed, lock, start time, bit rate, services covered.
netStatusnetwork interface tableLink state and speed, bytes and errors in and out, per interface.
stoStatusstorage tableSize 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

  1. 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.
  2. 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.
  3. 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_infoproduct, version, build, hostproductInfo, sysName
kylone_cpu_*, kylone_memory_*, kylone_temperature_celsius, kylone_system_*sensorsysResource, engStatus
kylone_engine_*–engStatus
kylone_service_*section, service, keyevery stream table: up, bit rate, buffer, invalid, errors, discontinuities, restarts, start time, inputs, outputs, speed, fps, dropped frames
kylone_tuner_*key, transponder, bandtpStatus: lock, CNR in dB, level in dBm, or the _percent variants
kylone_standin_stateservice, key, statestdStatus
kylone_srt_*section, service, key, rolethe 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, nodepeStatus
kylone_network_*interfacenetStatus, in bytes rather than megabytes
kylone_storage_*volume, devicestoStatus, 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, tpSyncDisplayStringtrue or false. Prometheus: kylone_service_up and kylone_tuner_lock as 1 or 0.
tpStrength, tpSnrInteger32Hundredths 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, engOutputRateGauge32Bytes per second over the last few seconds. Prometheus: bits per second.
*Invalid, *Error, *DiscontInteger32Counters since the stream started. Graph the rate, alarm on the slope.
tpBer, tpBerType, tpUncorrectedInteger32Bit 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, exmDropInteger32Restarts of the stream since the engine started; the module table's counter keeps its 2018 name. Prometheus: kylone_service_restarts_total.
exmSpeed, exmFpsInteger32Hundredths: 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, engSystemTimeDateAndTimeLocal time with the unit's UTC offset. Prometheus: Unix seconds.
*Duration, engUptimeTimeticksRunning time. Prometheus: seconds.
*BufferInteger32 (d-2)Seconds of buffered content, in hundredths.
pe* utilisations, power, temperatureInteger32Percent, watts and degrees Celsius; -1 when the node does not report the figure. Prometheus omits the sample instead.
netRxMBytes, netTxMBytes, sto*, engMemory*Counter32 / Gauge32Megabytes, so that terabyte volumes and 10 Gbit links fit a 32-bit value. Prometheus: bytes.
*NumConfig, *NumServiceInteger32Services 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.