мониторинг приложений Java без кодирования с помощью Azure Monitor Application Insights

Примечание

Если вы ищете старые документы 2.x, перейдите сюда.

Использовать мониторинг приложений Java без написания кода очень просто: не нужно изменять код, а агент Java можно включить, лишь немного изменив конфигурацию.

Агент Java работает в любой среде и позволяет отслеживать все приложения Java. Другими словами, независимо от того, выполняются ли приложения Java на виртуальных машинах, локально, в AKS, в Windows, Linux — где угодно — агент Java для Application Insights будет отслеживать ваше приложение.

Добавление в приложение пакета SDK Application Insights для Java 2.x больше не требуется, так как агент Java 3.x для Application Insights выполняет автоматический сбор запросов, зависимостей и журналов самостоятельно.

Вы по-прежнему можете отправить пользовательскую телеметрию из приложения. Агент версии 3.x будет отслеживать ее и сопоставлять со всеми автоматически собираемыми данными телеметрии.

Агент версии 3.x поддерживает Java 8 и более поздних версий.

Краткое руководство

1. Скачайте агент

Предупреждение

При обновлении с предварительной версии 3.0

Внимательно изучите все приведенные ниже параметры конфигурации, так как структура JSON полностью изменилась, как и само имя файла, которое ушло в нижний регистр.

Предупреждение

При обновлении с версии 3.0.x

Имена операций и телеметрии запросов теперь имеют префикс, соответствующий методу HTTP (GET, POST и т. п.). Это может повлиять на настраиваемые панели мониторинга или оповещения, если ранее для них использовались значения без префиксов. Дополнительные сведения см. в заметках о выпуске 3.1.0.

Скачайте applicationinsights-agent-3.1.1.jar

2. Укажите агенту виртуальную машину Java

Добавьте -javaagent:path/to/applicationinsights-agent-3.1.1.jar в аргумент виртуальной машина Java вашего приложения.

Дополнительные сведения о настройке аргументов виртуальной машины Java для приложения см. в статье Советы по обновлению аргументов виртуальной машины Java.

3. Укажите агенту ресурс Application Insights

Если у вас еще нет ресурса Application Insights, можно создать новый с помощью руководства по созданию ресурсов.

Наведите агент на ресурс Application Insights, задав переменную среды:

APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=...

Или создайте файл конфигурации с именем applicationinsights.json и поместите его в тот же каталог, что и applicationinsights-agent-3.1.1.jar, со следующим содержимым:

{
  "connectionString": "InstrumentationKey=..."
}

Строку подключения можно найти в ресурсе Application Insights:

Строка подключения Application Insights

4. Готово!

Теперь запустите приложение и перейдите к ресурсу Application Insights на портале Azure, чтобы просмотреть данные мониторинга.

Примечание

Для отображения данных мониторинга на портале может потребоваться несколько минут.

Варианты настройки

В файле applicationinsights.json можно дополнительно настроить следующие параметры:

  • Имя облачной роли
  • Экземпляр облачной роли
  • Дискретизация
  • Метрики JMX
  • Пользовательские измерения
  • Обработчики данных телеметрии (предварительная версия)
  • Автоматическое ведение журналов
  • Автоматический сбор метрик с помощью Micrometer (в том числе и метрики Spring Boot Actuator)
  • Пульс
  • Прокси-сервер HTTP
  • Самодиагностика

Полные сведения см. в разделе Параметры конфигурации.

Автоматически собранные запросы

  • Потребители JMS
  • Потребители Kafka
  • Netty/WebFlux
  • Сервлеты
  • Spring Scheduling

Автоматически собранные зависимости

Автоматически собранные зависимости и нисходящее распространение распределенной трассировки:

  • Клиенты Apache, HttpClient и HttpAsyncClient
  • gRPC
  • java.net.HttpURLConnection
  • JMS
  • Kafka
  • Клиент Netty
  • OkHttp;

Автоматически собранные зависимости (без нисходящего распространения распределенной трассировки):

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

Автоматически собранные журналы

  • java.util.logging
  • Log4j (включая свойства MDC)
  • SLF4J/Logback (включая свойства MDC)

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

  • Micrometer (включая метрики Spring Boot Actuator)
  • Метрики JMX

Пакеты SDK для Azure (предварительная версия)

Сведения о том, как включить эту предварительную версию функции и выполнить автоматический сбор данных телеметрии, созданных этими пакетами SDK для Azure, см. в разделе Параметры конфигурации:

Отправка пользовательской телеметрии из приложения

Наша цель в Java 3.x для Application Insights — обеспечить возможность отправки пользовательской телеметрии с помощью стандартных API.

На данный момент мы поддерживаем Micrometer, популярные платформы ведения журналов и пакет SDK для Java версии 2.x от Application Insights. В Java 3.x для Application Insights данные телеметрии, отправляемые через эти API, захватываются автоматически и сопоставляются с автоматически собираемой телеметрией.

Поддерживаемые пользовательские типы телеметрии

Приведенная ниже таблица представляет поддерживаемые на данный момент пользовательские типы телеметрии, которые можно включить в дополнение к работе агента Java 3.x. Подытожим: пользовательские метрики поддерживаются через Micrometer, пользовательские исключения и трассировки можно включить с помощью платформ ведения журналов, а любой тип пользовательской телеметрии поддерживается с помощью пакета SDK для Java 2.x от Application Insights.

