in util/common/metrics.go [112:207]
func SendCollectDMetrics(metricPerInterval int, sendingInterval, duration time.Duration) error {
// https://github.com/collectd/go-collectd/tree/92e86f95efac5eb62fa84acc6033e7a57218b606
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client, err := network.Dial(
net.JoinHostPort("127.0.0.1", network.DefaultService),
network.ClientOptions{
SecurityLevel: network.None,
})
if err != nil {
return err
}
defer client.Close()
ticker := time.NewTicker(sendingInterval)
defer ticker.Stop()
endTimeout := time.After(duration)
// Sending the collectd metric within the first minute before the ticker kicks in the next minute
for t := 1; t <= metricPerInterval/2; t++ {
_ = client.Write(ctx, &api.ValueList{
Identifier: api.Identifier{
Host: exec.Hostname(),
Plugin: fmt.Sprint("gauge_", t),
Type: "gauge",
},
Time: time.Now(),
Interval: time.Minute,
Values: []api.Value{api.Gauge(t)},
})
err = client.Write(ctx, &api.ValueList{
Identifier: api.Identifier{
Host: exec.Hostname(),
Plugin: fmt.Sprint("counter_", t),
Type: "counter",
},
Time: time.Now(),
Interval: time.Minute,
Values: []api.Value{api.Counter(t)},
})
if err != nil && !errors.Is(err, network.ErrNotEnoughSpace) {
return err
}
}
time.Sleep(30 * time.Second)
if err := client.Flush(); err != nil {
return err
}
for {
select {
case <-ticker.C:
for t := 1; t <= metricPerInterval/2; t++ {
_ = client.Write(ctx, &api.ValueList{
Identifier: api.Identifier{
Host: exec.Hostname(),
Plugin: fmt.Sprint("gauge_", t),
Type: "gauge",
},
Time: time.Now(),
Interval: time.Minute,
Values: []api.Value{api.Gauge(t)},
})
err = client.Write(ctx, &api.ValueList{
Identifier: api.Identifier{
Host: exec.Hostname(),
Plugin: fmt.Sprint("counter_", t),
Type: "counter",
},
Time: time.Now(),
Interval: time.Minute,
Values: []api.Value{api.Counter(t)},
})
if err != nil && !errors.Is(err, network.ErrNotEnoughSpace) {
return err
}
}
if err := client.Flush(); err != nil {
return err
}
case <-endTimeout:
return nil
}
}
}