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


Переопределение выборки — Azure Monitor Application Insights для Java

Примечание.

Функция изменения выборки находится в общественной доступности с версии 3.5.0.

Функция переопределения выборки позволяет переопределить Процент выборки по умолчанию, например:

  • Установите процент выборки на 0 (или на какое-то небольшое значение) для проверки состояния системы при наличии шумов.
  • Установите процент выборки на 0 (или на какое-то небольшое значение) для вызовов "шумных" зависимостей.
  • Задайте процент выборки 100 для важного типа запроса (например, /loginдаже если выборка по умолчанию настроена на что-то меньшее).

Терминология

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

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

Для переопределения параметров выборки важны следующие компоненты:

  • Атрибуты

Атрибуты диапазона представляют стандартные и пользовательские свойства выданного запроса или зависимости.

Начало работы

Для начала создайте файл конфигурации с именем applicationinsights.json. Сохраните его в том же каталоге, что и applicationinsights-agent-*.jar. Используйте следующий шаблон.

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10,
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 0
      },
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 100
      }
    ]
  }
}

Принцип работы

telemetryType (telemetryKind в Application Insights 3.4.0) должен быть одним из request, dependency( trace log) или exception.

Когда запускается интервал, тип интервала и атрибуты, присутствующие в нём в это время, используются для проверки совпадения изменений выборки.

Совпадения могут иметь тип strict или regexp. Соответствие регулярных выражений проверяется в отношении всего значения атрибута, поэтому, если вы хотите сопоставить значение, содержащее abc в любом месте, вам нужно использовать .*abc.*. Переопределение выборки может определять несколько критериев атрибутов, и в этом случае все они должны совпадать, чтобы переопределение выборки совпадало.

Если одно из переопределений выборки совпадает, то для решения, следует ли выбирать диапазон, используется соответствующий процент выборки.

Используется только первое совпавшее переопределение выборки.

Если ни одно переопределение параметров выборки не будет соответствовать:

Атрибуты диапазона, доступные для выборки

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

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

Примечание.

Чтобы просмотреть точный набор атрибутов, захваченных Приложением Application Insights Java для приложения, задайте для самостоятельного диагностика уровня отладки и найдите сообщения отладки, начиная с текста "экспорт диапазона".

Примечание.

Только атрибуты, заданные в начале диапазона, доступны для выборки, поэтому такие атрибуты, как http.response.status_code или длительность запроса, которые записываются позже, можно фильтровать с помощью расширений Java OpenTelemetry. Ниже приведен пример расширения, который фильтрует диапазоны на основе длительности запроса.

Примечание.

Атрибуты, добавленные с помощью обработчика телеметрии, недоступны для выборки.

Случаи использования

Подавление сбора телеметрии для тестов работоспособности

Этот пример подавляет сбор данных телеметрии для всех запросов к /health-checks.

В этом примере также подавляется сбор всех нижестоящих диапазонов (зависимостей), которые обычно собираются под /health-checks.

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/health-check",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

Отключение сбора телеметрии для вызова зависимой функции с высоким уровнем шума

Этот пример отменяет сбор данных телеметрии для всех GET my-noisy-key вызовов redis.

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "db.system",
            "value": "redis",
            "matchType": "strict"
          },
          {
            "key": "db.statement",
            "value": "GET my-noisy-key",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

Соберите 100 % телеметрии для важного типа запроса

В этом примере собирается 100 % телеметрических данных для /login.

Поскольку подчиненные диапазоны (зависимости) следуют решению о выборке родителя (если нет переопределения выборки для этого подчиненного диапазона), они также собираются для всех запросов "/login".

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10
  },
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/login",
            "matchType": "strict"
          }
        ],
        "percentage": 100
      }
    ]
  }
}

Предоставление атрибутов диапазона для подавления вызовов зависимостей SQL

В этом примере показано, как найти доступные атрибуты для подавления шумных вызовов SQL. В следующем запросе показаны различные вызовы SQL и связанные записи за последние 30 дней:

dependencies
| where timestamp > ago(30d)
| where name == 'SQL: DB Query'
| summarize count() by name, operation_Name, data
| sort by count_ desc
SQL: DB Query    POST /Order             DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    36712549    
SQL: DB Query    POST /Receipt           DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    2220248    
SQL: DB Query    POST /CheckOutForm      DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    554074    
SQL: DB Query    GET /ClientInfo         DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    37064

Из результатов можно увидеть, что все операции используют одно и то же значение в data поле: DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar; Сходство между всеми этими данными делает их хорошим кандидатом для изменения выборки.

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

