1
0
Fork 0
shezmu/stats/server.go

54 lines
1005 B
Go

package stats
import (
"encoding/json"
"fmt"
"net/http"
"time"
)
type Server struct {
base
history map[string][]*baseSnapshot
}
const (
serverSnapshotIntervl = 5 * time.Second
serverHistorySize = 360 // 30 minutes of 5 second snapshots
)
func NewServer() *Server {
s := &Server{}
s.init()
s.history = make(map[string][]*baseSnapshot)
go s.takeSnapshots()
return s
}
func (s *Server) History(rw http.ResponseWriter, _ *http.Request) {
encoded, err := json.Marshal(s.history)
if err != nil {
http.Error(rw, fmt.Sprintf("%v", err), http.StatusInternalServerError)
return
}
rw.Header().Add("Access-Control-Allow-Origin", "*")
rw.Write(encoded)
}
func (s *Server) takeSnapshots() {
for range time.NewTicker(serverSnapshotIntervl).C {
s.Lock()
for name, stat := range s.stats {
if len(s.history[name]) >= serverHistorySize {
s.history[name] = s.history[name][1:]
}
s.history[name] = append(s.history[name], stat.snapshot())
}
s.Reset()
s.Unlock()
}
}