Processar erros e exceções no Azure Logic Apps

Aplica-se a: Aplicativos Lógicos do Azure (Consumo + Padrão)

A maneira como qualquer arquitetura de integração lida adequadamente com o tempo de inatividade ou problemas causados por sistemas dependentes pode representar um desafio. Para ajudá-lo a criar integrações robustas e resilientes que lidam graciosamente com problemas e falhas, os Aplicativos Lógicos do Azure fornecem uma experiência de primeira classe para lidar com erros e exceções.

Repetir políticas

Para a exceção mais básica e o tratamento de erros, você pode usar a política de repetição quando houver suporte em um gatilho ou ação, como a ação HTTP. Se a solicitação original do gatilho ou ação expirar ou falhar, resultando em uma resposta 408, 429 ou 5xx, a política de repetição especifica que o gatilho ou ação reenvie a solicitação por configurações de política.

Limites da política de repetição

Para obter mais informações sobre políticas de repetição, configurações, limites e outras opções, consulte Limites da política de repetição.

Repetir tipos de política

As operações de conector que suportam políticas de repetição usam a política Padrão, a menos que você selecione uma política de repetição diferente.

Política de repetição Description
Predefinição Para a maioria das operações, a política de repetição padrão é uma política de intervalo exponencial que envia até 4 repetições em intervalos exponencialmente crescentes. Esses intervalos são dimensionados em 7,5 segundos, mas são limitados entre 5 e 45 segundos. Várias operações usam uma política de repetição padrão diferente, como uma política de intervalo fixo. Para obter mais informações, consulte o Tipo de política de repetição padrão.
Nenhuma Não reenvie o pedido. Para obter mais informações, consulte Nenhuma - Nenhuma política de novas tentativas.
Intervalo Exponencial Esta política aguarda um intervalo aleatório, que é selecionado a partir de um intervalo exponencialmente crescente antes de enviar a próxima solicitação. Para obter mais informações, revise o tipo de política de intervalo exponencial.
Intervalo fixo Esta política aguarda o intervalo especificado antes de enviar a próxima solicitação. Para obter mais informações, revise o tipo de política de intervalo fixo.

Alterar o tipo de política de repetição no designer

  1. No portal do Azure, abra o fluxo de trabalho do aplicativo lógico no designer.

  2. Se você estiver trabalhando em um fluxo de trabalho de Consumo ou Padrão, abra as Configurações do gatilho ou da ação.

    • Consumo: Na forma de ação, abra o menu de reticências (...) e selecione Configurações.

    • Padrão: no designer, selecione a ação. No painel de detalhes, selecione Configurações.

  3. Se o gatilho ou ação oferecer suporte a políticas de repetição, em Política de Repetição, selecione o tipo de política desejado.

Alterar o tipo de política de repetição no editor de visualização de código

  1. Se necessário, confirme se o gatilho ou a ação oferece suporte a políticas de repetição concluindo as etapas anteriores no designer.

  2. Abra o fluxo de trabalho do aplicativo lógico no editor de visualização de código.

  3. Na definição de gatilho ou ação, adicione o objeto JSON ao objeto desse gatilho retryPolicy ou ação inputs . Caso contrário, se nenhum retryPolicy objeto existir, o gatilho ou ação usará a default política de repetição.

    "inputs": {
       <...>,
       "retryPolicy": {
          "type": "<retry-policy-type>",
          // The following properties apply to specific retry policies.
          "count": <retry-attempts>,
          "interval": "<retry-interval>",
          "maximumInterval": "<maximum-interval>",
          "minimumInterval": "<minimum-interval>"
       },
       <...>
    },
    "runAfter": {}
    

    Necessário

    Propriedade valor Tipo Description
    type <retry-policy-type> String O tipo de política de repetição a ser usado: default, , , nonefixedouexponential
    count <novas tentativas-tentativas> Integer Para fixed e exponential tipos de política, o número de tentativas de repetição, que é um valor de 1 a 90. Para obter mais informações, consulte Intervalo fixo e Intervalo exponencial.
    interval <intervalo de repetição> String Para fixed e exponential tipos de política, o valor do intervalo de repetição no formato ISO 8601. Para a exponential política, você também pode especificar intervalos máximos e mínimos opcionais. Para obter mais informações, consulte Intervalo fixo e Intervalo exponencial.

    Consumo: 5 segundos () a 1 dia (PT5SP1D).
    Padrão: Para fluxos de trabalho com monitoração de estado, 5 segundos () a 1 dia (PT5SP1D). Para fluxos de trabalho sem monitoração de estado, de 1 segundo () a 1 minuto (PT1SPT1M).

    Opcional

    Propriedade valor Tipo Description
    maximumInterval <intervalo-máximo> String Para a exponential política, o maior intervalo para o intervalo selecionado aleatoriamente no formato ISO 8601. O valor padrão é 1 dia (P1D). Para obter mais informações, consulte Intervalo Exponencial.
    minimumInterval <intervalo-mínimo> String Para a exponential política, o menor intervalo para o intervalo selecionado aleatoriamente no formato ISO 8601. O valor padrão é 5 segundos (PT5S). Para obter mais informações, consulte Intervalo Exponencial.

