Прочитать на английском

Поделиться через


Добавление и изменение Azure Monitor OpenTelemetry для приложений .NET, Java, Node.js и Python

В этой статье содержатся инструкции по добавлению и изменению OpenTelemetry для приложений с помощью Azure Monitor Application Insights.

Дополнительные сведения о концепциях OpenTelemetry см. в статье Обзор OpenTelemetry или Вопросы и ответы по OpenTelemetry.

Автоматический сбор данных

Дистрибутивы автоматически собирают данные путем объединение библиотек инструментирования OpenTelemetry.

Включенные библиотеки инструментирования

Запросы

  • Потребители JMS
  • Потребители Kafka
  • Netty;
  • Quartz
  • RabbitMQ
  • Сервлеты
  • Планирование Spring

Примечание

Servlet и Netty autoinstrumentation охватывают большинство служб Java HTTP, включая Java EE, Jakarta EE, Spring Boot, Quarkus и Micronaut.

Зависимости (плюс распространение распределенной трассировки внизу)

  • Apache HttpClient
  • Apache HttpAsyncClient
  • AsyncHttpClient
  • Google HttpClient
  • gRPC;
  • java.net.HttpURLConnection
  • Java 11 HttpClient
  • Клиент JAX-RS
  • Jetty HttpClient
  • JMS;
  • Kafka
  • Клиент Netty
  • OkHttp;
  • RabbitMQ

Зависимости (без распространения распределенной трассировки внизу)

  • Cassandra
  • JDBC
  • MongoDB (Async и Sync)
  • Redis (Lettuce и Jedis)

Метрики

  • Метрики микрометра, включая метрики Spring Boot Actuator
  • Метрики JMX

Журналы

  • Обратная обратная связь (включая свойства MDC) no mware
  • Log4j (включая свойства контекста MDC/Thread) NO MWARE
  • Ведение журнала JBoss (в том числе свойства MDC) NO NO
  • java.util.logging NO FX

Коллекция по умолчанию

Данные телеметрии, создаваемые следующими пакетами SDK Azure, автоматически собираются по умолчанию:

