extension/agenthealth/handler/stats/provider/interval.go (45 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package provider
import (
"sync"
"sync/atomic"
"time"
"github.com/aws/amazon-cloudwatch-agent/extension/agenthealth/handler/stats/agent"
)
// intervalStats restricts the Stats get function to once
// per interval.
type intervalStats struct {
mu sync.RWMutex
interval time.Duration
getOnce *sync.Once
lastGet time.Time
stats atomic.Value
}
var _ agent.StatsProvider = (*intervalStats)(nil)
func (p *intervalStats) Stats(string) agent.Stats {
p.mu.RLock()
defer p.mu.RUnlock()
var stats agent.Stats
p.getOnce.Do(func() {
p.lastGet = time.Now()
stats = p.getStats()
go p.allowNextGetAfter(p.interval)
})
return stats
}
func (p *intervalStats) getStats() agent.Stats {
var stats agent.Stats
if value := p.stats.Load(); value != nil {
stats = value.(agent.Stats)
}
return stats
}
func (p *intervalStats) allowNextGetAfter(interval time.Duration) {
time.Sleep(interval)
p.mu.Lock()
defer p.mu.Unlock()
p.getOnce = new(sync.Once)
}
func newIntervalStats(interval time.Duration) *intervalStats {
return &intervalStats{
getOnce: new(sync.Once),
interval: interval,
}
}