2023-10-26 15:48:25.407-04:00 DEBUG c.m.a.a.i.exporter.AgentSpanExporter - exporting span: SpanData{spanContext=ImmutableSpanContext...

Область внимания в этих журналах — это раздел "атрибуты":

{
  "attributes": {
    "data": {
      "thread.name": "DefaultDatabaseBroadcastTransport: MessageReader thread",
      "thread.id": 96,
      "db.connection_string": "apache:",
      "db.statement": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
      "db.system": "other_sql",
      "applicationinsights.internal.item_count": 1
    }
  }
}

С помощью этого вывода можно настроить переопределение выборки, аналогичное следующему примеру, который фильтрует шумные вызовы SQL:

{
  "connectionString": "...",
  "preview": {
    "sampling": {
      "overrides": [
        {
          "telemetryType": "dependency",
          "attributes": [
            {
              "key": "db.statement",
              "value": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
              "matchType": "strict"
            }
          ],
          "percentage": 0
        }
      ]
    }
  }
}

После применения изменений следующий запрос позволяет определить время последнего приема этих зависимостей в Application Insights:

dependencies
| where timestamp > ago(30d)
| where data contains 'DECLARE @MyVar'
| summarize max(timestamp) by data
| sort by max_timestamp desc
DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    11/13/2023 8:52:41 PM 

Подавление телеметрии для сбора данных журнала

С помощью SL4J можно добавить атрибуты журнала:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MdcClass {

  private static final Logger logger = LoggerFactory.getLogger(MdcClass.class);

  void method {
	
    MDC.put("key", "value");
    try {
       logger.info(...); // Application log to remove
    finally {
       MDC.remove("key"); // In a finally block in case an exception happens with logger.info
    }
	
  }
  
}

Затем можно удалить журнал с добавленным атрибутом:

{
  "sampling": {
    "overrides": [
      {
        "telemetryType": "trace",
        "percentage": 0,
        "attributes": [
          {
            "key": "key",
            "value": "value",
            "matchType": "strict"
          }
        ]
      }
    ]
  }
}

Отключение сбора телеметрии для метода Java

Мы собираемся добавить временной отрезок в метод Java и удалить его с помощью переопределения выборки.

Сначала добавим opentelemetry-instrumentation-annotations зависимость:

    <dependency>
      <groupId>io.opentelemetry.instrumentation</groupId>
      <artifactId>opentelemetry-instrumentation-annotations</artifactId>
    </dependency>

Теперь можно добавить аннотацию к методу Java WithSpan, выполняющему SQL-запросы.

package org.springframework.samples.petclinic.vet;

@Controller
class VetController {

	private final VetRepository vetRepository;

	public VetController(VetRepository vetRepository) {
		this.vetRepository = vetRepository;
	}

	@GetMapping("/vets.html")
	public String showVetList(@RequestParam(defaultValue = "1") int page, Model model) {
		Vets vets = new Vets();
		Page<Vet> paginated = findPaginated(page);
		vets.getVetList().addAll(paginated.toList());
		return addPaginationModel(page, paginated, model);
	}

	@WithSpan
	private Page<Vet> findPaginated(int page) {
		int pageSize = 5;
		Pageable pageable = PageRequest.of(page - 1, pageSize);
		return vetRepository.findAll(pageable);  // Execution of SQL requests
	}

Следующая конфигурация переопределения выборки позволяет удалить диапазон, добавленный заметкой WithSpan :

  "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "code.function",
            "value": "findPaginated",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }

Значение атрибута — это имя метода Java.

Эта конфигурация удаляет все данные телеметрии, созданные методом findPaginated. Зависимости SQL не создаются для выполнений SQL-запросов, поступающих из метода findPaginated.

Следующая конфигурация удаляет все данные телеметрии, переданные методами VetController класса с аннотацией WithSpan.

 "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "code.namespace",
            "value": "org.springframework.samples.petclinic.vet.VetController",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }

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

Если используется regexp и переопределение выборки не работает, попробуйте использовать .* regex. Если выборка теперь работает, это означает, что у вас возникла проблема с первым регулярным выражением, и ознакомьтесь с этой документацией по регулярным выражениям.

Если это не работает с .*, возможно, у вас проблема с синтаксисом в application-insights.json file. Просмотрите журналы Application Insights и убедитесь, что вы заметили предупреждающие сообщения.

Дальнейшие шаги

  • Чтобы просмотреть часто задаваемые вопросы (FAQ), см. раздел "Часто задаваемые вопросы о переопределениях выборки Sampling overrides FAQ".