Share via


Application Insights ile bir Azure Batch .NET uygulamasını izleme ve hatalarını ayıklama

Application Insights , geliştiricilerin Azure hizmetlerine dağıtılan uygulamaları izlemesi ve hatalarını ayıklaması için şık ve güçlü bir yol sağlar. Performans sayaçlarını ve özel durumları izlemek ve kodunuzu özel ölçümler ve izleme ile izlemek için Application Insights'ı kullanın. Application Insights'ı Azure Batch uygulamanızla tümleştirmek, davranışlar hakkında derin içgörüler elde etmenize ve sorunları neredeyse gerçek zamanlı olarak araştırmanıza olanak tanır.

Bu makalede, Azure Batch .NET çözümünüzde Application Insights kitaplığını ekleme ve yapılandırma ve uygulama kodunuzu izleme gösterilmektedir. Ayrıca uygulamanızı Azure portal aracılığıyla izlemenin ve özel panolar oluşturmanın yollarını da gösterir. Diğer dillerde Application Insights desteği için diller, platformlar ve tümleştirme belgelerine bakın.

Bu makaleye eşlik edecek kodu içeren örnek bir C# çözümü GitHub'da mevcuttur. Bu örnek, Application Insights izleme kodunu TopNWords örneğine ekler. Bu örneği tanımıyorsanız önce TopNWords oluşturmayı ve çalıştırmayı deneyin. Bunu yapmak, birden çok işlem düğümünde paralel olarak bir dizi giriş blobu işlemeye yönelik temel bir Batch iş akışını anlamanıza yardımcı olur.

İpucu

Alternatif olarak, Batch çözümünüzü Batch Gezgini'nde VM performans sayaçları gibi Application Insights verilerini görüntüleyecek şekilde yapılandırın. Batch Explorer, Azure Batch uygulamaları oluşturmaya, hata ayıklamaya ve izlemeye yardımcı olan ücretsiz, zengin özellikli, tek başına bir istemci aracıdır. Mac, Linux veya Windows için yükleme paketi indirebilirsiniz. Batch Explorer'da Application Insights verilerini etkinleştirmeye yönelik hızlı adımlar için batch-insights deposuna bakın.

Ön koşullar

Projenize Application Insights ekleme

Microsoft.ApplicationInsights.WindowsServer NuGet paketi ve bağımlılıkları projeniz için gereklidir. Bunları uygulamanızın projesine ekleyin veya geri yükleyin. Paketi yüklemek için komutunu veya NuGet Paket Yöneticisi'ni Install-Package kullanın.

Install-Package Microsoft.ApplicationInsights.WindowsServer

Microsoft.ApplicationInsights ad alanını kullanarak .NET uygulamanızdan Application Insights'a başvurun.

Kodunuzu izleme

Kodunuzu işaretlemek için çözümünüzün bir Application Insights TelemetryClient oluşturması gerekir. Örnekte, TelemetryClient yapılandırmasını ApplicationInsights.config dosyasından yükler. Aşağıdaki projelerdeki ApplicationInsights.config Application Insights izleme anahtarınızla güncelleştirin: Microsoft.Azure.Batch.Samples.TelemetryStartTask ve TopNWordsSample.

<InstrumentationKey>YOUR-IKEY-GOES-HERE</InstrumentationKey>

Ayrıca izleme anahtarını TopNWords.cs dosyasına ekleyin.

TopNWords.cs dosyasındaki örnek, Application Insights API'sinden aşağıdaki izleme çağrılarını kullanır:

  • TrackMetric() - İşlem düğümlerinin gerekli metin dosyasını indirmesi ortalama olarak ne kadar sürdüğünü izler.
  • TrackTrace() - Kodunuza hata ayıklama çağrıları ekler.
  • TrackEvent() - Yakalamak için ilginç olayları izler.

Bu örnek, özel durum işlemeyi bilerek dışarıda bırakır. Bunun yerine, Application Insights otomatik olarak işlenmeyen özel durumları bildirir ve bu da hata ayıklama deneyimini önemli ölçüde geliştirir.

Aşağıdaki kod parçacığında bu yöntemlerin nasıl kullanılacağı gösterilmektedir.

