Udostępnij za pośrednictwem


Przykładowy kod do wysyłania danych do usługi Azure Monitor przy użyciu interfejsu API pozyskiwania dzienników

Ten artykuł zawiera przykładowy kod przy użyciu interfejsu API pozyskiwania dzienników. Każdy przykład wymaga utworzenia następujących składników przed uruchomieniem kodu. Zobacz Samouczek: wysyłanie danych do usługi Azure Monitor przy użyciu interfejsu API pozyskiwania dzienników (szablony usługi Resource Manager), aby zapoznać się z kompletnym przewodnikiem tworzenia tych składników skonfigurowanych do obsługi każdego z tych przykładów.

  • Tabela niestandardowa w obszarze roboczym usługi Log Analytics
  • Reguła zbierania danych (DCR) w celu przekierowania danych do tabeli docelowej
  • Aplikacja Microsoft Entra z dostępem do kontrolera domeny
  • Punkt końcowy zbierania danych (DCE), jeśli używasz łącza prywatnego. W przeciwnym razie użyj punktu końcowego dzienników dcR.

Przykładowy kod

Poniższy skrypt używa biblioteki klienta pozyskiwania usługi Azure Monitor dla platformy .NET.

  1. Zainstaluj bibliotekę klienta pozyskiwania usługi Azure Monitor i bibliotekę tożsamości platformy Azure. Biblioteka tożsamości platformy Azure jest wymagana do uwierzytelniania używanego w tym przykładzie.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Utwórz następujące zmienne środowiskowe z wartościami dla aplikacji Firmy Microsoft Entra. Te wartości są używane w DefaultAzureCredential bibliotece tożsamości platformy Azure.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Zastąp zmienne w poniższym przykładowym kodzie wartościami z kontrolera DOMENY. Możesz również zastąpić przykładowe dane własnymi.

    using Azure;
    using Azure.Core;
    using Azure.Identity;
    using Azure.Monitor.Ingestion;
    
    // Initialize variables
    var endpoint = new Uri("https://my-url.monitor.azure.com");
    var ruleId = "dcr-00000000000000000000000000000000";
    var streamName = "Custom-MyTableRawData";
    
    // Create credential and client
    var credential = new DefaultAzureCredential();
    LogsIngestionClient client = new(endpoint, credential);
    
    DateTimeOffset currentTime = DateTimeOffset.UtcNow;
    
    // Use BinaryData to serialize instances of an anonymous type into JSON
    BinaryData data = BinaryData.FromObjectAsJson(
        new[] {
            new
            {
                Time = currentTime,
                Computer = "Computer1",
                AdditionalContext = new
                {
                    InstanceName = "user1",
                    TimeZone = "Pacific Time",
                    Level = 4,
                    CounterName = "AppMetric1",
                    CounterValue = 15.3
                }
            },
            new
            {
                Time = currentTime,
                Computer = "Computer2",
                AdditionalContext = new
                {
                    InstanceName = "user2",
                    TimeZone = "Central Time",
                    Level = 3,
                    CounterName = "AppMetric1",
                    CounterValue = 23.5
                }
            },
        });
    
    // Upload logs
    try
    {
        var response = await client.UploadAsync(ruleId, streamName, RequestContent.Create(data)).ConfigureAwait(false);
        if (response.IsError)
        {
            throw new Exception(response.ToString());
        }
    
        Console.WriteLine("Log upload completed using content upload");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Upload failed with Exception: " + ex.Message);
    }
    
    // Logs can also be uploaded in a List
    var entries = new List<object>();
    for (int i = 0; i < 10; i++)
    {
        entries.Add(
            new
            {
                Time = currentTime,
                Computer = "Computer" + i.ToString(),
                AdditionalContext = new
                {
                    InstanceName = "user" + i.ToString(),
                    TimeZone = "Central Time",
                    Level = 3,
                    CounterName = "AppMetric1" + i.ToString(),
                    CounterValue = i
                }
            }
        );
    }
    
    // Make the request
    try
    {
        var response = await client.UploadAsync(ruleId, streamName, entries).ConfigureAwait(false);
        if (response.IsError)
        {
            throw new Exception(response.ToString());
        }
    
        Console.WriteLine("Log upload completed using list of entries");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Upload failed with Exception: " + ex.Message);
    }
    
  4. Wykonaj kod, a dane powinny zostać dostarczone do obszaru roboczego usługi Log Analytics w ciągu kilku minut.

Rozwiązywanie problemów

W tej sekcji opisano różne warunki błędu, które mogą zostać odebrane i jak je poprawić.

Skrypt zwraca kod błędu 403

Upewnij się, że masz odpowiednie uprawnienia dla aplikacji do kontrolera domeny. Może być również konieczne odczekanie do 30 minut, zanim uprawnienia będą propagowane.

Skrypt zwraca kod błędu 413 lub ostrzeżenie timeoutExpired z komunikatem ReadyBody_ClientConnectionAbort w odpowiedzi

Komunikat jest za duży. Maksymalny rozmiar komunikatu wynosi obecnie 1 MB na wywołanie.

Skrypt zwraca kod błędu 429

Przekroczono limity interfejsu API. Limity są obecnie ustawione na 500 MB danych na minutę dla skompresowanych i nieskompresowanych danych oraz 300 000 żądań na minutę. Ponów próbę po upływie czasu trwania wymienionego w nagłówku Retry-After w odpowiedzi.

Skrypt zwraca kod błędu 503

Upewnij się, że masz odpowiednie uprawnienia dla aplikacji do kontrolera domeny. Może być również konieczne odczekanie do 30 minut, zanim uprawnienia będą propagowane.

Nie otrzymujesz błędu, ale dane nie są wyświetlane w obszarze roboczym

Pozyskiwanie danych może zająć trochę czasu, zwłaszcza gdy dane są wysyłane po raz pierwszy do określonej tabeli. Nie powinno to trwać dłużej niż 15 minut.

Funkcja IntelliSense w usłudze Log Analytics nie rozpoznaje nowej tabeli

Aktualizacja pamięci podręcznej obsługującej funkcję IntelliSense może potrwać do 24 godzin.

Następne kroki