Codice di esempio per inviare dati a Monitoraggio di Azure usando l'API di inserimento dei log

Questo articolo fornisce codice di esempio usando l'API di inserimento log. Per ogni esempio è necessario creare i componenti seguenti prima dell'esecuzione del codice. Vedere Esercitazione: Inviare dati a Monitoraggio di Azure usando l'API di inserimento log (modelli di Resource Manager) per una procedura dettagliata completa sulla creazione di questi componenti configurati per supportare ognuno di questi esempi.

  • Tabella personalizzata in un'area di lavoro Log Analytics
  • Endpoint di raccolta dati (DCE) per ricevere i dati
  • Regola di raccolta dati (DCR) per indirizzare i dati alla tabella di destinazione
  • Applicazione Microsoft Entra con accesso al Registro Azure Container

Codice di esempio

Lo script seguente usa la libreria client di inserimento di Monitoraggio di Azure per .NET.

  1. Installare la libreria client di inserimento di Monitoraggio di Azure e la libreria di identità di Azure. La libreria di identità di Azure è necessaria per l'autenticazione usata in questo esempio.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Creare le variabili di ambiente seguenti con i valori per l'applicazione Microsoft Entra. Questi valori vengono usati da DefaultAzureCredential nella libreria di identità di Azure.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Sostituire le variabili nel codice di esempio seguente con i valori di DCE e DCR. È anche possibile sostituire i dati di esempio con i propri.

    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. Eseguire il codice e i dati devono arrivare nell'area di lavoro Log Analytics entro pochi minuti.

Risoluzione dei problemi

In questa sezione vengono descritte le diverse condizioni di errore che è possibile ricevere e come correggerle.

Lo script restituisce il codice di errore 403

Assicurarsi di disporre delle autorizzazioni corrette per l'applicazione nel Registro Azure Container. Potrebbe anche essere necessario attendere fino a 30 minuti per la propagazione delle autorizzazioni.

Lo script restituisce il codice di errore 413 o l'avviso timeoutExpired con il messaggio ReadyBody_Client Connessione ionAbort nella risposta

Il messaggio è troppo grande. La dimensione massima del messaggio è attualmente di 1 MB per ogni chiamata.

Lo script restituisce il codice di errore 429

Sono stati superati i limiti delle API. I limiti sono attualmente impostati su 500 MB di dati al minuto per dati compressi e non compressi e 300.000 richieste al minuto. Riprovare dopo la durata elencata nell'intestazione Retry-After nella risposta.

Lo script restituisce il codice di errore 503

Assicurarsi di disporre delle autorizzazioni corrette per l'applicazione nel Registro Azure Container. Potrebbe anche essere necessario attendere fino a 30 minuti per la propagazione delle autorizzazioni.

Non viene visualizzato un errore, ma i dati non vengono visualizzati nell'area di lavoro

L'inserimento dei dati potrebbe richiedere del tempo, in particolare la prima volta che i dati vengono inviati a una determinata tabella. Non dovrebbero essere necessari più di 15 minuti.

IntelliSense in Log Analytics non riconosce la nuova tabella

L'aggiornamento della cache che gestisce IntelliSense potrebbe richiedere fino a 24 ore.

Passaggi successivi