You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by oc...@apache.org on 2021/04/07 16:02:15 UTC
[trafficcontrol] 02/02: Ensure that 5.x TS is not logging all 0's
for cache_stats, when linked with a 5.x TM/TO (#5714)
This is an automated email from the ASF dual-hosted git repository.
ocket8888 pushed a commit to branch 5.1.x
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
commit 924138d143febb66e926f0e6be82b22d450bfbd9
Author: Srijeet Chatterjee <30...@users.noreply.github.com>
AuthorDate: Tue Apr 6 08:26:26 2021 -0600
Ensure that 5.x TS is not logging all 0's for cache_stats, when linked with a 5.x TM/TO (#5714)
* Add fixes to ensure that TS is not logging all 0's for cache_stats
* change log msg modification
(cherry picked from commit ff7984842b143212e27460bcf4243786d5098b94)
---
CHANGELOG.md | 8 +-
traffic_stats/traffic_stats.go | 16 +++-
traffic_stats/traffic_stats_test.go | 157 ++++++++++++++++++++++++++++++++++++
3 files changed, 177 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 738fc5e..d5759f5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
+## [5.1.2] - 2021-04-07
+### Fixed
+- Fixed the return error for GET api `cdns/routing` to avoid incorrect success response.
+- [#5712](https://github.com/apache/trafficcontrol/issues/5712) - Ensure that 5.x Traffic Stats is compatible with 5.x Traffic Monitor and 5.x Traffic Ops, and that it doesn't log all 0's for `cache_stats`
+- Fixed ORT being unable to update URLSIG keys for Delivery Services
+- Fixed an issue where Traffic Ops becoming unavailable caused Traffic Monitor to segfault and crash
+
## [5.1.1] - 2021-03-19
### Added
- Atscfg: Added a rule to ip_allow such that PURGE requests are allowed over localhost
@@ -16,7 +23,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- [#5604](https://github.com/apache/trafficcontrol/issues/5604) - traffic_monitor.log is no longer truncated when restarting Traffic Monitor
- [#1624](https://github.com/apache/trafficcontrol/issues/1624) - Fixed ORT to reload Traffic Server if LUA scripts are added or changed.
- #5554 - TM UI overflows screen width and hides table data
-- Fixed the return error for GET api `cdns/routing` to avoid incorrect success response.
## [5.1.0] - 2021-02-21
diff --git a/traffic_stats/traffic_stats.go b/traffic_stats/traffic_stats.go
index a4aef4e..5088a19 100644
--- a/traffic_stats/traffic_stats.go
+++ b/traffic_stats/traffic_stats.go
@@ -654,10 +654,14 @@ func calcCacheValues(trafmonData []byte, cdnName string, sampleTime int64, cache
if err != nil {
errHndlr(err, ERROR)
}
+
for cacheName, cacheData := range jData.Caches {
cache := cacheMap[string(cacheName)]
for statName, statData := range cacheData {
+ if len(statData) == 0 {
+ continue
+ }
//Get the stat time and make sure it's greater than the time 24 hours ago. If not, skip it so influxdb doesn't throw retention policy errors.
validTime := time.Now().AddDate(0, 0, -1)
if statData[0].Time.Before(validTime) {
@@ -669,10 +673,16 @@ func calcCacheValues(trafmonData []byte, cdnName string, sampleTime int64, cache
dataKey = strings.Replace(dataKey, "-", "_", -1)
//Get the stat value and convert to float
- statFloatValue, ok := statData[0].Val.(float64)
- if !ok {
- statFloatValue = 0.00
+ statFloatValue := 0.0
+ if statsValue, ok := statData[0].Val.(string); !ok {
+ log.Warnf("stat data %s with value %v couldn't be converted into string", statName, statData[0].Val)
+ } else {
+ statFloatValue, err = strconv.ParseFloat(statsValue, 64)
+ if err != nil {
+ log.Warnf("stat %s with value %v couldn't be converted into a float", statName, statsValue)
+ }
}
+
tags := map[string]string{
"cachegroup": cache.Cachegroup,
"hostname": string(cacheName),
diff --git a/traffic_stats/traffic_stats_test.go b/traffic_stats/traffic_stats_test.go
new file mode 100644
index 0000000..735023a
--- /dev/null
+++ b/traffic_stats/traffic_stats_test.go
@@ -0,0 +1,157 @@
+package main
+
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+*/
+
+import (
+ "encoding/json"
+ "testing"
+ "time"
+
+ "github.com/apache/trafficcontrol/lib/go-tc"
+ influx "github.com/influxdata/influxdb/client/v2"
+)
+
+func TestCalcCacheValuesWithInvalidValue(t *testing.T) {
+ stats := make(map[string][]tc.ResultStatVal)
+ caches := make(map[tc.CacheName]map[string][]tc.ResultStatVal)
+ cacheMap := make(map[string]tc.Server)
+ resultSatsVal := []tc.ResultStatVal{
+ {
+ Span: 0,
+ Time: time.Now(),
+ Val: "invalid stat",
+ },
+ }
+ stats["maxKbps"] = resultSatsVal
+ caches["cache1"] = stats
+ cacheMap["cache1"] = tc.Server{}
+ config := StartupConfig{
+ BpsChan: make(chan influx.BatchPoints),
+ }
+ legacyStats := tc.LegacyStats{
+ CommonAPIData: tc.CommonAPIData{},
+ Caches: caches,
+ }
+ data, err := json.Marshal(legacyStats)
+ if err != nil {
+ t.Fatalf("couldn't marshal struct %v", caches)
+ }
+ go calcCacheValues(data, "cdn", 0, cacheMap, config)
+ result := <-config.BpsChan
+ if len(result.Points()) == 0 {
+ t.Fatalf("expected one point in the result, got none")
+ }
+ fields, err := result.Points()[0].Fields()
+ if err != nil {
+ t.Fatalf("couldn't read the fields of the result: %v", err.Error())
+ }
+ if val, ok := fields["value"]; !ok {
+ t.Fatalf("couldn't find a 'value' field")
+ } else {
+ if val.(float64) != 0.0 {
+ t.Errorf("expected invalid stat to result in a value of 0.0, but got %v instead", val.(float64))
+ }
+ }
+}
+
+func TestCalcCacheValuesWithEmptyInterface(t *testing.T) {
+ stats := make(map[string][]tc.ResultStatVal)
+ caches := make(map[tc.CacheName]map[string][]tc.ResultStatVal)
+ cacheMap := make(map[string]tc.Server)
+ resultSatsVal := []tc.ResultStatVal{
+ {
+ Span: 0,
+ Time: time.Now(),
+ },
+ }
+ stats["maxKbps"] = resultSatsVal
+ caches["cache1"] = stats
+ cacheMap["cache1"] = tc.Server{}
+ config := StartupConfig{
+ BpsChan: make(chan influx.BatchPoints),
+ }
+ legacyStats := tc.LegacyStats{
+ CommonAPIData: tc.CommonAPIData{},
+ Caches: caches,
+ }
+ data, err := json.Marshal(legacyStats)
+ if err != nil {
+ t.Fatalf("couldn't marshal struct %v", caches)
+ }
+ go calcCacheValues(data, "cdn", 0, cacheMap, config)
+ result := <-config.BpsChan
+ if len(result.Points()) == 0 {
+ t.Fatalf("expected one point in the result, got none")
+ }
+ fields, err := result.Points()[0].Fields()
+ if err != nil {
+ t.Fatalf("couldn't read the fields of the result: %v", err.Error())
+ }
+ if val, ok := fields["value"]; !ok {
+ t.Fatalf("couldn't find a 'value' field")
+ } else {
+ if val.(float64) != 0.0 {
+ t.Errorf("expected invalid stat to result in a value of 0.0, but got %v instead", val.(float64))
+ }
+ }
+}
+
+func TestCalcCacheValues(t *testing.T) {
+ stats := make(map[string][]tc.ResultStatVal)
+ caches := make(map[tc.CacheName]map[string][]tc.ResultStatVal)
+ cacheMap := make(map[string]tc.Server)
+ resultSatsVal := []tc.ResultStatVal{
+ {
+ Span: 0,
+ Time: time.Now(),
+ Val: "25.56",
+ },
+ }
+ stats["maxKbps"] = resultSatsVal
+ caches["cache1"] = stats
+ cacheMap["cache1"] = tc.Server{}
+ config := StartupConfig{
+ BpsChan: make(chan influx.BatchPoints),
+ }
+ legacyStats := tc.LegacyStats{
+ CommonAPIData: tc.CommonAPIData{},
+ Caches: caches,
+ }
+ data, err := json.Marshal(legacyStats)
+ if err != nil {
+ t.Fatalf("couldn't marshal struct %v", caches)
+ }
+ go calcCacheValues(data, "cdn", 0, cacheMap, config)
+ result := <-config.BpsChan
+ if len(result.Points()) == 0 {
+ t.Fatalf("expected one point in the result, got none")
+ }
+ fields, err := result.Points()[0].Fields()
+ if err != nil {
+ t.Fatalf("couldn't read the fields of the result: %v", err.Error())
+ }
+ if val, ok := fields["value"]; !ok {
+ t.Fatalf("couldn't find a 'value' field")
+ } else {
+ if val.(float64) != 25.56 {
+ t.Errorf("expected invalid stat to result in a value of 0.0, but got %v instead", val.(float64))
+ }
+ }
+}