Política de repetição predefinida

As operações de conector que suportam políticas de repetição usam a política Padrão, a menos que você selecione uma política de repetição diferente. Para a maioria das operações, a política de repetição padrão é uma política de intervalo exponencial que envia até 4 repetições em intervalos exponencialmente crescentes . Esses intervalos são dimensionados em 7,5 segundos, mas são limitados entre 5 e 45 segundos. Várias operações usam uma política de repetição padrão diferente, como uma política de intervalo fixo.

Na definição de fluxo de trabalho, a definição de gatilho ou ação não define explicitamente a política padrão, mas o exemplo a seguir mostra como a política de repetição padrão se comporta para a ação HTTP:

"HTTP": {
   "type": "Http",
   "inputs": {
      "method": "GET",
      "uri": "http://myAPIendpoint/api/action",
      "retryPolicy" : {
         "type": "exponential",
         "interval": "PT7S",
         "count": 4,
         "minimumInterval": "PT5S",
         "maximumInterval": "PT1H"
      }
   },
   "runAfter": {}
}

Nenhum - Nenhuma política de repetição

Para especificar que a ação ou o gatilho não repete solicitações com falha, defina o <tipo> de política de repetição como none.

Política de repetição de intervalo fixo

Para especificar que a ação ou gatilho aguarda o intervalo especificado antes de enviar a próxima solicitação, defina retry-policy-type <>como .fixed

Exemplo

Esta política de repetição tenta obter as últimas notícias mais duas vezes após a primeira solicitação falhada com um atraso de 30 segundos entre cada tentativa:

"Get_latest_news": {
   "type": "Http",
   "inputs": {
      "method": "GET",
      "uri": "https://mynews.example.com/latest",
      "retryPolicy": {
         "type": "fixed",
         "interval": "PT30S",
         "count": 2
      }
   }
}

Política de repetição de intervalos exponenciais

A política de repetição de intervalo exponencial especifica que o gatilho ou ação aguarda um intervalo aleatório antes de enviar a próxima solicitação. Este intervalo aleatório é selecionado a partir de uma faixa de crescimento exponencial. Opcionalmente, você pode substituir os intervalos mínimos e máximos padrão especificando seus próprios intervalos mínimos e máximos, com base no fato de você ter um fluxo de trabalho de aplicativo lógico Consumo ou Padrão.

Nome Limite de consumo Limite padrão Notas
Atraso máximo Padrão: 1 dia Padrão: 1 hora Para alterar o limite padrão em um fluxo de trabalho de aplicativo lógico de consumo, use o parâmetro de política de repetição.

Para alterar o limite padrão em um fluxo de trabalho de aplicativo lógico padrão, revise Editar configurações de host e aplicativo para aplicativos lógicos em Aplicativos Lógicos do Azure de locatário único.

Atraso mínimo Padrão: 5 seg Padrão: 5 seg Para alterar o limite padrão em um fluxo de trabalho de aplicativo lógico de consumo, use o parâmetro de política de repetição.

Para alterar o limite padrão em um fluxo de trabalho de aplicativo lógico padrão, revise Editar configurações de host e aplicativo para aplicativos lógicos em Aplicativos Lógicos do Azure de locatário único.

Intervalos de variáveis aleatórias

Para a política de repetição de intervalo exponencial, a tabela a seguir mostra o algoritmo geral que os Aplicativos Lógicos do Azure usam para gerar uma variável aleatória uniforme no intervalo especificado para cada nova tentativa. O intervalo especificado pode ser até e incluindo o número de tentativas.

