in components/otelopscol/receiver/dcgmreceiver/scraper.go [201:233]
func (s *dcgmScraper) pollClient(ctx context.Context, client *dcgmClient, metricsCh chan<- map[uint]deviceMetrics, collectTriggerCh <-chan struct{}) {
defer client.cleanup()
for {
waitTime, err := client.collect()
// Ignore the error; it's logged in collect()
if err != nil {
waitTime = 10 * time.Second
}
// Try to poll at least twice per collection interval
waitTime = max(
100*time.Millisecond,
min(
s.config.CollectionInterval,
waitTime,
)/2,
)
s.settings.Logger.Sugar().Debugf("Waiting %s for the next collection", waitTime)
after := time.After(waitTime)
for after != nil {
deviceMetrics := client.getDeviceMetrics()
select {
case <-ctx.Done():
return
case <-collectTriggerCh:
// Loop and trigger a collect() again.
after = nil
case metricsCh <- deviceMetrics:
case <-after:
after = nil
}
}
}
}