示例#1
0
        private void Reader_TraceRead(object sender, EventRecordEventArgs e)
        {
            if (this.token.IsCancellationRequested)
            {
                // If cancellation has been request, let the reader know that it's time to stop.
                e.Cancel = true;

                // Call completed.
                this.OnCompleted();

                return;
            }

            if (e.Record.EventHeader.EventDescriptor.Version < MinimumVersionSupported)
            {
                return;
            }

            var traceRecord = this.Lookup(new TraceIdentity(e.Record.EventHeader.EventDescriptor.Id, (TaskName)e.Record.EventHeader.EventDescriptor.Task));

            if (traceRecord?.Target == null)
            {
                return;
            }

            traceRecord.Level               = (TraceLevel)e.Record.EventHeader.EventDescriptor.Level;
            traceRecord.TracingProcessId    = e.Record.EventHeader.ProcessId;
            traceRecord.ThreadId            = e.Record.EventHeader.ThreadId;
            traceRecord.TimeStamp           = DateTime.FromFileTimeUtc(e.Record.EventHeader.TimeStamp);
            traceRecord.Version             = e.Record.EventHeader.EventDescriptor.Version;
            traceRecord.PropertyValueReader = ValueReaderCreator.CreateRawByteValueReader(traceRecord.GetType(), traceRecord.Version, e.Record.UserData, e.Record.UserDataLength);

            this.DispatchAsync(traceRecord, CancellationToken.None).GetAwaiter().GetResult();
        }
示例#2
0
        public override async Task StartReadingAsync(IList <TraceRecordFilter> filters, DateTimeOffset startTime, DateTimeOffset endTime, CancellationToken token)
        {
            // Read all the Events and then dispatch them one by one.
            var values = await this.GatherResultsAcrossTablesAsync(filters, startTime, endTime, token).ConfigureAwait(false);

            foreach (var oneValue in values)
            {
                token.ThrowIfCancellationRequested();

                ValidMandatoryFields(oneValue);

                // We can make this a mandatory field. TODO
                if (!oneValue.UserDataMap.ContainsKey(WellKnownFields.EventVersion))
                {
                    continue;
                }

                var metadata = Mapping.TraceRecordAzureDataMap.SingleOrDefault(
                    item => item.EventType == oneValue.UserDataMap[WellKnownFields.EventType] &&
                    item.TaskName.ToString().Equals(oneValue.UserDataMap[WellKnownFields.TaskName]));

                if (metadata == null)
                {
                    throw new Exception(
                              string.Format(
                                  CultureInfo.InvariantCulture,
                                  "Can't Reverse transform for unknown Type. Type: {0}, Task: {1}",
                                  oneValue.UserDataMap[WellKnownFields.EventType],
                                  oneValue.UserDataMap[WellKnownFields.TaskName]));
                }

                var traceRecordRead = (TraceRecord)Activator.CreateInstance(metadata.Type, new object[] { null });
                var traceRecord     = this.Lookup(traceRecordRead.Identity);
                if (traceRecord?.Target == null)
                {
                    continue;
                }

                // Today, DCA, if it sees an ID field in event data, removes it and sets it value as the partition key. We need
                // to do the reverse transformation now.
                if (!oneValue.UserDataMap.ContainsKey(WellKnownFields.EventDataId) && oneValue.PartitionKey != string.Format(CultureInfo.InvariantCulture, "{0}.{1}", metadata.EventType, metadata.TaskName))
                {
                    oneValue.UserDataMap.Add(WellKnownFields.EventDataId, oneValue.PartitionKey);
                }

                // TODO: This is a bug in DCA. It doesn't upload Critical information to the Tables today, so
                // I've to resort to filling bogus values. We need to fix DCA.
                traceRecord.Level               = TraceLevel.Info;
                traceRecord.TracingProcessId    = 1;
                traceRecord.ThreadId            = 1;
                traceRecord.Version             = byte.Parse(oneValue.UserDataMap[WellKnownFields.EventVersion]);
                traceRecord.TimeStamp           = oneValue.TimeLogged.UtcDateTime;
                traceRecord.PropertyValueReader = ValueReaderCreator.CreatePropertyBagValueReader(traceRecord.GetType(), traceRecord.Version, oneValue.UserDataMap);

                this.DispatchAsync(traceRecord, CancellationToken.None).GetAwaiter().GetResult();
            }
        }