Megosztás a következőn keresztül:


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 eszközzé tehető a kód. Az Application Insights azure Batch-alkalmazással való integrálásával részletes elemzéseket kaphat a viselkedésekről, és közel valós időben vizsgálhatja meg a problémákat.

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

A cikkhez tartozó kóddal ellátott C#-mintamegoldás a GitHubon érhető el. Ez a példa hozzáadja az Application Insights rendszerállapotkó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 TopNWordst. Ez segít megérteni egy alapszintű Batch-munkafolyamatot, amely több számítási csomóponton párhuzamosan dolgoz fel bemeneti blobokat.

Tipp.

Másik lehetőségké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 az Azure Batch-alkalmazások létrehozásához, hibakereséséhez és monitorozásához. 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árában találja.

Előfeltételek

Az 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 Csomagkezelő.

Install-Package Microsoft.ApplicationInsights.WindowsServer

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

Kód hangszerelése

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 az ApplicationInsights.config fájlból. Mindenképpen frissítse az ApplicationInsights.config fájlt a következő projektekben az Application Insights rendszerállapot-kulcsá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élda az Application Insights API következő rendszerállapot-hí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 a rögzítendő érdekes eseményeket.

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

Az Azure Batch telemetriai inicializáló segédje

Egy adott kiszolgáló és példány telemetriájának jelentésekor az Application Insights az Azure-beli virtuálisgép-szerepkört és a virtuális gép nevét használja az alapértelmezett értékekhez. Az 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ához

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 letöltse őket a feladat végrehajtásakor. 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 átmeneti 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 tartalmazza 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 az Azure Portalon

Most, hogy konfigurálta a feladatot és a tevékenységeket az Application Insights használatára, futtassa a példafeladatot a készletben. Lépjen az Azure Portalra, é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 tová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 Application 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 CPU-használatot.

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

Nyomkövetési naplók megtekintése

Az Application 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ózza a rendszer egy tevékenység egyetlen nyomkövetését, és később lekérdezi őket hibakeresési célokbó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.

A kezeletlen kivételeket bemutató 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 feldolgozandó 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 hozzáadott diagram Szerkesztés gombjára .
  3. Frissítse a diagram részleteit az alábbiak szerint:
    • Diagramtípus beállítása Rács értékre.
    • Az aggregáció beállítása Átlag értékre.
    • Csoport beállítása NodeId értékre.
    • A Metrikák területen válassza az Egyéni>blob letöltése másodpercek alatt lehetőséget.
    • A megjelenítési színpalettát tetszés szerint módosíthatja.

A blobok csomópontonkénti letöltési idejét bemutató diagram képernyőképe.

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

Észrevehette, hogy az összes metrikát, beleértve a teljesítményszámlálókat is, csak akkor naplózza a rendszer, ha a tevékenységek futnak. Ez a viselkedés azért hasznos, mert korlátozza az Application Insights által naplózható 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ához.

Ennek a viselkedésnek az egyik módja egy olyan folyamat létrehozása, amely betölti az Application Insights-tárat, és a háttérben fut. A példában a kezdő tevékenység betölti a bináris fájlokat a gépen, és határozatlan ideig futtat egy folyamatot. Konfigurálja az Application Insights konfigurációs fájlját ehhez a folyamathoz, hogy további érdekes adatokat, például teljesítményszámlálókat bocsátson 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