Azure Logic Apps hataları ve özel durumları işlemeHandle errors and exceptions in Azure Logic Apps

Herhangi bir tümleştirme mimarisinin kapalı kalma süresini veya bağımlı sistemlerden kaynaklanan sorunları uygun şekilde işleme yöntemi bir zorluk oluşturabilirler.The way that any integration architecture appropriately handles downtime or issues caused by dependent systems can pose a challenge. Sorunları ve hataları sorunsuz şekilde işleyen güçlü ve dayanıklı tümleştirmeler oluşturmanıza yardımcı olmak için Logic Apps hataları ve özel durumları işlemeye yönelik birinci sınıf bir deneyim sağlar.To help you create robust and resilient integrations that gracefully handle problems and failures, Logic Apps provides a first-class experience for handling errors and exceptions.

İlkeleri yeniden denemeRetry policies

En temel özel durum ve hata işleme için, desteklenen yerlerde her türlü eylemde veya tetikleyici için bir yeniden deneme ilkesi kullanabilirsiniz.For the most basic exception and error handling, you can use a retry policy in any action or trigger where supported. Yeniden deneme ilkesi, özgün istek zaman aşımına uğradığında veya başarısız olduğunda, bir isteğin bir isteği yeniden deneme şeklini, bir 408, 429 veya 5xx yanıtı ile sonuçlanan bir istek olduğunu belirtir.A retry policy specifies whether and how the action or trigger retries a request when the original request times out or fails, which is any request that results in a 408, 429, or 5xx response. Başka bir yeniden deneme ilkesi kullanılmazsa, varsayılan ilke kullanılır.If no other retry policy is used, the default policy is used.

Yeniden deneme ilkesi türleri şunlardır:Here are the retry policy types:

TypeType AçıklamaDescription
VarsayılanDefault Bu ilke, 7,5 saniye ölçeklendirilen ancak 5 ila 45 saniye arasında ölçeklenebilen, en fazla dört yeniden deneme aralığını üstel olarak artırır .This policy sends up to four retries at exponentially increasing intervals, which scale by 7.5 seconds but are capped between 5 and 45 seconds.
Üstel AralıkExponential interval Bu ilke, sonraki isteği göndermeden önce üstel olarak büyüyen bir aralıktan seçilen rastgele aralığı bekler.This policy waits a random interval selected from an exponentially growing range before sending the next request.
Sabit AralıkFixed interval Bu ilke, sonraki isteği göndermeden önce belirtilen aralığı bekler.This policy waits the specified interval before sending the next request.
Yok.None İsteği yeniden gönderin.Don't resend the request.

Yeniden deneme ilkesi limitleri hakkında bilgi için bkz. Logic Apps sınırları ve yapılandırması.For information about retry policy limits, see Logic Apps limits and configuration.

Değişiklik yeniden deneme ilkesiChange retry policy

Farklı bir yeniden deneme ilkesi seçmek için şu adımları izleyin:To select a different retry policy, follow these steps:

  1. Mantıksal uygulama tasarımcısında mantıksal uygulamanızı açın.Open your logic app in Logic App Designer.

  2. Bir eylem veya tetikleyici için ayarları açın.Open the Settings for an action or trigger.

  3. Eylem veya tetikleyici yeniden deneme ilkelerini destekliyorsa, yeniden deneme ilkesialtında istediğiniz türü seçin.If the action or trigger supports retry policies, under Retry Policy, select the type you want.

Ya da yeniden deneme ilkelerini destekleyen bir eylem veya tetikleyici için inputs bölümünde yeniden deneme ilkesini el ile belirtebilirsiniz.Or, you can manually specify the retry policy in the inputs section for an action or trigger that supports retry policies. Bir yeniden deneme ilkesi belirtmezseniz, eylem varsayılan ilkeyi kullanır.If you don't specify a retry policy, the action uses the default policy.

"<action-name>": {
   "type": "<action-type>", 
   "inputs": {
      "<action-specific-inputs>",
      "retryPolicy": {
         "type": "<retry-policy-type>",
         "interval": "<retry-interval>",
         "count": <retry-attempts>,
         "minimumInterval": "<minimum-interval>",
         "maximumInterval": "<maximun-interval>"
      },
      "<other-action-specific-inputs>"
   },
   "runAfter": {}
}

GerekliRequired

