Сервіс Реклами

Цей сервіс визначає відповідну рекламу для показу користувачам на основі ключів контексту. Реклама буде для продуктів, доступних у магазині.

Сирці сервісу реклами

Автоматична інструменталізація

Цей сервіс використовує агент OpenTelemetry Java для автоматичної інструменталізації бібліотек, таких як gRPC, і для налаштування SDK OpenTelemetry. Агент передається в процес за допомогою аргументу командного рядка -javaagent. Аргументи командного рядка додаються через JAVA_TOOL_OPTIONS у Dockerfile і використовуються під час автоматично згенерованого скрипту запуску Gradle.

ENV JAVA_TOOL_OPTIONS=-javaagent:/app/opentelemetry-javaagent.jar

Трейси

Додавання атрибутів до автоматично інструментованих відрізків

Під час виконання автоматично інструментованого коду ви можете отримати поточний відрізок з контексту.

Span span = Span.current();

Додавання атрибутів до відрізка здійснюється за допомогою setAttribute на обʼєкті відрізка. У функції getAds до відрізка додається кілька атрибутів.

span.setAttribute("app.ads.contextKeys", req.getContextKeysList().toString());
span.setAttribute("app.ads.contextKeys.count", req.getContextKeysCount());

Додавання подій до відрізка

Додавання події до відрізка здійснюється за допомогою addEvent на обʼєкті відрізка. У функції getAds подія з атрибутом додається, коли виникає помилка.

span.addEvent("Error", Attributes.of(AttributeKey.stringKey("exception.message"), e.getMessage()));

Встановлення статусу відрізка

Якщо результат операції є помилкою, статус відрізка слід встановити відповідно за допомогою setStatus на обʼєкті відрізка. У функції getAds статус відрізка встановлюється, коли виникає помилка.

span.setStatus(StatusCode.ERROR);

Створення нових відрізків

Нові відрізки можна створити та запустити за допомогою Tracer.spanBuilder("spanName").startSpan(). Новостворені відрізки слід встановити в контекст за допомогою Span.makeCurrent(). Функція getRandomAds створить новий відрізок, встановить його в контекст, виконає операцію і, нарешті, завершить відрізок.

// створити та запустити новий відрізок вручну
Tracer tracer = GlobalOpenTelemetry.getTracer("ad");
Span span = tracer.spanBuilder("getRandomAds").startSpan();

// помістити відрізок у контекст, щоб якщо будь-який дочірній відрізок буде запущений, батьківський відрізок буде встановлений правильно
try (Scope ignored = span.makeCurrent()) {

  Collection<Ad> allAds = adsMap.values();
  for (int i = 0; i < MAX_ADS_TO_SERVE; i++) {
    ads.add(Iterables.get(allAds, random.nextInt(allAds.size())));
  }
  span.setAttribute("app.ads.count", ads.size());

} finally {
  span.end();
}

Метрики

Ініціалізація метрик

Подібно до створення відрізків, першим кроком у створенні метрик є ініціалізація екземпляра Meter, наприклад, GlobalOpenTelemetry.getMeter("ad"). Звідти, використовуйте різні методи побудови, доступні на екземплярі Meter, щоб створити бажаний інструмент метрики, наприклад:

meter
  .counterBuilder("app.ads.ad_requests")
  .setDescription("Рахує запити реклами за типом запиту та відповіді")
  .build();

Поєднання не-OTel власних метрик (клієнтська бібліотека Prometheus)

Сервіс Реклами також надає невеликий набір власних метрик за допомогою клієнтської бібліотеки Prometheus для Java, а не OpenTelemetry SDK. Ці метрики доступні на окремій HTTP-точці доступу (/metrics на порту AD_PROMETHEUS_PORT, зазвичай 9465) і збираються приймачем prometheus колектора OpenTelemetry, який передає їх у той самий конвеєр, що й метрики OTel SDK:

private static final Counter adsServedCounter =
    Counter.builder()
        .name("demo_ad_served_total")
        .help("Загальна кількість показаної реклами, з міткою за категорією")
        .labelNames("category")
        .register();

HTTPServer prometheusServer =
    HTTPServer.builder().port(prometheusPort).buildAndStart();

Конфігурація колектора, яка це забезпечує:

receivers:
  prometheus/ad:
    config:
      scrape_configs:
        - job_name: ad
          scrape_interval: 10s
          static_configs:
            - targets: ['ad:${env:AD_PROMETHEUS_PORT}']

Поточні метрики

Зверніть увагу, що всі назви метрик нижче зʼявляються в Prometheus/Grafana з перетвореними символами . на _.

Власні метрики

Наразі доступні такі власні метрики користувача:

  • app.ads.ad_requests (OpenTelemetry SDK): Лічильник запитів на рекламу з вимірами, що описують, чи був запит цільовим за ключами контексту чи ні, і чи була відповідь цільовою або випадковою рекламою.
  • demo_ad_served_total (клієнтська бібліотека Prometheus, збирається колектором): Лічильник показів реклами з міткою за category (наприклад, telescopes, binoculars, random). Див. Поєднання не-OTel власних метрик вище.

Автоматично інструментовані метрики

Для застосунку доступні такі автоматично інструментовані метрики:

Логи

Сервіс Реклами використовує Log4J, який автоматично налаштовується агентом OTel Java.

Він включає контекст трейсу в записи логів, що дозволяє кореляцію логів з трейсами.


Востаннє змінено July 12, 2026: [uk] Ukrainian documentation for OpenTelemetry (0301c8f3)