Azure: программный запрос WADLogsTable для данных трассировки

Я пытаюсь использовать следующий код, чтобы получить все данные трассировки за последний час из Azure:

                StorageCredentialsAccountAndKey storageCredentialsAccountAndKey = new StorageCredentialsAccountAndKey(accountName, key);
                CloudStorageAccount csa = new CloudStorageAccount(storageCredentialsAccountAndKey, true);
                TableServiceContext tableServiceContext = new TableServiceContext(csa.TableEndpoint.ToString(), csa.Credentials);
                var results = tableServiceContext.CreateQuery<TableServiceEntity>("WADLogsTable").Where(
                    x => x.Timestamp > DateTime.UtcNow.AddHours(-1)).ToList();

Однако я обнаружил, что результаты не найдены, когда я знаю, что в таблице есть данные за последний час (я сравниваю выходные данные с диспетчером диагностики Azure Cerebrata).

У меня есть два вопроса:

  1. Это правильный способ запроса WADLogsTable? Почему я не вижу никаких результатов?
  2. Каков правильный тип для передачи в качестве универсального параметра? TableServiceEntity — это базовый класс, который определяет только три столбца. Я хотел бы знать, существует ли тип, который конкретно представляет объект WADLogsTable. Мне просто создать тип со свойствами, такими же, как имена столбцов?

person David    schedule 15.03.2012    source источник


Ответы (2)


Не существует стандартного типа (класса), который представлял бы сущность WADLogs. Используя базовый класс, вы получите только свойства PartionKey, RowKey и Timestamp. Вы должны определить это самостоятельно. Вот образец, который я использую:

public class WadLogEntity
       : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
    {
        public WadLogEntity()
        {
            PartitionKey = "a";
            RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
        }

        public string Role { get; set; }
        public string RoleInstance { get; set; }
        public int Level { get; set; }
        public string Message { get; set; }
        public int Pid { get; set; }
        public int Tid { get; set; }
        public int EventId { get; set; }
        public DateTime EventDateTime
        {
            get
            {
                return new DateTime(long.Parse(this.PartitionKey.Substring(1)));
            }
        }
    }

Кроме того, когда я боролся с таблицей WADLogs, мне удалось показать результаты (за последние 24 часа) с помощью этого кода:

  var dtThen = DateTime.UtcNow.AddHours(-24);
                var dtNow = DateTime.UtcNow;

                var logs = this._wadLogs.WadLogs.Where(
                    wl => 
                        wl.Level == 2 
                        && String.Compare(wl.PartitionKey,"0" + dtThen.Ticks.ToString()) >=0
                        && String.Compare(wl.PartitionKey, "0" + dtNow.Ticks.ToString()) < 0
                    ).Take(200);

Я заметил, что перед подсчетом тиков в ключе раздела есть префикс «0».

person astaykov    schedule 15.03.2012
comment
Спасибо Антон. Какой тип this во втором фрагменте? - person David; 15.03.2012
comment
Все в порядке, я понял, что это IQueryable<WadLogEntity>. - person David; 15.03.2012
comment
Спасибо, теперь у меня это работает. Причина, по которой это не работало раньше, заключалась в том, что по какой-то мучительной причине вы не можете запросить столбец Timestamp. Вам высший балл, Антон. - person David; 15.03.2012
comment
Здорово, что это работает для вас сейчас. И да, обычно не рекомендуется использовать столбец Timestamp. Он предназначен только для внутреннего использования. - person astaykov; 15.03.2012
comment
Перед тиками стоит «0», потому что в какой-то момент тики могут превысить отметку 0999999999900000000. Более безопасный способ - использовать String.Format({0:0000000000000000000}, ticks)... хотя это будет 16 ноября... в 3169 году... Я не думаю, что доживу до этого :) - person Jeroen Landheer; 12.03.2013
comment
Может быть полезно отметить, что this.wadLogs.WadLogs это tableServiceContext.CreateQuery<TableServiceEntity>("WADLogsTable") из вопроса - person Dunc; 04.02.2015
comment
Как это обычно бывает с Microsoft, класс, который вы используете в своем примере, теперь устарел. Просто решил оставить заметку для других людей, пытающихся разобраться в этом барахле. - person Adam Heeg; 26.08.2015
comment
Ценю ваш комментарий. Хотя класс устарел, подход и логика не изменились. - person astaykov; 27.08.2015

Для пользователей последнего (2014 г.) клиента службы хранилища Azure:

http://blogs.msdn.com/b/tilovell/archive/2014/02/11/how-to-view-azure-diagnostics-traces-from-wadlogstable-in-вашей-локальной-консоли-app.aspx

tl;dr вы можете использовать метку времени для фильтрации.

...
var query = table.CreateQuery<GenericTableEntity>()
    .Where(e => e.Timestamp > DateTime.UtcNow.AddMinutes(-120));

Расширив сущность в связанном примере, вы можете открыть переменные Message и Date:

public class LogEntity : GenericTableEntity 
{
    // Since Timestamp is a DateTimeOffset
    public DateTime LogDate
    {
        get { return Timestamp.UtcDateTime; }
    }

    public string Message
    {
        get { return Properties["Message"].StringValue; }
    }
}
person Dunc    schedule 04.02.2015