ValueValue TypeType AçıklamaDescription
<retry-policy-type><retry-policy-type> DizeString Kullanmak istediğiniz yeniden deneme ilkesi türü: default, none, fixedveyaexponentialThe retry policy type you want to use: default, none, fixed, or exponential
<retry-interval><retry-interval> DizeString Değerin ıso 8601 biçiminikullanması gereken yeniden deneme aralığı.The retry interval where the value must use ISO 8601 format. Varsayılan en düşük Aralık PT5S ve en yüksek PT1DAralık.The default minimum interval is PT5S and the maximum interval is PT1D. Üstel Aralık ilkesini kullandığınızda, farklı en düşük ve en yüksek değerleri belirtebilirsiniz.When you use the exponential interval policy, you can specify different minimum and maximum values.
<retry-attempts><retry-attempts> IntegerInteger 1 ile 90 arasında olması gereken yeniden deneme girişimi sayısıThe number of retry attempts, which must be between 1 and 90

SeçimOptional

ValueValue TypeType AçıklamaDescription
<minimum-interval><minimum-interval> DizeString Üstel Aralık ilkesi için ıso 8601 biçiminde rastgele seçilen Aralık için en küçük AralıkFor the exponential interval policy, the smallest interval for the randomly selected interval in ISO 8601 format
<maximum-interval><maximum-interval> DizeString Üstel Aralık ilkesi için ıso 8601 biçiminde rastgele seçilen Aralık için en büyük AralıkFor the exponential interval policy, the largest interval for the randomly selected interval in ISO 8601 format

Farklı ilke türleri hakkında daha fazla bilgi aşağıda verilmiştir.Here is more information about the different policy types.

VarsayılanDefault

Bir yeniden deneme ilkesi belirtmezseniz, eylem, 7,5 saniye ölçeklendirilen aralıkları artırarak, en fazla dört yeniden deneme Gönderen, aslında üstel bir Aralık ilkesi olan varsayılan ilkeyi kullanır.If you don't specify a retry policy, the action uses the default policy, which is actually an exponential interval policy that sends up to four retries at exponentially increasing intervals that are scaled by 7.5 seconds. Aralık 5 ile 45 saniye arasında yapılır.The interval is capped between 5 and 45 seconds.

Eylemde veya tetikleyicide açıkça tanımlanmamışsa, örnek bir HTTP eyleminde varsayılan ilkenin nasıl davrandığı aşağıda verilmiştir:Though not explicitly defined in your action or trigger, here is how the default policy behaves in an example HTTP action:

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

Yok.None

Eylem veya tetikleyicinin başarısız istekleri yeniden denemediğini belirtmek için <retry-Policy-type> olarak noneayarlayın.To specify that the action or trigger doesn't retry failed requests, set the <retry-policy-type> to none.

Sabit AralıkFixed interval

Bir sonraki isteği göndermeden önce eylemin veya tetikleyicinin belirtilen aralığı bekleyeceğini belirtmek için, <retry-Policy-type> olarak fixedayarlayın.To specify that the action or trigger waits the specified interval before sending the next request, set the <retry-policy-type> to fixed.

ÖrnekExample

Bu yeniden deneme ilkesi, her bir girişim arasında 30 saniyelik bir gecikmeyle en son başarısız istekten sonraki iki kez en son haberleri almaya çalışır:This retry policy attempts to get the latest news two more times after the first failed request with a 30-second delay between each attempt:

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

Üstel AralıkExponential interval

Bir sonraki isteği göndermeden önce eylemin veya tetikleyicinin rastgele bir Aralık bekleyeceğini belirtmek için, <retry-Policy-type> olarak exponentialayarlayın.To specify that the action or trigger waits a random interval before sending the next request, set the <retry-policy-type> to exponential. Rastgele Aralık, üstel olarak büyüyen bir aralıktan seçilir.The random interval is selected from an exponentially growing range. İsteğe bağlı olarak, varsayılan en düşük ve en büyük aralıklarını, en az ve en fazla aralıklarını belirterek de geçersiz kılabilirsiniz.Optionally, you can also override the default minimum and maximum intervals by specifying your own minimum and maximum intervals.

Rastgele değişken aralıklarıRandom variable ranges

Bu tabloda, Logic Apps her bir yeniden deneme için belirtilen aralıkta bulunan ve yeniden deneme sayısı dahil olmak üzere, nasıl tek bir rastgele değişken oluşturduğu gösterilmektedir:This table shows how Logic Apps generates a uniform random variable in the specified range for each retry up to and including the number of retries:

Yeniden deneme numarasıRetry number Minimum AralıkMinimum interval Maksimum AralıkMaximum interval
1.1 en fazla (0, <Minimum aralık>)max(0, <minimum-interval>) Min (Interval, <maksimum aralık>)min(interval, <maximum-interval>)
22 maksimum (Aralık, <Minimum aralık>)max(interval, <minimum-interval>) Min (2 * Aralık, <maksimum aralık>)min(2 * interval, <maximum-interval>)
33 en fazla (2 * Aralık, <Minimum aralık>)max(2 * interval, <minimum-interval>) Min (4 * Aralık, <maksimum aralık>)min(4 * interval, <maximum-interval>)
44 Max (4 * Aralık, <Minimum aralık>)max(4 * interval, <minimum-interval>) Min (8 * Aralık, <maksimum aralık>)min(8 * interval, <maximum-interval>)
........ ........ ........

RunAfter özelliği ile sorunları yakala ve işleCatch and handle failures with the RunAfter property

Her mantıksal uygulama eylemi, bu eylem başlamadan önce tamamlaması gereken eylemleri bildirir ve iş akışınızdaki adımların sırasını nasıl belirttiğine benzer.Each logic app action declares the actions that must finish before that action starts, similar to how you specify the order of steps in your workflow. Bir eylem tanımında, Runafter özelliği bu sıralamayı tanımlar ve eylemi hangi eylemlerin ve eylem durumlarının yürütebileceğini açıklayan bir nesnedir.In an action definition, the runAfter property defines this ordering and is an object that describes which actions and action statuses execute the action.

Varsayılan olarak, mantıksal uygulama tasarımcısında eklediğiniz tüm eylemler, önceki adımın sonucu başarılıolduğunda önceki adımdan sonra çalıştırılacak şekilde ayarlanır.By default, all actions that you add in the Logic App Designer are set to run after the previous step when the previous step's result is Succeeded. Ancak, Runafter değerini özelleştirmek için, önceki eylemler neden başarısız, atlandıveya bu değerlerin bir birleşimi olduğunda eylemlerin tetiklenmesi gerekir.However, you can customize the runAfter value so that actions fire when the previous actions result as Failed, Skipped, or some combination of these values. Örneğin, belirli bir Insert_Row eylemi başarısız olduktan sonra belirli bir Service Bus konusuna bir öğe eklemek için, bu örnek şu şekilde çalışma açıklamasını kullanabilirsiniz:For example, to add an item to a specific Service Bus topic after a specific Insert_Row action fails, you could use this example runAfter definition:

"Send_message": {
    "inputs": {
        "body": {
            "ContentData": "@{encodeBase64(body('Insert_Row'))}",
            "ContentType": "{ \"content-type\" : \"application/json\" }"
        },
        "host": {
            "api": {
                "runtimeUrl": "https://logic-apis-westus.azure-apim.net/apim/servicebus"
            },
            "connection": {
                "name": "@parameters('$connections')['servicebus']['connectionId']"
            }
        },
        "method": "post",
        "path": "/@{encodeURIComponent('failures')}/messages"
    },
    "runAfter": {
        "Insert_Row": [
            "Failed"
        ]
    }
}

Insert_Row eylem durumu başarısızolduğunda runafter özelliği çalıştırılacak şekilde ayarlanır.The runAfter property is set to run when the Insert_Row action status is Failed. Eylem durumu başarılı, başarısızveya atlandıysa eylemi çalıştırmak için şu sözdizimini kullanın:To run the action if the action status is Succeeded, Failed, or Skipped, use this syntax:

"runAfter": {
        "Insert_Row": [
            "Failed", "Succeeded", "Skipped"
        ]
    }

İpucu

Önceki bir eylem başarısız olduktan sonra başarıyla çalışan ve son görüntülenen eylemler başarılıolarak işaretlenir.Actions that run and finish successfully after a preceding action has failed, are marked as Succeeded. Bu davranış, bir iş akışındaki tüm sorunları başarıyla yakalayabiliyorsanız, çalıştırmanın kendisi başarılıolarak işaretlenir anlamına gelir.This behavior means that if you successfully catch all failures in a workflow, the run itself is marked as Succeeded.

Kapsamları ve bunların sonuçlarını kullanarak eylemleri değerlendirinEvaluate actions with scopes and their results

Runafter özelliğinden bağımsız eylemlerden sonra çalışan adımlara benzer şekilde, eylemleri bir kapsamiçinde gruplandırabilirsiniz.Similar to running steps after individual actions with the runAfter property, you can group actions together inside a scope. İşlemleri mantıksal olarak gruplamak, kapsamın toplam durumunu değerlendirmek ve bu duruma göre eylemler gerçekleştirmek istediğinizde kapsamları kullanabilirsiniz.You can use scopes when you want to logically group actions together, assess the scope's aggregate status, and perform actions based on that status. Bir kapsamdaki tüm eylemler çalışmayı bitirdikten sonra, kapsamın kendisi kendi durumunu alır.After all the actions in a scope finish running, the scope itself gets its own status.

