Dayanıklı İşlevler'de sorunları tanılama ve giderme

Dayanıklı İşlevler, düzenleme sorunlarını gidermek için çeşitli tanılama araçları sağlar. Bu makalede izleme ve kayıt tutmayı yapılandırma, yeniden oynatma güvenli kod yazma, dağıtılmış izleri inceleme ve yerel hata ayıklama işlemleri ele alınıyor.

Bu makalede şunları öğreneceksiniz:

Application Insights izlemeyi yapılandırma

Application Insights , Dayanıklı İşlevleri izlemenin önerilen yoludur. Dayanıklı uzantısı, bir düzenlemenin uçtan uca yürütülmesini izlemenize olanak sağlayan izleme olayları yayar. Azure portalında Application Insights Analytics aracını kullanarak bu izleme olaylarını bulabilir ve sorgulayabilirsiniz.

Günlük düzeyi yapılandırması

host.json dosyanızda Application Insights'a yayılan izleme verilerinin ayrıntı düzeyini yapılandırın:

{
    "logging": {
        "logLevel": {
            "Host.Triggers.DurableTask": "Information",
        },
    }
}

Varsayılan olarak, tüm yeniden yürütme olmayan izleme olayları yayılır. Host.Triggers.DurableTask, "Warning" veya "Error" olarak ayarlayarak veri hacmini azaltabilirsiniz. Bu, izleme olaylarının yalnızca istisnai durumlar için yayıldığı anlamına gelir. Ayrıntılı orkestrasyon yeniden yürütme olaylarının yayınını etkinleştirmek için, logReplayEvents yapılandırma dosyasında, true değerini olarak ayarlayın.

Uyarı

Varsayılan olarak Azure İşlevleri çalışma zamanı, verileri çok sık yaymamak için Application Insights telemetri verilerini örnekler. Örnekleme, kısa bir süre içinde birçok yaşam döngüsü olayı gerçekleştiğinde izleme bilgilerinin kaybolmasına neden olabilir. Azure İşlevleri İzleme makalesinde bu davranışın nasıl yapılandırılması açıklanır.

Giriş ve çıkış kaydı

Varsayılan olarak, orkestratör, etkinlik ve varlık işlevi girişleri ve çıkışları günlüğe kaydedilmez. Girişlerin ve çıkışların günlüğe kaydedilmesi Application Insights maliyetlerini artırabileceğinden bu yaklaşım önerilir. İşlev giriş ve çıkış yükleri de hassas bilgiler içerebilir. Bunun yerine, işlevin giriş ve çıkışlarının bayt sayısı kaydolur. Dayanıklı İşlevler uzantısının tam giriş ve çıkış yüklerini günlüğe kaydetmesini istiyorsanız, traceInputsAndOutputs özelliğini true olarak host.json yapılandırma dosyasında ayarlayın.

Orkestrasyon örneklerini sorgulayın

Düzenleme örneklerini incelemek için Application Insights Analytics'te aşağıdaki Kusto sorgularını kullanın.

Tek örnekli sorgu

Aşağıdaki sorgu, Hello Sequence işlevi düzenlemesinin tek bir örneğine ait geçmiş izleme verilerini gösterir. Yalnızca mantıksal yürütme yolunun gösterilmesi amacıyla tekrar yürütmeyi filtreler. Aşağıdaki sorguda gösterildiği gibi ve timestamp ölçütüne göre sequenceNumber sıralayarak olayları sıralayabilirsiniz:

let targetInstanceId = "ddd1aaa685034059b545eb004b15d4eb";
let start = datetime(2018-03-25T09:20:00);
traces
| where timestamp > start and timestamp < start + 30m
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = customDimensions["prop__functionName"]
| extend instanceId = customDimensions["prop__instanceId"]
| extend state = customDimensions["prop__state"]
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend sequenceNumber = tolong(customDimensions["prop__sequenceNumber"])
| where isReplay != true
| where instanceId == targetInstanceId
| sort by timestamp asc, sequenceNumber asc
| project timestamp, functionName, state, instanceId, sequenceNumber, appName = cloud_RoleName

