Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O Durable Functions é uma extensão do Azure Functions que permite criar orquestrações sem servidor usando código comum. Para obter mais informações sobre funções duráveis, consulte a visão geral de funções duráveis.
Este artigo fornece um guia para solucionar problemas de cenários comuns em aplicativos Durable Functions.
Observação
Os engenheiros de suporte da Microsoft estão disponíveis para ajudar no diagnóstico de problemas com seu aplicativo. Se não conseguir diagnosticar o seu problema utilizando este guia, pode apresentar um bilhete de suporte acedendo à folha Novo pedido de Suporte na secção Suporte + resolução de problemas da página da sua aplicação de função no portal do Azure.
Sugestão
Ao depurar e diagnosticar problemas, é recomendável que você comece garantindo que seu aplicativo esteja usando a versão mais recente da extensão Durable Functions. Na maioria das vezes, o uso da versão mais recente atenua problemas conhecidos já relatados por outros usuários. Leia o artigo da versão da extensão Upgrade Durable Functions para obter instruções sobre como atualizar sua versão de extensão.
A guia Diagnosticar e resolver problemas no portal do Azure é um recurso útil para monitorar e diagnosticar possíveis problemas relacionados ao seu aplicativo. Também fornece potenciais soluções para os seus problemas com base no diagnóstico. Consulte Diagnóstico do aplicativo Azure Function para obter mais detalhes.
Se os recursos acima não resolverem seu problema, as seções a seguir fornecem conselhos para sintomas específicos do aplicativo:
A orquestração está bloqueada no estado Pending
Quando inicias uma orquestração, uma mensagem "start" é escrita numa fila interna gerida pela extensão Durable e o estado da orquestração é definido como "Pendente". Depois que a mensagem de orquestração for captada e processada com êxito por uma instância de aplicativo disponível, o status passará para "Em execução" (ou para algum outro estado não "Pendente").
Use as etapas seguintes para resolver instâncias de orquestração que permanecem bloqueadas indefinidamente no estado "Pendente".
Verifique os registos do Durable Task Framework em busca de avisos ou erros para o ID da instância de orquestração afetada. Uma consulta de exemplo pode ser encontrada na seção Erros/avisos de rastreamento.
Verifique as filas de controle do Armazenamento do Azure atribuídas ao orquestrador preso para ver se sua "mensagem inicial" ainda está lá Para obter mais informações sobre filas de controle, consulte a documentação da fila de controle do provedor de Armazenamento do Azure.
Altere a versão de configuração da plataforma do seu aplicativo para "64 Bit". Às vezes, as orquestrações não são iniciadas porque o aplicativo está ficando sem memória. Mudar para o processo de 64 bits permite que o aplicativo aloque mais memória total. Isso se aplica apenas aos planos App Service Basic, Standard, Premium e Elastic Premium. Os planos Gratuito ou de Consumo não suportam processos de 64 bits.
A orquestração começa após um longo atraso
Normalmente, as orquestrações começam dentro de alguns segundos depois de serem agendadas. No entanto, há certos casos em que as orquestrações podem demorar mais tempo a começar. Use as etapas a seguir para solucionar problemas quando as orquestrações levarem mais do que alguns segundos para começar a ser executadas.
Consulte a documentação sobre orquestrações atrasadas no Armazenamento do Azure para verificar se o atraso pode ser causado por limitações conhecidas.
Verifique os rastreios do Durable Task Framework para encontrar avisos ou erros com o ID da instância de orquestração afetada. Uma consulta de exemplo pode ser encontrada na seção Erros de rastreamento/avisos.
A orquestração não se completa / está presa no estado Running
Se uma orquestração permanecer no estado "Em execução" por um longo período de tempo, isso geralmente significa que está aguardando uma tarefa de longa duração que está agendada para conclusão. Por exemplo, ele pode estar aguardando a conclusão de uma tarefa de timer durável, uma tarefa de atividade ou uma tarefa de evento externo. No entanto, se você observar que as tarefas agendadas foram concluídas com êxito, mas a orquestração ainda não está progredindo, pode haver um problema impedindo que a orquestração prossiga para sua próxima tarefa. Muitas vezes nos referimos a orquestrações neste estado como "orquestrações presas".
Utilize as seguintes etapas para solucionar problemas de orquestrações que estão bloqueadas.
Tente reiniciar o aplicativo de função. Este passo pode ajudar se a orquestração ficar presa devido a um bug transitório ou um bloqueio no aplicativo ou no código da extensão.
Verifique as filas de controle de conta do Armazenamento do Azure para ver se alguma fila está crescendo continuamente. Esta consulta KQL de mensagens do Armazenamento do Azure pode ajudar a identificar problemas com o desenfileiramento de mensagens de orquestração. Se o problema afetar apenas uma única fila de controle, isto pode indicar um problema que existe apenas numa instância de aplicação específica. Nesse caso, escalar para cima ou para baixo para sair da instância de VM com problemas pode ser útil.
Use a consulta do Application Insights na seção Mensagens de Armazenamento do Azure para filtrar esse nome de fila como a ID da Partição e procure quaisquer problemas relacionados a essa partição de fila de controle.
Consulte as orientações em Melhores Práticas de Funções Duráveis e Ferramentas de Diagnóstico. Alguns problemas podem ser causados por antipadrões conhecidos de Funções Duráveis.
Verifique a documentação sobre versionamento das Funções Duráveis. Alguns problemas podem ser causados por alterações que interrompem instâncias de orquestração em andamento.
A orquestração corre lentamente
Processamento pesado de dados, erros internos e recursos de computação insuficientes podem fazer com que as orquestrações sejam executadas mais lentamente do que o normal. Use as seguintes etapas para solucionar problemas de orquestrações que estão demorando mais do que o esperado para serem executadas:
Verifique os rastreamentos do Durable Task Framework em busca de avisos ou erros para o ID da instância de orquestração afetada. Uma consulta de exemplo pode ser encontrada na seção Erros/avisos de rastreamento.
Se seu aplicativo utilizar o modelo em processo .NET, considere habilitar sessões estendidas. Sessões prolongadas podem minimizar as cargas do histórico, o que pode tornar o processamento mais lento.
Verifique se há gargalos de desempenho e escalabilidade. O desempenho do aplicativo depende de muitos fatores. Por exemplo, o alto uso da CPU ou o grande consumo de memória podem resultar em atrasos. Leia Desempenho e dimensionamento em Funções duráveis para obter orientações detalhadas.
Consultas de Exemplo
Esta seção mostra como solucionar problemas escrevendo consultas KQL personalizadas na instância do Azure Application Insights configurada para seu aplicativo Azure Functions.
Mensagens de Armazenamento do Azure
Ao usar o provedor de Armazenamento do Azure padrão, todo o comportamento de Funções Duráveis é controlado por mensagens de fila do Armazenamento do Azure e todo o estado relacionado a uma orquestração é armazenado no armazenamento de tabelas e no armazenamento de blobs. Quando o rastreamento da Estrutura de Tarefas Duráveis está habilitado, todas as interações do Armazenamento do Azure são registradas no Application Insights, e esses dados são extremamente importantes para depurar problemas de execução e desempenho.
A partir da v2.3.0 da extensão Durable Functions, você pode ter esses logs do Durable Task Framework publicados em sua instância do Application Insights atualizando sua configuração de log no arquivo host.json. Consulte o artigo de log do Durable Task Framework para obter informações e instruções sobre como fazer isso.
A consulta a seguir é para inspecionar interações de ponta a ponta do Armazenamento do Azure para uma instância de orquestração específica. Edite start e orchestrationInstanceID para filtrar por intervalo de tempo e ID da instância.
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
let orchestrationInstanceID = "XXXXXXX"; //edit this
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = customDimensions["prop__PartitionId"]
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Erros/avisos de rastreamento
A consulta a seguir pesquisa erros e avisos para uma dada instância de orquestração. Você precisará fornecer um valor para orchestrationInstanceID.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX);
traces
| where timestamp > start and timestamp < start + 1h
| extend instanceId = iif(isnull(customDimensions["prop__InstanceId"] ) , customDimensions["prop__instanceId"], customDimensions["prop__InstanceId"] )
| extend logLevel = customDimensions["LogLevel"]
| extend functionName = customDimensions["prop__functionName"]
| extend status = customDimensions["prop__status"]
| extend details = customDimensions["prop__Details"]
| extend reason = customDimensions["prop__reason"]
| where severityLevel >= 1 // to see all logs of severity level "Information" or greater.
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
Logs de fila de controle / ID de partição
A consulta a seguir procura todas as atividades associadas à fila de controle de um instanceId. Você precisará fornecer o valor para o instanceID in orchestrationInstanceID e a hora de início da consulta em start.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
traces // determine control queue for this orchestrator
| where timestamp > start and timestamp < start + 1h
| extend instanceId = customDimensions["prop__TargetInstanceId"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| where partitionId contains "control"
| where instanceId == orchestrationInstanceID
| join kind = rightsemi(
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
) on partitionId
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Referência da coluna Application Insights
Abaixo está uma lista das colunas projetadas pelas consultas acima e suas respetivas descrições.
| Coluna | Descrição |
|---|---|
| PID | ID do processo da instância do aplicativo de função. Isso é útil para determinar se o processo foi reciclado enquanto uma orquestração estava a ser executada. |
| Nome da tarefa | O nome do evento que está sendo registrado. |
| tipo de evento | O tipo de mensagem, que geralmente representa o trabalho feito por um orquestrador. Uma lista completa de seus valores possíveis, e suas descrições, está aqui |
| sessão prolongada | Valor booleano que indica se as sessões estendidas estão habilitadas. |
| conta | A conta de armazenamento usada pelo aplicativo. |
| detalhes | Informações adicionais sobre um evento específico, se disponíveis. |
| instanceId | A ID de uma determinada orquestração ou instância de entidade. |
| ID da Mensagem | A ID de Armazenamento do Azure exclusiva para uma determinada mensagem de fila. Esse valor geralmente aparece em eventos de rastreamento ReceivedMessage, ProcessingMessage e DeletingMessage. Observe que ele NÃO está presente nos eventos SendingMessage porque a ID da mensagem é gerada pelo Armazenamento do Azure depois que enviamos a mensagem. |
| ID de execução | O ID da execução do orquestrador, que muda sempre que o continue-as-new é invocado. |
| idade | O número de milissegundos desde que uma mensagem foi enfileirada. Grandes números geralmente indicam problemas de desempenho. Uma exceção é o tipo de mensagem TimerFired, que pode ter um grande valor Age dependendo da duração do temporizador. |
| latência em milissegundos | O número de milissegundos tomados por alguma operação de armazenamento. |
| dequeueCount | O número de vezes que uma mensagem foi removida da fila. Em circunstâncias normais, este valor é sempre 1. Se for mais de um, então pode haver um problema. |
| ID de partição | O nome da fila associada a esse log. |
| contagemTotalDeEventos | O número de eventos históricos envolvidos na ação atual. |
| taskHub | O nome do seu hub de tarefas. |
| novosEventos | Uma lista, separada por vírgulas, dos eventos do histórico que estão a ser escritos na tabela Histórico na área de armazenamento. |