Número de repetição Intervalo mínimo Intervalo máximo
1 max(0, <intervalo-mínimo>) min (intervalo, <intervalo-máximo>)
2 max (intervalo, <intervalo-mínimo>) min (2 * intervalo, <intervalo> máximo)
3 max(2 * intervalo, <intervalo> mínimo) min (4 * intervalo, <intervalo> máximo)
4 max (4 * intervalo, <intervalo> mínimo) min (8 * intervalo, <intervalo> máximo)
.... .... ....

Gerenciar o comportamento de "correr atrás"

Ao adicionar ações no designer de fluxo de trabalho, você declara implicitamente a ordem a ser usada para executar essas ações. Depois que uma ação termina de ser executada, essa ação é marcada com um status como Êxito, Falha, Ignorado ou Tempo Limite. Por padrão, uma ação adicionada no designer é executada somente depois que o predecessor é concluído com o status Bem-sucedido . Na definição subjacente de uma ação, a propriedade especifica que a ação predecessora que deve ser concluída primeiro e os status permitidos para essa ação predecessora antes que a runAfter ação sucessora possa ser executada.

Quando uma ação gera um erro ou exceção não tratada, a ação é marcada como Falha e qualquer ação sucessora é marcada como Ignorada. Se esse comportamento acontecer para uma ação que tenha ramificações paralelas, o mecanismo de Aplicativos Lógicos do Azure seguirá as outras ramificações para determinar seus status de conclusão. Por exemplo, se uma ramificação terminar com uma ação ignorada, o status de conclusão dessa ramificação será baseado no status antecessor dessa ação ignorada . Após a conclusão da execução do fluxo de trabalho, o mecanismo determina o status de toda a execução avaliando todos os status da ramificação. Se qualquer ramificação terminar em falha, toda a execução do fluxo de trabalho será marcada como Falha.

Conceptual diagram with examples that show how run statuses are evaluated.

Para garantir que uma ação ainda possa ser executada apesar do status de seu antecessor, você pode alterar o comportamento "executar após" de uma ação para lidar com os status malsucedidos do predecessor. Dessa forma, a ação é executada quando o status do antecessor é Succeeded, Failed, Skipped, Timedout ou todos esses status.

Por exemplo, para executar a ação Enviar um email do Office 365 Outlook após a ação Adicionar uma linha em uma tabela predecessora do Excel Online estiver marcada como Falha, em vez de Com êxito, altere o comportamento "executar após" usando o designer ou o editor de exibição de código.

Nota

No designer, a configuração "executar após" não se aplica à ação que se segue imediatamente ao gatilho, pois o gatilho deve ser executado com êxito antes que a primeira ação possa ser executada.

Alterar o comportamento "executar após" no designer

  1. No portal do Azure, abra o fluxo de trabalho do aplicativo lógico no designer.

  2. No designer, selecione a forma de ação. No painel de detalhes, selecione Executar após.

    Screenshot showing Standard workflow designer and current action details pane with

    O painel Executar Depois mostra a ação predecessora para a ação selecionada no momento.

    Screenshot showing Standard designer, current action, and

  3. Expanda o nó de ação antecessor para exibir todos os status "executar depois".

    Por padrão, o status "executar após" é definido como bem-sucedido. Portanto, a ação predecessora deve ser executada com êxito antes que a ação selecionada atualmente possa ser executada.

    Screenshot showing Standard designer, current action, and default

  4. Altere o comportamento "executar após" para o status desejado. Certifique-se de selecionar uma opção antes de desmarcar a opção padrão. Você sempre tem que ter pelo menos uma opção selecionada.

    O exemplo a seguir seleciona falhou.

    Screenshot showing Standard designer, current action, and

  5. Para especificar que a ação atual é executada se a ação predecessora estiver marcada como Falha, Ignorada ou Tempo Limite, selecione os outros status.

    Screenshot showing Standard designer, current action, and multiple

  6. Para exigir que mais de uma ação predecessora seja executada, cada uma com seus próprios status "executar após", expanda a lista Selecionar ações . Selecione as ações predecessoras desejadas e especifique os status necessários de "execução após".

    Screenshot showing Standard designer, current action, and multiple predecessor actions available.

  7. Quando estiver pronto, selecione Concluído.