public void CountWords(string blobName, int numTopN, string storageAccountName, string storageAccountKey)
{
    // simulate exception for some set of tasks
    Random rand = new Random();
    if (rand.Next(0, 10) % 10 == 0)
    {
        blobName += ".badUrl";
    }

    // log the url we are downloading the file from
    insightsClient.TrackTrace(new TraceTelemetry(string.Format("Task {0}: Download file from: {1}", this.taskId, blobName), SeverityLevel.Verbose));

    // open the cloud blob that contains the book
    var storageCred = new StorageCredentials(storageAccountName, storageAccountKey);
    CloudBlockBlob blob = new CloudBlockBlob(new Uri(blobName), storageCred);
    using (Stream memoryStream = new MemoryStream())
    {
        // calculate blob download time
        DateTime start = DateTime.Now;
        blob.DownloadToStream(memoryStream);
        TimeSpan downloadTime = DateTime.Now.Subtract(start);

        // track how long the blob takes to download on this node
        // this will help debug timing issues or identify poorly performing nodes
        insightsClient.TrackMetric("Blob download in seconds", downloadTime.TotalSeconds, this.CommonProperties);

        memoryStream.Position = 0; //Reset the stream
        var sr = new StreamReader(memoryStream);
        var myStr = sr.ReadToEnd();
        string[] words = myStr.Split(' ');

        // log how many words were found in the text file
        insightsClient.TrackTrace(new TraceTelemetry(string.Format("Task {0}: Found {1} words", this.taskId, words.Length), SeverityLevel.Verbose));
        var topNWords =
            words.
                Where(word => word.Length > 0).
                GroupBy(word => word, (key, group) => new KeyValuePair<String, long>(key, group.LongCount())).
                OrderByDescending(x => x.Value).
                Take(numTopN).
                ToList();
        foreach (var pair in topNWords)
        {
            Console.WriteLine("{0} {1}", pair.Key, pair.Value);
        }

        // emit an event to track the completion of the task
        insightsClient.TrackEvent("Done counting words");
    }
}

Telemetri başlatıcı yardımcısı Azure Batch

Belirli bir sunucu ve örnek için telemetri bildirirken, Application Insights varsayılan değerler için Azure VM Rolü ve VM adını kullanır. Azure Batch bağlamında örnekte havuz adı ve işlem düğümü adının nasıl kullanılacağı gösterilmektedir. Varsayılan değerleri geçersiz kılmak için telemetri başlatıcısı kullanın.

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using System;
using System.Threading;

namespace Microsoft.Azure.Batch.Samples.TelemetryInitializer
{
    public class AzureBatchNodeTelemetryInitializer : ITelemetryInitializer
    {
        // Azure Batch environment variables
        private const string PoolIdEnvironmentVariable = "AZ_BATCH_POOL_ID";
        private const string NodeIdEnvironmentVariable = "AZ_BATCH_NODE_ID";

        private string roleInstanceName;
        private string roleName;

        public void Initialize(ITelemetry telemetry)
        {
            if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
            {
                // override the role name with the Azure Batch Pool name
                string name = LazyInitializer.EnsureInitialized(ref this.roleName, this.GetPoolName);
                telemetry.Context.Cloud.RoleName = name;
            }

            if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleInstance))
            {
                // override the role instance with the Azure Batch Compute Node name
                string name = LazyInitializer.EnsureInitialized(ref this.roleInstanceName, this.GetNodeName);
                telemetry.Context.Cloud.RoleInstance = name;
            }
        }

        private string GetPoolName()
        {
            return Environment.GetEnvironmentVariable(PoolIdEnvironmentVariable) ?? string.Empty;
        }

        private string GetNodeName()
        {
            return Environment.GetEnvironmentVariable(NodeIdEnvironmentVariable) ?? string.Empty;
        }
    }
}

Telemetri başlatıcısını etkinleştirmek için TopNWordsSample projesindeki ApplicationInsights.config dosyası aşağıdakileri içerir:

<TelemetryInitializers>
    <Add Type="Microsoft.Azure.Batch.Samples.TelemetryInitializer.AzureBatchNodeTelemetryInitializer, Microsoft.Azure.Batch.Samples.TelemetryInitializer"/>
</TelemetryInitializers>

İşi ve görevleri Application Insights ikili dosyalarını içerecek şekilde güncelleştirme

Application Insights'ın işlem düğümlerinizde doğru çalışması için ikili dosyaların doğru yerleştirildiğinden emin olun. Görev yürütülürken indirilmeleri için gerekli ikili dosyaları görevinizin kaynak dosyaları koleksiyonuna ekleyin. Aşağıdaki kod parçacıkları Job.cs dosyasındaki koda benzer.

İlk olarak, karşıya yüklenecek Application Insights dosyalarının statik bir listesini oluşturun.

