diff --git a/metrics/healthOverview.go b/metrics/healthOverview.go index 615eb3ca8..6ff6cbad4 100644 --- a/metrics/healthOverview.go +++ b/metrics/healthOverview.go @@ -11,8 +11,9 @@ import ( ) const ( - healthyPercentageValue = 75 - maxCPUUsage = 90 + healthyPercentageValue = 75 + maxCPUUsage = 90 + minClientCountForDetails = 3 ) // GetStreamHealthOverview will return the stream health overview. @@ -37,9 +38,10 @@ func generateStreamHealthOverview() { // Determine what percentage of total players are represented in our overview. totalPlayerCount := len(core.GetActiveViewers()) - representation := utils.IntPercentage(len(windowedBandwidths), totalPlayerCount) - overview.Representation = representation - + if totalPlayerCount > 0 && len(windowedBandwidths) > 0 { + representation := utils.IntPercentage(len(windowedBandwidths), totalPlayerCount) + overview.Representation = representation + } metrics.streamHealthOverview = overview } @@ -152,20 +154,29 @@ func errorCountHealthOverview() *models.StreamHealthOverview { return nil } - healthyPercentage := 100 - utils.IntPercentage(clientsWithErrors, totalNumberOfClients) - message := fmt.Sprintf("%d of %d clients (%d%%) are experiencing different, unspecified, playback issues.", clientsWithErrors, totalNumberOfClients, healthyPercentage) + // Only return these detailed values and messages if we feel we have enough + // clients to be able to make a reasonable assessment. This is an arbitrary + // number but 1 out of 1 isn't helpful. + message := "" + healthyPercentage := 0 - isUsingPassthrough := false - outputVariants := data.GetStreamOutputVariants() - for _, variant := range outputVariants { - if variant.IsVideoPassthrough { - isUsingPassthrough = true + if totalNumberOfClients >= minClientCountForDetails { + healthyPercentage := utils.IntPercentage(clientsWithErrors, totalNumberOfClients) + message = fmt.Sprintf("%d of %d clients (%d%%) may be experiencing some issues.", clientsWithErrors, totalNumberOfClients, healthyPercentage) + + isUsingPassthrough := false + outputVariants := data.GetStreamOutputVariants() + for _, variant := range outputVariants { + if variant.IsVideoPassthrough { + isUsingPassthrough = true + } + } + + if isUsingPassthrough { + message = fmt.Sprintf("%d of %d clients (%d%%) are experiencing errors. You're currently using a video passthrough output, often known for causing playback issues for people. It is suggested you turn it off.", clientsWithErrors, totalNumberOfClients, healthyPercentage) } } - if isUsingPassthrough { - message = fmt.Sprintf("%d of %d clients (%d%%) are experiencing errors. You're currently using a video passthrough output, often known for causing playback issues for people. It is suggested you turn it off.", clientsWithErrors, totalNumberOfClients, healthyPercentage) - } return &models.StreamHealthOverview{ Healthy: healthyPercentage > healthyPercentageValue, Message: message, diff --git a/utils/utils_test.go b/utils/utils_test.go index ea41f48f6..9b8bfcdbc 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -30,3 +30,14 @@ func TestGetHashtagsFromText(t *testing.T) { t.Error("Incorrect hashtags fetched from text.") } } + +func TestPercentageUtilsTest(t *testing.T) { + total := 42 + number := 18 + + percent := IntPercentage(number, total) + + if percent != 42 { + t.Error("Incorrect percentage calculation.") + } +}