Sdílet prostřednictvím


Monitorování a ladění aplikace Azure Batch .NET pomocí Application Insights

Application Insights poskytuje elegantní a výkonný způsob, jak vývojáři monitorovat a ladit aplikace nasazené do služeb Azure. Pomocí Application Insights můžete monitorovat čítače výkonu a výjimky a také instrumentovat kód pomocí vlastních metrik a trasování. Integrace Application Insights s vaší aplikací Azure Batch umožňuje získat podrobné přehledy o chování a prozkoumat problémy téměř v reálném čase.

Tento článek ukazuje, jak přidat a nakonfigurovat knihovnu Application Insights do řešení Azure Batch .NET a instrumentovat kód aplikace. Ukazuje také způsoby, jak monitorovat aplikaci prostřednictvím webu Azure Portal a vytvářet vlastní řídicí panely. Informace o podpoře Application Insights v jiných jazycích najdete v dokumentaci k jazykům, platformám a integracím.

Na GitHubu je k dispozici ukázkové řešení jazyka C# s kódem, které bude doprovázet tento článek. Tento příklad přidá instrumentační kód Application Insights do příkladu TopNWords . Pokud tento příklad neznáte, zkuste nejdřív sestavit a spustit TopNWords. To vám pomůže pochopit základní pracovní postup služby Batch pro paralelní zpracování sady vstupních objektů blob na několika výpočetních uzlech.

Tip

Alternativně nakonfigurujte řešení Batch tak, aby zobrazovala data Application Insights, jako jsou čítače výkonu virtuálních počítačů v Batch Exploreru. Batch Explorer je bezplatný samostatný klientský nástroj, který vám pomůže vytvářet, ladit a monitorovat aplikace Azure Batch. Můžete si stáhnout instalační balíček pro Mac, Linux nebo Windows. Rychlé kroky povolení dat Application Insights v Batch Exploreru najdete v úložišti Batch Insights.

Požadavky

Přidejte ke svému projektu Application Insights.

Pro váš projekt se vyžaduje balíček NuGet Microsoft.ApplicationInsights.WindowsServer a jeho závislosti. Přidejte nebo obnovte je do projektu aplikace. K instalaci balíčku použijte Install-Package příkaz nebo Správce balíčků NuGet.

Install-Package Microsoft.ApplicationInsights.WindowsServer

Odkazujte na Application Insights z vaší aplikace .NET pomocí oboru názvů Microsoft.ApplicationInsights .

Instrumentace kódu

K instrumentaci kódu potřebuje vaše řešení vytvořit Application Insights TelemetryClient. V tomto příkladu TelemetryClient načte konfiguraci ze souboru ApplicationInsights.config . Nezapomeňte aktualizovat ApplicationInsights.config v následujících projektech pomocí instrumentačního klíče Application Insights: Microsoft.Azure.Batch.Samples.TelemetryStartTask a TopNWordsSample.

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

Přidejte také instrumentační klíč do souboru TopNWords.cs.

Příklad v TopNWords.cs používá následující volání instrumentace z rozhraní API Application Insights:

  • TrackMetric() – Sleduje, jak dlouho výpočetní uzel v průměru trvá stažení požadovaného textového souboru.
  • TrackTrace() – Přidá do kódu volání ladění.
  • TrackEvent() - Sleduje zajímavé události, které se mají zachytit.

Tento příklad záměrně vynechá zpracování výjimek. Application Insights místo toho automaticky hlásí neošetřené výjimky, což výrazně zlepšuje možnosti ladění.

Následující fragment kódu ukazuje, jak tyto metody používat.

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

Pomocná rutina inicializátoru telemetrie služby Azure Batch

Při generování telemetrie pro daný server a instanci používá Application Insights pro výchozí hodnoty roli a název virtuálního počítače Azure. V kontextu služby Azure Batch příklad ukazuje, jak místo toho použít název fondu a název výpočetního uzlu. K přepsání výchozích hodnot použijte inicializátor telemetrie.

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

Pro povolení inicializátoru telemetrie obsahuje soubor ApplicationInsights.config v projektu TopNWordsSample následující:

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

Aktualizace úlohy a úkolů tak, aby zahrnovaly binární soubory Application Insights

Aby služba Application Insights správně běžela na výpočetních uzlech, ujistěte se, že jsou binární soubory správně umístěné. Přidejte požadované binární soubory do kolekce souborů prostředků vašeho úkolu, aby se stáhly v době, kdy se úloha spustí. Následující fragmenty kódu se podobají kódu v Job.cs.

Nejprve vytvořte statický seznam souborů Application Insights, které se mají nahrát.

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

