Udostępnij za pośrednictwem


Monitorowanie i debugowanie aplikacji platformy .NET Azure Batch za pomocą usługi Application Insights

Usługa Application Insights zapewnia elegancki i zaawansowany sposób monitorowania i debugowania aplikacji wdrożonych w usługach platformy Azure przez deweloperów. Usługa Application Insights służy do monitorowania liczników wydajności i wyjątków, a także instrumentacji kodu za pomocą metryk niestandardowych i śledzenia. Integracja usługi Application Insights z aplikacją Azure Batch pozwala uzyskać szczegółowe informacje na temat zachowań i badać problemy niemal w czasie rzeczywistym.

W tym artykule pokazano, jak dodać i skonfigurować bibliotekę usługi Application Insights do rozwiązania platformy .NET Azure Batch i instrumentować kod aplikacji. Przedstawiono również sposoby monitorowania aplikacji za pośrednictwem Azure Portal i tworzenia niestandardowych pulpitów nawigacyjnych. Aby uzyskać informacje o obsłudze usługi Application Insights w innych językach, zobacz dokumentację języków, platform i integracji.

Przykładowe rozwiązanie języka C# z kodem towarzyszącym temu artykułowi jest dostępne w witrynie GitHub. Ten przykład dodaje kod instrumentacji usługi Application Insights do przykładu TopNWords . Jeśli nie znasz tego przykładu, najpierw spróbuj utworzyć i uruchomić topNWords. Ułatwi to zrozumienie podstawowego przepływu pracy usługi Batch przetwarzania zestawu wejściowych obiektów blob równolegle w wielu węzłach obliczeniowych.

Porada

Alternatywnie skonfiguruj rozwiązanie usługi Batch w celu wyświetlenia danych usługi Application Insights, takich jak liczniki wydajności maszyny wirtualnej w usłudze Batch Explorer. Batch Explorer to bezpłatne, rozbudowane, autonomiczne narzędzie klienckie ułatwiające tworzenie, debugowanie i monitorowanie aplikacji Azure Batch. Pobierz pakiet instalacyjny dla komputerów Mac lub systemu Linux albo Windows. Zobacz repozytorium batch-insights , aby uzyskać szybkie kroki umożliwiające włączenie danych usługi Application Insights w usłudze Batch Explorer.

Wymagania wstępne

Dodawanie usługi Application Insights do projektu

Pakiet NuGet Microsoft.ApplicationInsights.WindowsServer i jego zależności są wymagane dla projektu. Dodaj lub przywróć je do projektu aplikacji. Aby zainstalować pakiet, użyj Install-Package polecenia lub Menedżera pakietów NuGet.

Install-Package Microsoft.ApplicationInsights.WindowsServer

Odwoływanie się do usługi Application Insights z poziomu aplikacji .NET przy użyciu przestrzeni nazw Microsoft.ApplicationInsights .

Instrumentacja kodu

Aby instrumentować kod, rozwiązanie musi utworzyć telemetrię usługi Application InsightsClient. W tym przykładzie obiekt TelemetryClient ładuje konfigurację z pliku ApplicationInsights.config . Pamiętaj, aby zaktualizować ApplicationInsights.config w następujących projektach przy użyciu klucza instrumentacji usługi Application Insights: Microsoft.Azure.Batch.Samples.TelemetryStartTask i TopNWordsSample.

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

Dodaj również klucz instrumentacji w pliku TopNWords.cs.

W przykładzie pliku TopNWords.cs są używane następujące wywołania instrumentacji z interfejsu API usługi Application Insights:

  • TrackMetric() — Śledzi, jak długo, średnio, węzeł obliczeniowy trwa do pobrania wymaganego pliku tekstowego.
  • TrackTrace() — Dodaje wywołania debugowania do kodu.
  • TrackEvent() - Śledzi interesujące zdarzenia do przechwycenia.

W tym przykładzie celowo pomija się obsługę wyjątków. Zamiast tego usługa Application Insights automatycznie zgłasza nieobsługiwane wyjątki, co znacznie poprawia środowisko debugowania.

Poniższy fragment kodu ilustruje sposób użycia tych metod.

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

pomocnik inicjatora Azure Batch telemetrii

Podczas raportowania danych telemetrycznych dla danego serwera i wystąpienia usługa Application Insights używa roli maszyny wirtualnej platformy Azure i nazwy maszyny wirtualnej jako wartości domyślnych. W kontekście Azure Batch przykład pokazuje, jak zamiast tego użyć nazwy puli i nazwy węzła obliczeniowego. Użyj inicjatora telemetrii , aby zastąpić wartości domyślne.

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

Aby włączyć inicjator telemetrii, plik ApplicationInsights.config w projekcie TopNWordsSample zawiera następujące elementy:

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

Aktualizowanie zadania i zadań w celu uwzględnienia plików binarnych usługi Application Insights

Aby usługa Application Insights mogła działać poprawnie w węzłach obliczeniowych, upewnij się, że pliki binarne są poprawnie umieszczone. Dodaj wymagane pliki binarne do kolekcji plików zasobów zadania, aby były pobierane podczas wykonywania zadania. Poniższe fragmenty kodu są podobne do kodu w pliku Job.cs.

Najpierw utwórz statyczną listę plików usługi Application Insights do przekazania.

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