Sonuç, yürütme zamanına göre artan düzende sıralanmış etkinlik işlevleri de dahil olmak üzere düzenlemenin yürütme yolunu gösteren izleme olaylarının listesidir.

İzleme olaylarıyla birlikte tek örnekli sıralı sorgu sonuçlarını gösteren Application Insights'ın ekran görüntüsü.

Örnek özet sorgusu

Aşağıdaki sorgu, belirtilen zaman aralığında çalıştırılan tüm düzenleme örneklerinin durumunu görüntüler.

let start = datetime(2017-09-30T04:30:00);
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = tostring(customDimensions["prop__functionName"])
| extend instanceId = tostring(customDimensions["prop__instanceId"])
| extend state = tostring(customDimensions["prop__state"])
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend output = tostring(customDimensions["prop__output"])
| where isReplay != true
| summarize arg_max(timestamp, *) by instanceId
| project timestamp, instanceId, functionName, state, output, appName = cloud_RoleName
| order by timestamp asc

Sonuç, örnek kimliklerinin ve bunların geçerli çalışma zamanı durumunun listesidir.

Örnek kimlikleri ve durum bilgilerini içeren tek örnek özet sorgu sonuçlarını gösteren Application Insights'ın ekran görüntüsü.

Veri referansını izleme

Her düzenleme örneği, yaşam döngüsü boyunca ilerledikçe izleme olayları oluşturur. Her yaşam döngüsü olayı, çeşitli alanlara sahip bir customDimensions yükü içerir. Alan adlarının tümü prop__ ile önceden eklenir.

Alan adı Açıklama
hubName Düzenlemelerinizin çalıştığı görev hub'ının adı.
appName İşlev uygulamasının adı. Bu alan, aynı Application Insights örneğini paylaşan birden çok işlev uygulamanız olduğunda kullanışlıdır.
slotName Geçerli işlev uygulamasının çalışmakta olduğu dağıtım yuvası. Bu alan, orkestrasyonlarınızı sürümlemek için dağıtım yuvalarını kullandığınızda faydalıdır.
functionName Orkestratörün veya etkinlik işlevinin adı.
functionType Orchestrator veya Activity gibi işlevin türü.
instanceId Orkestrasyon örneğinin benzersiz kimliği.
state Örneğin yaşam döngüsü yürütme durumu.
state.Scheduled İşlev yürütme için zamanlandı ancak henüz çalışmaya başlamadı.
state.Started İşlev çalışmaya başladı ancak henüz beklemedi veya tamamlanmadı.
state.Awaited Orkestratör bazı işleri zamanladı ve tamamlanmalarını bekliyor.
state.Listening Orchestrator, bir dış olay bildirimini bekliyor.
state.Completed İşlev başarıyla tamamlandı.
state.Failed İşlev bir hatayla başarısız oldu.
reason İzleme olayıyla ilişkili ek veriler. Örneğin, bir örnek dış olay bildirimi bekliyorsa, bu alan beklediği olayın adını gösterir. bir işlev başarısız olursa, bu alan hata ayrıntılarını içerir.
isReplay İzleme olayının yeniden oynatılan yürütme için olup olmadığını gösteren Boole değeri.
extensionVersion Dayanıklı Görev uzantısının sürümü. Sürüm bilgileri, uzantıdaki olası hataları bildirirken özellikle önemli verilerdir. Uzun süre çalışan örnekler, örnek çalışırken bir güncelleştirme gerçekleştiğinde birden çok sürüm bildirebilir.
sequenceNumber Bir olay için yürütme sırası numarası. Zaman damgasıyla birlikte bu, olayları yürütme zamanına göre sıralamaya yardımcı olur. Örnek çalışırken konak yeniden başlatılırsa bu sayı sıfıra sıfırlanır, bu nedenle her zaman önce zaman damgasına, sonra sequenceNumber'a göre sıralamak önemlidir.