Dále vytvořte pracovní soubory, které úloha používá.

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

Metoda FileToStage je pomocná funkce v ukázce kódu, která umožňuje snadno nahrát soubor z místního disku do objektu blob služby Azure Storage. Každý soubor se později stáhne do výpočetního uzlu a na který odkazuje úkol.

Nakonec přidejte úkoly do úlohy a přidejte potřebné binární soubory Application Insights.

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

Zobrazení dat na webu Azure Portal

Teď, když jste nakonfigurovali úlohu a úkoly tak, aby používaly Application Insights, spusťte ukázkové úlohy ve fondu. Přejděte na web Azure Portal a otevřete prostředek Application Insights, který jste zřídili. Po zřízení fondu byste měli začít zobrazovat toky dat a zaznamenávat do protokolu. Zbytek tohoto článku se týká jenom několika funkcí Application Insights, ale můžete prozkoumat celou sadu funkcí.

Zobrazení dat živého streamu

Pokud chcete zobrazit protokoly trasování v prostředku Application Insights, klikněte na Live Stream. Následující snímek obrazovky ukazuje, jak zobrazit živá data pocházející z výpočetních uzlů ve fondu, například využití procesoru na výpočetní uzel.

Snímek obrazovky s daty výpočetního uzlu živého streamu

Zobrazení protokolů trasování

Pokud chcete zobrazit protokoly trasování v prostředku Application Insights, klikněte na Hledat. Toto zobrazení zobrazuje seznam diagnostických dat zachycených službou Application Insights, včetně trasování, událostí a výjimek.

Následující snímek obrazovky ukazuje, jak se zaprotokoluje jedno trasování úlohy a později se dotazuje na účely ladění.

Snímek obrazovky zobrazující protokoly pro jedno trasování

Zobrazení neošetřených výjimek

Application Insights protokoluje výjimky vyvolané vaší aplikací. V takovém případě můžete během několika sekund od aplikace, která vyvolá výjimku, přejít k podrobnostem konkrétní výjimky a diagnostikovat problém.

Snímek obrazovky s neošetřenými výjimkami

Měření času stahování objektů blob

Vlastní metriky jsou také cenným nástrojem na portálu. Můžete například zobrazit průměrnou dobu, po kterou každý výpočetní uzel trvalo stažení požadovaného textového souboru, který zpracovával.

Vytvoření ukázkového grafu:

  1. V prostředku Application Insights klikněte na Přidat graf Průzkumníka>metrik.
  2. Klikněte na Upravit v přidaném grafu.
  3. Aktualizujte podrobnosti grafu následujícím způsobem:
    • Nastavte typ grafu na Mřížku.
    • Nastavte agregaci na průměr.
    • Nastavte seskupit podle NodeId.
    • V metrikách vyberte stažení vlastního>objektu blob v sekundách.
    • Upravte paletu barev zobrazení podle svého výběru.

Snímek obrazovky s grafem zobrazujícím čas stažení objektu blob na uzel

Průběžné monitorování výpočetních uzlů

Možná jste si všimli, že všechny metriky, včetně čítačů výkonu, se protokolují pouze při spuštění úloh. Toto chování je užitečné, protože omezuje množství dat, která Application Insights protokoluje. Existují však případy, kdy byste chtěli vždy monitorovat výpočetní uzly. Můžou například spouštět práci na pozadí, která není naplánovaná prostřednictvím služby Batch. V tomto případě nastavte proces monitorování tak, aby běžel po dobu životnosti výpočetního uzlu.

Jedním ze způsobů, jak tohoto chování dosáhnout, je vytvořit proces, který načte knihovnu Application Insights a běží na pozadí. V tomto příkladu spouštěcí úloha načte binární soubory na počítači a udržuje proces po neomezenou dobu. Nakonfigurujte konfigurační soubor Application Insights pro tento proces tak, aby vygenerovávala další data, která vás zajímají, například čítače výkonu.

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

Pokud chcete zvýšit možnosti správy vašeho řešení, můžete sestavení sbalit do balíčku aplikace. Pokud chcete balíček aplikace nasadit automaticky do fondů, přidejte do konfigurace fondu odkaz na balíček aplikace.

Omezení a ukázková data

Vzhledem k rozsáhlé povaze aplikací Azure Batch běžících v produkčním prostředí můžete chtít omezit množství dat shromážděných službou Application Insights za účelem správy nákladů. Některé mechanismy, které toho získáte, najdete v tématu Vzorkování v Application Insights .

Další kroky

  • Přečtěte si další informace o Application Insights.
  • Informace o podpoře Application Insights v jiných jazycích najdete v dokumentaci k jazykům, platformám a integracím.