Partilhar via


Código de exemplo para enviar dados ao 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 componentes a seguir sejam criados antes que o código seja executado. Confira Tutorial: Como enviar dados para o Azure Monitor usando a API de ingestão de logs (exemplos 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.

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

Código de exemplo

O código de exemplo a seguir usa a biblioteca de clientes de Ingestão do Azure Monitor para Python.

  1. Instale a biblioteca de clientes de Ingestão do Azure Monitor e a biblioteca de identidade do Azure. 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 variáveis de ambiente a seguir com valores para o seu aplicativo do Microsoft Entra. Esses valores são usados pela 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 de DCR. Talvez você também queira 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 workspace do Log Analytics em alguns minutos.

Solução de problemas

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

O script retorna o código de erro 403

Verifique se você tem as permissões corretas do aplicativo para a DCR. Talvez você também precise aguardar até 30 minutos até que as permissões se propaguem.

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

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

O script retorna o código de erro 429

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

O script retorna o código de erro 503

Verifique se você tem as permissões corretas do aplicativo para a DCR. Talvez você também precise aguardar até 30 minutos até que as permissões se propaguem.

Você não recebe um erro, mas os dados não aparecem no workspace

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

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

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

Próximas etapas