我正在测试持久功能如何展开/展开以及如何扩展代码。在此示例中,我模拟了许多短期运行,CPU密集型操作。
并非所有活动似乎都已完成,我不确定为什么或在何处查找失败日志。
请参见下面的代码:
public static class ParallelLoadDurable
{
[FunctionName("ParallelLoadDurable")]
public static async Task<string> RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
{
DateTime StartTimer = DateTime.Now;
int counter = 0;
var parallelTasks = new List<Task<string>>();
var retryOptions = new RetryOptions(
firstRetryInterval: TimeSpan.FromSeconds(5),
maxNumberOfAttempts: 5);
for (int i = 0; i < 1000; i++)
{
counter += 1;
DurablePassModel DPM = new DurablePassModel()
{
LoopNum = counter,
StartedOn = StartTimer
};
Task<string> task = context.CallActivityWithRetryAsync<string>("ParallelLoadDurable_Hello", retryOptions, DPM);
parallelTasks.Add(task);
}
await Task.WhenAll(parallelTasks);
DateTime CompleteTime = DateTime.Now;
TimeSpan TS = CompleteTime.Subtract(StartTimer);
string ret = $"PROCESS COMPLETED: {counter} times for: {TS.TotalMilliseconds} ms.";
log.LogInformation(ret);
return ret;
}
[FunctionName("ParallelLoadDurable_Hello")]
public static string SayHello([ActivityTrigger] DurablePassModel val, ILogger log)
{
log.LogInformation($"Starting child function num {val.LoopNum.ToString()}.");
DateTime StartTimer = DateTime.Now;
var endTime = DateTime.Now.AddSeconds(10);
while (true)
{
if (DateTime.Now >= endTime)
break;
}
DateTime CompleteTime = DateTime.Now;
TimeSpan TS = CompleteTime.Subtract(val.StartedOn);
TimeSpan TSThis = CompleteTime.Subtract(StartTimer);
string ret = $"Ran this for: {TSThis.TotalSeconds}s - LoopNum: {val.LoopNum} - total time: {TS.TotalSeconds}s.";
log.LogInformation(ret);
return ret;
}
[FunctionName("ParallelLoadDurable_HttpStart")]
public static async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]HttpRequestMessage req,
[OrchestrationClient]DurableOrchestrationClient starter,
ILogger log)
{
// Function input comes from the request content.
string instanceId = await starter.StartNewAsync("ParallelLoadDurable", null);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
}
在几乎每种情况下,我所获得的收益约为完成的预期活动的96%。这是来自历史记录表中的结果,其中EventType = TaskCompleted
在“实例”表中,RuntimeStatus仍保持“运行中”状态
我在哪里可以找到失败列表?
感谢您的帮助
尼克
答案 0 :(得分:1)
使用try
catch
块环绕代码,然后使用Ilogger
记录异常。
可以这样实现
try
{
//Do something
}
catch(Exception ex){
log.LogError($"Error in function: {ex.Message}");
}
然后,您可以在日志中查看错误消息;如果有错误消息,也可以查看Application insights
。
答案 1 :(得分:1)
我建议您为Azure功能配置Application Insights:https://docs.microsoft.com/en-us/azure/azure-functions/functions-monitoring 尽管存储数据涉及一些成本,但在调查问题时确实有很大帮助。
此外(或当您不需要Application Insights时),您可以通过C#或HTTP查询业务流程的状态。在本地计算机上运行和调试时,这也很好用!
使用HTTP API,您可以执行以下查询以确定失败的实例:
@functionAppUrl = https://{{appName}}.azurewebsites.net
@code = YOUR_HOST_KEY
@taskHub = YOUR_HUB_NAME (see host.json)
@createdFrom = 2019-02-01T20:00:00Z
GET {{functionAppUrl}}/runtime/webhooks/durabletask/instances
?taskHub={{taskHub}}
&code={{code}}
&createdTimeFrom={{createdFrom}}
&runtimeStatus=Failed
我注意到您在业务流程代码中使用了DateTime.Now
。建议使用CurrentUtcDateTime
中的DurableOrchestrationContext
属性,因为编排功能中的行为应是确定性的。有关协调器代码约束的信息,请参见this section。