Alterar o comportamento "executar após" no editor de visualização de código

  1. No portal do Azure, abra o fluxo de trabalho do aplicativo lógico no editor de exibição de código.

  2. Na definição JSON da ação, edite a propriedade, que tem a runAfter seguinte sintaxe:

    "<action-name>": {
       "inputs": {
          "<action-specific-inputs>"
       },
       "runAfter": {
          "<preceding-action>": [
             "Succeeded"
          ]
       },
       "type": "<action-type>"
    }
    
  3. Neste exemplo, altere a runAfter propriedade de SucceededFailedpara :

    "Send_an_email_(V2)": {
       "inputs": {
          "body": {
             "Body": "<p>Failed to add row to table: @{body('Add_a_row_into_a_table')?['Terms']}</p>",
             "Subject": "Add row to table failed: @{body('Add_a_row_into_a_table')?['Terms']}",
             "To": "Sophia.Owen@fabrikam.com"
          },
          "host": {
             "connection": {
                "name": "@parameters('$connections')['office365']['connectionId']"
             }
          },
          "method": "post",
          "path": "/v2/Mail"
       },
       "runAfter": {
          "Add_a_row_into_a_table": [
             "Failed"
          ]
       },
       "type": "ApiConnection"
    }
    
  4. Para especificar que a ação é executada se a ação predecessora estiver marcada como Failed, ou TimedOut, Skipped adicione os outros status:

    "runAfter": {
       "Add_a_row_into_a_table": [
          "Failed", "Skipped", "TimedOut"
       ]
    },
    

Avaliar ações com escopos e seus resultados

Semelhante à execução de etapas após ações individuais com a configuração "executar após", você pode agrupar ações dentro de um escopo. Você pode usar escopos quando quiser agrupar logicamente ações, avaliar o status agregado do escopo e executar ações com base nesse status. Depois que todas as ações em um escopo terminam de ser executadas, o escopo em si ganha seu próprio status.

Para verificar o status de um escopo, você pode usar os mesmos critérios usados para verificar o status de execução de um fluxo de trabalho, como Aprovado, Reprovado e assim por diante.

Por padrão, quando todas as ações do escopo são bem-sucedidas, o status do escopo é marcado como Bem-sucedido. Se a ação final em um escopo estiver marcada como Falha ou Anulada, o status do escopo será marcado como Falha.

Para detetar exceções em um escopo com falha e executar ações que manipulam esses erros, você pode usar a configuração "executar após" que Escopo com falha. Dessa forma, se alguma ação no escopo falhar e você usar a configuração "executar após" para esse escopo, poderá criar uma única ação para detetar falhas.

Para limites de escopos, consulte Limites e configuração.

Obtenha contexto e resultados para falhas

Embora a deteção de falhas de um escopo seja útil, você também pode querer mais contexto para ajudá-lo a aprender as ações com falha exatas, além de quaisquer erros ou códigos de status. A result() função retorna os resultados das ações de nível superior em uma ação com escopo. Essa função aceita o nome do escopo como um único parâmetro e retorna uma matriz com os resultados dessas ações de nível superior. Esses objetos de ação têm os mesmos atributos que os atributos retornados actions() pela função, como a hora de início, a hora de término, o status, as entradas, as IDs de correlação e as saídas da ação.

Nota

A result() função retorna os resultados somente das ações de nível superior e não de ações aninhadas mais profundas, como ações de alternância ou condição.

Para obter contexto sobre as ações que falharam em um escopo, você pode usar a expressão com o nome do escopo e a @result() configuração "executar após". Para filtrar a matriz retornada para ações com status Falha, você pode adicionar a ação Filtrar matriz. Para executar uma ação para uma ação com falha retornada, pegue a matriz filtrada retornada e use um Para cada loop.

O exemplo JSON a seguir envia uma solicitação HTTP POST com o corpo de resposta para todas as ações que falharam dentro da ação de escopo chamada My_Scope. Segue-se um exemplo de uma explicação detalhada.

"Filter_array": {
   "type": "Query",
   "inputs": {
      "from": "@result('My_Scope')",
      "where": "@equals(item()['status'], 'Failed')"
   },
   "runAfter": {
      "My_Scope": [
         "Failed"
      ]
    }
},
"For_each": {
   "type": "foreach",
   "actions": {
      "Log_exception": {
         "type": "Http",
         "inputs": {
            "method": "POST",
            "body": "@item()['outputs']['body']",
            "headers": {
               "x-failed-action-name": "@item()['name']",
               "x-failed-tracking-id": "@item()['clientTrackingId']"
            },
            "uri": "http://requestb.in/"
         },
         "runAfter": {}
      }
   },
   "foreach": "@body('Filter_array')",
   "runAfter": {
      "Filter_array": [
         "Succeeded"
      ]
   }
}

