Сервіс рекомендацій

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

Сирці сервісу рекомендацій

Інструментування

Цей сервіс — застосунок Spring Boot 4, який використовує Spring gRPC для звʼязку. Він використовує стартер OpenTelemetry для Spring Boot, який налаштовує SDK OpenTelemetry та робить його доступним як bean OpenTelemetry, щоб показати альтернативу агенту Java. Експортні точки доступу, атрибути ресурсів та імʼя сервісу надходять зі стандартних змінних середовища OTEL_*.

Агент Java залишається стандартним вибором для застосунків Spring Boot, і сервіс ad використовує його. Сторінка стартера пояснює, коли стартер підходить краще.

implementation platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${opentelemetryInstrumentationVersion}")
implementation "io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter"

Трейси

Відрізки gRPC

Стартер не інструментує gRPC, тому сервіс додає бібліотеку інструментування gRPC і реєструє свої перехоплювачі як глобальні перехоплювачі Spring gRPC. Це створює серверний відрізок ListRecommendations і клієнтський відрізок ListProducts, а також поширює контекст трасування до сервісу каталогу товарів.

@Bean
GrpcTelemetry grpcTelemetry(OpenTelemetry openTelemetry) {
  return GrpcTelemetry.create(openTelemetry);
}

@Bean
@GlobalServerInterceptor
ServerInterceptor grpcTelemetryServerInterceptor(GrpcTelemetry grpcTelemetry) {
  return grpcTelemetry.createServerInterceptor();
}

@Bean
@GlobalClientInterceptor
ClientInterceptor grpcTelemetryClientInterceptor(GrpcTelemetry grpcTelemetry) {
  return grpcTelemetry.createClientInterceptor();
}

Додавання атрибутів до поточного відрізка

Усередині обробника gRPC поточний відрізок — це серверний відрізок, створений перехоплювачем. У listRecommendations до нього додається атрибут.

Span.current().setAttribute("demo.product.recommended.count", productIds.size());

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

Сервіс отримує Tracer з bean OpenTelemetry. Метод getProductList створює відрізок get_product_list за допомогою spanBuilder, поміщає його в контекст через makeCurrent і завершує його в блоці finally. Виняток записується у відрізок і встановлює його статус як помилку. Рекомендовані продукти записуються як атрибут масиву рядків demo.product.filtered.list.

Tracer tracer = openTelemetry.getTracer("recommendation");

Span span = tracer.spanBuilder("get_product_list").startSpan();
try (Scope ignored = span.makeCurrent()) {
  ...
  span.setAttribute(FILTERED_LIST, recommended);
} catch (RuntimeException e) {
  span.recordException(e);
  span.setStatus(StatusCode.ERROR);
  throw e;
} finally {
  span.end();
}

Метрики

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

Сервіс отримує Meter з того самого bean OpenTelemetry і будує свій лічильник.

LongCounter recommendations =
    openTelemetry
        .getMeter("recommendation")
        .counterBuilder("demo.recommendation.requests")
        .setDescription("Counts the total number of given recommendations")
        .setUnit("{recommendation}")
        .build();

Кожен запит додає кількість продуктів, які він рекомендував.

recommendations.add(productIds.size(), CATALOG_RECOMMENDATION);

Поточні створювані метрики

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

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

  • demo.recommendation.requests: Лічильник рекомендованих продуктів, з атрибутом recommendation.type, встановленим у catalog.

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

Логи

Сервіс веде логи через SLF4J і Logback, стандартні для Spring Boot. Стартер сам встановлює доповнювач Logback для OpenTelemetry, тому сервісу не потрібна конфігурація логування. Записи логів експортуються через OTLP з ідентифікаторами трасування та відрізка активного відрізка.

logger.info("Receive ListRecommendations for product ids:{}", productIds);

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