Bir kapsamın durumunu denetlemek için, bir mantıksal uygulamanın çalıştırma durumunu denetlemek için kullanılan ölçütü ( başarılı, başarısızvb.) kullanabilirsiniz.To check a scope's status, you can use the same criteria that you use to check a logic app's run status, such as Succeeded, Failed, and so on.

Varsayılan olarak, tüm kapsamın eylemleri başarılı olduğunda, kapsamın durumu başarılıolarak işaretlenir.By default, when all the scope's actions succeed, the scope's status is marked Succeeded. Bir kapsamdaki son eylem başarısız veya durdurulmuşolarak sonuçlanırsa, kapsamın durumu başarısızolarak işaretlenir.If the final action in a scope results as Failed or Aborted, the scope's status is marked Failed.

Başarısız bir kapsamda özel durumları yakalamak ve bu hataları işleyen eylemleri çalıştırmak Için, başarısız olan kapsam için runafter özelliğini kullanabilirsiniz.To catch exceptions in a Failed scope and run actions that handle those errors, you can use the runAfter property for that Failed scope. Bu şekilde, kapsamdaki herhangi bir eylem başarısız olursa ve bu kapsam Için runafter özelliğini kullanırsanız, hata yakalamak için tek bir eylem oluşturabilirsiniz.That way, if any actions in the scope fail, and you use the runAfter property for that scope, you can create a single action to catch failures.

Kapsamlar için sınırlar ve yapılandırmakonusuna bakın.For limits on scopes, see Limits and config.

Bağlam ve hatalara ilişkin sonuçları alGet context and results for failures

Bir kapsamdan hata yakalama yararlı olsa da, bağlamı tam olarak hangi eylemlerin başarısız olduğunu ve döndürülen hataları veya durum kodlarını anlamanıza yardımcı olmak isteyebilirsiniz.Although catching failures from a scope is useful, you might also want context to help you understand exactly which actions failed plus any errors or status codes that were returned.

result() İşlevi, bir kapsamdaki tüm eylemlerin sonuçları hakkında bağlam sağlar.The result() function provides context about the results from all the actions in a scope. result() İşlevi, kapsamın adı olan tek bir parametreyi kabul eder ve bu kapsam içindeki tüm eylem sonuçlarını içeren bir dizi döndürür.The result() function accepts a single parameter, which is the scope's name, and returns an array that contains all the action results from within that scope. Bu eylem nesneleri, @actions() nesnenin başlangıç zamanı, bitiş zamanı, durum, girişler, bağıntı kimlikleri ve çıktılar gibi nesneyle aynı öznitelikleri içerir.These action objects include the same attributes as the @actions() object, such as the action's start time, end time, status, inputs, correlation IDs, and outputs. Kapsam içinde başarısız olan herhangi bir eylemin bağlamını göndermek için, @result() runAfter özelliği ile kolayca bir ifadeyi eşleştirin.To send context for any actions that failed within a scope, you can easily pair a @result() expression with the runAfter property.

Başarısız olan bir kapsamda her eylem için bir eylem çalıştırmak ve sonuçların dizisini başarısız eylemlere göre filtrelemek için, bir @result() ifadeyi bir filtre dizisi eylemiyle ve her döngü için bir ile eşleştirin.To run an action for each action in a scope that has a Failed result, and to filter the array of results down to the failed actions, you can pair a @result() expression with a Filter Array action and a For each loop. Her bir döngü için kullanarak filtrelenmiş sonuç dizisini alabilir ve her hata için bir eylem gerçekleştirebilirsiniz.You can take the filtered result array and perform an action for each failure using the For each loop.

Aşağıda, "My_Scope" kapsamında başarısız olan herhangi bir eylem için yanıt gövdesi ile bir HTTP POST isteği gönderen ayrıntılı bir açıklama verilmiştir.Here's an example, followed by a detailed explanation, that sends an HTTP POST request with the response body for any actions that failed within the scope "My_Scope":

"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"
      ]
   }
}