Micrometer Log4j, logback, ИЮЛ SDK версии 2.x
Пользовательские события Да
Пользовательские метрики Да Да
Зависимости Да
Исключения Да Да
Просмотры страницы Да
Запросы Да
Трассировки Да Да

В настоящее время мы не планируем выпускать пакет SDK с Application Insights 3.x.

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

Отправка пользовательских метрик с помощью Micrometer

Добавьте Micrometer к вашему приложению:

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-core</artifactId>
  <version>1.6.1</version>
</dependency>

Используйте глобальный реестр Micrometer для создания счетчика:

static final Counter counter = Metrics.counter("test_counter");

и используйте его для записи метрик:

counter.increment();

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

Log4j, Logback и java.util.logging являются автоматически инструментируемыми платформами, поэтому ведение журналов, выполняемое с помощью этих платформ, основывается на автоматическом сборе данных в качестве трассировки и телеметрии исключений.

По умолчанию данные журнала собираются только в том случае, если ведение журнала выполняется на уровне INFO или выше. Сведения о том, как изменить этот уровень, см. в разделе Параметры конфигурации.

Если вы хотите присоединить пользовательские измерения к журналам, можно использовать Log4j 1.2 MDC, log4j 2 MDC или Logback MDC, а Java 3.x для Application Insights автоматически захватит эти свойства MDC в виде пользовательских измерений для трассировки и телеметрии исключений.

Отправка пользовательской телеметрии с помощью пакета SDK для версии 2.x

Добавьте applicationinsights-core-2.6.3.jar в приложение (все версии 2.x поддерживаются Java 3.x для Application Insights, но следует по возможности использовать последнюю версию):

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-core</artifactId>
  <version>2.6.3</version>
</dependency>

Создайте TelemetryClient:

static final TelemetryClient telemetryClient = new TelemetryClient();

и используйте его для отправки пользовательских данных телеметрии:

События
telemetryClient.trackEvent("WinGame");
Метрики
telemetryClient.trackMetric("queueLength", 42.0);
Зависимости
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);
}
Журналы
telemetryClient.trackTrace(message, SeverityLevel.Warning, properties);
Исключения
try {
    ...
} catch (Exception e) {
    telemetryClient.trackException(e);
}

Добавление запроса пользовательских измерений с помощью пакета SDK 2.x

Примечание

Эта функция доступна только в 3.0.2 и более поздних версиях

Добавьте applicationinsights-web-2.6.3.jar в приложение (все версии 2.x поддерживаются Java 3.x для Application Insights, но следует по возможности использовать последнюю версию):

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-web</artifactId>
  <version>2.6.3</version>
</dependency>

и добавьте пользовательские измерения в код:

import com.microsoft.applicationinsights.web.internal.ThreadContext;

RequestTelemetry requestTelemetry = ThreadContext.getRequestTelemetryContext().getHttpRequestTelemetry();
requestTelemetry.getProperties().put("mydimension", "myvalue");

Настройте параметр user_Id для телеметрии запросов с помощью пакета SDK 2.x

Примечание

Эта функция доступна только в 3.0.2 и более поздних версиях

Добавьте applicationinsights-web-2.6.3.jar в приложение (все версии 2.x поддерживаются Java 3.x для Application Insights, но следует по возможности использовать последнюю версию):

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-web</artifactId>
  <version>2.6.3</version>
</dependency>

и задайте user_Id в коде:

import com.microsoft.applicationinsights.web.internal.ThreadContext;

RequestTelemetry requestTelemetry = ThreadContext.getRequestTelemetryContext().getHttpRequestTelemetry();
requestTelemetry.getContext().getUser().setId("myuser");

Переопределение имени телеметрии запроса с помощью пакета SDK 2.x

Примечание

Эта функция доступна только в 3.0.2 и более поздних версиях

Добавьте applicationinsights-web-2.6.3.jar в приложение (все версии 2.x поддерживаются Java 3.x для Application Insights, но следует по возможности использовать последнюю версию):

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-web</artifactId>
  <version>2.6.3</version>
</dependency>

и задайте имя в коде:

import com.microsoft.applicationinsights.web.internal.ThreadContext;

RequestTelemetry requestTelemetry = ThreadContext.getRequestTelemetryContext().getHttpRequestTelemetry();
requestTelemetry.setName("myname");

Получение идентификатора телеметрии запроса и идентификатора операции с помощью пакета SDK 2.x

Примечание

Эта функция доступна только в 3.0.3 и более поздних версиях

Добавьте applicationinsights-web-2.6.3.jar в приложение (все версии 2.x поддерживаются Java 3.x для Application Insights, но следует по возможности использовать последнюю версию):

<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-web</artifactId>
  <version>2.6.3</version>
</dependency>

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

import com.microsoft.applicationinsights.web.internal.ThreadContext;

RequestTelemetry requestTelemetry = ThreadContext.getRequestTelemetryContext().getHttpRequestTelemetry();
String requestId = requestTelemetry.getId();
String operationId = requestTelemetry.getContext().getOperation().getId();