Мы отправляем копию данных, сгенерированных Application Insights, в концентратор событий, используя стандартную расширяемость Sinks в клиентском SDK. Мы придерживаемся той же логики пакетной обработки и сжатия, что и для приемника по умолчанию, вместо этого просто отправляем данные в конечную точку концентратора событий.
В приложении-функции, которое получает данные, одно сообщение EventHub, следовательно, будет содержать поток JSON с несколькими точками телеметрии, сжатыми с помощью gzip.
Нам необходимо десериализовать поток и предпринять ряд действий в зависимости от типа телеметрии. Мы будем получать около 50 Кбит / с, поэтому производительность важна.
Я заметил, что SDK использует Bond и определил общедоступную схему - https://github.com/Microsoft/ApplicationInsights-aspnetcore/tree/develop/Schema/PublicSchema
В настоящее время я делаю что-то вроде
foreach (var eventHubMessage in messages)
{
// decompress the entire gzipped payload
var decompressedData = DeserializeCompressedStream(eventHubMessage.Body.Array);
// deframe the JSON stream into individual items, (e.g. data.Split(new[] { Environment.NewLine })
var payloadItems = decompressedData.Deframe();
foreach (var item in payloadItems){
// A standard JSON.NET conversion to get the item
Envelope telemetryItem = ItemConverter.CreateTelemetryFromPayloadItem(item);
// etc etc
}
}
Это работает, но преобразование на уровне элементов с использованием JSON.Net является дорогостоящей операцией с таким масштабом и максимальной загрузкой ЦП.
Предполагая, что приложение, выполняющее десериализацию, имеет доступ к типам, например, https://github.com/Microsoft/ApplicationInsights-aspnetcore/tree/develop/test/ApplicationInsightsTypes, каков был бы рекомендуемый и наиболее эффективный способ десериализации потока JSON с использованием определений Bond?