Memantau dan memperbaiki kesalahan aplikasi Azure Batch .NET dengan Application Insights

Application Insights menyediakan cara yang elegan dan kuat bagi pengembang untuk memantau dan memperbaiki kesalahan aplikasi yang disebarkan ke layanan Azure. Gunakan Application Insights untuk memantau penghitung kinerja serta instrumen kode Anda dengan metrik dan penelusuran khusus. Mengintegrasikan Application Insights dengan aplikasi Azure Batch memungkinkan Anda mendapatkan wawasan mendalam tentang perilaku dan menyelidiki masalah dalam waktu mendekati real-time.

Artikel ini memperlihatkan cara menambahkan dan mengonfigurasi pustaka Application Insights ke dalam solusi Azure Batch .NET Anda dan instrumen kode aplikasi Anda. Ini juga menunjukkan cara untuk memantau aplikasi Anda melalui portal Microsoft Azure dan membangun dasbor khusus. Untuk dukungan Application Insights dalam bahasa lain, lihat dokumentasi bahasa, platform, dan integrasi.

Contoh solusi C# dengan kode untuk menyertai artikel ini tersedia di GitHub. Contoh ini menambahkan kode instrumentasi Application Insights ke contoh TopNWords. Jika Anda tidak terbiasa dengan contoh tersebut, cobalah bangun dan jalankan TopNWords terlebih dahulu. Melakukan ini akan membantu Anda memahami alur kerja Batch dasar dalam memproses serangkaian blob input secara paralel pada beberapa simpul komputasi.

Tip

Sebagai alternatif, konfigurasikan solusi Batch Anda untuk menampilkan data Application Insights seperti penghitung kinerja VM di Batch Explorer. Batch Explorer adalah alat klien gratis, kaya fitur, dan mandiri untuk membantu membuat, memperbaiki kesalahan, dan memantau aplikasi Azure Batch. Unduh paket penginstalan untuk Mac, Linux, atau Windows. Lihat repositori wawasan batch untuk langkah cepat untuk mengaktifkan data Application Insights di Batch Explorer.

Prasyarat

Menambahkan Application Insights ke proyek Anda

Paket NuGet Microsoft.ApplicationInsights.WindowsServer dan dependensinya diperlukan untuk proyek Anda. Tambahkan atau pulihkan ke proyek aplikasi Anda. Untuk menginstal paket, gunakan Install-Package perintah atau NuGet Package Manager.

Install-Package Microsoft.ApplicationInsights.WindowsServer

Referensi Application Insights dari aplikasi .NET Anda dengan menggunakan namespace Microsoft.ApplicationInsights.

Instrumen kode Anda

Untuk melengkapi instrumen kode Anda, solusi Anda perlu membuat Application Insights TelemetryClient. Dalam contoh, TelemetryClient memuat konfigurasinya dari file ApplicationInsights.config. Pastikan untuk memperbarui ApplicationInsights.config di proyek berikutnya dengan kunci instrumentasi Application Insights Anda: Microsoft.Azure.Batch.Samples.TelemetryStartTask dan TopNWordsSample.

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

Tambahkan juga kunci instrumentasi dalam file TopNWords.cs.

Contoh dalam TopNWords.cs menggunakan panggilan instrumentasi berikut dari API Application Insights:

  • TrackMetric() - Melacak berapa lama rata-rata simpul komputasi diperlukan untuk mengunduh file teks yang diperlukan.
  • TrackTrace() - Menambahkan panggilan debugging ke kode Anda.
  • TrackEvent() - Melacak peristiwa menarik untuk ditangkap.

Contoh ini sengaja meninggalkan penanganan pengecualian. Sebaliknya, Application Insights secara otomatis melaporkan pengecualian yang tidak tertangani, yang secara signifikan meningkatkan pengalaman debugging.

Cuplikan berikut menggambarkan cara menggunakan metode-metode ini.

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");
    }
}

Pembantu penginisialisasi telemetri Azure Batch

Saat melaporkan telemetri untuk server dan contoh tertentu, Application Insights menggunakan Azure VM Role dan nama VM untuk nilai default. Dalam konteks Azure Batch, contoh menunjukkan cara menggunakan nama kumpulan dan nama simpul komputasi sebagai gantinya. Gunakan penginisialisasi telemetri untuk mengambil alih nilai default.

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;
        }
    }
}

Untuk mengaktifkan penginisialisasi telemetri, file ApplicationInsights.config dalam proyek TopNWordsSample mencakup berikut:

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

Perbarui pekerjaan dan tugas untuk menyertakan biner Application Insights

Agar Application Insights berjalan dengan benar pada simpul komputasi Anda, pastikan biner ditempatkan dengan benar. Tambahkan biner yang diperlukan ke koleksi file sumber daya tugas Anda sehingga diunduh pada saat tugas Anda dijalankan. Cuplikan berikut mirip dengan kode di Job.cs.

Pertama, buat daftar statis file Application Insights untuk diunggah.

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",
 };
...

