You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ne...@apache.org on 2017/02/27 20:13:07 UTC

[1/2] incubator-trafficcontrol git commit: Add Stat endpoint Oldest Polled Peer name, time

Repository: incubator-trafficcontrol
Updated Branches:
  refs/heads/master 6cd6b3e9c -> ad9754043


Add Stat endpoint Oldest Polled Peer name, time


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/52e0c339
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/52e0c339
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/52e0c339

Branch: refs/heads/master
Commit: 52e0c3399cb2a4b564822599c1b3b7181d435d69
Parents: 6cd6b3e
Author: Robert Butts <ro...@gmail.com>
Authored: Mon Feb 27 12:59:27 2017 -0700
Committer: David Neuman <da...@gmail.com>
Committed: Mon Feb 27 13:12:48 2017 -0700

----------------------------------------------------------------------
 .../traffic_monitor/manager/datarequest.go      | 37 ++++++++++++++++----
 .../traffic_monitor/peer/crstates.go            | 25 ++++++++++++-
 .../traffic_monitor/version.go                  |  2 +-
 3 files changed, 55 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/52e0c339/traffic_monitor_golang/traffic_monitor/manager/datarequest.go
----------------------------------------------------------------------
diff --git a/traffic_monitor_golang/traffic_monitor/manager/datarequest.go b/traffic_monitor_golang/traffic_monitor/manager/datarequest.go
index 86ebe01..1b5bd9e 100644
--- a/traffic_monitor_golang/traffic_monitor/manager/datarequest.go
+++ b/traffic_monitor_golang/traffic_monitor/manager/datarequest.go
@@ -618,8 +618,8 @@ func srvPeerStates(params url.Values, errorCount threadsafe.Uint, path string, t
 	return WrapErrCode(errorCount, path, bytes, err)
 }
 
