func()

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
		}
	}
}