Selanjutnya, buat file penahapan yang digunakan oleh tugas tersebut.

...
// 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 Metode ini adalah fungsi pembantu dalam sampel kode yang memungkinkan Anda mengunggah file dengan mudah dari disk lokal ke blob Azure Storage. Setiap file kemudian diunduh ke sebuah simpul komputasi dan direferensikan oleh sebuah tugas.

Terakhir, tambahkan tugas-tugas tersebut ke pekerjaan dan sertakan biner Application Insights yang diperlukan.

...
// 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);
}

Menampilkan data di portal Microsoft Azure

Sekarang setelah Anda mengonfigurasi pekerjaan dan tugas untuk menggunakan Application Insights, jalankan contoh pekerjaan di kumpulan Anda. Navigasi ke portal Microsoft Azure dan buka sumber daya Application Insights yang Anda tentukan. Setelah kumpulan disediakan, Anda harus mulai melihat aliran data dan masuk. Sisa artikel ini hanya menyentuh beberapa fitur Application Insights, tetapi jangan ragu untuk menjelajahi set fitur lengkapnya.

Melihat data streaming langsung

Untuk melihat log pelacakan di sumber daya Application Insights Anda, klik Streaming Langsung. Cuplikan layar berikut menunjukkan cara melihat data langsung yang berasal dari simpul komputasi dalam kumpulan, misalnya penggunaan CPU per simpul komputasi.

Cuplikan layar data simpul komputasi streaming langsung.

Menampilkan log pelacakan

Untuk melihat log pelacakan di sumber daya Application Insights Anda, klik Pencarian. Tampilan ini memperlihatkan daftar data diagnostik yang diambil oleh Application Insights termasuk jejak, peristiwa, dan pengecualian.

Cuplikan layar berikut ini memperlihatkan bagaimana satu jejak tugas dicatat dan kemudian dikueri untuk tujuan penelusuran kesalahan.

Cuplikan layar memperlihatkan log untuk satu jejak.

Menampilkan pengecualian yang tidak tertangani

Application Insights mencatat pengecualian yang ditampilkan dari aplikasi Anda. Dalam hal ini, dalam hitungan detik dari saat aplikasi menampilkan pengecualian, Anda dapat menelusuri hingga ke dalam sebuah pengecualian tertentu dan mendiagnosis masalah.

Cuplikan layar memperlihatkan pengecualian tak tertangani.

Mengukur waktu pengunduhan blob

Metrik kustom juga merupakan alat berharga di portal. Misalnya, Anda dapat menampilkan waktu rata-rata yang diperlukan setiap simpul komputasi untuk mengunduh file teks yang diperlukan yang sedang diproses.

Untuk membuat contoh bagan:

  1. Di sumber daya Application Insights Anda, klik bagan Metrics Explorer>Tambahkan.
  2. Klik Edit pada bagan yang ditambahkan.
  3. Perbarui detail bagan sebagai berikut:
    • Atur Jenis bagan ke Kisi.
    • Atur Agregasi keRata-rata.
    • Atur Kelompokkan Berdasarkanke NodeId.
    • Di Metrik, pilih unduhan Blob Kustom>dalam hitungan detik.
    • Sesuaikan palet Warna tampilan dengan pilihan Anda.

Cuplikan layar bagan memperlihatkan waktu pengunduhan blob per simpul.

Memantau simpul komputasi secara terus-menerus

Anda mungkin telah memperhatikan bahwa semua metrik, termasuk penghitung kinerja, hanya dicatat saat tugas berjalan. Perilaku ini berguna karena membatasi jumlah data yang tercatat di Application Insights. Namun, ada saat Anda selalu ingin memantau simpul komputasi. Misalnya, simpul tersebut mungkin menjalankan pekerjaan latar belakang yang tidak dijadwalkan melalui layanan Batch. Dalam hal ini, siapkan proses pemantauan untuk dijalankan selama simpul komputasi dijalankan.

Salah satu cara mencapai perilaku ini adalah dengan menelurkan proses yang memuat pustaka Application Insights dan berjalan di latar belakang. Dalam contoh, tugas awal memuat biner pada komputer dan menjaga proses berjalan tanpa batas waktu. Konfigurasikan file konfigurasi Application Insights untuk proses ini guna memancarkan data tambahan yang Anda minati, seperti penghitung kinerja.

...
 // 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
};
...

Tip

Untuk meningkatkan pengelolaan solusi Anda, Anda dapat menggabungkan perakitan dalam sebuahpaket aplikasi. Kemudian, untuk menyebarkan paket aplikasi secara otomatis ke kumpulan Anda, tambahkan referensi paket aplikasi ke konfigurasi kumpulan.

Pembatasan dan data sampel

Karena sifat skala besar aplikasi Azure Batch yang berjalan dalam produksi, Anda mungkin ingin membatasi jumlah data yang dikumpulkan oleh Application Insights untuk mengelola biaya. Lihat Pengambilan Sampel dalam Application Insights untuk beberapa mekanisme untuk mencapai hal ini.

Langkah berikutnya