1
0 Comments

Shipped stream monitoring — the outage that HTTP 200 can't see

Observare is my bundled ops-monitoring SaaS (£5/month — uptime, SSL, ports, cron heartbeats, process/Docker checks via a Go agent). This week I shipped the seventh monitor type: streams. HLS playlists, DASH manifests, MP4 files.

The failure mode that made it worth building

Every stream operator has lived this one: the encoder crashes or the packager wedges, the CDN keeps cheerfully serving the last playlist it has, and every uptime check on earth stays green. The URL returns 200 OK all day. Meanwhile every viewer is watching a frozen frame.

So a plain HTTP check is worthless for streams. The check that matters is: is the playlist still advancing? Observare remembers the stream's position between checks — media sequence and newest segment for HLS, a manifest fingerprint for live DASH. Playlist still served but not moving = frozen stream = incident + alert, same as any outage.

The design constraint that shaped everything

Segment requests are indistinguishable from playback. Lots of streams have session tokens or concurrent-viewer caps, and a monitor that downloads video would either fail spuriously or count as a viewer — on some setups it would literally lock the real viewer out. So the cloud checker fetches playlist text only, never media. A playlist that keeps advancing is proof the stream is playing, and playlist fetches don't count as plays.

That constraint also settled the architecture for the deeper tier. Actually measuring video — real bitrate, black-frame detection, silent audio — means downloading and decoding segments, which is both heavy and playback-shaped. That work doesn't belong on my server, it belongs on the customer's. So deep inspection lives in the Linux agent: opt-in per monitor, runs ffprobe/ffmpeg on the customer's own hardware, and catches the truly nasty case — stream is up, segments flowing, HTTP green, and the channel is transmitting a black screen with no sound.

The split keeps my VPS doing kilobytes of text parsing while the customer's box does the video work. A £5/month product can't afford to transcode-check the world's streams centrally — and it turns out it never needs to.

Where it's at

Live now, in the same £5 bundle, 7-day trial with no card. Docs: https://observare.co.uk/docs/stream-monitoring

Happy to answer anything about the staleness detection or the agent split.

posted toAvatar for product Observare
Observare