in apmproxy/apmserver.go [84:125]
func (c *Client) FlushAPMData(ctx context.Context) {
if c.IsUnhealthy() {
c.logger.Debug("Flush skipped - Transport failing")
return
}
c.logger.Debug("Flush started - Checking for agent data")
// Flush agent data first to make sure metadata is available if possible
for i := len(c.AgentDataChannel); i > 0; i-- {
data := <-c.AgentDataChannel
if err := c.forwardAgentData(ctx, data); err != nil {
c.logger.Errorf("Error sending to APM Server, skipping: %v", err)
}
}
// If metadata still not available then fail fast
if c.batch == nil {
c.logger.Warnf("Metadata not available at flush, skipping sending lambda data to APM Server")
return
}
// Flush lambda data
c.logger.Debug("Flush in progress - Processing lambda data")
for {
select {
case apmData := <-c.LambdaDataChannel:
if err := c.forwardLambdaData(ctx, apmData); err != nil {
c.logger.Errorf("Error sending to APM server, skipping: %v", err)
}
case <-ctx.Done():
c.logger.Debug("Failed to flush completely, may result in data drop")
return
default:
// Flush any remaining data in batch
if err := c.sendBatch(ctx); err != nil {
c.logger.Errorf("Error sending to APM server, skipping: %v", err)
}
c.logger.Debug("Flush ended for lambda data - no data in buffer")
return
}
}
}