[//]: # "Azure Cosmos DB 4.22.0+ due to https://github.com/Azure/azure-sdk-for-java/pull/25571"
[//]: # "the remaining above names and links scraped from https://azure.github.io/azure-sdk/releases/latest/java.html"
[//]: # "and version synched manually against the oldest version in maven central built on azure-core 1.14.0"
[//]: # ""
[//]: # "var table = document.querySelector('#tg-sb-content > div > table')"
[//]: # "var str = ''"
[//]: # "for (var i = 1, row; row = table.rows[i]; i++) {"
[//]: # "  var name = row.cells[0].getElementsByTagName('div')[0].textContent.trim()"
[//]: # "  var stableRow = row.cells[1]"
[//]: # "  var versionBadge = stableRow.querySelector('.badge')"
[//]: # "  if (!versionBadge) {"
[//]: # "    continue"
[//]: # "  }"
[//]: # "  var version = versionBadge.textContent.trim()"
[//]: # "  var link = stableRow.querySelectorAll('a')[2].href"
[//]: # "  str += '* [' + name + '](' + link + ') ' + version + '\n'"
[//]: # "}"
[//]: # "console.log(str)"

Сноски

  • NO. Поддерживает автоматическую отчетность необработанных и неуправляемых исключений.
  • 2. Поддерживает метрики OpenTelemetry
  • Fx. По умолчанию ведение журнала собирается только на уровне INFO или выше. Чтобы изменить этот параметр, см . параметры конфигурации.
  • ⁴. По умолчанию ведение журнала собирается только при выполнении этого ведения журнала на уровне ПРЕДУПРЕЖДЕНИЯ или выше.

Примечание

Дистрибутивы OpenTelemetry Azure Monitor включают настраиваемое сопоставление и логику для автоматического выдачи стандартных метрик Application Insights.

Совет

Все метрики OpenTelemetry, собираемые автоматически из библиотек инструментирования или вручную собранные из пользовательского кода, в настоящее время считаются Application Insights "пользовательскими метриками" для выставления счетов. Подробнее.

Добавление библиотеки инструментирования сообщества

Вы можете автоматически собирать дополнительные данные при включении библиотек инструментирования из сообщества OpenTelemetry.

Внимание!

Мы не поддерживаем или не гарантируем качество библиотек инструментирования сообщества. Чтобы предложить один для нашего дистрибутива, публикации или голосования в нашем сообществе отзывов. Помните, что некоторые из них основаны на экспериментальных спецификациях OpenTelemetry и могут ввести будущие критические изменения.

Вы не можете расширить дистрибутив Java с помощью библиотек инструментирования сообщества. Чтобы запросить включение другой библиотеки инструментирования, откройте проблему на странице GitHub. Ссылку на страницу GitHub можно найти на следующей странице.

Сбор пользовательских данных телеметрии

В этом разделе объясняется, как собирать пользовательские данные телеметрии из приложения.

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

  • OpenTelemetry API
  • Библиотеки журналов и метрик для конкретного языка
  • Классический API Application Insights

В следующей таблице представлены поддерживаемые в настоящее время пользовательские типы телеметрии:

Язык Пользовательские события Пользовательские метрики Зависимости Исключения Просмотры страницы Запросы Трассировки
ASP.NET Core
   OpenTelemetry API Да Да Да Да
   API ILogger Да
   Классический API ИИ
Java
   OpenTelemetry API Да Да Да Да
   Logback, Log4j, JUL Да Да
   Метрики Micrometer Да
   Классический API ИИ Да Да Да Да Да Да Да
Node.js
   OpenTelemetry API Да Да Да Да
Python
   OpenTelemetry API Да Да Да Да
   Модуль ведения журнала Python Да
   Расширение событий Да Да

Примечание

Application Insights Java 3.x прослушивает данные телеметрии, отправляемые в классический API Application Insights. Аналогичным образом Application Insights Node.js 3.x собирает события, созданные с помощью классического API Application Insights. Это упрощает обновление и заполняет пробел в нашей пользовательской поддержке телеметрии до тех пор, пока все пользовательские типы телеметрии не будут поддерживаться через API OpenTelemetry.

Добавление пользовательских метрик

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

API OpenTelemetry предлагает шесть инструментов для покрытия различных сценариев метрик и необходимо выбрать правильный тип агрегирования при визуализации метрик в обозревателе метрик. Это требование верно при использовании API метрик OpenTelemetry для отправки метрик и при использовании библиотеки инструментирования.

В следующей таблице показаны рекомендуемые типы агрегирования для каждого из инструментов метрик OpenTelemetry.

Инструмент OpenTelemetry Тип агрегирования Azure Monitor
Счетчик Sum
Асинхронный счетчик Sum
Гистограмма Min, Max, Average, Sum и Count
Асинхронный датчик По средней
UpDownCounter Sum
Асинхронный upDownCounter Sum

Внимание!

Типы агрегирования за пределами того, что показано в таблице, обычно не являются значимыми.

Спецификация OpenTelemetry описывает инструменты и приводит примеры использования каждого из них.

Совет

Гистограмма является наиболее универсальным и наиболее тесно эквивалентным классическому API Application Insights GetMetric. Azure Monitor в настоящее время сглаживает инструмент гистограммы в наших пяти поддерживаемых типах агрегирования и поддерживает процентиль. Хотя и менее универсальный, другие инструменты OpenTelemetry оказывают меньшее влияние на производительность вашего приложения.

Пример гистограммы

Java
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.Meter;

public class Program {

    public static void main(String[] args) {
        Meter meter = GlobalOpenTelemetry.getMeter("OTEL.AzureMonitor.Demo");
        DoubleHistogram histogram = meter.histogramBuilder("histogram").build();
        histogram.record(1.0);
        histogram.record(100.0);
        histogram.record(30.0);
    }
}

Пример счетчика

Java
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;

public class Program {

    public static void main(String[] args) {
        Meter meter = GlobalOpenTelemetry.getMeter("OTEL.AzureMonitor.Demo");

        LongCounter myFruitCounter = meter
                .counterBuilder("MyFruitCounter")
                .build();

        myFruitCounter.add(1, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "red"));
        myFruitCounter.add(2, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
        myFruitCounter.add(1, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
        myFruitCounter.add(2, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "green"));
        myFruitCounter.add(5, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "red"));
        myFruitCounter.add(4, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
    }
}

Пример датчика

Java
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter;

public class Program {

    public static void main(String[] args) {
        Meter meter = GlobalOpenTelemetry.getMeter("OTEL.AzureMonitor.Demo");

        meter.gaugeBuilder("gauge")
                .buildWithCallback(
                        observableMeasurement -> {
                            double randomNumber = Math.floor(Math.random() * 100);
                            observableMeasurement.record(randomNumber, Attributes.of(AttributeKey.stringKey("testKey"), "testValue"));
                        });
    }
}

Добавление настраиваемых исключений

Выберите библиотеки инструментирования автоматически сообщать об исключениях в Application Insights. Однако может потребоваться вручную сообщать об исключениях за пределами отчетов библиотек инструментирования. Например, исключения, пойманные кодом, обычно не сообщаются. Вы можете сообщить о них, чтобы привлечь внимание к соответствующим интерфейсам, включая разделы сбоев и сквозные представления транзакций.

Можно использовать opentelemetry-api для обновления состояния исключений диапазона и записи.

  1. Добавьте opentelemetry-api-1.0.0.jar (или более поздней версии) в приложение:

    XML
    <dependency>
      <groupId>io.opentelemetry</groupId>
      <artifactId>opentelemetry-api</artifactId>
      <version>1.0.0</version>
    </dependency>
    
  2. Задайте состояние error и запишите исключение в коде:

    Java
     import io.opentelemetry.api.trace.Span;
     import io.opentelemetry.api.trace.StatusCode;
    
     Span span = Span.current();
     span.setStatus(StatusCode.ERROR, "errorMessage");
     span.recordException(e);
    

Добавление настраиваемых диапазонов

Может потребоваться добавить пользовательский диапазон в двух сценариях. Во-первых, когда запрос на зависимость еще не собирается библиотекой инструментирования. Во-вторых, когда вы хотите моделировать процесс приложения в виде диапазона в сквозном представлении транзакций.

  • Использование заметки OpenTelemetry

    Самый простой способ добавления собственных диапазонов — с помощью заметки OpenTelemetry @WithSpan .

    Диапазоны заполняют таблицы requests и dependencies в Application Insights.

    1. Добавьте opentelemetry-instrumentation-annotations-1.32.0.jar (или более поздней версии) в приложение:

      XML
      <dependency>
          <groupId>io.opentelemetry.instrumentation</groupId>
          <artifactId>opentelemetry-instrumentation-annotations</artifactId>
          <version>1.32.0</version>
      </dependency>
      
    2. Используйте заметку @WithSpan, чтобы создавать интервал при каждом выполнении метода:

      Java
      import io.opentelemetry.instrumentation.annotations.WithSpan;
      
      @WithSpan(value = "your span name")
      public void yourMethod() {
      }
      

    По умолчанию диапазон заканчивается в таблице с типом dependencies InProcзависимостей.

    Для методов, представляющих фоновое задание, не захваченное автоинструментацией, рекомендуется применить атрибут kind = SpanKind.SERVER к @WithSpan заметке, чтобы убедиться, что они отображаются в таблице Application Insights requests .

  • Использование API OpenTelemetry

    Если предыдущая заметка OpenTelemetry @WithSpan не соответствует вашим потребностям, можно добавить диапазоны с помощью API OpenTelemetry.

    1. Добавьте opentelemetry-api-1.0.0.jar (или более поздней версии) в приложение:

      XML
      <dependency>
          <groupId>io.opentelemetry</groupId>
          <artifactId>opentelemetry-api</artifactId>
          <version>1.0.0</version>
      </dependency>
      
    2. GlobalOpenTelemetry Используйте класс для создания Tracer:

      Java
      import io.opentelemetry.api.GlobalOpenTelemetry;
      import io.opentelemetry.api.trace.Tracer;
      
      static final Tracer tracer = GlobalOpenTelemetry.getTracer("com.example");
      
    3. Создайте диапазон, сделайте его текущим, а затем завершите его:

      Java
      Span span = tracer.spanBuilder("my first span").startSpan();
      try (Scope ignored = span.makeCurrent()) {
          // do stuff within the context of this 
      } catch (Throwable t) {
          span.recordException(t);
      } finally {
          span.end();
      }
      

Отправка пользовательской телеметрии с помощью классического API Application Insights

Мы рекомендуем использовать API OpenTelemetry по возможности, но некоторые сценарии могут возникнуть при использовании классического API Application Insights.

  1. Добавьте applicationinsights-core в свое приложение:

    XML
    <dependency>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>applicationinsights-core</artifactId>
      <version>3.4.18</version>
    </dependency>
    
  2. Создайте экземпляр TelemetryClient:

    Java
    static final TelemetryClient telemetryClient = new TelemetryClient();
    
  3. Используйте клиент для отправки пользовательской телеметрии:

    События

    Java
    telemetryClient.trackEvent("WinGame");
    

    Журналы

    Java
    telemetryClient.trackTrace(message, SeverityLevel.Warning, properties);
    

    Метрики

    Java
    telemetryClient.trackMetric("queueLength", 42.0);
    

    Зависимости

    Java
    boolean success = false;
    long startTime = System.currentTimeMillis();
    try {
        success = dependency.call();
    } finally {
        long endTime = System.currentTimeMillis();
        RemoteDependencyTelemetry telemetry = new RemoteDependencyTelemetry();
        telemetry.setSuccess(success);
        telemetry.setTimestamp(new Date(startTime));
        telemetry.setDuration(new Duration(endTime - startTime));
        telemetryClient.trackDependency(telemetry);
    }
    

    Исключения

    Java
    try {
        ...
    } catch (Exception e) {
        telemetryClient.trackException(e);
    }
    
    
    

Изменение телеметрии

В этом разделе описано, как изменить телеметрию.

Добавление атрибутов диапазона

Эти атрибуты могут включать в себя добавление пользовательского свойства в данные телеметрии. Можно также использовать атрибуты для задания необязательных полей в схеме Application Insights, например "IP-адрес клиента".

Добавление настраиваемого свойства в диапазон

Все атрибуты, добавляемые в диапазоны, экспортируются как пользовательские свойства. Они заполняют поле customDimensions в таблице запросов, зависимостей, трассировок или исключений.

Для добавления атрибутов в диапазоны можно использовать opentelemetry-api.

Добавление одного или нескольких атрибутов диапазона заполняет customDimensions поле в requestsdependenciesтаблице или tracesexceptions поле.

  1. Добавьте opentelemetry-api-1.0.0.jar (или более поздней версии) в приложение:

    XML
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-api</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Добавьте настраиваемые измерения в код:

    Java
    import io.opentelemetry.api.trace.Span;
    import io.opentelemetry.api.common.AttributeKey;
    
    AttributeKey attributeKey = AttributeKey.stringKey("mycustomdimension");
    Span.current().setAttribute(attributeKey, "myvalue1");
    

Задание IP-адреса пользователя

Поле client_IP для запросов можно заполнить, задав атрибут в диапазоне. Application Insights использует IP-адрес для создания атрибутов расположения пользователей, а затем по умолчанию отменяет его.

Java автоматически заполняет это поле.

Установка идентификатора пользователя или идентификатора пользователя, прошедшего проверку подлинности

Вы можете заполнить поле user_Id или user_AuthenticatedId для запросов с помощью следующего руководства. Идентификатор пользователя — это анонимный идентификатор пользователя. Идентификатор пользователя, прошедший проверку подлинности, является известным идентификатором пользователя.

Важно!

Перед настройкой идентификатора пользователя с проверкой подлинности обратитесь к применимым законам о конфиденциальности.

user ID Заполните поле в requestsdependenciesтаблице или exceptions поле.

  1. Добавьте opentelemetry-api-1.0.0.jar (или более поздней версии) в приложение:

    XML
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-api</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Задайте user_Id в коде:

    Java
    import io.opentelemetry.api.trace.Span;
    
    Span.current().setAttribute("enduser.id", "myuser");
    

Добавление атрибутов журнала

Logback, Log4j и java.util.log автоматически используются. Присоединение пользовательских измерений к журналам можно сделать следующим образом:

Получение идентификатора трассировки или идентификатора диапазона

Вы можете получить Trace ID и Span ID текущее активное диапазон, выполнив следующие действия.

Для получения идентификатора трассировки или идентификатора диапазона можно использовать opentelemetry-api.

  1. Добавьте opentelemetry-api-1.0.0.jar (или более поздней версии) в приложение:

    XML
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-api</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Получите идентификатор трассировки запроса и идентификатор диапазона в коде:

    Java
    import io.opentelemetry.api.trace.Span;
    
    Span span = Span.current();
    String traceId = span.getSpanContext().getTraceId();
    String spanId = span.getSpanContext().getSpanId();
    

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