Refactored hoststats collector

This commit is contained in:
Diptanu Choudhury
2016-12-11 22:58:28 -08:00
parent a38201a220
commit 41d7ebc5c5
3 changed files with 22 additions and 17 deletions

View File

@@ -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

View File

@@ -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 {

View File

@@ -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