From 41d7ebc5c56317ebb40f5071838f29bad372cb51 Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Sun, 11 Dec 2016 22:58:28 -0800 Subject: [PATCH] Refactored hoststats collector --- client/client.go | 14 +++----------- client/gc.go | 1 + client/stats/host.go | 24 ++++++++++++++++++------ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/client/client.go b/client/client.go index ffdfc9df9..ba616f2b8 100644 --- a/client/client.go +++ b/client/client.go @@ -141,8 +141,6 @@ type Client struct { // HostStatsCollector collects host resource usage stats hostStatsCollector *stats.HostStatsCollector - resourceUsage *stats.HostStats - resourceUsageLock sync.RWMutex shutdown bool shutdownCh chan struct{} @@ -481,9 +479,7 @@ func (c *Client) GetAllocStats(allocID string) (AllocStatsReporter, error) { // HostStats returns all the stats related to a Nomad client func (c *Client) LatestHostStats() *stats.HostStats { - c.resourceUsageLock.RLock() - defer c.resourceUsageLock.RUnlock() - return c.resourceUsage + return c.hostStatsCollector.Stats() } // GetAllocFS returns the AllocFS interface for the alloc dir of an allocation @@ -2104,20 +2100,16 @@ func (c *Client) collectHostStats() { for { select { case <-next.C: - ru, err := c.hostStatsCollector.Collect() + err := c.hostStatsCollector.Collect() next.Reset(c.config.StatsCollectionInterval) if err != nil { c.logger.Printf("[WARN] client: error fetching host resource usage stats: %v", err) continue } - c.resourceUsageLock.Lock() - c.resourceUsage = ru - c.resourceUsageLock.Unlock() - // Publish Node metrics if operator has opted in if c.config.PublishNodeMetrics { - c.emitStats(ru) + c.emitStats(c.hostStatsCollector.Stats()) } case <-c.shutdownCh: return diff --git a/client/gc.go b/client/gc.go index 2c2120832..eb66ab170 100644 --- a/client/gc.go +++ b/client/gc.go @@ -163,6 +163,7 @@ func (a *AllocGarbageCollector) MakeRoomFor(allocations []*structs.Allocation) e ar := gcAlloc.allocRunner alloc := ar.Alloc() + a.logger.Printf("[INFO] client: garbage collecting allocation %v", alloc.ID) ar.Destroy() diskCleared += alloc.Resources.DiskMB if diskCleared >= totalResource.DiskMB { diff --git a/client/stats/host.go b/client/stats/host.go index 49fb0fdcb..d1cd6ac8d 100644 --- a/client/stats/host.go +++ b/client/stats/host.go @@ -4,6 +4,7 @@ import ( "log" "math" "runtime" + "sync" "time" "github.com/shirou/gopsutil/cpu" @@ -58,6 +59,8 @@ type HostStatsCollector struct { numCores int statsCalculator map[string]*HostCpuStatsCalculator logger *log.Logger + hostStats *HostStats + hostStatsLock sync.RWMutex } // NewHostStatsCollector returns a HostStatsCollector @@ -73,11 +76,11 @@ func NewHostStatsCollector(logger *log.Logger) *HostStatsCollector { } // Collect collects stats related to resource usage of a host -func (h *HostStatsCollector) Collect() (*HostStats, error) { +func (h *HostStatsCollector) Collect() error { hs := &HostStats{Timestamp: time.Now().UTC().UnixNano()} memStats, err := mem.VirtualMemory() if err != nil { - return nil, err + return err } hs.Memory = &MemoryStats{ Total: memStats.Total, @@ -89,7 +92,7 @@ func (h *HostStatsCollector) Collect() (*HostStats, error) { ticksConsumed := 0.0 cpuStats, err := cpu.Times(true) if err != nil { - return nil, err + return err } cs := make([]*CPUStats, len(cpuStats)) for idx, cpuStat := range cpuStats { @@ -113,7 +116,7 @@ func (h *HostStatsCollector) Collect() (*HostStats, error) { partitions, err := disk.Partitions(false) if err != nil { - return nil, err + return err } var diskStats []*DiskStats for _, partition := range partitions { @@ -143,11 +146,20 @@ func (h *HostStatsCollector) Collect() (*HostStats, error) { uptime, err := host.Uptime() if err != nil { - return nil, err + return err } hs.Uptime = uptime - return hs, nil + h.hostStatsLock.Lock() + defer h.hostStatsLock.Unlock() + h.hostStats = hs + return nil +} + +func (h *HostStatsCollector) Stats() *HostStats { + h.hostStatsLock.RLock() + defer h.hostStatsLock.RUnlock() + return h.hostStats } // HostCpuStatsCalculator calculates cpu usage percentages