private async Task <T> SendDropEtwEvent <T>(Task <T> task) where T : DropOperationBaseEvent { long startTime = DateTime.UtcNow.Ticks; T dropEvent = null; try { dropEvent = await task; return(dropEvent); } finally { // if 'task' failed, create an event indicating an error if (dropEvent == null) { dropEvent = Activator.CreateInstance <T>(); dropEvent.Succeeded = false; dropEvent.ErrorMessage = "internal error"; } // common properties: execution time, drop type, drop url dropEvent.ElapsedTimeTicks = DateTime.UtcNow.Ticks - startTime; dropEvent.DropType = "VsoDrop"; if (m_dropClientTask.IsCompleted && !m_dropClientTask.IsFaulted) { dropEvent.DropUrl = (await m_dropClientTask).DropUrl; } // send event m_etwLogger.Log(dropEvent); } }
/// <summary> /// Logs a generic <see cref="DropOperationBaseEvent"/> by delegating based on the type of <paramref name="e"/>. /// </summary> public static void Log(this ICloudBuildLogger logger, DropOperationBaseEvent e) { switch (e.Kind) { case EventKind.DropCreation: logger.Log((DropCreationEvent)e); return; case EventKind.DropFinalization: logger.Log((DropFinalizationEvent)e); return; default: Contract.Assert(false, "Unsupported " + nameof(DropOperationBaseEvent) + " " + e.Kind); return; } }