Сервіс рекомендацій
Цей сервіс відповідає за отримання списку рекомендованих продуктів для користувача на основі наявних ідентифікаторів продуктів, які переглядає користувач.
Інструментування
Цей сервіс — застосунок 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.
Автоінструментовані метрики
- Метрики середовища виконання для JVM від стартера. Вони показують зростання памʼяті, коли увімкнено прапорець функції
recommendationCacheFailure. - Метрики затримки для RPC від бібліотеки інструментування gRPC, як для серверних, так і для клієнтських викликів.
- Метрики самоспостережуваності SDK, оскільки сервіс встановлює
OTEL_EXPERIMENTAL_SDK_TELEMETRY_VERSION=latest. Дивіться Інфопанель самоспостережуваності.
Логи
Сервіс веде логи через SLF4J і Logback, стандартні для Spring Boot. Стартер сам встановлює доповнювач Logback для OpenTelemetry, тому сервісу не потрібна конфігурація логування. Записи логів експортуються через OTLP з ідентифікаторами трасування та відрізка активного відрізка.
logger.info("Receive ListRecommendations for product ids:{}", productIds);
Зворотний зв’язок
Чи була ця сторінка корисною?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!