Azure Batch .NET-alkalmazás monitorozása és hibakeresése az Application Insights használatával

Az Application Insights elegáns és hatékony módot kínál a fejlesztők számára az Azure-szolgáltatásokban üzembe helyezett alkalmazások monitorozására és hibakeresésére. Az Application Insights segítségével figyelheti a teljesítményszámlálókat és a kivételeket, valamint egyéni metrikákkal és nyomkövetéssel is kialakíthatja a kódot. Az Application Insights és a Azure Batch alkalmazás integrálása lehetővé teszi, hogy részletes betekintést nyerjen a viselkedésbe, és közel valós időben vizsgálja meg a problémákat.

Ez a cikk bemutatja, hogyan adhatja hozzá és konfigurálhatja az Application Insights-kódtárat a Azure Batch .NET-megoldásba, és hogyan alakíthatja ki az alkalmazás kódját. Azt is bemutatja, hogyan monitorozza az alkalmazást a Azure Portal és hogyan hozhat létre egyéni irányítópultokat. Az Application Insights más nyelveken történő támogatásáról a nyelvek, platformok és integrációk dokumentációjában olvashat.

A cikkhez tartozó kóddal ellátott C#-mintamegoldás a GitHubon érhető el. Ez a példa hozzáadja az Application Insights eszközkódját a TopNWords-példához . Ha nem ismeri ezt a példát, először próbálja meg felépíteni és futtatni a TopNWords szolgáltatást. Ez segít megérteni egy alapszintű Batch-munkafolyamatot, amely több számítási csomóponton párhuzamosan dolgozza fel a bemeneti blobokat.

Tipp

Alternatív megoldásként konfigurálja a Batch-megoldást az Application Insights-adatok, például a virtuálisgép-teljesítményszámlálók megjelenítésére a Batch Explorerben. A Batch Explorer egy ingyenes, gazdag funkcionalitású, önálló ügyféleszköz, amellyel Azure Batch alkalmazásokat hozhat létre, hibakeresést és monitorozást végezhet. Töltse le a telepítőcsomagot Mac, Linux vagy Windows rendszerre. Az Application Insights-adatok Batch Explorerben való engedélyezésének gyors lépéseit a batch-insights adattárban találja.

Előfeltételek

Application Insights hozzáadása a projekthez

A Microsoft.ApplicationInsights.WindowsServer NuGet-csomag és függőségei szükségesek a projekthez. Adja hozzá vagy állítsa vissza őket az alkalmazás projektjéhez. A csomag telepítéséhez használja a parancsot vagy a Install-Package NuGet Package Managert.

Install-Package Microsoft.ApplicationInsights.WindowsServer

A .NET-alkalmazásBól származó Application Insights-referencia a Microsoft.ApplicationInsights névtér használatával.

A kód alakítása

A kód kialakításához a megoldásnak létre kell hoznia egy Application Insights TelemetryClientet. A példában a TelemetryClient betölti a konfigurációját a ApplicationInsights.config fájlból. Mindenképpen frissítse ApplicationInsights.config a következő projektekben az Application Insights eszközkulcsával: Microsoft.Azure.Batch.Samples.TelemetryStartTask és TopNWordsSample.

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

Adja hozzá a rendszerállapotkulcsot is a TopNWords.cs fájlhoz.

A TopNWords.cs példája az Application Insights API következő rendszerhívásait használja:

  • TrackMetric() – Nyomon követi, hogy egy számítási csomópont átlagosan mennyi ideig tart a szükséges szövegfájl letöltéséhez.
  • TrackTrace() – Hibakeresési hívásokat ad hozzá a kódhoz.
  • TrackEvent() - Nyomon követi az érdekes eseményeket, amelyek rögzíthetők.

Ez a példa szándékosan hagyja ki a kivételkezelést. Ehelyett az Application Insights automatikusan jelenti a kezeletlen kivételeket, ami jelentősen javítja a hibakeresési élményt.

Az alábbi kódrészlet bemutatja, hogyan használhatja ezeket a metódusokat.

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

Azure Batch telemetriai inicializáló segéd

Amikor egy adott kiszolgáló és példány telemetriáját jelenti, az Application Insights az alapértelmezett értékekhez az Azure-beli virtuálisgép-szerepkört és a virtuális gép nevét használja. A Azure Batch kontextusában a példa bemutatja, hogyan használhatja inkább a készlet nevét és a számítási csomópont nevét. Az alapértelmezett értékek felülbírálásához használjon telemetriai inicializálót .

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

A telemetriai inicializáló engedélyezéséhez a TopNWordsSample projekt ApplicationInsights.config fájlja a következőket tartalmazza:

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

A feladat és a tevékenységek frissítése az Application Insights bináris fájljainak belefoglalására

Annak érdekében, hogy az Application Insights megfelelően fusson a számítási csomópontokon, győződjön meg arról, hogy a bináris fájlok helyesen vannak elhelyezve. Adja hozzá a szükséges bináris fájlokat a tevékenység erőforrásfájl-gyűjteményéhez, hogy azok a feladat végrehajtásakor töltődjenek le. Az alábbi kódrészletek hasonlóak a Job.cs kódhoz.

