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

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

  • Настраиваемая таблица в рабочей области Log Analytics
  • Конечная точка сбора данных (DCE) для получения данных
  • Правило сбора данных (DCR) для перенаправления данных в целевую таблицу
  • Приложение Microsoft Entra с доступом к 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. Замените переменные в следующем примере кода значениями из DCE и DCR. Вы также можете заменить примеры данных собственными.

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

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

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

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

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

Скрипт возвращает код ошибки 413 или предупреждение TimeoutExpired с сообщением ReadyBody_Client Подключение ionAbort в ответе

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

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

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

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

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

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

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

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

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

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