Получение журналов диагностики Azure

У нас есть около 10 экземпляров в 5 развертываниях, работающих в Azure, с ведением журнала в службе диагностики Azure (WADLogsTable). Мне нужно получать эти журналы один раз в несколько минут для локального анализа с помощью стороннего инструмента. У меня уже есть простая версия, которая читает журналы из таблицы, сохраняет последние ключи раздела и строки и в следующий раз выполняет запрос PartitionKey> = SavedPartitionKey. Проблема в том, что таким способом извлекаются не все журналы: WAD использует буферизацию журналов и сохраняет журналы в таблице группами раз в 5 минут (для каждого экземпляра). RowKey зарегистрированного события начинается с идентификатора развертывания (который равен guid).

  1. В 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
  2. В 00:06:00 запускается сценарий передачи, получает все логи, сохраняет LastPK = 00: 05: 00
  3. Во время 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
  4. В 00:07:00 запускается сценарий передачи, получает журналы с PK> = LastPK = 00: 05: 00 и фактически получает только msg8 и msg9 (msg6 и msg7 теряются).

Решение, о котором я думаю, - это каждый раз, когда TransferScript извлекает все журналы за последние 6 минут (5 минут для синхронизации wad + 1 минута для буфера), но это может значительно увеличить объем передаваемых данных (например, в 5 раз) + необходимо как-то фильтровать из уже извлеченных журналов, что может быть проблематичным. Вдобавок я подумал о добавлении Timestamp> LastSeenTimestamp, но не уверен, решит ли это проблему количества и дублирования данных и не потеряет ли я таким образом сообщения. Любые идеи? Спасибо


person Stam    schedule 02.08.2012    source источник


Ответы (2)


Должен ли перенос в сторонний инструмент осуществляться в режиме реального времени или «как можно скорее?» Можно ли передавать только данные не старше 5 минут и НЕ передавать данные менее 5 минут? Это гарантирует, что вы перенесет только завершенные разделы.

person Igorek    schedule 02.08.2012
comment
Это вариант. Единственной проблемной проблемой может быть синхронизация времени между хранилищем Azure и хостом, который извлекает журналы. Спасибо - person Stam; 03.08.2012

Другой возможностью может быть включение DeploymentId в ваш запрос вместе с PartitionKey для получения диагностических данных за последние «n» минут, если у вас есть эта информация.

person Gaurav Mantri    schedule 03.08.2012
comment
На самом деле DeploymentId и InstanceId, поскольку временная проблема существует также между экземплярами одного и того же развертывания. Спасибо, это может быть вариант. - person Stam; 03.08.2012
comment
Что вы можете сделать, так это создать словарь идентификатора развертывания и последнего полученного значения PartitionKey и периодически перебирать эту коллекцию и извлекать данные (используя как PartitionKey, так и идентификатор развертывания). Если вы получаете данные для определенного идентификатора развертывания, обновите значение PartitionKey, в противном случае оставьте его как есть. - person Gaurav Mantri; 03.08.2012