Exemple de code pour envoyer des données à Azure Monitor à l’aide de l’API d’ingestion des journaux

Cet article fournit un exemple de code à l’aide de l’API d’ingestion des journaux. Chaque exemple nécessite la création des composants suivants avant l’exécution du code. Consultez Tutoriel : Envoyer des données à Azure Monitor à l’aide de l’API d’ingestion de journaux (Resource Manager modèles) pour obtenir une procédure pas à pas complète de la création de ces composants configurés pour prendre en charge chacun de ces exemples.

  • Table personnalisée dans un espace de travail Log Analytics
  • Point de terminaison de collecte de données (DCE) pour recevoir des données
  • Règle de collecte de données (DCR) pour diriger les données vers la table cible
  • Application Microsoft Entra avec accès à la DCR

Exemple de code

Le script suivant utilise la bibliothèque de client d’ingestion Azure Monitor pour .NET.

  1. Installez la bibliothèque de client d’ingestion Azure Monitor et la bibliothèque d’identité Azure. La bibliothèque Azure Identity est requise pour l’authentification utilisée dans cet exemple.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Créez les variables d’environnement suivantes avec des valeurs pour votre application Microsoft Entra. Ces valeurs sont utilisées par DefaultAzureCredential dans la bibliothèque Azure Identity.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Remplacez les variables de l’exemple de code suivant par les valeurs de votre DCE et de votre DCR. Vous voudrez sûrement remplacer l’échantillon de donnée avec le votre.

    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. Exécuter le code et les données doivent arriver dans votre espace de travail Log Analytics en quelques minutes.

Dépannage

Cette section décrit différentes conditions d’erreur que vous pouvez recevoir et explique comment les résoudre.

Le script renvoie le code d’erreur 403

Assurez-vous que vous disposez des autorisations appropriées pour votre application pour la règle DCR. Vous devrez peut-être également attendre jusqu’à 30 minutes pour que les autorisations se propagent.

Le script retourne le code d’erreur 413 ou l’avertissement TimeoutExpired avec le message ReadyBody_ClientConnectionAbort dans la réponse

Le message est trop volumineux. La taille de message maximale est actuellement de 1 Mo par appel.

Le script renvoie le code d’erreur 429

Les limites de débit de l’API ont été dépassées. Les limites sont actuellement définies sur 500 Mo de données par minute, pour les données compressées et non compressées, et sur 300 000 demandes par minute. Réessayez après la durée indiquée dans l’en-tête Retry-After de la réponse.

Le script renvoie le code d’erreur 503

Assurez-vous que vous disposez des autorisations appropriées pour votre application pour la règle DCR. Vous devrez peut-être également attendre jusqu’à 30 minutes pour que les autorisations se propagent.

Vous ne recevez pas d’erreur, mais les données ne s’affichent pas dans l’espace de travail

L’ingestion des données peut prendre un certain temps, surtout en cas d’envoi de données à une table particulière pour la première fois. Cette opération ne doit pas durer plus de 15 minutes.

Dans Log Analytics, IntelliSense ne reconnaît pas la nouvelle table

La mise à jour du cache qui pilote IntelliSense peut prendre jusqu’à 24 heures.

Étapes suivantes