Dayanıklı İşlem Çerçevesi kaydı (DTFx)

Dayanıklı uzantı günlükleri, düzenleme mantığınızın davranışını anlamak için kullanışlıdır. Ancak bu günlükler her zaman çerçeve düzeyinde performans ve güvenilirlik sorunlarını ayıklamak için yeterli bilgi içermez. Dayanıklı uzantısının v2.3.0'dan başlayarak, altında yatan Dayanıklı Görev Çerçevesi (DTFx) tarafından yayılan günlükler de toplanabilir.

DTFx tarafından yayılan günlüklere bakarken, DTFx altyapısının iki bileşeni olduğunu anlamak önemlidir: çekirdek dağıtım altyapısı (DurableTask.Core) ve desteklenen birçok depolama sağlayıcısından biri.

Bileşen Açıklama
DurableTask.Core Çekirdek orkestrasyon icrası ve düşük seviyeli zamanlama günlükleri ve telemetri.
DurableTask.DurableTaskScheduler Dayanıklı Görev Zamanlayıcı'ya özgü arka uç günlükleri.
DurableTask.AzureStorage Azure Depolama durum sağlayıcısına özgü arka plan günlükleri. Bu günlükler, iç orkestrasyon durumunun depolanması ve alınması için kullanılan iç kuyruklar, bloblar ve depolama tabloları ile yapılan ayrıntılı etkileşimleri içerir.
DurableTask.Netherite Etkinleştirildiyse, Netherite depolama sağlayıcısına özgü arka uç günlükleri.
DurableTask.SqlServer Etkinleştirilirse, Microsoft SQL (MSSQL) depolama sağlayıcısına özgü arka uç günlükleri.

İşlev uygulamanızın logging/logLevel dosyasının host.json bölümünü güncelleştirerek bu günlükleri etkinleştirebilirsiniz. Aşağıdaki örnekte hem DurableTask.Core hem de DurableTask.AzureStorage öğelerinden uyarı ve hata günlüklerinin nasıl etkinleştirileceği gösterilmektedir.

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.AzureStorage": "Warning",
      "DurableTask.Core": "Warning"
    }
  }
}

Application Insights'ı etkinleştirdiyseniz, bu günlükler koleksiyona trace otomatik olarak eklenir. Kusto sorgularını kullanarak bunları diğer trace günlüklerde yaptığınız gibi arayabilirsiniz.

Uyarı

Üretim uygulamaları için, DurableTask.Core filtresini kullanarak DurableTask.AzureStorage ve uygun depolama sağlayıcısının (örneğin, "Warning") günlüklerini etkinleştirmenizi öneririz. gibi "Information" daha yüksek ayrıntı filtreleri, performans sorunlarının hatalarını ayıklamak için yararlıdır. Ancak bu günlük olayları yüksek hacimli olabilir ve Application Insights veri depolama maliyetlerini önemli ölçüde artırabilir.

Aşağıdaki Kusto sorgusunda DTFx günlüklerinin nasıl sorgu yapılacağı gösterilmektedir. Sorgunun en önemli kısmı, where customerDimensions.Category startswith "DurableTask" sonuçları ve DurableTask.Core kategorilerindeki günlüklere göre filtrelediğindendirDurableTask.AzureStorage.

traces
| where customDimensions.Category startswith "DurableTask"
| project
    timestamp,
    severityLevel,
    Category = customDimensions.Category,
    EventId = customDimensions.EventId,
    message,
    customDimensions
| order by timestamp asc 

Sonuç, Durable Task Framework günlük sistemi sağlayıcıları tarafından yazılmış bir günlük kümesidir.

Dayanıklı Görev Çerçevesi günlükleriyle DTFx sorgu sonuçlarını gösteren Application Insights'ın ekran görüntüsü.

Hangi günlük olaylarının kullanılabilir olduğu hakkında daha fazla bilgi için GitHub'daki Durable Task Framework yapılandırılmış günlük belgelerine bakın.

Dağıtılmış izleme

