in apmproxy/apmserver.go [263:314]
func (c *Client) UpdateStatus(ctx context.Context, status Status) {
// Reduce lock contention as UpdateStatus is called on every
// successful request
c.mu.RLock()
if status == c.Status {
c.mu.RUnlock()
return
}
c.mu.RUnlock()
switch status {
case Healthy:
c.mu.Lock()
if c.Status == status {
return
}
c.Status = status
c.logger.Debugf("APM server Transport status set to %s", c.Status)
c.ReconnectionCount = -1
c.mu.Unlock()
case RateLimited, ClientFailing:
// No need to start backoff, this is a temporary status. It usually
// means we went over the limit of events/s.
c.mu.Lock()
c.Status = status
c.logger.Debugf("APM server Transport status set to %s", c.Status)
c.mu.Unlock()
case Failing:
c.mu.Lock()
c.Status = status
c.logger.Debugf("APM server Transport status set to %s", c.Status)
c.ReconnectionCount++
gracePeriodTimer := time.NewTimer(c.ComputeGracePeriod())
c.logger.Debugf("Grace period entered, reconnection count : %d", c.ReconnectionCount)
c.mu.Unlock()
go func() {
select {
case <-gracePeriodTimer.C:
c.logger.Debug("Grace period over - timer timed out")
case <-ctx.Done():
c.logger.Debug("Grace period over - context done")
}
c.mu.Lock()
c.Status = Started
c.logger.Debugf("APM server Transport status set to %s", c.Status)
c.mu.Unlock()
}()
default:
c.logger.Errorf("Cannot set APM server Transport status to %s", status)
}
}