Ukázkový kód pro odesílání dat do služby Azure Monitor pomocí rozhraní API pro příjem protokolů

Tento článek obsahuje ukázkový kód pomocí rozhraní API pro příjem protokolů. Každá ukázka vyžaduje, aby se před spuštěním kódu vytvořily následující komponenty. Viz kurz: Odesílání dat do služby Azure Monitor pomocí rozhraní API pro příjem protokolů (šablon Resource Manageru) pro kompletní názorný postup vytvoření těchto komponent nakonfigurovaných pro podporu každé z těchto ukázek.

  • Vlastní tabulka v pracovním prostoru služby Log Analytics
  • Pravidlo shromažďování dat (DCR) pro směrování dat do cílové tabulky
  • Aplikace Microsoft Entra s přístupem k DCR
  • Koncový bod shromažďování dat (DCE), pokud používáte privátní propojení. V opačném případě použijte koncový bod protokolů DCR.

Ukázkový kód

Následující skript používá klientskou knihovnu pro příjem dat služby Azure Monitor pro .NET.

  1. Nainstalujte klientskou knihovnu pro příjem dat služby Azure Monitor a knihovnu identit Azure. Pro ověřování použité v této ukázce se vyžaduje knihovna identit Azure.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Vytvořte následující proměnné prostředí s hodnotami pro vaši aplikaci Microsoft Entra. Tyto hodnoty se používají DefaultAzureCredential v knihovně identit Azure.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Nahraďte proměnné v následujícím vzorovém kódu hodnotami z vašeho DCR. Ukázková data můžete také nahradit vlastními daty.

    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. Spusťte kód a data by měla docházet do pracovního prostoru služby Log Analytics během několika minut.

Řešení problému

Tato část popisuje různé chybové stavy, které se můžou zobrazit a jak je opravit.

Skript vrátí kód chyby 403.

Ujistěte se, že máte správná oprávnění pro aplikaci k řadiči domény. Možná budete muset počkat až 30 minut, než se oprávnění rozšíří.

Skript vrátí kód chyby 413 nebo upozornění časového limituExpired se zprávou ReadyBody_ClientConnectionAbort v odpovědi.

Zpráva je příliš velká. Maximální velikost zprávy je aktuálně 1 MB na volání.

Skript vrátí kód chyby 429.

Došlo k překročení limitů rozhraní API. Omezení jsou aktuálně nastavená na 500 MB dat za minutu pro komprimovaná i nekomprimovaná data a 300 000 požadavků za minutu. Opakujte akci po době trvání uvedené v Retry-After hlavičce v odpovědi.

Skript vrátí kód chyby 503.

Ujistěte se, že máte správná oprávnění pro aplikaci k řadiči domény. Možná budete muset počkat až 30 minut, než se oprávnění rozšíří.

Nezobrazí se vám chyba, ale data se v pracovním prostoru nezobrazují

Příjem dat může nějakou dobu trvat, zejména při prvním odeslání dat do konkrétní tabulky. Nemělo by to trvat déle než 15 minut.

IntelliSense v Log Analytics nerozpozná novou tabulku

Aktualizace mezipaměti, která řídí technologii IntelliSense, může trvat až 24 hodin.

Další kroky