Następnie utwórz pliki przejściowe, które są używane przez zadanie.

...
// 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 jest funkcją pomocnika w przykładzie kodu, która umożliwia łatwe przekazywanie pliku z dysku lokalnego do obiektu blob usługi Azure Storage. Każdy plik jest później pobierany do węzła obliczeniowego i przywoływane przez zadanie.

Na koniec dodaj zadania do zadania i uwzględnij niezbędne pliki binarne usługi 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);
}

Wyświetlanie danych w Azure Portal

Po skonfigurowaniu zadania i zadań podrzędnych do używania usługi Application Insights uruchom przykładowe zadanie w puli. Przejdź do Azure Portal i otwórz zasób usługi Application Insights, który został aprowizacji. Po aprowizacji puli należy zacząć widzieć przepływ danych i zalogować się. W pozostałej części tego artykułu omówiono tylko kilka funkcji usługi Application Insights, ale możesz zapoznać się z pełnym zestawem funkcji.

Wyświetlanie danych transmisji strumieniowej na żywo

Aby wyświetlić dzienniki śledzenia w zasobie usługi Applications Insights, kliknij pozycję Transmisja strumieniowa na żywo. Poniższy zrzut ekranu przedstawia sposób wyświetlania danych na żywo pochodzących z węzłów obliczeniowych w puli, na przykład użycia procesora CPU na węzeł obliczeniowy.

Zrzut ekranu przedstawiający dane węzła obliczeniowego strumienia na żywo.

Wyświetlanie dzienników śledzenia

Aby wyświetlić dzienniki śledzenia w zasobie usługi Applications Insights, kliknij pozycję Wyszukaj. Ten widok przedstawia listę danych diagnostycznych przechwyconych przez usługę Application Insights, w tym ślady, zdarzenia i wyjątki.

Poniższy zrzut ekranu przedstawia sposób rejestrowania pojedynczego śledzenia zadania i późniejszego wykonywania zapytań na potrzeby debugowania.

Zrzut ekranu przedstawiający dzienniki dla pojedynczego śledzenia.

Wyświetlanie nieobsługiwane wyjątki

Usługa Application Insights rejestruje wyjątki zgłaszane przez aplikację. W takim przypadku w ciągu kilku sekund od zgłoszenia wyjątku można przejść do szczegółów określonego wyjątku i zdiagnozować problem.

Zrzut ekranu przedstawiający nieobsługiwane wyjątki.

Mierzenie czasu pobierania obiektu blob

Metryki niestandardowe są również cennym narzędziem w portalu. Można na przykład wyświetlić średni czas potrzebny na pobranie wymaganego pliku tekstowego, który przetwarzał każdy węzeł obliczeniowy.

Aby utworzyć przykładowy wykres:

  1. W zasobie usługi Application Insights kliknij pozycję Eksplorator >metrykDodaj wykres.
  2. Kliknij pozycję Edytuj na dodanym wykresie.
  3. Zaktualizuj szczegóły wykresu w następujący sposób:
    • Ustaw wartość Typ wykresu na Siatka.
    • Ustaw pozycję Agregacja na Wartość Średnia.
    • Ustaw pozycję Grupuj według na Wartość NodeId.
    • W obszarze Metryki wybierz pozycję Pobieranie niestandardowego>obiektu blob w ciągu kilku sekund.
    • Dostosuj paletę kolorów wyświetlania do wybranej opcji.

Zrzut ekranu przedstawiający wykres przedstawiający czas pobierania obiektów blob na węzeł.

Ciągłe monitorowanie węzłów obliczeniowych

Być może zauważysz, że wszystkie metryki, w tym liczniki wydajności, są rejestrowane tylko wtedy, gdy zadania są uruchomione. To zachowanie jest przydatne, ponieważ ogranicza ilość danych dzienników usługi Application Insights. Istnieją jednak przypadki, w których zawsze chcesz monitorować węzły obliczeniowe. Na przykład mogą uruchamiać pracę w tle, która nie jest zaplanowana za pośrednictwem usługi Batch. W takim przypadku skonfiguruj proces monitorowania, który będzie uruchamiany przez okres eksploatacji węzła obliczeniowego.

Jednym ze sposobów osiągnięcia tego zachowania jest zduplikowanie procesu, który ładuje bibliotekę usługi Application Insights i działa w tle. W tym przykładzie zadanie uruchamiania ładuje pliki binarne na maszynie i utrzymuje proces uruchomiony w nieskończoność. Skonfiguruj plik konfiguracji usługi Application Insights dla tego procesu, aby emitować interesujące Cię dodatkowe dane, takie jak liczniki wydajności.

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

Porada

Aby zwiększyć możliwości zarządzania rozwiązaniem, możesz powiązać zestaw w pakiecie aplikacji. Następnie, aby automatycznie wdrożyć pakiet aplikacji w pulach, dodaj odwołanie do pakietu aplikacji do konfiguracji puli.

Ograniczanie przepustowości i przykładowe dane

Ze względu na duży charakter aplikacji Azure Batch działających w środowisku produkcyjnym możesz ograniczyć ilość danych zebranych przez usługę Application Insights w celu zarządzania kosztami. Zobacz Próbkowanie w usłudze Application Insights, aby zapoznać się z niektórymi mechanizmami, aby to osiągnąć.

Następne kroki