-func srvStats(staticAppData StaticAppData, healthPollInterval time.Duration, lastHealthDurations DurationMapThreadsafe, fetchCount threadsafe.Uint, healthIteration threadsafe.Uint, errorCount threadsafe.Uint) ([]byte, error) {
-	return getStats(staticAppData, healthPollInterval, lastHealthDurations.Get(), fetchCount.Get(), healthIteration.Get(), errorCount.Get())
+func srvStats(staticAppData StaticAppData, healthPollInterval time.Duration, lastHealthDurations DurationMapThreadsafe, fetchCount threadsafe.Uint, healthIteration threadsafe.Uint, errorCount threadsafe.Uint, peerStates peer.CRStatesPeersThreadsafe) ([]byte, error) {
+	return getStats(staticAppData, healthPollInterval, lastHealthDurations.Get(), fetchCount.Get(), healthIteration.Get(), errorCount.Get(), peerStates)
 }
 
 func srvConfigDoc(opsConfig OpsConfigThreadsafe) ([]byte, error) {
@@ -756,7 +756,7 @@ func MakeDispatchMap(
 			return srvPeerStates(params, errorCount, path, toData, peerStates)
 		}, ContentTypeJSON)),
 		"/publish/Stats": wrap(WrapErr(errorCount, func() ([]byte, error) {
-			return srvStats(staticAppData, healthPollInterval, lastHealthDurations, fetchCount, healthIteration, errorCount)
+			return srvStats(staticAppData, healthPollInterval, lastHealthDurations, fetchCount, healthIteration, errorCount, peerStates)
 		}, ContentTypeJSON)),
 		"/publish/ConfigDoc": wrap(WrapErr(errorCount, func() ([]byte, error) {
 			return srvConfigDoc(opsConfig)
@@ -1114,6 +1114,8 @@ type Stats struct {
 	MemAllocBytes       uint64 `json:"Memory Bytes Allocated"`
 	MemTotalBytes       uint64 `json:"Total Bytes Allocated"`
 	MemSysBytes         uint64 `json:"System Bytes Allocated"`
+	OldestPolledPeer    string `json:"Oldest Polled Peer"`
+	OldestPolledPeerMs  int64  `json:"Oldest Polled Peer Time (ms)"`
 }
 
 func getLongestPoll(lastHealthTimes map[enum.CacheName]time.Duration) (enum.CacheName, time.Duration) {
@@ -1128,7 +1130,25 @@ func getLongestPoll(lastHealthTimes map[enum.CacheName]time.Duration) (enum.Cach
 	return longestCache, longestTime
 }
 
-func getStats(staticAppData StaticAppData, pollingInterval time.Duration, lastHealthTimes map[enum.CacheName]time.Duration, fetchCount uint64, healthIteration uint64, errorCount uint64) ([]byte, error) {
+func oldestPeerPollTime(peerTimes map[enum.TrafficMonitorName]time.Time) (enum.TrafficMonitorName, time.Time) {
+	now := time.Now()
+	oldestTime := now
+	oldestPeer := enum.TrafficMonitorName("")
+	for p, t := range peerTimes {
+		if oldestTime.After(t) {
+			oldestTime = t
+			oldestPeer = p
+		}
+	}
+	if oldestTime == now {
+		oldestTime = time.Time{}
+	}
+	return oldestPeer, oldestTime
+}
+
+const MillisecondsPerNanosecond = int64(1000000)
+
+func getStats(staticAppData StaticAppData, pollingInterval time.Duration, lastHealthTimes map[enum.CacheName]time.Duration, fetchCount uint64, healthIteration uint64, errorCount uint64, peerStates peer.CRStatesPeersThreadsafe) ([]byte, error) {
 	longestPollCache, longestPollTime := getLongestPoll(lastHealthTimes)
 	var memStats runtime.MemStats
 	runtime.ReadMemStats(&memStats)
@@ -1157,6 +1177,10 @@ func getStats(staticAppData StaticAppData, pollingInterval time.Duration, lastHe
 	s.MemTotalBytes = memStats.TotalAlloc
 	s.MemSysBytes = memStats.Sys
 
+	oldestPolledPeer, oldestPolledPeerTime := oldestPeerPollTime(peerStates.GetQueryTimes()) // map[enum.TrafficMonitorName]time.Time)
+	s.OldestPolledPeer = string(oldestPolledPeer)
+	s.OldestPolledPeerMs = time.Now().Sub((oldestPolledPeerTime)).Nanoseconds() / MillisecondsPerNanosecond
+
 	return json.Marshal(JSONStats{Stats: s})
 }
 
@@ -1195,9 +1219,8 @@ func createStatSummary(statResultHistory cache.ResultStatHistory, filter cache.F
 				continue
 			}
 			ssStat := StatSummaryStat{}
-			msPerNs := int64(1000000)
-			ssStat.StartTime = statHistory[len(statHistory)-1].Time.UnixNano() / msPerNs
-			ssStat.EndTime = statHistory[0].Time.UnixNano() / msPerNs
+			ssStat.StartTime = statHistory[len(statHistory)-1].Time.UnixNano() / MillisecondsPerNanosecond
+			ssStat.EndTime = statHistory[0].Time.UnixNano() / MillisecondsPerNanosecond
 			oldestVal, isOldestValNumeric := util.ToNumeric(statHistory[len(statHistory)-1].Val)
 			newestVal, isNewestValNumeric := util.ToNumeric(statHistory[0].Val)
 			if !isOldestValNumeric || !isNewestValNumeric {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/52e0c339/traffic_monitor_golang/traffic_monitor/peer/crstates.go
----------------------------------------------------------------------
diff --git a/traffic_monitor_golang/traffic_monitor/peer/crstates.go b/traffic_monitor_golang/traffic_monitor/peer/crstates.go
index ef0133e..efa40a9 100644
--- a/traffic_monitor_golang/traffic_monitor/peer/crstates.go
+++ b/traffic_monitor_golang/traffic_monitor/peer/crstates.go
@@ -22,6 +22,7 @@ package peer
 import (
 	"encoding/json"
 	"sync"
+	"time"
 
 	"github.com/apache/incubator-trafficcontrol/traffic_monitor_golang/traffic_monitor/enum"
 )
@@ -187,12 +188,18 @@ func (t *CRStatesThreadsafe) DeleteDeliveryService(name enum.DeliveryServiceName
 type CRStatesPeersThreadsafe struct {
 	crStates   map[enum.TrafficMonitorName]Crstates
 	peerStates map[enum.TrafficMonitorName]bool
+	peerTimes  map[enum.TrafficMonitorName]time.Time
 	m          *sync.RWMutex
 }
 
 // NewCRStatesPeersThreadsafe creates a new CRStatesPeers object safe for multiple goroutine readers and a single writer.
 func NewCRStatesPeersThreadsafe() CRStatesPeersThreadsafe {
-	return CRStatesPeersThreadsafe{m: &sync.RWMutex{}, crStates: map[enum.TrafficMonitorName]Crstates{}, peerStates: map[enum.TrafficMonitorName]bool{}}
+	return CRStatesPeersThreadsafe{
+		m:          &sync.RWMutex{},
+		crStates:   map[enum.TrafficMonitorName]Crstates{},
+		peerStates: map[enum.TrafficMonitorName]bool{},
+		peerTimes:  map[enum.TrafficMonitorName]time.Time{},
+	}
 }
 
 // GetCrstates returns the internal Traffic Monitor peer Crstates data. This MUST NOT be modified.
@@ -206,6 +213,14 @@ func (t *CRStatesPeersThreadsafe) GetCrstates() map[enum.TrafficMonitorName]Crst
 	return m
 }
 
+func copyPeerTimes(a map[enum.TrafficMonitorName]time.Time) map[enum.TrafficMonitorName]time.Time {
+	m := make(map[enum.TrafficMonitorName]time.Time, len(a))
+	for k, v := range a {
+		m[k] = v
+	}
+	return m
+}
+
 // GetPeerAvailability returns the state of the given peer
 func (t *CRStatesPeersThreadsafe) GetPeerAvailability(peer enum.TrafficMonitorName) bool {
 	t.m.RLock()
@@ -214,6 +229,13 @@ func (t *CRStatesPeersThreadsafe) GetPeerAvailability(peer enum.TrafficMonitorNa
 	return availability
 }
 
+// GetPeerAvailability returns the state of the given peer
+func (t *CRStatesPeersThreadsafe) GetQueryTimes() map[enum.TrafficMonitorName]time.Time {
+	t.m.RLock()
+	defer t.m.RUnlock()
+	return copyPeerTimes(t.peerTimes)
+}
+
 // HasAvailablePeers returns true if at least one peer is online
 func (t *CRStatesPeersThreadsafe) HasAvailablePeers() bool {
 	availablePeers := false
@@ -237,5 +259,6 @@ func (t *CRStatesPeersThreadsafe) Set(result Result) {
 	t.m.Lock()
 	t.crStates[result.ID] = result.PeerStates
 	t.peerStates[result.ID] = result.Available
+	t.peerTimes[result.ID] = result.Time
 	t.m.Unlock()
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/52e0c339/traffic_monitor_golang/traffic_monitor/version.go
----------------------------------------------------------------------
diff --git a/traffic_monitor_golang/traffic_monitor/version.go b/traffic_monitor_golang/traffic_monitor/version.go
index 31569de..e9738e5 100644
--- a/traffic_monitor_golang/traffic_monitor/version.go
+++ b/traffic_monitor_golang/traffic_monitor/version.go
@@ -20,4 +20,4 @@ package main
  */
 
 // Version is the current version of the app, in string form.
-var Version = "2.0.5"
+var Version = "2.0.6"


[2/2] incubator-trafficcontrol git commit: This closes #316

Posted by ne...@apache.org.
This closes #316


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/ad975404
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/ad975404
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/ad975404

Branch: refs/heads/master
Commit: ad9754043c03fd8125cec9f25d5595392ddfcae0
Parents: 52e0c33
Author: David Neuman <da...@gmail.com>
Authored: Mon Feb 27 13:13:01 2017 -0700
Committer: David Neuman <da...@gmail.com>
Committed: Mon Feb 27 13:13:01 2017 -0700

----------------------------------------------------------------------

----------------------------------------------------------------------