private static readonly List<string> AIFilesToUpload = new List<string>()
{
    // Application Insights config and assemblies
    "ApplicationInsights.config",
    "Microsoft.ApplicationInsights.dll",
    "Microsoft.AI.Agent.Intercept.dll",
    "Microsoft.AI.DependencyCollector.dll",
    "Microsoft.AI.PerfCounterCollector.dll",
    "Microsoft.AI.ServerTelemetryChannel.dll",
    "Microsoft.AI.WindowsServer.dll",
    
    // custom telemetry initializer assemblies
    "Microsoft.Azure.Batch.Samples.TelemetryInitializer.dll",
 };
...

Ardından, görev tarafından kullanılan hazırlama dosyalarını oluşturun.

...
// create file staging objects that represent the executable and its dependent assembly to run as the task.
// These files are copied to every node before the corresponding task is scheduled to run on that node.
FileToStage topNWordExe = new FileToStage(TopNWordsExeName, stagingStorageAccount);
FileToStage storageDll = new FileToStage(StorageClientDllName, stagingStorageAccount);

// Upload Application Insights assemblies
List<FileToStage> aiStagedFiles = new List<FileToStage>();
foreach (string aiFile in AIFilesToUpload)
{
    aiStagedFiles.Add(new FileToStage(aiFile, stagingStorageAccount));
}
...

FileToStage yöntemi, yerel diskten Azure Depolama blob'una kolayca dosya yüklemenizi sağlayan kod örneğindeki yardımcı bir işlevdir. Her dosya daha sonra bir işlem düğümüne indirilir ve bir görev tarafından başvurulur.

Son olarak, görevleri işe ekleyin ve gerekli Application Insights ikili dosyalarını ekleyin.

...
// initialize a collection to hold the tasks that will be submitted in their entirety
List<CloudTask> tasksToRun = new List<CloudTask>(topNWordsConfiguration.NumberOfTasks);
for (int i = 1; i <= topNWordsConfiguration.NumberOfTasks; i++)
{
    CloudTask task = new CloudTask("task_no_" + i, String.Format("{0} --Task {1} {2} {3} {4}",
        TopNWordsExeName,
        string.Format("https://{0}.blob.core.windows.net/{1}",
            accountSettings.StorageAccountName,
            documents[i]),
        topNWordsConfiguration.TopWordCount,
        accountSettings.StorageAccountName,
        accountSettings.StorageAccountKey));

    //This is the list of files to stage to a container -- for each job, one container is created and 
    //files all resolve to Azure Blobs by their name (so two tasks with the same named file will create just 1 blob in
    //the container).
    task.FilesToStage = new List<IFileStagingProvider>
                        {
                            // required application binaries
                            topNWordExe,
                            storageDll,
                        };
    foreach (FileToStage stagedFile in aiStagedFiles)
   {
        task.FilesToStage.Add(stagedFile);
   }    
    task.RunElevated = false;
    tasksToRun.Add(task);
}

Azure portal verileri görüntüleme

Artık işi ve görevleri Application Insights'ı kullanacak şekilde yapılandırdığınıza göre, örnek işi havuzunuzda çalıştırın. Azure portal gidin ve sağladığınız Application Insights kaynağını açın. Havuz sağlandıktan sonra verilerin aktığını ve günlüğe kaydedildiğini görmeye başlamalısınız. Bu makalenin geri kalanında yalnızca birkaç Application Insights özelliğine değinilmiştir ancak özellik kümesinin tamamını keşfedebilirsiniz.

Canlı akış verilerini görüntüleme

Applications Insights kaynağınızda izleme günlüklerini görüntülemek için Canlı Akış'a tıklayın. Aşağıdaki ekran görüntüsünde, havuzdaki işlem düğümlerinden gelen canlı verilerin (örneğin, işlem düğümü başına CPU kullanımı) nasıl görüntüleyebileceğiniz gösterilmektedir.

Canlı akış işlem düğümü verilerinin ekran görüntüsü.

İzleme günlüklerini görüntüleme

Applications Insights kaynağınızda izleme günlüklerini görüntülemek için Ara'ya tıklayın. Bu görünümde izlemeler, olaylar ve özel durumlar dahil olmak üzere Application Insights tarafından yakalanan tanılama verilerinin listesi gösterilir.

Aşağıdaki ekran görüntüsünde, bir görev için tek bir izlemenin günlüğe nasıl kaydedildiği ve daha sonra hata ayıklama amacıyla nasıl sorgulandığı gösterilmektedir.

Tek bir izlemenin günlüklerini gösteren ekran görüntüsü.

İşlenmeyen özel durumları görüntüleme