Dağıtılmış izleme istekleri izler ve farklı hizmetlerin birbirleriyle nasıl etkileşim kuracaklarını gösterir. Dayanıklı İşlevler, orkestrasyonlar, varlıklar ve aktiviteleri birlikte ilişkilendirir. Dağıtılmış izleme, düzenlemenin tamamına göre her düzenleme adımı için yürütme süresini gösterir ve sorunların veya özel durumların oluştuğu yeri tanımlar. Bu özellik tüm diller ve depolama sağlayıcıları için Application Insights'ta desteklenir.

Prerequisites

Dağıtılmış izleme için belirli en düşük uzantı sürümleri gerekir:

Dağıtılmış izlemeyi ayarlama

Dağıtılmış izlemeyi yapılandırmak için host.json güncelleyin ve bir Application Insights kaynağı ayarlayın.

host.json

{
   "extensions": {
     "durableTask": {
       "tracing": {
         "distributedTracingEnabled": true,
         "version": "V2"
       }
     }
   }
 }

Uygulama Öngörüleri

İşlev uygulamanızı bir Application Insights kaynağıyla yapılandırın.

İzlerin incelenmesi

Application Insights kaynağınızda İşlem Arama'ya gidin. Sonuçlarda Dayanıklı'ya özgü ön eklerle (örneğin, Request, Dependency, vb.) başlayan orchestration: ve activity: olaylarını arayın. Bu olaylardan birinin seçilmesi, uçtan uca dağıtılmış izlemeyi gösteren bir Gantt grafiği açar. Grafik, her orkestrasyon adımını yatay bir çubuk olarak gösterir ve etkinlik ile alt orkestrasyon çağrıları, kendi üst orkestrasyonlarının altında iç içe yer alır. Çubuk uzunluğu, her adımın duvar saati süresini temsil ederek tıkanıklıkları veya beklenmedik şekilde yavaş etkinlikleri fark etmeyi kolaylaştırır.

Orkestrasyon ve etkinlik zaman çizelgeleriyle Application Insights dağıtılmış izlemesini gösteren Gantt grafiğinin ekran görüntüsü.

Uyarı

Application Insights'ta izlemelerinizi göremiyor musunuz? Tüm verilerin Application Insights kaynağına yayılmasını sağlamak için uygulamanızı çalıştırdıktan sonra yaklaşık beş dakika bekleyin.

Orchestrator işlevlerinde yeniden yürütme sırasında güvenli günlük kaydı

Orchestrator işlevleri, her yeni giriş alındığında yeniden yürütülür, başka bir deyişle bir orchestrator içindeki tüm log deyimleri tek bir mantıksal yürütme için birden çok kez çalıştırılır. Örneğin, üç etkinlik çağrısı içeren bir işlev, yeniden yürütme sırasında aşağıdaki gibi bir günlük çıkışı oluşturur:

Calling F1.
Calling F1.
Calling F2.
Calling F1.
Calling F2.
Calling F3.
Calling F1.
Calling F2.
Calling F3.
Done!

Yinelenen log satırlarını önlemek için logların yalnızca ilk (yeniden oynatma olmayan) geçişte yürütüldüğünden emin olmak için "yeniden oynatılıyor" bayrağını denetleyin. Aşağıdaki örneklerde her dilde yeniden yürütme güvenli günlük kaydı gösterilmektedir.

Dayanıklı İşlevler 2.0 ile birlikte, yeniden yürütme sırasında günlük kayıtlarını otomatik olarak filtrelemek için CreateReplaySafeLogger kullanın.

[FunctionName("FunctionChain")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context,
    ILogger log)
{
    log = context.CreateReplaySafeLogger(log);
    log.LogInformation("Calling F1.");
    await context.CallActivityAsync("F1");
    log.LogInformation("Calling F2.");
    await context.CallActivityAsync("F2");
    log.LogInformation("Calling F3");
    await context.CallActivityAsync("F3");
    log.LogInformation("Done!");
}

