private static void CalculateLatencyProperties(MessageTrackingEvent mte) { string messageInfo = mte.MessageInfo; if (string.IsNullOrEmpty(messageInfo) || (mte.EventId != "DELIVER" && mte.EventId != "SEND" && mte.EventId != "SUBMIT" && (mte.EventId != "RESUBMIT" || mte.Source != "STOREDRIVER"))) { mte.MessageLatency = null; mte.MessageLatencyType = MessageLatencyType.None; return; } GetMessageTrackingLog.MessageLatencyParser messageLatencyParser = new GetMessageTrackingLog.MessageLatencyParser(); if (messageLatencyParser.TryParse(messageInfo)) { if (messageLatencyParser.OriginalArrivalTime != DateTime.MinValue) { mte.MessageLatency = new EnhancedTimeSpan?((mte.Timestamp.ToUniversalTime() > messageLatencyParser.OriginalArrivalTime.ToUniversalTime()) ? (mte.Timestamp.ToUniversalTime() - messageLatencyParser.OriginalArrivalTime.ToUniversalTime()) : TimeSpan.Zero); } else { mte.MessageLatency = null; } mte.MessageLatencyType = messageLatencyParser.MessageLatencyType; return; } mte.MessageLatency = null; mte.MessageLatencyType = MessageLatencyType.None; }
protected override void WriteResult(LogSearchCursor cursor) { object field = cursor.GetField(0); if (!(field is DateTime)) { return; } MessageTrackingEvent messageTrackingEvent = new MessageTrackingEvent(); messageTrackingEvent.Timestamp = ((DateTime)field).ToLocalTime(); messageTrackingEvent.ClientIp = (cursor.GetField(1) as string); messageTrackingEvent.ClientHostname = (string)cursor.GetField(2); messageTrackingEvent.ServerIp = (cursor.GetField(3) as string); messageTrackingEvent.ServerHostname = (cursor.GetField(4) as string); messageTrackingEvent.SourceContext = (cursor.GetField(5) as string); messageTrackingEvent.ConnectorId = (cursor.GetField(6) as string); messageTrackingEvent.Source = (cursor.GetField(7) as string); messageTrackingEvent.EventId = (cursor.GetField(8) as string); messageTrackingEvent.InternalMessageId = (cursor.GetField(9) as string); messageTrackingEvent.MessageId = (cursor.GetField(10) as string); messageTrackingEvent.Recipients = (cursor.GetField(12) as string[]); this.RedactPiiStringArrayIfNeeded(messageTrackingEvent.Recipients); messageTrackingEvent.RecipientStatus = (cursor.GetField(13) as string[]); if (messageTrackingEvent.EventId == "DELIVER" || messageTrackingEvent.EventId == "DUPLICATEDELIVER") { this.RedactPiiStringArrayIfNeeded(messageTrackingEvent.RecipientStatus); } messageTrackingEvent.TotalBytes = GetMessageTrackingLog.Unbox <int>(cursor.GetField(14)); messageTrackingEvent.RecipientCount = GetMessageTrackingLog.Unbox <int>(cursor.GetField(15)); messageTrackingEvent.RelatedRecipientAddress = this.RedactPiiStringIfNeeded(cursor.GetField(16) as string, false); messageTrackingEvent.Reference = (cursor.GetField(17) as string[]); if (messageTrackingEvent.Reference != null && messageTrackingEvent.Reference.Length == 1 && string.IsNullOrEmpty(messageTrackingEvent.Reference[0])) { messageTrackingEvent.Reference = null; } messageTrackingEvent.MessageSubject = this.RedactPiiStringIfNeeded(cursor.GetField(18) as string, true); messageTrackingEvent.Sender = this.RedactPiiStringIfNeeded(cursor.GetField(19) as string, false); messageTrackingEvent.ReturnPath = this.RedactPiiStringIfNeeded(cursor.GetField(20) as string, false); messageTrackingEvent.Directionality = (cursor.GetField(22) as string); messageTrackingEvent.TenantId = (cursor.GetField(23) as string); messageTrackingEvent.OriginalClientIp = (cursor.GetField(24) as string); messageTrackingEvent.MessageInfo = (cursor.GetField(21) as string); messageTrackingEvent.EventData = (cursor.GetField(26) as KeyValuePair <string, object>[]); if (base.NeedSuppressingPiiData) { Utils.RedactEventData(messageTrackingEvent.EventData, GetMessageTrackingLog.EventDataKeyToRedact, this); } GetMessageTrackingLog.CalculateLatencyProperties(messageTrackingEvent); base.WriteObject(messageTrackingEvent); }
public static IEnumerable <MessageTrackingLatency> GetLatencies(MessageTrackingEvent mte) { if (mte != null) { ComponentLatencyParser parser = new ComponentLatencyParser(); if (parser.TryParse(mte.MessageInfo)) { foreach (LatencyComponent component in parser.Components) { yield return(new MessageTrackingLatency(mte, component)); } } } yield break; }
private MessageTrackingLatency(MessageTrackingEvent mte, LatencyComponent component) { this.mte = mte; this.component = component; }