Application Insights, uygulamanızdan oluşan özel durumları günlüğe kaydeder. Bu durumda, uygulamanın özel durumu oluşturmasını izleyen saniyeler içinde belirli bir özel durumun detayına gidebilir ve sorunu tanılayabilirsiniz.

İşlenmeyen özel durumları gösteren ekran görüntüsü.

Blob indirme süresini ölçme

Özel ölçümler portalda da değerli bir araçtır. Örneğin, her işlem düğümünü işlemekte olduğu gerekli metin dosyasını indirmek için geçen ortalama süreyi görüntüleyebilirsiniz.

Örnek grafik oluşturmak için:

  1. Application Insights kaynağınızda Ölçüm Gezgini>Grafik ekle'ye tıklayın.
  2. Eklenen grafikte Düzenle'ye tıklayın.
  3. Grafik ayrıntılarını aşağıdaki gibi güncelleştirin:
    • Grafik türünüKılavuz olarak ayarlayın.
    • Toplama'yıOrtalama olarak ayarlayın.
    • Gruplandırma ölçütü değerini NodeId olarak ayarlayın.
    • Ölçümler'de saniyeler içinde Özel>Blob indirme'yi seçin.
    • Ekran Rengi paletini istediğiniz şekilde ayarlayın.

Düğüm başına blob indirme süresini gösteren grafiğin ekran görüntüsü.

İşlem düğümlerini sürekli izleme

Performans sayaçları da dahil olmak üzere tüm ölçümlerin yalnızca görevler çalışırken günlüğe kaydedildiğini fark etmiş olabilirsiniz. Bu davranış, Application Insights'ın günlüğe kaydeddiği veri miktarını sınırladığı için yararlıdır. Ancak, işlem düğümlerini her zaman izlemek istediğiniz durumlar vardır. Örneğin, Batch hizmeti aracılığıyla zamanlamayan arka plan çalışması çalıştırıyor olabilirler. Bu durumda, işlem düğümünün ömrü boyunca çalışacak bir izleme işlemi ayarlayın.

Bu davranışı elde etmenin bir yolu, Application Insights kitaplığını yükleyen ve arka planda çalışan bir işlem oluşturmaktır. Örnekte, başlangıç görevi makinedeki ikili dosyaları yükler ve bir işlemin süresiz olarak çalışmasını sağlar. Bu işlem için Application Insights yapılandırma dosyasını, ilgilendiğiniz performans sayaçları gibi ek verileri yayacak şekilde yapılandırın.

...
 // Batch start task telemetry runner
private const string BatchStartTaskFolderName = "StartTask";
private const string BatchStartTaskTelemetryRunnerName = "Microsoft.Azure.Batch.Samples.TelemetryStartTask.exe";
private const string BatchStartTaskTelemetryRunnerAIConfig = "ApplicationInsights.config";
...
CloudPool pool = client.PoolOperations.CreatePool(
    topNWordsConfiguration.PoolId,
    targetDedicated: topNWordsConfiguration.PoolNodeCount,
    virtualMachineSize: "standard_d1_v2",
    VirtualMachineConfiguration: new VirtualMachineConfiguration(
    imageReference: new ImageReference(
                        publisher: "MicrosoftWindowsServer",
                        offer: "WindowsServer",
                        sku: "2019-datacenter-core",
                        version: "latest"),
    nodeAgentSkuId: "batch.node.windows amd64");
...

// Create a start task which will run a dummy exe in background that simply emits performance
// counter data as defined in the relevant ApplicationInsights.config.
// Note that the waitForSuccess on the start task was not set so the Compute Node will be
// available immediately after this command is run.
pool.StartTask = new StartTask()
{
    CommandLine = string.Format("cmd /c {0}", BatchStartTaskTelemetryRunnerName),
    ResourceFiles = resourceFiles
};
...

İpucu

Çözümünüzün yönetilebilirliğini artırmak için derlemeyi bir uygulama paketinde paketleyebilirsiniz. Ardından, uygulama paketini havuzlarınıza otomatik olarak dağıtmak için havuz yapılandırmasına bir uygulama paketi başvurusu ekleyin.

Kısıtlama ve örnek veriler

Üretimde çalışan Azure Batch uygulamaların büyük ölçekli yapısı nedeniyle, maliyetleri yönetmek için Application Insights tarafından toplanan veri miktarını sınırlamak isteyebilirsiniz. Bunu başarmak için bazı mekanizmalar için bkz. Application Insights'ta Örnekleme .

Sonraki adımlar