Código de exemplo para enviar dados para o Azure Monitor usando a API de ingestão de logs

Este artigo fornece código de exemplo usando a API de ingestão de logs. Cada exemplo requer que os seguintes componentes sejam criados antes que o código seja executado. Consulte Tutorial: Enviar dados para o Azure Monitor usando a API de ingestão de logs (modelos do Gerenciador de Recursos) para obter um passo a passo completo da criação desses componentes configurados para dar suporte a cada um desses exemplos.

  • Tabela personalizada em um espaço de trabalho do Log Analytics
  • Regra de coleta de dados (DCR) para direcionar os dados para a tabela de destino
  • Aplicação Microsoft Entra com acesso ao DCR
  • Ponto de extremidade de coleta de dados (DCE) se você estiver usando link privado. Caso contrário, use o ponto de extremidade de logs DCR.

Código de exemplo

O script a seguir usa a biblioteca de cliente do Azure Monitor Ingestion para .NET.

  1. Instale a biblioteca de cliente do Azure Monitor Ingestion e a biblioteca do Azure Identity. A biblioteca de Identidade do Azure é necessária para a autenticação usada neste exemplo.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Crie as seguintes variáveis de ambiente com valores para seu aplicativo Microsoft Entra. Esses valores são usados por DefaultAzureCredential na biblioteca de Identidade do Azure.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Substitua as variáveis no código de exemplo a seguir por valores do seu DCR. Você também pode querer substituir os dados de exemplo pelos seus.

    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. Execute o código e os dados devem chegar ao seu espaço de trabalho do Log Analytics em poucos minutos.

Resolução de Problemas

Esta seção descreve as diferentes condições de erro que você pode receber e como corrigi-las.

O script retorna o código de erro 403

Verifique se você tem as permissões corretas para seu aplicativo para o DCR. Também pode ser necessário aguardar até 30 minutos para que as permissões se propaguem.

O script retorna o código de erro 413 ou aviso de TimeoutExpired com a mensagem ReadyBody_ClientConnectionAbort na resposta

A mensagem é demasiado grande. Atualmente, o tamanho máximo da mensagem é de 1 MB por chamada.

O script retorna o código de erro 429

Os limites da API foram excedidos. Atualmente, os limites estão definidos para 500 MB de dados por minuto para dados compactados e não compactados e 300.000 solicitações por minuto. Tente novamente após a duração listada Retry-After no cabeçalho da resposta.

O script retorna o código de erro 503

Verifique se você tem as permissões corretas para seu aplicativo para o DCR. Também pode ser necessário aguardar até 30 minutos para que as permissões se propaguem.

Você não recebe um erro, mas os dados não aparecem no espaço de trabalho

Os dados podem levar algum tempo para serem ingeridos, especialmente na primeira vez que os dados estão sendo enviados para uma tabela específica. Não deve demorar mais do que 15 minutos.

O IntelliSense no Log Analytics não reconhece a nova tabela

O cache que conduz o IntelliSense pode levar até 24 horas para ser atualizado.

Próximos passos