Bu örnekte neler olduğunu açıklayan ayrıntılı bir anlatım aşağıda verilmiştir:Here's a detailed walkthrough that describes what happens in this example:

  1. "My_Scope" içindeki tüm eylemlerin sonucunu almak için, diziyi filtrele eylemi bu filtre ifadesini kullanır:@result('My_Scope')To get the result from all actions inside "My_Scope", the Filter Array action uses this filter expression: @result('My_Scope')

  2. Filtre dizisi koşulu, durumu başarısızolan @result() herhangi bir öğedir.The condition for Filter Array is any @result() item that has a status equal to Failed. Bu koşul, "My_Scope" olan tüm eylem sonuçlarına sahip diziyi yalnızca başarısız eylem sonuçlarıyla bir diziye filtreler.This condition filters the array that has all the action results from "My_Scope" down to an array with only the failed action results.

  3. Filtrelenen dizi çıktılarında her döngü eylemi için bir gerçekleştirin.Perform a For each loop action on the filtered array outputs. Bu adım, daha önce filtrelenen her başarısız eylem sonucu için bir eylem gerçekleştirir.This step performs an action for each failed action result that was previously filtered.

    Kapsamda tek bir eylem başarısız olduysa, her bir döngüdeki eylemler yalnızca bir kez çalışır.If a single action in the scope failed, the actions in the For each loop run only once. Birden çok başarısız eylem hata başına bir eyleme neden olur.Multiple failed actions cause one action per failure.

  4. @item()['outputs']['body'] İfadesi olan her öğe yanıt gövdesi için bir http gönderisi gönderin.Send an HTTP POST on the For each item response body, which is the @item()['outputs']['body'] expression.

    Öğe şekli @actions() şekille aynıdır ve aynı şekilde ayrıştırılabilir. @result()The @result() item shape is the same as the @actions() shape and can be parsed the same way.

  5. Başarısız eylem adı (@item()['name']) ve başarısız çalıştırma istemci izleme kimliği (@item()['clientTrackingId']) ile iki özel üst bilgi ekleyin.Include two custom headers with the failed action name (@item()['name']) and the failed run client tracking ID (@item()['clientTrackingId']).

Başvuru için, önceki örnekte ayrıştırılmış ad, gövdeve @result() clienttrackingıd özelliklerini gösteren tek bir öğe örneği aşağıda verilmiştir.For reference, here's an example of a single @result() item, showing the name, body, and clientTrackingId properties that are parsed in the previous example. Her bir eylemin dışında, @result() bu nesnelerin bir dizisini döndürür.Outside a For each action, @result() returns an array of these objects.

{
   "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"
}

Farklı özel durum işleme desenleri gerçekleştirmek için, bu makalede daha önce açıklanan ifadeleri kullanabilirsiniz.To perform different exception handling patterns, you can use the expressions previously described in this article. Tüm filtrelenmiş hata dizisini kabul eden kapsam dışında tek bir özel durum işleme eylemini çalıştırmayı ve her eylem için öğesini kaldırmayı tercih edebilirsiniz.You might choose to execute a single exception handling action outside the scope that accepts the entire filtered array of failures, and remove the For each action. Daha önce açıklandığı gibi @Result () yanıtından diğer yararlı özellikleri de ekleyebilirsiniz.You can also include other useful properties from the @result() response as previously described.

Azure Tanılama ve ölçümlerAzure Diagnostics and metrics

Önceki desenler, bir çalıştırma içindeki hataları ve özel durumları işlemek için harika bir yoldur, ancak aynı zamanda çalıştırmanın kendisinden bağımsız olarak hataları tanımlayabilir ve bunlara yanıt verebilirsiniz.The previous patterns are great way to handle errors and exceptions within a run, but you can also identify and respond to errors independent of the run itself. Azure tanılama , tüm çalıştırma ve eylem durumları dahil olmak üzere tüm iş akışı olaylarını bir Azure depolama hesabına veya Azure Event Hubs oluşturulmuş bir olay hub 'ına göndermek için basit bir yol sağlar.Azure Diagnostics provides a simple way to send all workflow events, including all run and action statuses, to an Azure Storage account or an event hub created with Azure Event Hubs.

Çalıştırma durumlarını değerlendirmek için günlükleri ve ölçümleri izleyebilir ya da istediğiniz izleme aracında yayımlayabilirsiniz.To evaluate run statuses, you can monitor the logs and metrics, or publish them into any monitoring tool that you prefer. Olası bir seçenek, tüm olayların Azure Stream AnalyticsEvent Hubs aracılığıyla akışını sağlar.One potential option is to stream all the events through Event Hubs into Azure Stream Analytics. Stream Analytics, tanılama günlüklerinden tüm bozukluklar, ortalamalar veya hatalara göre canlı sorgular yazabilirsiniz.In Stream Analytics, you can write live queries based on any anomalies, averages, or failures from the diagnostic logs. Stream Analytics, kuyruklar, konular, SQL, Azure Cosmos DB veya Power BI gibi diğer veri kaynaklarına bilgi göndermek için kullanabilirsiniz.You can use Stream Analytics to send information to other data sources, such as queues, topics, SQL, Azure Cosmos DB, or Power BI.

Sonraki adımlarNext steps