mirror of
https://github.com/livekit/livekit.git
synced 2026-09-16 23:24:45 +00:00
* Rework node stats a bit. Related protocol PR - https://github.com/livekit/protocol/pull/1023 - Make a config for node stats measurements. Wanted to put the config in `routing` package, but a circular dependency forced me to put in config.go - Make rate calculations explicit, i. e. requested via config. Previously, it had some odd checks to decide when to calculate rate and it would have been calculating over different windows. - Report signal/data channel bytes every 5 seconds to stats collection module. Previously, it was doing it every 30 seconds and that meant some windows could have had a large spike NOTE: Still need to think about this for load calculations as a large number of participants leaving could flush in a small window and that could report a large spike in bytes/packets. Maybe need to ignore signal bytes for load calculation? * deps * use default node stats config if given config is nil * split out node stats into a struct for re-use * update config
83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
// Copyright 2023 LiveKit, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package routing
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/livekit/protocol/livekit"
|
|
"github.com/livekit/protocol/logger"
|
|
|
|
"github.com/livekit/livekit-server/pkg/config"
|
|
"github.com/livekit/livekit-server/pkg/telemetry/prometheus"
|
|
)
|
|
|
|
type NodeStats struct {
|
|
config config.NodeStatsConfig
|
|
startedAt int64
|
|
|
|
lock sync.Mutex
|
|
statsHistory []*livekit.NodeStats
|
|
statsHistoryWritePtr int
|
|
}
|
|
|
|
func NewNodeStats(conf *config.NodeStatsConfig, startedAt int64) *NodeStats {
|
|
n := &NodeStats{
|
|
startedAt: startedAt,
|
|
}
|
|
n.UpdateConfig(conf)
|
|
return n
|
|
}
|
|
|
|
func (n *NodeStats) UpdateConfig(conf *config.NodeStatsConfig) {
|
|
n.lock.Lock()
|
|
defer n.lock.Unlock()
|
|
|
|
if conf == nil {
|
|
conf = &config.DefaultNodeStatsConfig
|
|
}
|
|
n.config = *conf
|
|
|
|
// set up stats history to be able to measure different rate windows
|
|
var maxInterval time.Duration
|
|
for _, rateInterval := range conf.StatsRateMeasurementIntervals {
|
|
if rateInterval > maxInterval {
|
|
maxInterval = rateInterval
|
|
}
|
|
}
|
|
n.statsHistory = make([]*livekit.NodeStats, (maxInterval+conf.StatsUpdateInterval-1)/conf.StatsUpdateInterval)
|
|
n.statsHistoryWritePtr = 0
|
|
}
|
|
|
|
func (n *NodeStats) UpdateAndGetNodeStats() (*livekit.NodeStats, error) {
|
|
n.lock.Lock()
|
|
defer n.lock.Unlock()
|
|
|
|
stats, err := prometheus.GetNodeStats(
|
|
n.startedAt,
|
|
append(n.statsHistory[n.statsHistoryWritePtr:], n.statsHistory[0:n.statsHistoryWritePtr]...),
|
|
n.config.StatsRateMeasurementIntervals,
|
|
)
|
|
if err != nil {
|
|
logger.Errorw("could not update node stats", err)
|
|
return nil, err
|
|
}
|
|
|
|
n.statsHistory[n.statsHistoryWritePtr] = stats
|
|
n.statsHistoryWritePtr = (n.statsHistoryWritePtr + 1) % len(n.statsHistory)
|
|
return stats, nil
|
|
}
|