in BASE/src/Microsoft.ApplicationInsights/Channel/Transmission.cs [275:379]
public virtual Tuple<Transmission, Transmission> Split(Func<int, int> calculateLength)
{
if (calculateLength == null)
{
throw new ArgumentNullException(nameof(calculateLength));
}
Transmission transmissionA = this;
Transmission transmissionB = null;
// We can be more efficient if we have a copy of the telemetry items still
if (this.TelemetryItems != null)
{
// We don't need to deserialize, we have a copy of each telemetry item
int numItems = calculateLength(this.TelemetryItems.Count);
if (numItems != this.TelemetryItems.Count)
{
List<ITelemetry> itemsA = new List<ITelemetry>();
List<ITelemetry> itemsB = new List<ITelemetry>();
var i = 0;
foreach (var item in this.TelemetryItems)
{
if (i < numItems)
{
itemsA.Add(item);
}
else
{
itemsB.Add(item);
}
i++;
}
transmissionA = new Transmission(
this.EndpointAddress,
itemsA);
transmissionB = new Transmission(
this.EndpointAddress,
itemsB);
}
}
else if (this.ContentType == JsonSerializer.ContentType)
{
// We have to decode the payload in order to split
bool compress = this.ContentEncoding == JsonSerializer.CompressionType;
string[] payloadItems = JsonSerializer
.Deserialize(this.Content, compress)
.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
int numItems = calculateLength(payloadItems.Length);
if (numItems != payloadItems.Length)
{
string itemsA = string.Empty;
string itemsB = string.Empty;
for (int i = 0; i < payloadItems.Length; i++)
{
if (i < numItems)
{
if (!string.IsNullOrEmpty(itemsA))
{
itemsA += Environment.NewLine;
}
itemsA += payloadItems[i];
}
else
{
if (!string.IsNullOrEmpty(itemsB))
{
itemsB += Environment.NewLine;
}
itemsB += payloadItems[i];
}
}
transmissionA = new Transmission(
this.EndpointAddress,
JsonSerializer.ConvertToByteArray(itemsA, compress),
this.ContentType,
this.ContentEncoding);
transmissionB = new Transmission(
this.EndpointAddress,
JsonSerializer.ConvertToByteArray(itemsB, compress),
this.ContentType,
this.ContentEncoding);
}
}
else
{
// We can't deserialize it!
// We can say it's of length 1 at the very least
int numItems = calculateLength(1);
if (numItems == 0)
{
transmissionA = null;
transmissionB = this;
}
}
return Tuple.Create(transmissionA, transmissionB);
}