Monitoring and troubleshooting
Monitoring and troubleshooting
Operator-facing guide for Pixop Prime on AWS Marketplace (guest: Amazon Linux 2023) and KVM (same guest; hypervisor: Ubuntu with sudo ./scripts/pixop-install from the extracted installer archive root). This page is the navigation hub: scope, a five-minute diagnostic flow, how to read “healthy” without false positives, and where to go next.
Documentation baseline: behavior described here reflects relay-capable and native appliance paths where applicable. CLI subcommands and timers vary by AMI recipe; confirm with pixop-version, command -v <tool>, and -h on the appliance. When behavior differs, treat the running binaries under /opt/pixop/bin as authoritative.
Scope
| In scope | Out of scope (see linked pages) |
|---|---|
| Guest health, logs, metrics, automatic recovery policy | WAN firewall / security group design — Network and transport, Transport troubleshooting |
| Pipeline checkpoints: input → processing → egress | Picture processing presets — Configuration (:8080 UI) |
| Safe observation and conservative recovery | KVM host VFIO/memlock detail — KVM troubleshooting guide |
| Escalation packaging | Internal Image Builder / AMI build runbooks |
Facts vs recommendations: tables labeled Operational fact come from shipped scripts, systemd units, or defaults in /etc/pixop-live. Recommendation rows are Pixop operator practice unless cited to a specific command flag.
Operational success (no invented SLAs)
Success is context-dependent — a standby encoder with no scheduled event is healthy when idle.
| Layer | Operational fact (what “up” means) | Recommendation (when you expect more) |
|---|---|---|
| Host | pixop-preflight exits 0 (no FAIL); GPU and Docker checks pass | Re-run after AMI or pixop-image-update; KVM host: cd extract root; sudo ./scripts/pixop-install doctor |
| Licensing | AWS: pixop-license doctor acceptable for your account; marker /var/lib/pixop-live/instance-init.complete present after first boot | KVM: license file readable in guest; see Licensing and support |
| Units | After init marker: pixop-live, tsduck-in@main, tsduck-out@egress-main active when stack is started | pixop-stack status summarizes Pulse + TSDuck |
| Transport listen | tsduckctl check main / egress-main — UDP bind when policy is srt-udp | Caller mode: no local listener — bind introspection (if present): tsduckctl transport NAME when tsduck-transport-info is installed; ss -ulnp |
| MPEG-TS motion | pixop-flow reports UDP payload Mbps per stage when a sender is active; exit 0 with zero Mbps is valid idle | Sample --secs 5 or longer for bursty sources |
| Enhancement | HTTP metrics show processing when a continuous source is fed; pixop-flow shows non-zero on Pixop -> replacement and Final merged TS when Pixop is replacing video | Allow GPU/model warmup after cold start — Incident response runbook |
| Egress | pixop-flow shows SRT main egress :5001 when downstream pulls enhanced TS | Downstream must select the correct program for your configured output recipe (codec/profile depends on nvencc.args / UI — not identical on every AMI version) |
Decision hierarchy (do not skip steps): systemd active ≠ UDP listener bound ≠ SRT peer connected ≠ MPEG-TS on the internal on-guest multicast TS backbone ≠ GPU enhancement ≠ correct program at the receiver. Each layer has distinct tools; jumping to pixopctl restart before locating the failing layer wastes airtime and can disturb ingress.
Permissions
| Where | User | Privilege |
|---|---|---|
| AWS / KVM guest | ec2-user (in groups pixop, docker) | Operator CLIs re-exec via sudo internally; do not prefix routine commands with sudo |
| KVM host | Your login | sudo ./scripts/pixop-install … from extracted installer root — see KVM quickstart |
Packet capture (pixop-flow) and support bundle run as root on the guest by design.
Five-minute diagnostic flow
Run on the guest (SSH). KVM: run host pixop-install checks in parallel if the VM misbehaves before boot.
pixop-version
pixop-preflight
pixop-stack status
pixopctl status
tsduckctl check main
tsduckctl check egress-main
pixopctl health
pixop-flow --secs 5Optional AWS entitlement pass:
pixop-license doctor| Step | Checkpoint | If it fails |
|---|---|---|
pixop-version | Identity / recipe drift | Compare installed AMI recipe against your delivery record or support configuration — do not assume it matches a Marketplace product version string |
pixop-preflight | Host, images, config files, timer policy | Fix FAIL before stream debugging — pixop-preflight |
pixop-stack status | pixop-live + TSDuck instances | pixop-stack, pixopctl |
tsduckctl check | Unit active + transport bind policy | Transport troubleshooting |
pixopctl health | Local HTTP metrics (Prometheus text) | Monitoring and health signals |
pixop-flow | Printed stages: SRT ingest, Ingress -> Pixop, Pixop -> replacement, Final merged TS, SRT main egress (ports from network.env) | Exit 3 = backbone capacity at TS_TARGET_BITRATE in network.env; exit 10 = capture error |
Read-only preference: use pixopctl health, curl to localhost metrics, and journalctl before pixopctl recover, pixop-stack restart, or manual pixop-healthcheck (the oneshot can trigger recovery when thresholds are met — pixop-healthcheck).
Pipeline checkpoints
[ SRT ingest :5000 ] → [ Ingress -> Pixop :5500 ] → Pixop LIVE → [ Pixop -> replacement :5501 ] → [ Final merged TS :5600 ] → [ SRT main egress :5001 ]
input processing egress| Checkpoint | Primary signals | Logs |
|---|---|---|
| Input | tsduckctl check main, pixop-flow SRT ingest / Ingress -> Pixop, TSDuck ingest log | tsduckctl logs main, journalctl -u 'tsduck-in@main' |
| Processing | pixopctl health, /v1/metrics.json (see health signals doc), pixop-flow Pixop -> replacement | /var/log/pixop-live/live.log, pixopctl logs |
| Egress | tsduckctl check egress-main, pixop-flow Final merged TS / SRT main egress | tsduckctl logs egress-main |
TSDuck does not archive MPEG-TS in journald. For elementary-stream inspection use tap helpers — Stream diagnostics.
Startup, warmup, and idle traffic
Operational facts:
- First AWS boot:
pixop-instance-init.serviceenables units and writes/var/lib/pixop-live/instance-init.complete; until then passphrases and listeners may be incomplete — preflight warns instead of failing some UDP checks. pixop-healthcheck.timeris enabled during appliance provisioning and again at end of instance-init (OnBootSec=30s,OnUnitActiveSec=15s,AccuracySec=5s,Persistent=false).- After
pixop-livebecomes active, healthcheck ignores failures forGRACE_SECS=120(from/etc/pixop-live/healthcheck.env). - Idle / waiting-for-input (
awaiting_job, or zero frames with zero libav errors) is not a restart condition for automatic recovery.
Recommendations:
- After cold start, keep a continuous source while GPU models load before judging enhancement.
- New EBS volumes may hydrate slowly on first launch; default launch templates can request provisioned initialization (see AWS Marketplace quickstart). Use
pixop-startup-timelinefor milestone timing — pixop-startup-timeline. - Zero Mbps on all
pixop-flowstages with no sender is normal; verify with an active encoder before opening a transport ticket.
Automatic recovery (summary)
Operational fact: when PIXOP_HEALTHCHECK_RESTART=1, each timer tick classifies one bad check as either (a) non-idle status=ERROR from metrics JSON (or Prometheus equivalent), or (b) both /v1/metrics.json and /v1/metrics empty for longer than NO_METRICS_RESTART_AFTER_SECS=180 since the last good metrics fetch. BAD_CONSECUTIVE=3 such ticks (after GRACE_SECS=120 post–pixop-live active) may invoke pixopctl recover: stop primary ingress (main), restart pixop-live, start ingress and wait for UDP 5000. Egress stays up. RESTART_COOLDOWN_SECS=120 gates repeat recoveries. Idle / awaiting_job suppresses restart even when status=ERROR; DEGRADED resets the bad counter and does not recover. Timer fires about every 15 s (AccuracySec=5 coalescing, boot delay) — do not treat interval × 3 as a fixed SLA.
Limitation: the missing-metrics branch timestamps from last_ok; if that file is absent the script defaults last_ok to “now”, so metrics that never succeeded since boot do not alone accumulate the 180 s missing timer — use external monitoring for guaranteed endpoint availability. Details: Monitoring and health signals.
Safe recovery escalation
Default stance: observe, then recover the smallest scope that matches evidence. Restarts drop SRT sessions on affected legs.
| Action | Outage scope | When |
|---|---|---|
| None / logs only | None | Misconfigured peer firewall, wrong passphrase, no source |
tsduckctl restart main | Primary ingest SRT | Ingest wedged; processing metrics OK |
tsduckctl restart egress-main | Primary egress SRT | Merge/egress issue; ingest OK |
pixopctl restart | Pixop container only; ingest SRT stays up | nvencc.args or Pixop-only fault |
pixopctl recover | Primary ingest + Pixop | Same path as healthcheck; wedged decode/ingress |
pixop-stack restart | Full stop/start order: all ingress → live → all egress | Controlled maintenance; brief full pipeline stop |
pixop-stack restart --all | Above plus secondary instances if configured | Only when aux paths are enabled |
Do not use docker restart / docker kill on pixop-live. Image changes: pixop-image-update, not pixopctl pull.
AWS first boot / license: if pixop-license doctor reports account-level License Manager setup, fix IAM/account prerequisites with Pixop support guidance. Recommendation: do not restart pixop-instance-init.service on production AWS instances until support confirms — init is mutating and can disturb entitlements.
Triage matrix
| Symptom | First evidence | Deep dive |
|---|---|---|
| Nothing listens on 5000/5001 | tsduckctl check, ss -ulnp | Transport troubleshooting |
| Listener OK, peer cannot connect | Off-appliance path | Security groups, NACL, on-prem firewall — network doc |
| SRT up, no TS on tap | pixop-flow, ingest logs | Runbook: SRT connected, no TS |
TS on Ingress -> Pixop, no replacement | pixop-flow, metrics JSON | Runbook: ingest without enhancement |
| Enhancement OK, egress flat | pixop-flow Final merged TS / SRT main egress | Egress / PID / program selection |
| Frequent recoveries | journalctl -u pixop-healthcheck.service | Health signals: timer loops |
| KVM GPU / VFIO | Host pixop-install | KVM troubleshooting guide |
Step-by-step fault isolation: Incident response runbook.
Logs and metrics (quick map)
Full signal taxonomy: Monitoring and health signals. In brief: live.log and pixopctl logs for Pixop; tsduckctl logs for TSDuck; localhost 8080 serves /v1/metrics (Prometheus), /v1/metrics.json, and /v1/control/status. Typical on-guest curl to 127.0.0.1 works without credentials; when NVEnc REST auth is configured (restapi.yaml), the same endpoints may require Basic or Bearer — restrict 8080 to management CIDRs and supply credentials to external monitors. Never expose 8080 to untrusted networks.
Support bundle and privacy
pixop-support-bundleWrites /var/lib/pixop-live/support/pixop-support-<host>-<UTC>.tar.gz (mode 0600). The script excludes license JWT bodies and Pulse env from packs and runs pixop-redact over staged content — best-effort, not a guarantee that no secret ever appears. Recommendation: manually review archives before upload; never attach pixop-license token or tsduckctl credentials output.
Include for support: pixop-version, incident timestamps (UTC), deployment path (Region/instance type or KVM), symptom layer (input / processing / egress), and the bundle path.
Service order reference
Operational fact — two different stop paths:
| Action | Order | Why |
|---|---|---|
pixop-stack start | live → primary ingress → primary egress | Pulse up before listeners accept TS |
pixop-stack stop / pixopctl recover | all ingress → live → all egress | Stop ingest so Pulse metrics are not inflated by in-flight packets |
| Host poweroff / reboot (systemd) | pixop-live stops before tsduck-in@* | [email protected] has Before=pixop-live.service: graceful Pulse /v1/shutdown while ingest is still up; ingress stops after Pixop |
tsduck-in@main is not PartOf pixop-live — a routine pixopctl restart leaves primary SRT ingest running.
Related documentation
Monitoring and health signals · Incident response runbook · Network and transport · Transport troubleshooting · CLI reference · Connect your first SRT stream
Updated about 8 hours ago
