package data import ( "os/exec" "time" ) type Sampler struct { consumer *Consumer items []Item triggers []Trigger triggersChannel chan *Sample } func NewSampler(consumer *Consumer, items []Item, triggers []Trigger, rateMs int) Sampler { ticker := time.NewTicker( time.Duration(rateMs * int(time.Millisecond)), ) sampler := Sampler{ consumer, items, triggers, make(chan *Sample), } go func() { for ; true; <-ticker.C { for _, item := range sampler.items { go sampler.sample(item) } } }() go func() { for { select { case sample := <-sampler.triggersChannel: for _, t := range sampler.triggers { t.Execute(sample) } } } }() return sampler } func (s *Sampler) sample(item Item) { val, err := item.nextValue() if err == nil { sample := &Sample{Label: item.Label, Value: val, Color: item.Color} s.consumer.SampleChannel <- sample s.triggersChannel <- sample } else { s.consumer.AlertChannel <- &Alert{ Title: "SAMPLING FAILURE", Text: getErrorMessage(err.(*exec.ExitError)), Color: item.Color, } } }