This project implements an end-to-end MPEG-DASH streaming service with full observability using OpenTelemetry, Prometheus, Jaeger, and Grafana.
rust-app/: Rust application using GStreamer (dashsink2) to generate DASH content, instrumented with OpenTelemetry Tracing.observability/: Docker Compose setup for OTel Collector, Prometheus, Jaeger, and Grafana.node-server/: Node.js Express server (HTTPS) serving DASH content and the web player.node-server/web-player/: Frontend web player usingdash.jswith OpenTelemetry JS Metrics instrumentation.
- GStreamer: Core library and plugins (
gst-plugins-good,gst-plugins-bad,gst-plugins-ugly). - Rust:
cargoandrustc. - Node.js:
npmandnode. - Docker: For running the observability stack.
To run the Node.js server with HTTPS, you need to generate a self-signed certificate in the node-server/ directory:
cd node-server
mkdir cert
openssl req -x509 -newkey rsa:4096 -keyout cert/key.pem -out cert/cert.pem -sha256 -days 365 -nodes -subj "/CN=localhost"cd observability
sudo docker compose up -d- Grafana: http://localhost:3001 - Data sources (Prometheus and Jaeger) are pre-provisioned.
- Prometheus: http://localhost:9090
- Jaeger: http://localhost:16686
Be sure that the folder node-server/dash-content/ exists, otherwise create it. This folder is necessary to serve the DASH segments.
Install dependencies and run the server:
cd node-server
npm install
node server.js- Server URL: https://localhost:3000
- Web Player: https://localhost:3000/player/index.html
cd rust-app
# Run the application with OpenTelemetry tracing enabled
cargo runThis starts generating DASH segments in node-server/dash-content/ and exports telemetry to the OTel Collector.
- Tracing: Visualized in Jaeger. Tracks pipeline lifecycle, state changes, and segment generation via GStreamer tracers and custom spans.
The dash.js player is instrumented with the OpenTelemetry JS SDK to export real-time playback metrics:
dash_buffer_level: Current video buffer depth (seconds).dash_bitrate: Current stream bitrate (kbps), using high-accuracy representational switch monitoring.dash_dropped_frames: Count of dropped frames.
- URL: http://localhost:3001
- Dashboards:
- Dash.js Player Metrics: Visualizes playback stability, buffer levels, and bitrate switches.
- Data Sources: Prometheus and Jaeger are automatically configured.
This project is licensed under the GNU Affero General Public License version 3 (AGPL-3.0). See the LICENSE file for the full text.