Yeniden yürütme güvenliğine sahip günlüğe kaydetme ile günlük çıktısı şu şekildedir:

Calling F1.
Calling F2.
Calling F3.
Done!

Özel düzenleme durumu

İş akışı ilerleme durumunu dış istemcilere bildirmek için özel düzenleme durumunu kullanın. Yaygın desenler tamamlama yüzdelerini, adım açıklamalarını ve hata özetlerini içerir. Dış istemciler HTTP durum sorgusu API'sini veya dile özgü API çağrılarını kullanarak özel durumu görüntüleyebilir.

Aşağıdaki kod, bir orchestrator işlevinde özel durum değerinin nasıl ayarlandığını gösterir:

[FunctionName("SetStatusTest")]
public static async Task SetStatusTest([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    // ...do work...

    // update the status of the orchestration with some arbitrary data
    var customStatus = new { completionPercentage = 90.0, status = "Updating database records" };
    context.SetCustomStatus(customStatus);

    // ...do more work...
}

Uyarı

Önceki C# örneği Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için DurableOrchestrationContext yerine IDurableOrchestrationContext kullanmanız gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Orkestrasyon devam ederken dış müşteriler bu özel durum bilgisini alabilir:

GET /runtime/webhooks/durabletask/instances/instance123?code=XYZ

İstemciler aşağıdaki yanıtı alır:

{
  "runtimeStatus": "Running",
  "input": null,
  "customStatus": { "completionPercentage": 90.0, "status": "Updating database records" },
  "output": null,
  "createdTime": "2017-10-06T18:30:24Z",
  "lastUpdatedTime": "2017-10-06T19:40:30Z"
}

Uyarı

Özel durum yükü, bir Azure Tablo Depolaması sütununa sığması gerektiğinden 16 KB UTF-16 JSON metniyle sınırlıdır. Daha büyük bir yüke ihtiyacınız varsa dış depolamayı kullanabilirsiniz.

Hata ayıklama

Azure İşlevleri, işlev kodunu doğrudan hata ayıklama desteği sağlar ve bu destek, hem Azure'da hem de yerel ortamda çalışan Dayanıklı İşlevler için de geçerlidir. En iyi hata ayıklama deneyimi için aşağıdaki iş akışını kullanın:

  1. Yeni bir görev hub'ı ile yeni bir hata ayıklama oturumu başlatın veya oturumlar arasındaki görev hub'ı içeriğini temizleyin. Önceki çalıştırmalardan kalan iletiler beklenmeyen yeniden yürütmeye neden olabilir.

  2. Düzenleyicinizde veya etkinlik işlevlerinizde kesme noktaları ayarlayın. Orchestrator işlevleri için, yalnızca "yeniden yürütülüyor" değeri false olduğunda kesen bir koşullu kesme noktası kullanın, böylece yeniden yürütme sırasında aynı kesme noktasına birden çok kez çarpmaktan kaçınırsınız.

  3. Kodda her zamanki gibi adım adım ilerleyin. Aşağıdaki davranışları aklınızda bulundurun:

    • Replay:
      Orchestrator işlevleri, yeni girişler alındığında düzenli olarak yeniden oynatılır . Bir orchestrator işlevinin tek bir mantıksal yürütmesi, özellikle işlev kodunda erken ayarlanmışsa aynı kesme noktasına birden çok kez isabet etmeyle sonuçlanabilir.

    • Bekliyor:
      Bir orchestrator işlevinde bir await ile karşılaşıldığında, denetimi Dayanıklı Görev Çerçevesi dağıtıcısına geri verir. Belirli bir await görevle ilk kez karşılaşılıyorsa, ilişkili görev hiçbir zaman sürdürülemez . Görev hiçbir zaman devam etmediğinden, await üstünden geçme (Visual Studio'da F10) adımlama mümkün değildir. Yalnızca bir görev yeniden yürütülüyorken geçiş adımı çalışır.

    • Mesajlaşma zaman aşımları:
      Dayanıklı İşlevler, düzenleyici, etkinlik ve varlık işlevlerinin yürütülmesini sağlamak için kuyruk iletilerini dahili olarak kullanır. Çoklu VM ortamında, genişletilmiş hata ayıklama oturumları başka bir VM'nin iletiyi işlemesine neden olarak yinelenen yürütmeye neden olabilir. Bu davranış normal kuyruk tetikleyici işlevleri için de mevcut olsa da, kuyruklar bir uygulama ayrıntısı olduğundan bu bağlamı vurgulamak önemlidir.

    • Durdurma ve başlatma:
      Dayanıklı İşlevler'deki iletiler hata ayıklama oturumları arasında kalır. Dayanıklı bir işlev yürütülürken hata ayıklamayı durdurur ve yerel konak işlemini sonlandırırsanız, bu işlev gelecekteki bir hata ayıklama oturumunda otomatik olarak yeniden yürütülebilir.

Ek araçlar

Depolama durumunu inceleme

Varsayılan olarak, Dayanıklı Fonksiyonlar durumu Azure Depolama'da saklar. Microsoft Azure Depolama Gezgini gibi araçları kullanarak düzenleme durumunu ve iletileri inceleyebilirsiniz.

Dayanıklı İşlevler orkestrasyon durumunu tablolar ve kuyruklarda gösteren Azure Depolama Gezgini ekran görüntüsü.

Uyarı

Tablo depolamada yürütme geçmişini görmek kullanışlı olsa da, bu tabloya bağımlılık yapmaktan kaçının. Dayanıklı İşlevler uzantısı geliştikçe değişebilir.

Uyarı

Varsayılan Azure Depolama sağlayıcısı yerine diğer depolama sağlayıcılarını yapılandırabilirsiniz. Uygulamanız için yapılandırılan depolama sağlayıcısına bağlı olarak, temel alınan durumu incelemek için farklı araçlar kullanmanız gerekebilir.

Dayanıklı İşlevler İzleyicisi

Dayanıklı İşlevler İzleyici, düzenleme ve varlık örneklerini izlemeye, yönetmeye ve hata ayıklamaya yönelik bir grafik aracıdır. Visual Studio Code uzantısı veya tek başına uygulama olarak kullanılabilir. Kurulum yönergeleri ve özelliklerin listesi için bkz. Dayanıklı İşlevler Monitor Wiki.

Azure portalı tanılama araçları

Azure portalı, işlev uygulamalarınız için yerleşik tanılama araçları sağlar.

Sorunları tanılama ve çözme: Azure İşlev Uygulaması Tanılama, uygulamanızdaki olası sorunları izlemek ve tanılamak için kullanışlı bir kaynaktır. Ayrıca, tanılamaya göre sorunların çözülmesine yardımcı olacak öneriler sağlar. Daha fazla bilgi için bkz. Azure İşlev Uygulaması Tanılama.

Düzenleme izlemeleri: Azure portalı, her düzenleme örneğinin durumunu anlamanıza ve uçtan uca yürütmeyi izlemenize yardımcı olmak için düzenleme izleme ayrıntıları sağlar. Azure İşlevleri uygulamanızın içindeki işlevlerin listesini görüntülediğinizde, izlemelerin bağlantılarını içeren bir Monitor sütunu görürsünüz. Uygulamanızın bu bilgilere erişebilmesi için Application Insights'ın etkinleştirilmiş olması gerekir.

Roslyn Çözümleyicisi

Dayanıklı İşlevler Roslyn Analyzer, C# geliştiricilerine belirli Dayanıklı İşlevler code kısıtlamaları uymaları için yol gösteren bir canlı kod çözümleyicisidir. Visual Studio ve Visual Studio Code etkinleştirme yönergeleri için bkz. Dayanıklı İşlevler Roslyn Analyzer.

Sorun giderme

Düzenlemelerin takılması, başlatılamaması veya yavaş çalışması gibi yaygın sorunları gidermek için Dayanıklı İşlevler sorun giderme kılavuzuna bakın.

Sonraki Adımlar