Пример кода для отправки данных в Azure Monitor с помощью API приема журналов

В этой статье приведен пример кода с помощью API приема журналов. Для каждого примера необходимо создать следующие компоненты перед выполнением кода. См . руководство. Отправка данных в Azure Monitor с помощью API приема журналов (шаблонов Resource Manager) для полного пошагового руководства по созданию этих компонентов, настроенных для поддержки каждого из этих примеров.

  • Настраиваемая таблица в рабочей области Log Analytics
  • Правило сбора данных (DCR) для перенаправления данных в целевую таблицу
  • Приложение Microsoft Entra с доступом к DCR
  • Конечная точка сбора данных (DCE), если вы используете приватный канал. В противном случае используйте конечную точку журналов DCR.

Пример кода

В следующем скрипте используется клиентская библиотека приема Azure Monitor для .NET.

  1. Установите клиентную библиотеку Приема Azure Monitor и библиотеку удостоверений Azure. Библиотека удостоверений Azure необходима для проверки подлинности, используемой в этом примере.

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Создайте следующие переменные среды со значениями для приложения Microsoft Entra. Эти значения используются DefaultAzureCredential в библиотеке удостоверений Azure.

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. Замените переменные в следующем примере кода значениями из DCR. Вы также можете заменить примеры данных собственными.

    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. Выполните код, и данные должны поступать в рабочую область Log Analytics в течение нескольких минут.

Устранение неполадок

В этом разделе описаны различные условия ошибки, которые могут возникнуть и как их исправить.

Сценарий возвращает код ошибки 403

Убедитесь, что у вас есть необходимые разрешения для приложения в правиле сбора данных. Также может потребоваться ждать до 30 минут для распространения разрешений.

Скрипт возвращает код ошибки 413 или предупреждение TimeoutExpired с сообщением ReadyBody_ClientConnectionAbort в ответе

Сообщение слишком большое. Максимальный размер сообщения в настоящее время составляет 1 МБ на вызов.

Сценарий возвращает код ошибки 429

Превышены ограничения для API. Ограничения в настоящее время устанавливаются в 500 МБ данных в минуту для сжатых и несжатых данных и 300 000 запросов в минуту. Повторите попытку через интервал, указанный в заголовке Retry-After в ответе.

Сценарий возвращает код ошибки 503

Убедитесь, что у вас есть необходимые разрешения для приложения в правиле сбора данных. Также может потребоваться ждать до 30 минут для распространения разрешений.

Вы не получаете сообщение об ошибке, но данные не отображаются в рабочей области

Данные могут занять некоторое время для приема, особенно при первом отправке данных в определенную таблицу. Это не должно занять больше 15 минут.

IntelliSense в Log Analytics не распознает новую таблицу

Кэш, который управляет IntelliSense, может занять до 24 часов для обновления.

Следующие шаги