Exempelkod för att skicka data till Azure Monitor med hjälp av API för logginmatning

Den här artikeln innehåller exempelkod med hjälp av API:et för logginmatning. Varje exempel kräver att följande komponenter skapas innan koden körs. Se Självstudie: Skicka data till Azure Monitor med hjälp av API för logginmatning (Resource Manager-mallar) för en fullständig genomgång av hur du skapar dessa komponenter som konfigurerats för att stödja vart och ett av dessa exempel.

  • Anpassad tabell på en Log Analytics-arbetsyta
  • Datainsamlingsslutpunkt (DCE) för att ta emot data
  • Datainsamlingsregel (DCR) för att dirigera data till måltabellen
  • Microsoft Entra-program med åtkomst till DCR

Exempelkod

Följande skript använder Azure Monitor Ingestion-klientbiblioteket för .NET.

  1. Installera Azure Monitor Ingestion-klientbiblioteket och Azure Identity-biblioteket. Azure Identity-biblioteket krävs för den autentisering som används i det här exemplet.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Skapa följande miljövariabler med värden för ditt Microsoft Entra-program. Dessa värden används av DefaultAzureCredential i Azure Identity-biblioteket.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Ersätt variablerna i följande exempelkod med värden från din DCE och DCR. Du kanske också vill ersätta exempeldata med dina egna.

    using Azure;
    using Azure.Core;
    using Azure.Identity;
    using Azure.Monitor.Ingestion;
    
    // Initialize variables
    var endpoint = new Uri("https://logs-ingestion-rzmk.eastus2-1.ingest.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
    {
        Response response = client.Upload(ruleId, streamName, RequestContent.Create(data));
    }
    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 = recordingNow,
                Computer = "Computer" + i.ToString(),
                AdditionalContext = i
            }
        );
    }
    
    // Make the request
    LogsUploadOptions options = new LogsUploadOptions();
    bool isTriggered = false;
    options.UploadFailed += Options_UploadFailed;
    await client.UploadAsync(TestEnvironment.DCRImmutableId, TestEnvironment.StreamName, entries, options).ConfigureAwait(false);
    
    Task Options_UploadFailed(LogsUploadFailedEventArgs e)
    {
        isTriggered = true;
        Console.WriteLine(e.Exception);
        foreach (var log in e.FailedLogs)
        {
            Console.WriteLine(log);
        }
        return Task.CompletedTask;
    }
    
  4. Kör koden och data ska komma till Log Analytics-arbetsytan inom några minuter.

Felsökning

I det här avsnittet beskrivs olika feltillstånd som du kan få och hur du korrigerar dem.

Skript returnerar felkod 403

Kontrollera att du har rätt behörigheter för ditt program till DCR. Du kan också behöva vänta upp till 30 minuter innan behörigheter sprids.

Skript returnerar felkod 413 eller varning om TimeoutExpired med meddelandet ReadyBody_Client Anslut ionAbort i svaret

Meddelandet är för stort. Den maximala meddelandestorleken är för närvarande 1 MB per anrop.

Skriptet returnerar felkod 429

API-gränserna har överskridits. Gränserna är för närvarande inställda på 500 MB data per minut för både komprimerade och okomprimerade data och 300 000 begäranden per minut. Försök igen efter varaktigheten Retry-After som anges i rubriken i svaret.

Skriptet returnerar felkoden 503

Kontrollera att du har rätt behörigheter för ditt program till DCR. Du kan också behöva vänta upp till 30 minuter innan behörigheter sprids.

Du får inget fel, men data visas inte på arbetsytan

Det kan ta lite tid att mata in data, särskilt första gången data skickas till en viss tabell. Det bör inte ta längre tid än 15 minuter.

IntelliSense i Log Analytics känner inte igen den nya tabellen

Cacheminnet som driver IntelliSense kan ta upp till 24 timmar att uppdatera.

Nästa steg