Beispielcode zum Senden von Daten an Azure Monitor mithilfe der Protokollerfassungs-API

Dieser Artikel enthält Beispielcode für die Verwendung der Protokollerfassungs-API. Für jedes Beispiel müssen die folgenden Komponenten erstellt werden, bevor der Code ausgeführt wird. Eine vollständige Vorgehensweise zum Erstellen dieser Komponenten, die zur Unterstützung jedes dieser Beispiele konfiguriert sind, finden Sie unter Tutorial: Senden von Daten an Azure Monitor mithilfe der Protokollerfassungs-API (Resource Manager-Vorlagen).

  • Benutzerdefinierte Tabelle in einem Log Analytics-Arbeitsbereich
  • Datensammlungsregel (Data Collection Rule, DCR), um die Daten an die Zieltabelle zu leiten
  • Microsoft Entra-Anwendung mit Zugriff auf den DCR
  • Datensammlungsendpunkt (DATA Collection Endpoint, DCE), wenn Sie einen privaten Link verwenden. Verwenden Sie andernfalls den DCR-Protokollendpunkt.

Beispielcode

Der folgende Beispielcode verwendet die Azure Monitor-Erfassungsclientbibliothek für .Net.

  1. Installieren Sie die Azure Monitor-Erfassungsclientbibliothek und die Azure Identity-Bibliothek. Die Azure Identity-Bibliothek ist für die in diesem Beispiel verwendete Authentifizierung erforderlich.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Erstellen Sie die folgenden Umgebungsvariablen mit Werten für Ihre Microsoft Entra-Anwendung. Diese Werte werden von DefaultAzureCredential in der Azure Identity-Bibliothek verwendet.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Ersetzen Sie die Variablen im folgenden Beispielcode mit Werten aus Ihrem DCR. Vielleicht wollen Sie auch die Beispieldaten mit Ihren eigenen Daten ersetzen.

    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. Führen Sie den Code aus, und die Daten sollten innerhalb weniger Minuten in Ihrem Log Analytics-Arbeitsbereich eintreffen.

Problembehandlung

In diesem Abschnitt werden verschiedene Fehlerbedingungen, die auftreten können, und deren Behebung beschrieben.

Rückgabe des Fehlercodes 403 durch das Skript

Vergewissern Sie sich, dass Sie über die richtigen Berechtigungen für Ihre Anwendung für die DCR verfügen. Sie müssen u. U. auch bis zu 30 Minuten warten, bis Berechtigungen weitergegeben werden.

Rückgabe des Fehlercodes 413 oder einer Warnung TimeoutExpired mit der Meldung „ReadyBody_ClientConnectionAbort“ in der Antwort durch das Skript

Die Nachricht ist zu lang. Die maximale Nachrichtengröße beträgt derzeit 1 MB pro Aufruf.

Rückgabe des Fehlercodes 429 durch das Skript

Die API-Grenzwerte wurden überschritten. Die Grenzwerte sind derzeit auf 500 MB Daten pro Minute für komprimierte und nicht komprimierte Daten sowie auf 300.000 Anforderungen pro Minute festgelegt. Wiederholen Sie den Vorgang nach der Zeitspanne, die im Retry-After-Header in der Antwort aufgeführt wird.

Rückgabe des Fehlercodes 503 durch das Skript

Vergewissern Sie sich, dass Sie über die richtigen Berechtigungen für Ihre Anwendung für die DCR verfügen. Sie müssen u. U. auch bis zu 30 Minuten warten, bis Berechtigungen weitergegeben werden.

Sie erhalten keinen Fehler, aber Daten werden nicht im Arbeitsbereich angezeigt

Die Erfassung der Daten kann einige Zeit dauern, insbesondere wenn sie erstmalig an eine bestimmte Tabelle gesendet werden. Dieser Vorgang sollte jedoch nicht länger als 15 Minuten dauern.

Die neue Tabelle wird von IntelliSense in Log Analytics nicht erkannt

Die Aktualisierung des Caches, auf dem IntelliSense basiert, kann bis zu 24 Stunden dauern.

Nächste Schritte