У нас есть около 10 экземпляров в 5 развертываниях, работающих в Azure, с ведением журнала в службе диагностики Azure (WADLogsTable). Мне нужно получать эти журналы один раз в несколько минут для локального анализа с помощью стороннего инструмента. У меня уже есть простая версия, которая читает журналы из таблицы, сохраняет последние ключи раздела и строки и в следующий раз выполняет запрос PartitionKey> = SavedPartitionKey. Проблема в том, что таким способом извлекаются не все журналы: WAD использует буферизацию журналов и сохраняет журналы в таблице группами раз в 5 минут (для каждого экземпляра). RowKey зарегистрированного события начинается с идентификатора развертывания (который равен guid).
- В 00:05:30 InstanceA с DeploymentId = 999 ... помещает журналы за последние 5 минут Сообщение PK RK 00:01:00 999 msg1 00:01:00 999 msg2 00:02:00 999 msg3 00:02: 00 999 сообщение 4 00:05:00 999 сообщение 5
- В 00:06:00 запускается сценарий передачи, получает все логи, сохраняет LastPK = 00: 05: 00
- Во время 00:06:30 InstanceB с DeploymentId = 111 ... помещает журналы за последние 5 минут 00:02:00 111 msg6 00:03:00 111 msg7 00:05:00 111 msg8 00:06:00 111 msg9
- В 00:07:00 запускается сценарий передачи, получает журналы с PK> = LastPK = 00: 05: 00 и фактически получает только msg8 и msg9 (msg6 и msg7 теряются).
Решение, о котором я думаю, - это каждый раз, когда TransferScript извлекает все журналы за последние 6 минут (5 минут для синхронизации wad + 1 минута для буфера), но это может значительно увеличить объем передаваемых данных (например, в 5 раз) + необходимо как-то фильтровать из уже извлеченных журналов, что может быть проблематичным. Вдобавок я подумал о добавлении Timestamp> LastSeenTimestamp, но не уверен, решит ли это проблему количества и дублирования данных и не потеряет ли я таким образом сообщения. Любые идеи? Спасибо