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 Diagnostics Manager на 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}, отметки)... въпреки че това ще бъде на 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 Storage:

http://blogs.msdn.com/b/tilovell/archive/2014/02/11/how-to-view-azure-diagnostics-traces-from-wadlogstable-in-your-local-console-app.aspx

tl;dr можете да използвате времево клеймо за филтриране.

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

Чрез разширяване на обекта в свързания пример можете да изложите променливите Съобщение и Дата:

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