in src/WebJobs.Extensions.DurableTask/ContextImplementations/DurableClient.cs [937:1041]
private static async Task<DurableOrchestrationStatus> GetDurableOrchestrationStatusAsync(OrchestrationState orchestrationState, TaskHubClient client, bool showHistory, bool showHistoryOutput, bool showInput)
{
JArray historyArray = null;
if (showHistory && orchestrationState.OrchestrationStatus != OrchestrationStatus.Pending)
{
string history = await client.GetOrchestrationHistoryAsync(orchestrationState.OrchestrationInstance);
if (!string.IsNullOrEmpty(history))
{
historyArray = MessagePayloadDataConverter.ConvertToJArray(history);
var eventMapper = new Dictionary<string, EventIndexDateMapping>();
var indexList = new List<int>();
for (var i = 0; i < historyArray.Count; i++)
{
JObject historyItem = (JObject)historyArray[i];
if (Enum.TryParse(historyItem["EventType"].Value<string>(), out EventType eventType))
{
// Changing the value of EventType from integer to string for better understanding in the history output
historyItem["EventType"] = eventType.ToString();
switch (eventType)
{
case EventType.TaskScheduled:
TrackNameAndScheduledTime(historyItem, eventType, i, eventMapper);
historyItem.Remove("Version");
break;
case EventType.TaskCompleted:
case EventType.TaskFailed:
AddScheduledEventDataAndAggregate(ref eventMapper, "TaskScheduled", historyItem, indexList, showInput);
historyItem["TaskScheduledId"]?.Parent.Remove();
if (!showHistoryOutput && eventType == EventType.TaskCompleted)
{
historyItem.Remove("Result");
}
ConvertOutputToJToken(historyItem, showHistoryOutput && eventType == EventType.TaskCompleted);
break;
case EventType.SubOrchestrationInstanceCreated:
TrackNameAndScheduledTime(historyItem, eventType, i, eventMapper);
historyItem.Remove("Version");
break;
case EventType.SubOrchestrationInstanceCompleted:
case EventType.SubOrchestrationInstanceFailed:
AddScheduledEventDataAndAggregate(ref eventMapper, "SubOrchestrationInstanceCreated", historyItem, indexList, showInput);
historyItem.Remove("TaskScheduledId");
if (!showHistoryOutput && eventType == EventType.SubOrchestrationInstanceCompleted)
{
historyItem.Remove("Result");
}
ConvertOutputToJToken(historyItem, showHistoryOutput && eventType == EventType.SubOrchestrationInstanceCompleted);
break;
case EventType.ExecutionStarted:
var functionName = historyItem["Name"];
historyItem.Remove("Name");
historyItem["FunctionName"] = functionName;
historyItem.Remove("OrchestrationInstance");
historyItem.Remove("ParentInstance");
historyItem.Remove("Version");
historyItem.Remove("Tags");
break;
case EventType.ExecutionCompleted:
if (Enum.TryParse(historyItem["OrchestrationStatus"].Value<string>(), out OrchestrationStatus orchestrationStatus))
{
historyItem["OrchestrationStatus"] = orchestrationStatus.ToString();
}
if (!showHistoryOutput)
{
historyItem.Remove("Result");
}
ConvertOutputToJToken(historyItem, showHistoryOutput);
break;
case EventType.TimerFired:
historyItem.Remove("TimerId");
break;
case EventType.OrchestratorStarted:
case EventType.OrchestratorCompleted:
indexList.Add(i);
break;
}
if (!showInput)
{
historyItem.Remove("Input");
}
historyItem.Remove("EventId");
historyItem.Remove("IsPlayed");
}
}
var counter = 0;
indexList.Sort();
foreach (var indexValue in indexList)
{
historyArray.RemoveAt(indexValue - counter);
counter++;
}
}
}
return ConvertOrchestrationStateToStatus(orchestrationState, historyArray);
}