As etapas a seguir descrevem o que acontece neste exemplo:

  1. Para obter o resultado de todas as ações dentro My_Scope, a ação Matriz de Filtros usa esta expressão de filtro: @result('My_Scope')

  2. A condição para Filter Array é qualquer @result() item que tenha um status igual a Failed. Essa condição filtra a matriz que tem todos os resultados da ação de My_Scope para uma matriz com apenas os resultados da ação com falha.

  3. Execute uma For_each ação de loop nas saídas de matriz filtradas. Esta etapa executa uma ação para cada resultado de ação com falha que foi filtrado anteriormente.

    Se uma única ação no escopo falhar, as ações no For_each loop serão executadas apenas uma vez. Várias ações com falha causam uma ação por falha.

  4. Envie um HTTP POST no corpo de resposta do For_each item, que é a @item()['outputs']['body'] expressão.

    A @result() forma do item é a mesma que a @actions() forma e pode ser analisada da mesma maneira.

  5. Inclua dois cabeçalhos personalizados com o nome da ação com falha () e o ID de acompanhamento do cliente de execução com falha (@item()['name']@item()['clientTrackingId']).

Para referência, aqui está um exemplo de um único @result() item, mostrando o name, bodye clientTrackingId as propriedades que são analisadas no exemplo anterior. Fora de uma ação, @result() retorna uma For_each matriz desses objetos.

{
   "name": "Example_Action_That_Failed",
   "inputs": {
      "uri": "https://myfailedaction.azurewebsites.net",
      "method": "POST"
   },
   "outputs": {
      "statusCode": 404,
      "headers": {
         "Date": "Thu, 11 Aug 2016 03:18:18 GMT",
         "Server": "Microsoft-IIS/8.0",
         "X-Powered-By": "ASP.NET",
         "Content-Length": "68",
         "Content-Type": "application/json"
      },
      "body": {
         "code": "ResourceNotFound",
         "message": "/docs/folder-name/resource-name does not exist"
      }
   },
   "startTime": "2016-08-11T03:18:19.7755341Z",
   "endTime": "2016-08-11T03:18:20.2598835Z",
   "trackingId": "bdd82e28-ba2c-4160-a700-e3a8f1a38e22",
   "clientTrackingId": "08587307213861835591296330354",
   "code": "NotFound",
   "status": "Failed"
}

Para executar diferentes padrões de tratamento de exceções, você pode usar as expressões descritas anteriormente neste artigo. Você pode optar por executar uma única ação de tratamento de exceção fora do escopo que aceita toda a matriz filtrada de falhas e remover a For_each ação. Você também pode incluir outras propriedades úteis da resposta, \@result() conforme descrito anteriormente.

Configurar logs do Azure Monitor

Os padrões anteriores são maneiras úteis de lidar com erros e exceções que acontecem dentro de uma execução. No entanto, você também pode identificar e responder a erros que acontecem independentemente da execução. Para avaliar os status da execução, você pode monitorar os logs e as métricas de suas execuções ou publicá-las em qualquer ferramenta de monitoramento de sua preferência.

Por exemplo, o Azure Monitor fornece uma maneira simplificada de enviar todos os eventos de fluxo de trabalho, incluindo todos os status de execução e ação, para um destino. Você pode configurar alertas para métricas e limites específicos no Azure Monitor. Você também pode enviar eventos de fluxo de trabalho para um espaço de trabalho do Log Analytics ou uma conta de armazenamento do Azure. Ou, você pode transmitir todos os eventos por meio dos Hubs de Eventos do Azure para oAzure Stream Analytics. No Stream Analytics, você pode escrever consultas em tempo real com base em quaisquer anomalias, médias ou falhas dos logs de diagnóstico. Você pode usar o Stream Analytics para enviar informações para outras fontes de dados, como filas, tópicos, SQL, Azure Cosmos DB ou Power BI.

Para obter mais informações, consulte Configurar logs do Azure Monitor e coletar dados de diagnóstico para Aplicativos Lógicos do Azure.

Próximos passos