metric: clear useless proxy statistics data

This commit is contained in:
fatedier 2017-05-26 02:00:00 +08:00
parent 08b0885564
commit f0dc3ed47b
2 changed files with 41 additions and 10 deletions

View File

@ -268,7 +268,7 @@ func (ctl *Control) stoper() {
for _, pxy := range ctl.proxies { for _, pxy := range ctl.proxies {
pxy.Close() pxy.Close()
ctl.svr.DelProxy(pxy.GetName()) ctl.svr.DelProxy(pxy.GetName())
StatsCloseProxy(pxy.GetConf().GetBaseInfo().ProxyType) StatsCloseProxy(pxy.GetName(), pxy.GetConf().GetBaseInfo().ProxyType)
} }
ctl.allShutdown.Done() ctl.allShutdown.Done()

View File

@ -16,8 +16,10 @@ package server
import ( import (
"sync" "sync"
"time"
"github.com/fatedier/frp/models/config" "github.com/fatedier/frp/models/config"
"github.com/fatedier/frp/utils/log"
"github.com/fatedier/frp/utils/metric" "github.com/fatedier/frp/utils/metric"
) )
@ -46,10 +48,13 @@ type ServerStatistics struct {
} }
type ProxyStatistics struct { type ProxyStatistics struct {
Name string
ProxyType string ProxyType string
TrafficIn metric.DateCounter TrafficIn metric.DateCounter
TrafficOut metric.DateCounter TrafficOut metric.DateCounter
CurConns metric.Counter CurConns metric.Counter
LastStartTime time.Time
LastCloseTime time.Time
} }
func init() { func init() {
@ -63,6 +68,27 @@ func init() {
ProxyStatistics: make(map[string]*ProxyStatistics), ProxyStatistics: make(map[string]*ProxyStatistics),
} }
go func() {
for {
time.Sleep(12 * time.Hour)
log.Debug("start to clear useless proxy statistics data...")
StatsClearUselessInfo()
log.Debug("finish to clear useless proxy statistics data")
}
}()
}
func StatsClearUselessInfo() {
// To check if there are proxies that closed than 7 days and drop them.
globalStats.mu.Lock()
defer globalStats.mu.Unlock()
for name, data := range globalStats.ProxyStatistics {
if !data.LastCloseTime.IsZero() && time.Since(data.LastCloseTime) > time.Duration(7*24)*time.Hour {
delete(globalStats.ProxyStatistics, name)
log.Trace("clear proxy [%s]'s statistics data, lastCloseTime: [%s]", name, data.LastCloseTime.String())
}
}
} }
func StatsNewClient() { func StatsNewClient() {
@ -91,23 +117,28 @@ func StatsNewProxy(name string, proxyType string) {
proxyStats, ok := globalStats.ProxyStatistics[name] proxyStats, ok := globalStats.ProxyStatistics[name]
if !(ok && proxyStats.ProxyType == proxyType) { if !(ok && proxyStats.ProxyType == proxyType) {
proxyStats = &ProxyStatistics{ proxyStats = &ProxyStatistics{
Name: name,
ProxyType: proxyType, ProxyType: proxyType,
CurConns: metric.NewCounter(), CurConns: metric.NewCounter(),
TrafficIn: metric.NewDateCounter(ReserveDays), TrafficIn: metric.NewDateCounter(ReserveDays),
TrafficOut: metric.NewDateCounter(ReserveDays), TrafficOut: metric.NewDateCounter(ReserveDays),
LastStartTime: time.Now(),
} }
globalStats.ProxyStatistics[name] = proxyStats globalStats.ProxyStatistics[name] = proxyStats
} }
} }
} }
func StatsCloseProxy(proxyType string) { func StatsCloseProxy(proxyName string, proxyType string) {
if config.ServerCommonCfg.DashboardPort != 0 { if config.ServerCommonCfg.DashboardPort != 0 {
globalStats.mu.Lock() globalStats.mu.Lock()
defer globalStats.mu.Unlock() defer globalStats.mu.Unlock()
if counter, ok := globalStats.ProxyTypeCounts[proxyType]; ok { if counter, ok := globalStats.ProxyTypeCounts[proxyType]; ok {
counter.Dec(1) counter.Dec(1)
} }
if proxyStats, ok := globalStats.ProxyStatistics[proxyName]; ok {
proxyStats.LastCloseTime = time.Now()
}
} }
} }