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
  • Datensammlungsendpunkts (Data Collection Endpoint, DCE) zum Empfangen von Daten
  • Datensammlungsregel (Data Collection Rule, DCR), um die Daten an die Zieltabelle zu leiten
  • Microsoft Entra-Anwendung mit Zugriff auf den DCR

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 DCE und Ihrer 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://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. 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