private Dictionary <string, string> ConvertEventToKvp(EventRecord eventRecord, EventDefinition eventDefinition) { var keyValueDictionary = new Dictionary <string, string>(); try { var dataReader = new ApplicationDataReader(eventRecord.UserData, eventRecord.UserDataLength); foreach (FieldDefinition fieldDef in eventDefinition.Fields) { string propertyValue = null; switch (fieldDef.Type) { case FieldDefinition.FieldType.UnicodeString: { propertyValue = dataReader.ReadUnicodeString(); break; } case FieldDefinition.FieldType.AnsiString: { propertyValue = dataReader.ReadAnsiString(); break; } case FieldDefinition.FieldType.Boolean: { propertyValue = dataReader.ReadBoolean().ToString(); break; } case FieldDefinition.FieldType.UInt8: { propertyValue = dataReader.ReadUInt8().ToString(); break; } case FieldDefinition.FieldType.UInt16: { propertyValue = dataReader.ReadUInt16().ToString(); break; } case FieldDefinition.FieldType.UInt32: { unchecked { propertyValue = dataReader.ReadUInt32().ToString(); } break; } case FieldDefinition.FieldType.UInt64: { unchecked { propertyValue = dataReader.ReadUInt64().ToString(); } break; } case FieldDefinition.FieldType.Int8: { propertyValue = dataReader.ReadInt8().ToString(); break; } case FieldDefinition.FieldType.Int16: { propertyValue = dataReader.ReadInt16().ToString(); break; } case FieldDefinition.FieldType.Int32: { propertyValue = dataReader.ReadInt32().ToString(); break; } case FieldDefinition.FieldType.Int64: { propertyValue = dataReader.ReadInt64().ToString(); break; } case FieldDefinition.FieldType.HexInt32: { unchecked { propertyValue = dataReader.ReadUInt32().ToString(); } break; } case FieldDefinition.FieldType.HexInt64: { unchecked { propertyValue = dataReader.ReadUInt64().ToString(); } break; } case FieldDefinition.FieldType.Float: { propertyValue = dataReader.ReadFloat().ToString(); break; } case FieldDefinition.FieldType.Double: { propertyValue = dataReader.ReadDouble().ToString(); break; } case FieldDefinition.FieldType.DateTime: { propertyValue = dataReader.ReadFileTime().ToString("yyyy-dd-M--HH-mm-ss"); break; } case FieldDefinition.FieldType.Guid: { propertyValue = dataReader.ReadGuid().ToString(); break; } default: { this.traceSource.WriteError( logSourceId, "Event of type {0}.{1} has an unsupported field of type {2}.", eventDefinition.TaskName, eventDefinition.EventName, fieldDef.Type); break; } } if (propertyValue != null) { keyValueDictionary[fieldDef.Name] = propertyValue; } } } catch (Exception e) { this.traceSource.WriteError( logSourceId, "Failed to get all the fields of event of type {0}.{1}. Exception info: {2}.", eventDefinition.TaskName, eventDefinition.EventName, e); return(null); } // our Platform event can't have a field names TimeStamp today. Still keeping this check till we add a unit test for that. if (!keyValueDictionary.ContainsKey(TimeStampFieldName)) { keyValueDictionary.Add(TimeStampFieldName, DateTime.FromFileTimeUtc(eventRecord.EventHeader.TimeStamp).ToString(TimeStampFormat)); } return(keyValueDictionary); }
// returns an object that would be either a string or a double, or null if failed private static object GetEtwEventRecordValue(ApplicationDataReader reader, FieldDefinition fieldDef, string logSourceId) { object value = null; switch (fieldDef.Type) { case FieldDefinition.FieldType.UnicodeString: value = reader.ReadUnicodeString(); break; case FieldDefinition.FieldType.AnsiString: value = reader.ReadAnsiString(); break; case FieldDefinition.FieldType.Boolean: value = reader.ReadBoolean() ? "true" : "false"; break; case FieldDefinition.FieldType.UInt8: value = (double)reader.ReadUInt8(); break; case FieldDefinition.FieldType.UInt16: value = (double)reader.ReadUInt16(); break; case FieldDefinition.FieldType.UInt32: value = (double)reader.ReadUInt32(); break; case FieldDefinition.FieldType.UInt64: value = (double)reader.ReadUInt64(); break; case FieldDefinition.FieldType.Int8: value = (double)reader.ReadInt8(); break; case FieldDefinition.FieldType.Int16: value = (double)reader.ReadInt16(); break; case FieldDefinition.FieldType.Int32: value = (double)reader.ReadInt32(); break; case FieldDefinition.FieldType.Int64: value = (double)reader.ReadInt64(); break; case FieldDefinition.FieldType.HexInt32: value = (double)reader.ReadUInt32(); break; case FieldDefinition.FieldType.HexInt64: value = (double)reader.ReadUInt64(); break; case FieldDefinition.FieldType.Float: value = (double)reader.ReadFloat(); break; case FieldDefinition.FieldType.Double: value = (double)reader.ReadDouble(); break; case FieldDefinition.FieldType.DateTime: value = reader.ReadFileTime().ToString(); break; case FieldDefinition.FieldType.Guid: value = reader.ReadGuid().ToString(); break; default: Utility.TraceSource.WriteError( logSourceId, "Unsupported field of type {0}.", fieldDef.Type); break; } return(value); }