Store connected viewers in Prometheus and serve this amount

This commit is contained in:
Yohann D'ANELLO 2020-09-29 18:03:28 +02:00
parent c49b5eeb2b
commit 2005f3ece1
6 changed files with 31 additions and 0 deletions

2
go.mod
View File

@ -5,10 +5,12 @@ go 1.13
require ( require (
github.com/go-ldap/ldap/v3 v3.2.3 github.com/go-ldap/ldap/v3 v3.2.3
github.com/haivision/srtgo v0.0.0-20200731151239-e00427ae473a github.com/haivision/srtgo v0.0.0-20200731151239-e00427ae473a
github.com/hashicorp/go.net v0.0.1
github.com/markbates/pkger v0.17.1 github.com/markbates/pkger v0.17.1
github.com/pion/rtp v1.6.0 github.com/pion/rtp v1.6.0
github.com/pion/webrtc/v3 v3.0.0-beta.5 github.com/pion/webrtc/v3 v3.0.0-beta.5
github.com/prometheus/client_golang v1.7.1 github.com/prometheus/client_golang v1.7.1
github.com/prometheus/client_model v0.2.0
github.com/spf13/viper v1.7.1 github.com/spf13/viper v1.7.1
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
) )

1
go.sum
View File

@ -148,6 +148,7 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=

View File

@ -7,6 +7,7 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
dto "github.com/prometheus/client_model/go"
) )
// Options holds web package configuration // Options holds web package configuration
@ -26,8 +27,23 @@ var (
Name: "ghostream_web_sessions_total", Name: "ghostream_web_sessions_total",
Help: "The total amount of WebRTC sessions exchanged", Help: "The total amount of WebRTC sessions exchanged",
}) })
// WebRTCConnectedSessions is the total amount of WebRTC session exchange
WebRTCConnectedSessions = promauto.NewGauge(prometheus.GaugeOpts{
Name: "ghostream_webrtc_connected_sessions",
Help: "The current amount of opened WebRTC sessions",
})
) )
func GetGaugeValue(metric prometheus.Gauge) float64 {
var m = &dto.Metric{}
if err := metric.Write(m); err != nil {
log.Fatal(err)
return 0
}
return m.Gauge.GetValue()
}
// Serve monitoring server that expose prometheus metrics // Serve monitoring server that expose prometheus metrics
func Serve(cfg *Options) { func Serve(cfg *Options) {
mux := http.NewServeMux() mux := http.NewServeMux()

View File

@ -2,6 +2,7 @@ package webrtc
import ( import (
"fmt" "fmt"
"gitlab.crans.org/nounous/ghostream/internal/monitoring"
"io" "io"
"log" "log"
"math/rand" "math/rand"
@ -128,10 +129,12 @@ func newPeerHandler(remoteSdp webrtc.SessionDescription, cfg *Options) webrtc.Se
// Register tracks // Register tracks
videoTracks = append(videoTracks, videoTrack) videoTracks = append(videoTracks, videoTrack)
audioTracks = append(audioTracks, audioTrack) audioTracks = append(audioTracks, audioTrack)
monitoring.WebRTCConnectedSessions.Inc()
} else if connectionState == webrtc.ICEConnectionStateDisconnected { } else if connectionState == webrtc.ICEConnectionStateDisconnected {
// Unregister tracks // Unregister tracks
videoTracks = removeTrack(videoTracks, videoTrack) videoTracks = removeTrack(videoTracks, videoTrack)
audioTracks = removeTrack(audioTracks, audioTrack) audioTracks = removeTrack(audioTracks, audioTrack)
monitoring.WebRTCConnectedSessions.Dec()
} }
}) })

View File

@ -84,3 +84,11 @@ func staticHandler() http.Handler {
staticFs := http.FileServer(pkger.Dir("/web/static")) staticFs := http.FileServer(pkger.Dir("/web/static"))
return http.StripPrefix("/static/", staticFs) return http.StripPrefix("/static/", staticFs)
} }
func statisticsHandler(w http.ResponseWriter, r *http.Request) {
// Display connected users stats
enc := json.NewEncoder(w)
enc.Encode(struct {
ConnectedViewers int
}{int(monitoring.GetGaugeValue(monitoring.WebRTCConnectedSessions))})
}

View File

@ -84,6 +84,7 @@ func Serve(rSdpChan chan webrtc.SessionDescription, lSdpChan chan webrtc.Session
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("/", viewerHandler) mux.HandleFunc("/", viewerHandler)
mux.Handle("/static/", staticHandler()) mux.Handle("/static/", staticHandler())
mux.HandleFunc("/_stats/", statisticsHandler)
log.Printf("HTTP server listening on %s", cfg.ListenAddress) log.Printf("HTTP server listening on %s", cfg.ListenAddress)
log.Fatal(http.ListenAndServe(cfg.ListenAddress, mux)) log.Fatal(http.ListenAndServe(cfg.ListenAddress, mux))
} }