1
0
Fork 0
telegraf/plugins/inputs/vsphere/tscache.go

62 lines
1.4 KiB
Go
Raw Permalink Normal View History

package vsphere
import (
"sync"
"time"
"github.com/influxdata/telegraf"
)
// tsCache is a cache of timestamps used to determine the validity of datapoints
type tsCache struct {
ttl time.Duration
table map[string]time.Time
mux sync.RWMutex
log telegraf.Logger
}
// newTSCache creates a new tsCache with a specified time-to-live after which timestamps are discarded.
func newTSCache(ttl time.Duration, log telegraf.Logger) *tsCache {
return &tsCache{
ttl: ttl,
table: make(map[string]time.Time),
log: log,
}
}
// purge removes timestamps that are older than the time-to-live
func (t *tsCache) purge() {
t.mux.Lock()
defer t.mux.Unlock()
n := 0
for k, v := range t.table {
if time.Since(v) > t.ttl {
delete(t.table, k)
n++
}
}
t.log.Debugf("purged timestamp cache. %d deleted with %d remaining", n, len(t.table))
}
// get returns a timestamp (if present)
func (t *tsCache) get(key, metricName string) (time.Time, bool) {
t.mux.RLock()
defer t.mux.RUnlock()
ts, ok := t.table[makeKey(key, metricName)]
return ts, ok
}
// put updates the latest timestamp for the supplied key.
func (t *tsCache) put(key, metricName string, timestamp time.Time) {
t.mux.Lock()
defer t.mux.Unlock()
k := makeKey(key, metricName)
if timestamp.After(t.table[k]) {
t.table[k] = timestamp
}
}
func makeKey(resource, metric string) string {
return resource + "|" + metric
}