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(); }
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(); } }