Először hozzon létre egy statikus listát a feltöltendő Application Insights-fájlokról.

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

Ezután hozza létre a feladat által használt előkészítési fájlokat.

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

A FileToStage metódus egy segédfüggvény a kódmintában, amely lehetővé teszi egy fájl egyszerű feltöltését a helyi lemezről egy Azure Storage-blobba. A rendszer később letölti az egyes fájlokat egy számítási csomópontra, és egy feladat hivatkozik rá.

Végül adja hozzá a feladathoz a tevékenységeket, és foglalja bele a szükséges Application Insights bináris fájlokat.

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

Adatok megtekintése a Azure Portal

Most, hogy konfigurálta a feladatot és a feladatokat az Application Insights használatára, futtassa a példafeladatot a készletben. Lépjen a Azure Portal, és nyissa meg a kiépített Application Insights-erőforrást. A készlet kiépítése után meg kell kezdenie az adatfolyamok megtekintését és a naplózást. A cikk többi része csak néhány Application Insights-funkciót érint, de nyugodtan fedezze fel a teljes funkciókészletet.

Élő streamadatok megtekintése

Az Applications Insights-erőforrás nyomkövetési naplóinak megtekintéséhez kattintson az Élő stream elemre. Az alábbi képernyőkép bemutatja, hogyan tekintheti meg a készlet számítási csomópontjaiból származó élő adatokat, például a számítási csomópontonkénti processzorhasználatot.

Képernyőkép az élő streames számítási csomópont adatairól.

Nyomkövetési naplók megtekintése

Az Applications Insights-erőforrás nyomkövetési naplóinak megtekintéséhez kattintson a Keresés gombra. Ez a nézet az Application Insights által rögzített diagnosztikai adatok listáját jeleníti meg, beleértve a nyomkövetéseket, eseményeket és kivételeket.

Az alábbi képernyőkép bemutatja, hogyan naplózható egy tevékenység egyetlen nyomkövetése, és hogyan kérdezhető le később hibakeresés céljából.

Képernyőkép egyetlen nyomkövetés naplóiról.

Kezeletlen kivételek megtekintése

Az Application Insights naplózza az alkalmazásból származó kivételeket. Ebben az esetben az alkalmazás a kivételt követő másodpercekben részletezhet egy adott kivételt, és diagnosztizálhatja a problémát.

Nem kezelt kivételeket ábrázoló képernyőkép.

Blob letöltési idejének mérése

Az egyéni metrikák szintén értékes eszközök a portálon. Megjelenítheti például azt az átlagos időt, amíg az egyes számítási csomópontok letöltik a feldolgozáshoz szükséges szövegfájlt.

Mintadiagram létrehozása:

  1. Az Application Insights-erőforrásban kattintson a Metrics Explorer>Add chart (Diagram hozzáadása) elemre.
  2. Kattintson a Szerkesztés gombra a hozzáadott diagramon.
  3. Frissítse a diagram részleteit az alábbiak szerint:
    • Állítsa a Diagramtípust Rács értékre.
    • Állítsa az Aggregáció értékét Átlag értékre.
    • Állítsa a Csoportosítás csomópontazonosító értékre.
    • A Metrikák területen válassza az Egyéni>blob letöltése másodpercben lehetőséget.
    • A megjelenítési színpalettát tetszés szerint módosíthatja .

Képernyőkép egy diagramról, amely a blobok csomópontonkénti letöltési idejét mutatja.

Számítási csomópontok folyamatos monitorozása

Észrevehette, hogy az összes metrika, beleértve a teljesítményszámlálókat is, csak akkor van naplózva, ha a tevékenységek futnak. Ez a viselkedés azért hasznos, mert korlátozza az Application Insights által naplózandó adatok mennyiségét. Vannak azonban olyan esetek, amikor mindig figyelni szeretné a számítási csomópontokat. Előfordulhat például, hogy olyan háttérmunkát futtatnak, amely nincs ütemezve a Batch szolgáltatáson keresztül. Ebben az esetben állítson be egy monitorozási folyamatot a számítási csomópont élettartamára.

Ennek a viselkedésnek az egyik módja, ha létrehoz egy folyamatot, amely betölti az Application Insights-kódtárat, és a háttérben fut. A példában a start feladat betölti a bináris fájlokat a gépen, és határozatlan ideig futtatja a folyamatot. Konfigurálja az Application Insights konfigurációs fájlját ehhez a folyamathoz, hogy további adatokat, például teljesítményszámlálókat küldjön ki.

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

Tipp

A megoldás kezelhetőségének növelése érdekében a szerelvényt egy alkalmazáscsomagba csomagolhatja. Ezután, ha az alkalmazáscsomagot automatikusan szeretné üzembe helyezni a készletekben, adjon hozzá egy alkalmazáscsomag-hivatkozást a készlet konfigurációjához.

Szabályozás és mintaadatok

Az éles környezetben futó Azure Batch alkalmazások nagy léptékű jellege miatt érdemes lehet korlátozni az Application Insights által gyűjtött adatok mennyiségét a költségek kezelése érdekében. Ennek eléréséhez tekintse meg a mintavételezést az Application Insightsban .

Következő lépések