Долгосрочные функции Azure - диагностика сбоев - PullRequest
1 голос
/ 21 мая 2019

Я проверяю, как долговечные функции могут разворачиваться и разворачиваться, и как я могу масштабировать свой код.для этого примера я имитирую много кратковременных, интенсивных операций с процессором.

Кажется, что не все действия завершены, и я не уверен, почему или где искать журнал для сбоев.

Пожалуйстасм. код ниже:

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 просто остается «работающим»

Где я могу найти список сбоев?

Спасибо за любую помощь

Ник

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Я предлагаю вам настроить Application Insights для функций Azure: 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, поскольку поведение в функции оркестровки должно быть детерминированным.См. этот раздел об ограничениях кода оркестратора.

1 голос
/ 21 мая 2019

Окружите свой код блоком try catch, а затем зарегистрируйте исключение, используя Ilogger.

Это может быть достигнуто следующим образом

try
{
   //Do something
}
catch(Exception ex){
   log.LogError($"Error in function: {ex.Message}");
}

Затем вы можете просмотреть сообщения об ошибках в журналах или, кроме того, Application insights, если они есть.

...