From 3e342bc25d9248aa23efa58f8bb37957323d92f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9A=D0=B0?= =?UTF-8?q?=D0=BD?= Date: Thu, 12 Feb 2026 18:37:33 +0300 Subject: [PATCH 1/4] feat: implement recommendation system (collector, aggregator, analyzer) --- .run/Deployment compose-local.run.xml | 11 - .run/MainApplication (local).run.xml | 11 - .run/MainApplication.run.xml | 10 - .run/StatApplication (local).run.xml | 11 - .run/StatApplication.run.xml | 11 - core/comment-service/pom.xml | 7 - core/event-service/pom.xml | 7 - .../controller/PublicEventController.java | 27 +- .../yandex/practicum/mapper/EventMapper.java | 6 +- .../java/ru/yandex/practicum/model/Event.java | 4 +- .../practicum/service/EventService.java | 8 +- .../practicum/service/EventServiceImpl.java | 208 +- .../src/main/resources/schema.sql | 2 +- .../practicum/client/RequestClient.java | 3 + .../client/RequestClientFallback.java | 6 + .../practicum/dto/event/EventFullDto.java | 2 +- .../practicum/dto/event/EventShortDto.java | 2 +- core/request-service/pom.xml | 7 - .../controller/InternalRequestController.java | 6 + .../repository/RequestRepository.java | 2 + .../practicum/service/RequestServiceImpl.java | 27 + core/user-service/pom.xml | 7 - docker-compose.yml | 44 +- execution-report.txt | 4230 +++++++++++++++++ .../src/main/resources/application.yaml | 3 + .../config/aggregator/aggregator.yaml | 10 + .../resources/config/analyzer/analyzer.yaml | 35 + .../resources/config/collector/collector.yaml | 9 + .../comment-service/comment-service.yaml | 6 +- .../config/event-service/event-service.yaml | 18 +- .../request-service/request-service.yaml | 18 +- .../config/stats-server/stats-server.yaml | 19 - .../config/user-service/user-service.yaml | 6 +- pom.xml | 18 +- stats/{stats-server => aggregator}/pom.xml | 53 +- .../ru/yandex/practicum/AggregatorApp.java} | 8 +- .../yandex/practicum/config/KafkaClient.java | 18 + .../yandex/practicum/config/KafkaConfig.java | 94 + .../config/KafkaTopicsProperties.java | 13 + .../consumer/UserActionConsumer.java | 84 + .../practicum/mapper/SimilarityMapper.java | 24 + .../processor/SimilarityCalculator.java | 118 + .../processor/SimilarityProcessor.java | 116 + .../producer/EventSimilarityProducer.java | 67 + .../practicum/runner/AggregatorRunner.java | 21 + .../src/main/resources/application.yaml | 26 + stats/analyzer/pom.xml | 114 + .../java/ru/yandex/practicum/AnalyzerApp.java | 13 + .../yandex/practicum/config/KafkaClient.java | 17 + .../yandex/practicum/config/KafkaConfig.java | 91 + .../config/KafkaTopicsProperties.java | 13 + .../consumer/EventSimilarityConsumer.java | 80 + .../consumer/UserActionConsumer.java | 80 + .../controller/RecommendationsController.java | 57 + .../handler/EventSimilarityHandler.java | 7 + .../handler/EventSimilarityHandlerImpl.java | 26 + .../practicum/handler/UserActionHandler.java | 7 + .../handler/UserActionHandlerImpl.java | 26 + .../mapper/EventSimilarityMapper.java | 17 + .../mapper/RecommendationsMapper.java | 43 + .../practicum/mapper/UserActionMapper.java | 28 + .../ru/yandex/practicum/model/ActionType.java | 7 + .../practicum/model/EventSimilarity.java | 27 + .../ru/yandex/practicum/model/UserAction.java | 33 + .../processor/SimilarityProcessor.java | 119 + .../processor/UserActionProcessor.java | 120 + .../repository/EventSimilarityRepository.java | 58 + .../repository/UserActionRepository.java | 34 + .../practicum/runner/AnalyzerRunner.java | 23 + .../service/EventSimilarityService.java | 7 + .../service/EventSimilarityServiceImpl.java | 48 + .../service/RecommendationService.java | 17 + .../service/RecommendationServiceImpl.java | 165 + .../practicum/service/UserActionService.java | 7 + .../service/UserActionServiceImpl.java | 38 + .../src/main/resources/application.yaml | 23 + stats/analyzer/src/main/resources/schema.sql | 27 + stats/collector/pom.xml | 119 + .../ru/yandex/practicum/CollectorApp.java | 13 + .../yandex/practicum/config/KafkaClient.java | 18 + .../yandex/practicum/config/KafkaConfig.java | 74 + .../config/KafkaTopicsProperties.java | 12 + .../controller/UserActionGrpcController.java | 47 + .../practicum/mapper/UserActionMapper.java | 41 + .../processor/UserActionProcessor.java | 7 + .../processor/UserActionProcessorImpl.java | 25 + .../producer/UserActionProducer.java | 74 + .../src/main/resources/application.yaml | 26 + stats/{stats-dto => common}/pom.xml | 17 +- .../deserializer/BaseAvroDeserializer.java | 47 + .../EventSimilarityDeserializer.java | 9 + .../deserializer/UserActionDeserializer.java | 9 + .../exception/DeserializationException.java | 7 + .../practicum/serializer/AvroSerializer.java | 31 + stats/pom.xml | 12 +- stats/serialization/avro-schemas/pom.xml | 79 + .../src/main/avro/stats/EventSimilarity.avdl | 9 + .../src/main/avro/stats/UserAction.avdl | 15 + stats/serialization/pom.xml | 27 + stats/serialization/proto-schemas/pom.xml | 92 + .../messages/interactions_count_request.proto | 10 + .../stats/messages/recommended_event.proto | 11 + .../messages/similar_events_request.proto | 12 + .../protobuf/stats/messages/user_action.proto | 21 + .../messages/user_predictions_request.proto | 11 + .../services/recommendations_controller.proto | 22 + .../services/user_action_controller.proto | 14 + stats/stats-client/pom.xml | 22 +- .../ru/yandex/practicum/StatsClientApp.java | 77 - .../practicum/client/AnalyzerClient.java | 58 + .../practicum/client/CollectorClient.java | 27 + .../exception/StatsClientException.java | 7 - .../practicum/CreateEndpointHitDto.java | 26 - .../ru/yandex/practicum/StatsRequest.java | 28 - .../ru/yandex/practicum/ViewStatsDto.java | 11 - .../constants/DateTimeConstants.java | 9 - stats/stats-server/Dockerfile | 5 - .../practicum/controller/StatsController.java | 42 - .../exception/BadRequestException.java | 7 - .../practicum/exception/ErrorHandler.java | 31 - .../practicum/exception/ErrorResponse.java | 15 - .../practicum/mapper/EndpointHitMapper.java | 13 - .../yandex/practicum/model/EndpointHit.java | 30 - .../practicum/repository/StatsRepository.java | 36 - .../practicum/service/StatsService.java | 13 - .../practicum/service/StatsServiceImpl.java | 45 - .../src/main/resources/application.yaml | 21 - .../src/main/resources/schema.sql | 10 - 128 files changed, 7572 insertions(+), 687 deletions(-) delete mode 100644 .run/Deployment compose-local.run.xml delete mode 100644 .run/MainApplication (local).run.xml delete mode 100644 .run/MainApplication.run.xml delete mode 100644 .run/StatApplication (local).run.xml delete mode 100644 .run/StatApplication.run.xml create mode 100644 execution-report.txt create mode 100644 infra/config-server/src/main/resources/config/aggregator/aggregator.yaml create mode 100644 infra/config-server/src/main/resources/config/analyzer/analyzer.yaml create mode 100644 infra/config-server/src/main/resources/config/collector/collector.yaml delete mode 100644 infra/config-server/src/main/resources/config/stats-server/stats-server.yaml rename stats/{stats-server => aggregator}/pom.xml (77%) rename stats/{stats-server/src/main/java/ru/yandex/practicum/StatServerApp.java => aggregator/src/main/java/ru/yandex/practicum/AggregatorApp.java} (53%) create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaClient.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaConfig.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/mapper/SimilarityMapper.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/producer/EventSimilarityProducer.java create mode 100644 stats/aggregator/src/main/java/ru/yandex/practicum/runner/AggregatorRunner.java create mode 100644 stats/aggregator/src/main/resources/application.yaml create mode 100644 stats/analyzer/pom.xml create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/AnalyzerApp.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaClient.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaConfig.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/consumer/EventSimilarityConsumer.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/controller/RecommendationsController.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandler.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandlerImpl.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandler.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandlerImpl.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/mapper/EventSimilarityMapper.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/mapper/RecommendationsMapper.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/model/ActionType.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/model/EventSimilarity.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/model/UserAction.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/repository/EventSimilarityRepository.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/repository/UserActionRepository.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/runner/AnalyzerRunner.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityService.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityServiceImpl.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationService.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationServiceImpl.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionService.java create mode 100644 stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionServiceImpl.java create mode 100644 stats/analyzer/src/main/resources/application.yaml create mode 100644 stats/analyzer/src/main/resources/schema.sql create mode 100644 stats/collector/pom.xml create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/CollectorApp.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/config/KafkaClient.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/config/KafkaConfig.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/controller/UserActionGrpcController.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessorImpl.java create mode 100644 stats/collector/src/main/java/ru/yandex/practicum/producer/UserActionProducer.java create mode 100644 stats/collector/src/main/resources/application.yaml rename stats/{stats-dto => common}/pom.xml (56%) create mode 100644 stats/common/src/main/java/ru/yandex/practicum/deserializer/BaseAvroDeserializer.java create mode 100644 stats/common/src/main/java/ru/yandex/practicum/deserializer/EventSimilarityDeserializer.java create mode 100644 stats/common/src/main/java/ru/yandex/practicum/deserializer/UserActionDeserializer.java create mode 100644 stats/common/src/main/java/ru/yandex/practicum/exception/DeserializationException.java create mode 100644 stats/common/src/main/java/ru/yandex/practicum/serializer/AvroSerializer.java create mode 100644 stats/serialization/avro-schemas/pom.xml create mode 100644 stats/serialization/avro-schemas/src/main/avro/stats/EventSimilarity.avdl create mode 100644 stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl create mode 100644 stats/serialization/pom.xml create mode 100644 stats/serialization/proto-schemas/pom.xml create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/interactions_count_request.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/recommended_event.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/similar_events_request.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_action.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_predictions_request.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/services/recommendations_controller.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/services/user_action_controller.proto delete mode 100644 stats/stats-client/src/main/java/ru/yandex/practicum/StatsClientApp.java create mode 100644 stats/stats-client/src/main/java/ru/yandex/practicum/client/AnalyzerClient.java create mode 100644 stats/stats-client/src/main/java/ru/yandex/practicum/client/CollectorClient.java delete mode 100644 stats/stats-client/src/main/java/ru/yandex/practicum/exception/StatsClientException.java delete mode 100644 stats/stats-dto/src/main/java/ru/yandex/practicum/CreateEndpointHitDto.java delete mode 100644 stats/stats-dto/src/main/java/ru/yandex/practicum/StatsRequest.java delete mode 100644 stats/stats-dto/src/main/java/ru/yandex/practicum/ViewStatsDto.java delete mode 100644 stats/stats-dto/src/main/java/ru/yandex/practicum/constants/DateTimeConstants.java delete mode 100644 stats/stats-server/Dockerfile delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/controller/StatsController.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/exception/BadRequestException.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorHandler.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorResponse.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/mapper/EndpointHitMapper.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/model/EndpointHit.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/repository/StatsRepository.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsService.java delete mode 100644 stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsServiceImpl.java delete mode 100644 stats/stats-server/src/main/resources/application.yaml delete mode 100644 stats/stats-server/src/main/resources/schema.sql diff --git a/.run/Deployment compose-local.run.xml b/.run/Deployment compose-local.run.xml deleted file mode 100644 index 4f2962b..0000000 --- a/.run/Deployment compose-local.run.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.run/MainApplication (local).run.xml b/.run/MainApplication (local).run.xml deleted file mode 100644 index bd3928c..0000000 --- a/.run/MainApplication (local).run.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/MainApplication.run.xml b/.run/MainApplication.run.xml deleted file mode 100644 index d0e71e8..0000000 --- a/.run/MainApplication.run.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/StatApplication (local).run.xml b/.run/StatApplication (local).run.xml deleted file mode 100644 index ed683b0..0000000 --- a/.run/StatApplication (local).run.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/StatApplication.run.xml b/.run/StatApplication.run.xml deleted file mode 100644 index 65d72ff..0000000 --- a/.run/StatApplication.run.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/core/comment-service/pom.xml b/core/comment-service/pom.xml index d017437..fb664c3 100644 --- a/core/comment-service/pom.xml +++ b/core/comment-service/pom.xml @@ -55,12 +55,6 @@ ${project.version} - - ru.yandex.practicum - stats-dto - ${project.version} - - org.projectlombok lombok @@ -95,7 +89,6 @@ org.springframework.retry spring-retry - 2.0.5 diff --git a/core/event-service/pom.xml b/core/event-service/pom.xml index fc467b1..4f728a4 100644 --- a/core/event-service/pom.xml +++ b/core/event-service/pom.xml @@ -55,12 +55,6 @@ ${project.version} - - ru.yandex.practicum - stats-dto - ${project.version} - - org.projectlombok lombok @@ -95,7 +89,6 @@ org.springframework.retry spring-retry - 2.0.5 diff --git a/core/event-service/src/main/java/ru/yandex/practicum/controller/PublicEventController.java b/core/event-service/src/main/java/ru/yandex/practicum/controller/PublicEventController.java index cfe01a4..7240a8f 100644 --- a/core/event-service/src/main/java/ru/yandex/practicum/controller/PublicEventController.java +++ b/core/event-service/src/main/java/ru/yandex/practicum/controller/PublicEventController.java @@ -6,12 +6,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; +import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; import ru.yandex.practicum.dto.event.*; import ru.yandex.practicum.service.EventService; import java.util.List; +import java.util.stream.Stream; @Slf4j @Validated @@ -34,8 +37,28 @@ public List getEventsPublic(@ModelAttribute @Valid SearchEventPub @GetMapping("/{id}") public EventFullDto getEventByIdPublic(@PathVariable("id") @Positive Long eventId, - HttpServletRequest httpRequest) { + HttpServletRequest httpRequest, + @RequestHeader("X-EWM-USER-ID") Long userId) { log.debug("Controller: getEventByIdPublic eventId={}", eventId); - return eventService.getEventByIdPublic(eventId, httpRequest.getRemoteAddr()); + return eventService.getEventByIdPublic(eventId, httpRequest.getRemoteAddr(), userId); + } + + @GetMapping("/recommendations") + public Stream getRecommendations( + @RequestHeader("X-EWM-USER-ID") Long userId, + @RequestParam(defaultValue = "10") int maxResults) { + + log.debug("Controller: getRecommendations userId={}, maxResults={}", userId, maxResults); + return eventService.getRecommendationsForUser(userId, maxResults); + } + + @PutMapping("/{eventId}/like") + @ResponseStatus(HttpStatus.OK) + public void likeEvent( + @PathVariable Long eventId, + @RequestHeader("X-EWM-USER-ID") Long userId) { + + log.debug("Controller: likeEvent eventId={}, userId={}", eventId, userId); + eventService.likeEvent(userId, eventId); } } diff --git a/core/event-service/src/main/java/ru/yandex/practicum/mapper/EventMapper.java b/core/event-service/src/main/java/ru/yandex/practicum/mapper/EventMapper.java index 18dcf68..b4d5669 100644 --- a/core/event-service/src/main/java/ru/yandex/practicum/mapper/EventMapper.java +++ b/core/event-service/src/main/java/ru/yandex/practicum/mapper/EventMapper.java @@ -15,7 +15,7 @@ public interface EventMapper { @Mapping(target = "createdOn", ignore = true) @Mapping(target = "publishedOn", ignore = true) @Mapping(target = "confirmedRequests", ignore = true) - @Mapping(target = "views", ignore = true) + @Mapping(target = "rating", ignore = true) Event toEntity(NewEventDto dto, Long initiatorId, Category category); @Mapping(target = "initiator", ignore = true) @@ -32,7 +32,7 @@ public interface EventMapper { @Mapping(target = "publishedOn", ignore = true) @Mapping(target = "state", ignore = true) @Mapping(target = "category", ignore = true) - @Mapping(target = "views", ignore = true) + @Mapping(target = "rating", ignore = true) @Mapping(target = "confirmedRequests", ignore = true) @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) void updateEventFromUserRequest(UpdateEventUserRequest request, @MappingTarget Event event, Category category); @@ -43,7 +43,7 @@ public interface EventMapper { @Mapping(target = "createdOn", ignore = true) @Mapping(target = "publishedOn", ignore = true) @Mapping(target = "state", ignore = true) - @Mapping(target = "views", ignore = true) + @Mapping(target = "rating", ignore = true) @Mapping(target = "confirmedRequests", ignore = true) @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) void updateEventFromAdminRequest(UpdateEventAdminRequest request, @MappingTarget Event event, Category category); diff --git a/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java b/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java index a33d87f..a2d428f 100644 --- a/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java +++ b/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java @@ -71,9 +71,9 @@ public class Event { @Builder.Default private Integer confirmedRequests = 0; - @Column(name = "views", nullable = false) + @Column(name = "rating", nullable = false) @Builder.Default - private Long views = 0L; + private Double rating = 0.0; public void pending() { this.state = EventState.PENDING; diff --git a/core/event-service/src/main/java/ru/yandex/practicum/service/EventService.java b/core/event-service/src/main/java/ru/yandex/practicum/service/EventService.java index 934e08e..0a8205a 100644 --- a/core/event-service/src/main/java/ru/yandex/practicum/service/EventService.java +++ b/core/event-service/src/main/java/ru/yandex/practicum/service/EventService.java @@ -1,10 +1,12 @@ package ru.yandex.practicum.service; import org.springframework.data.domain.Pageable; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; import ru.yandex.practicum.dto.event.*; import ru.yandex.practicum.model.Event; import java.util.List; +import java.util.stream.Stream; public interface EventService { List getEvents(Long userId, Pageable pageable); @@ -23,5 +25,9 @@ public interface EventService { List getEventsPublic(SearchEventPublicRequest requestParams, Pageable pageable, String ip); - EventFullDto getEventByIdPublic(Long eventId, String ip); + EventFullDto getEventByIdPublic(Long eventId, String ip, Long userId); + + Stream getRecommendationsForUser(Long userId, int maxResults); + + void likeEvent(Long userId, Long eventId); } diff --git a/core/event-service/src/main/java/ru/yandex/practicum/service/EventServiceImpl.java b/core/event-service/src/main/java/ru/yandex/practicum/service/EventServiceImpl.java index 1000ecc..aaf8328 100644 --- a/core/event-service/src/main/java/ru/yandex/practicum/service/EventServiceImpl.java +++ b/core/event-service/src/main/java/ru/yandex/practicum/service/EventServiceImpl.java @@ -1,5 +1,6 @@ package ru.yandex.practicum.service; +import com.google.protobuf.Timestamp; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -7,9 +8,13 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.yandex.practicum.CreateEndpointHitDto; -import ru.yandex.practicum.StatsClientApp; -import ru.yandex.practicum.ViewStatsDto; +import ru.practicum.ewm.stats.proto.InteractionsCountRequestProto; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.practicum.ewm.stats.proto.UserPredictionsRequestProto; +import ru.practicum.ewm.stats.proto.ActionTypeProto; +import ru.yandex.practicum.client.AnalyzerClient; +import ru.yandex.practicum.client.CollectorClient; import ru.yandex.practicum.client.RequestClient; import ru.yandex.practicum.client.UserClient; import ru.yandex.practicum.dto.event.*; @@ -21,9 +26,11 @@ import ru.yandex.practicum.model.Event; import ru.yandex.practicum.repository.*; +import java.time.Instant; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; @Slf4j @Service @@ -33,8 +40,9 @@ public class EventServiceImpl implements EventService { private final EventMapper eventMapper; private final UserClient userClient; private final RequestClient requestClient; - private final StatsClientApp statsClient; private final CategoryRepository categoryRepository; + private final AnalyzerClient analyzerClient; + private final CollectorClient collectorClient; @Override @Transactional @@ -47,6 +55,7 @@ public EventFullDto createEvent(Long userId, NewEventDto newEventDto) { .orElseThrow(() -> new NotFoundException("Категория с id=" + newEventDto.category() + " не найдена")); Event event = eventMapper.toEntity(newEventDto, userId, category); + event.setRating(0.0); event = eventRepository.save(event); log.info("Создано событие с id={}, title={}, initiatorId={}", event.getId(), event.getTitle(), userId); @@ -54,7 +63,7 @@ public EventFullDto createEvent(Long userId, NewEventDto newEventDto) { EventFullDto dto = eventMapper.toFullDto(event); dto.setInitiator(getUserShortDto(userId)); dto.setConfirmedRequests(0L); - dto.setViews(0L); + dto.setRating(0.0); return dto; } @@ -70,15 +79,16 @@ public List getEvents(Long userId, Pageable pageable) { .map(Event::getId) .toList(); - EventStatistics stats = getEventStatistics(eventIds); + Map confirmedRequests = getConfirmedRequests(eventIds); + Map ratings = getRatingsForEvents(eventIds); Map userCache = new HashMap<>(); return events.stream() .map(event -> { EventShortDto dto = eventMapper.toShortDto(event); - dto.setConfirmedRequests(stats.confirmedRequests().getOrDefault(event.getId(), 0L)); - dto.setViews(stats.views().getOrDefault(event.getId(), 0L)); + dto.setConfirmedRequests(confirmedRequests.getOrDefault(event.getId(), 0L)); + dto.setRating(ratings.getOrDefault(event.getId(), 0.0)); UserShortDto initiatorDto = userCache.computeIfAbsent( event.getInitiatorId(), @@ -100,13 +110,11 @@ public EventFullDto getEvent(Long userId, Long eventId, String ip) { throw new NotFoundException("Событие c id " + eventId + " не найдено у пользователя с id " + userId); } - saveHit("/events/" + eventId, ip); return buildFullDto(event); } catch (Exception e) { log.warn("Сервис пользователей недоступен или пользователь не найден, userId={}", userId); Event event = getEventOrThrow(eventId); - saveHit("/events/" + eventId, ip); return buildFullDto(event); } } @@ -171,28 +179,25 @@ public List getEventsAdmin(SearchEventAdminRequest request, Pageab specification = specification.and(SearchEventSpecifications.addWhereStartsBefore(LocalDateTime.now())); Page eventsPage = eventRepository.findAll(specification, pageable); - List eventIds = eventsPage.getContent().stream() - .map(Event::getId) - .toList(); - if (eventIds.isEmpty()) { + if (eventsPage.isEmpty()) { return List.of(); } List events = eventsPage.getContent(); - - List searchEventIds = events.stream() + List eventIds = events.stream() .map(Event::getId) .toList(); - EventStatistics stats = getEventStatistics(searchEventIds); + Map confirmedRequests = getConfirmedRequests(eventIds); + Map ratings = getRatingsForEvents(eventIds); Map userCache = new HashMap<>(); return events.stream() .map(event -> { EventFullDto dto = eventMapper.toFullDto(event); - dto.setConfirmedRequests(stats.confirmedRequests().getOrDefault(event.getId(), 0L)); - dto.setViews(stats.views().getOrDefault(event.getId(), 0L)); + dto.setConfirmedRequests(confirmedRequests.getOrDefault(event.getId(), 0L)); + dto.setRating(ratings.getOrDefault(event.getId(), 0.0)); UserShortDto initiatorDto = userCache.computeIfAbsent( event.getInitiatorId(), @@ -258,6 +263,7 @@ public List getEventsPublic( specification = specification.and(SearchEventSpecifications.addWhereCategories(request.categories())); if (request.paid() != null) specification = specification.and(SearchEventSpecifications.isPaid(request.paid())); + LocalDateTime rangeStart = (request.rangeStart() == null && request.rangeEnd() == null) ? LocalDateTime.now() : request.rangeStart(); if (rangeStart != null) @@ -275,14 +281,15 @@ public List getEventsPublic( .map(Event::getId) .toList(); - EventStatistics stats = getEventStatistics(eventIds); + Map confirmedRequests = getConfirmedRequests(eventIds); + Map ratings = getRatingsForEvents(eventIds); Map userCache = new HashMap<>(); List result = events.stream() .map(event -> { EventShortDto dto = eventMapper.toShortDto(event); - dto.setConfirmedRequests(stats.confirmedRequests().getOrDefault(event.getId(), 0L)); - dto.setViews(stats.views().getOrDefault(event.getId(), 0L)); + dto.setConfirmedRequests(confirmedRequests.getOrDefault(event.getId(), 0L)); + dto.setRating(ratings.getOrDefault(event.getId(), 0.0)); UserShortDto initiatorDto = userCache.computeIfAbsent( event.getInitiatorId(), @@ -293,11 +300,9 @@ public List getEventsPublic( }) .toList(); - saveHit("/events", ip); - if (SortState.VIEWS.equals(request.sort())) { return result.stream() - .sorted(Comparator.comparing(EventShortDto::getViews).reversed()) + .sorted(Comparator.comparing(EventShortDto::getRating).reversed()) .toList(); } else if (SortState.EVENT_DATE.equals(request.sort())) { return result.stream() @@ -309,23 +314,73 @@ public List getEventsPublic( } @Override - public EventFullDto getEventByIdPublic(Long eventId, String ip) { + public EventFullDto getEventByIdPublic(Long eventId, String ip, Long userId) { Event event = eventRepository.findByIdNew(eventId) .filter(ev -> ev.getState() == EventState.PUBLISHED) .orElseThrow(() -> new NotFoundException("Событие c id " + eventId + " не найдено")); - saveHit("/events/" + eventId, ip); + UserActionProto action = UserActionProto.newBuilder() + .setUserId(userId) + .setEventId(eventId) + .setActionType(ActionTypeProto.VIEW) + .setTimestamp(Timestamp.newBuilder() + .setSeconds(Instant.now().getEpochSecond()) + .setNanos(Instant.now().getNano()) + .build()) + .build(); + + collectorClient.sendUserAction(action); return buildFullDto(event); } + @Override + public Stream getRecommendationsForUser(Long userId, int maxResults) { + log.info("Получение рекомендаций для пользователя userId={}, maxResults={}", userId, maxResults); + + UserPredictionsRequestProto request = UserPredictionsRequestProto.newBuilder() + .setUserId(userId) + .setMaxResults(maxResults) + .build(); + + return analyzerClient.getRecommendationsForUser(request); + } + + @Override + @Transactional + public void likeEvent(Long userId, Long eventId) { + log.info("Лайк события eventId={} от пользователя userId={}", eventId, userId); + + Event event = getEventOrThrow(eventId); + + if (event.getState() != EventState.PUBLISHED) { + throw new ValidationException("Нельзя лайкнуть неопубликованное событие"); + } + + if (!hasUserVisitedEvent(userId, eventId)) { + throw new ValidationException("Нельзя лайкнуть непосещенное мероприятие"); + } + + UserActionProto action = UserActionProto.newBuilder() + .setUserId(userId) + .setEventId(eventId) + .setActionType(ActionTypeProto.LIKE) + .setTimestamp(Timestamp.newBuilder() + .setSeconds(Instant.now().getEpochSecond()) + .setNanos(Instant.now().getNano()) + .build()) + .build(); + + collectorClient.sendUserAction(action); + } + private EventFullDto buildFullDto(Event event) { Map confirmedRequests = getConfirmedRequests(List.of(event.getId())); - Map views = getViewsForEvents(List.of(event.getId())); + Double rating = getEventRating(event.getId()); EventFullDto dto = eventMapper.toFullDto(event); dto.setConfirmedRequests(confirmedRequests.getOrDefault(event.getId(), 0L)); - dto.setViews(views.getOrDefault(event.getId(), 0L)); + dto.setRating(rating); UserShortDto initiatorDto = getUserShortDto(event.getInitiatorId()); dto.setInitiator(initiatorDto); @@ -338,13 +393,48 @@ private void validateRangeStartAndEnd(LocalDateTime rangeStart, LocalDateTime ra throw new BadRequestException("Дата начала не может быть позже даты окончания"); } - private void saveHit(String path, String ip) { + private Double getEventRating(Long eventId) { + try { + InteractionsCountRequestProto request = InteractionsCountRequestProto.newBuilder() + .addEventId(eventId) + .build(); + + return analyzerClient.getInteractionsCount(request) + .findFirst() + .map(RecommendedEventProto::getScore) + .orElse(0.0); + } catch (Exception e) { + log.warn("Не удалось получить рейтинг для события {}", eventId, e); + return 0.0; + } + } + + private Map getRatingsForEvents(List eventIds) { + if (eventIds.isEmpty()) return Map.of(); + + Map ratings = eventIds.stream() + .collect(Collectors.toMap(id -> id, id -> 0.0)); + + try { + InteractionsCountRequestProto request = InteractionsCountRequestProto.newBuilder() + .addAllEventId(eventIds) + .build(); + + analyzerClient.getInteractionsCount(request) + .forEach(proto -> ratings.put(proto.getEventId(), proto.getScore())); + } catch (Exception e) { + log.warn("Не удалось получить рейтинги для событий", e); + } + + return ratings; + } + + private boolean hasUserVisitedEvent(Long userId, Long eventId) { try { - CreateEndpointHitDto endpointHitDto = new CreateEndpointHitDto( - "main-service", path, ip, LocalDateTime.now()); - statsClient.saveHit(endpointHitDto); + return requestClient.hasUserConfirmedRequest(userId, eventId); } catch (Exception e) { - log.warn("Не удалось сохранить статистику для path={}, ip={}", path, ip, e); + log.warn("Не удалось проверить посещение события", e); + return false; } } @@ -374,56 +464,6 @@ private Map getConfirmedRequests(List eventIds) { return result; } - private Map getViewsForEvents(List eventIds) { - if (eventIds.isEmpty()) return Map.of(); - - Map views = eventIds.stream() - .collect(Collectors.toMap(id -> id, id -> 0L)); - - try { - List uris = eventIds.stream() - .map(id -> "/events/" + id) - .toList(); - - LocalDateTime start = eventRepository.findFirstByOrderByCreatedOnAsc().getCreatedOn(); - LocalDateTime end = LocalDateTime.now(); - - List stats = statsClient.getStats(start, end, uris, true); - - if (stats != null && !stats.isEmpty()) { - stats.forEach(stat -> { - Long eventId = getEventIdFromUri(stat.uri()); - if (eventId > -1L) { - views.put(eventId, stat.hits()); - } - }); - } - } catch (Exception e) { - log.warn("Сервис статистики недоступен, используем значение по умолчанию 0. eventIds={}", eventIds); - } - - return views; - } - - private Long getEventIdFromUri(String uri) { - try { - return Long.parseLong(uri.substring("/events".length() + 1)); - } catch (Exception e) { - return -1L; - } - } - - private EventStatistics getEventStatistics(List eventIds) { - if (eventIds.isEmpty()) { - return new EventStatistics(Map.of(), Map.of()); - } - - Map confirmedRequests = getConfirmedRequests(eventIds); - Map views = getViewsForEvents(eventIds); - - return new EventStatistics(confirmedRequests, views); - } - private void checkUserExists(Long userId) { try { userClient.getUser(userId); diff --git a/core/event-service/src/main/resources/schema.sql b/core/event-service/src/main/resources/schema.sql index 2963e87..e7f0b52 100644 --- a/core/event-service/src/main/resources/schema.sql +++ b/core/event-service/src/main/resources/schema.sql @@ -27,7 +27,7 @@ create TABLE IF NOT EXISTS events ( participant_limit INTEGER NOT NULL, request_moderation BOOLEAN NOT NULL, confirmed_requests INT NOT NULL, - views BIGINT NOT NULL + rating DOUBLE PRECISION NOT NULL ); -- Создание таблицы подборок diff --git a/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClient.java b/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClient.java index 48c759b..f07e6df 100644 --- a/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClient.java +++ b/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClient.java @@ -21,4 +21,7 @@ public interface RequestClient { @PostMapping("/events/count/confirmed") Map getConfirmedRequestsCount(@RequestBody List eventIds); + + @GetMapping("/internal/requests/user/{userId}/event/{eventId}/confirmed") + Boolean hasUserConfirmedRequest(@PathVariable Long userId, @PathVariable Long eventId); } diff --git a/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClientFallback.java b/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClientFallback.java index 6b23c77..d51109c 100644 --- a/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClientFallback.java +++ b/core/interaction-api/src/main/java/ru/yandex/practicum/client/RequestClientFallback.java @@ -23,4 +23,10 @@ public Map getConfirmedRequestsCount(List eventIds) { log.warn("Сервис запросов недоступен для batch, eventIds={}", eventIds); return eventIds.stream().collect(Collectors.toMap(id -> id, id -> 0L)); } + + @Override + public Boolean hasUserConfirmedRequest(Long userId, Long eventId) { // ✅ ДОБАВИТЬ + log.warn("Сервис запросов недоступен, userId={}, eventId={}", userId, eventId); + return false; + } } diff --git a/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventFullDto.java b/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventFullDto.java index a785993..2bfdb67 100644 --- a/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventFullDto.java +++ b/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventFullDto.java @@ -51,5 +51,5 @@ public class EventFullDto { String title; - Long views; + Double rating; } diff --git a/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventShortDto.java b/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventShortDto.java index 935db89..fc5778a 100644 --- a/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventShortDto.java +++ b/core/interaction-api/src/main/java/ru/yandex/practicum/dto/event/EventShortDto.java @@ -34,5 +34,5 @@ public class EventShortDto { String title; - Long views; + Double rating; } diff --git a/core/request-service/pom.xml b/core/request-service/pom.xml index 5e27657..47a9a5f 100644 --- a/core/request-service/pom.xml +++ b/core/request-service/pom.xml @@ -55,12 +55,6 @@ ${project.version} - - ru.yandex.practicum - stats-dto - ${project.version} - - org.projectlombok lombok @@ -90,7 +84,6 @@ org.springframework.retry spring-retry - 2.0.5 diff --git a/core/request-service/src/main/java/ru/yandex/practicum/controller/InternalRequestController.java b/core/request-service/src/main/java/ru/yandex/practicum/controller/InternalRequestController.java index 49c7d68..f0e2613 100644 --- a/core/request-service/src/main/java/ru/yandex/practicum/controller/InternalRequestController.java +++ b/core/request-service/src/main/java/ru/yandex/practicum/controller/InternalRequestController.java @@ -16,4 +16,10 @@ public class InternalRequestController { public Long countByStatus(@PathVariable Long eventId, @PathVariable RequestStatus status) { return requestRepository.countByEventIdAndStatus(eventId, status); } + + @GetMapping("/user/{userId}/event/{eventId}/confirmed") + public Boolean hasUserConfirmedRequest(@PathVariable Long userId, @PathVariable Long eventId) { + return requestRepository.existsByRequesterIdAndEventIdAndStatus( + userId, eventId, RequestStatus.CONFIRMED); + } } diff --git a/core/request-service/src/main/java/ru/yandex/practicum/repository/RequestRepository.java b/core/request-service/src/main/java/ru/yandex/practicum/repository/RequestRepository.java index fe99db6..b99e98d 100644 --- a/core/request-service/src/main/java/ru/yandex/practicum/repository/RequestRepository.java +++ b/core/request-service/src/main/java/ru/yandex/practicum/repository/RequestRepository.java @@ -30,4 +30,6 @@ public interface RequestRepository extends JpaRepository { "FROM Request r " + "WHERE r.eventId IN :eventIds AND r.status = 'CONFIRMED' GROUP BY r.eventId") List countConfirmedByEventIds(@Param("eventIds") List eventIds); + + boolean existsByRequesterIdAndEventIdAndStatus(Long userId, Long eventId, RequestStatus status); } diff --git a/core/request-service/src/main/java/ru/yandex/practicum/service/RequestServiceImpl.java b/core/request-service/src/main/java/ru/yandex/practicum/service/RequestServiceImpl.java index eb24838..42bbe6d 100644 --- a/core/request-service/src/main/java/ru/yandex/practicum/service/RequestServiceImpl.java +++ b/core/request-service/src/main/java/ru/yandex/practicum/service/RequestServiceImpl.java @@ -1,10 +1,14 @@ package ru.yandex.practicum.service; +import com.google.protobuf.Timestamp; import feign.FeignException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import ru.practicum.ewm.stats.proto.ActionTypeProto; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.yandex.practicum.client.CollectorClient; import ru.yandex.practicum.client.EventClient; import ru.yandex.practicum.client.UserClient; import ru.yandex.practicum.dto.event.EventFullDto; @@ -16,6 +20,7 @@ import ru.yandex.practicum.model.Request; import ru.yandex.practicum.repository.RequestRepository; +import java.time.Instant; import java.util.*; @Slf4j @@ -27,6 +32,7 @@ public class RequestServiceImpl implements RequestService { private final RequestMapper requestMapper; private final UserClient userClient; private final EventClient eventClient; + private final CollectorClient collectorClient; @Override @Transactional @@ -65,6 +71,8 @@ public ParticipationRequestDto addRequest(Long userId, Long eventId) { request = requestRepository.save(request); + sendRegisterAction(userId, eventId); + log.info("Добавление нового запроса на участие в событии с id={} от пользователя с id={}", eventId, userId); return requestMapper.toDto(request); } @@ -227,4 +235,23 @@ private void validateRequestsState(List requests, Long eventId) { } } } + + private void sendRegisterAction(Long userId, Long eventId) { + try { + UserActionProto action = UserActionProto.newBuilder() + .setUserId(userId) + .setEventId(eventId) + .setActionType(ActionTypeProto.REGISTER) + .setTimestamp(Timestamp.newBuilder() + .setSeconds(Instant.now().getEpochSecond()) + .setNanos(Instant.now().getNano()) + .build()) + .build(); + + collectorClient.sendUserAction(action); + log.debug("Отправлена регистрация в Collector: userId={}, eventId={}", userId, eventId); + } catch (Exception e) { + log.error("Ошибка отправки регистрации в Collector: {}", e.getMessage(), e); + } + } } diff --git a/core/user-service/pom.xml b/core/user-service/pom.xml index d43bfff..66e9b9e 100644 --- a/core/user-service/pom.xml +++ b/core/user-service/pom.xml @@ -55,12 +55,6 @@ ${project.version} - - ru.yandex.practicum - stats-dto - ${project.version} - - org.projectlombok lombok @@ -90,7 +84,6 @@ org.springframework.retry spring-retry - 2.0.5 diff --git a/docker-compose.yml b/docker-compose.yml index 17c6317..a42991c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: POSTGRES_PASSWORD: stat_password POSTGRES_DB: ewm_stats_db volumes: - - ./stats/stats-server/src/main/resources/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql + - ./stats/analyzer/src/main/resources/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql healthcheck: test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} -p 5432" ] @@ -32,8 +32,40 @@ services: volumes: - ./core/event-service/src/main/resources/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql healthcheck: - test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} -p 5432" ] - interval: 10s - timeout: 5s - retries: 5 - start_period: 10s \ No newline at end of file + test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} -p 5432" ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + kafka: + image: confluentinc/confluent-local:7.4.3 + hostname: kafka + container_name: kafka + ports: + - "9092:9092" # for client connections + - "9101:9101" # JMX + restart: unless-stopped + environment: + KAFKA_NODE_ID: 1 + KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092' + KAFKA_JMX_PORT: 9101 + KAFKA_JMX_HOSTNAME: localhost + KAFKA_PROCESS_ROLES: 'broker,controller' + KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093' + KAFKA_LISTENERS: 'PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092' + CLUSTER_ID: 'K0EA9p0yEe6MkAAAAkKsEg' + + kafka-init-topics: + image: confluentinc/confluent-local:7.4.3 + container_name: kafka-init-topics + depends_on: + - kafka + command: "bash -c \ + 'kafka-topics --create --topic stats.user-actions.v1 \ + --partitions 1 --replication-factor 1 --if-not-exists \ + --bootstrap-server kafka:29092 && \ + kafka-topics --create --topic stats.events-similarity.v1 \ + --partitions 1 --replication-factor 1 --if-not-exists \ + --bootstrap-server kafka:29092'" + init: true \ No newline at end of file diff --git a/execution-report.txt b/execution-report.txt new file mode 100644 index 0000000..c27a128 --- /dev/null +++ b/execution-report.txt @@ -0,0 +1,4230 @@ +-------------------------------- +Лог выполнения от 12/02/2026 - 15:36:03.736 MSK +-------------------------------- +12/02/2026 - 15:36:03.746 MSK -- [Trace]: Сгенерирован следующий набор событий о действиях пользователей: +{ user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T12:36:03.745101700Z } +{ user: 7, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T12:39:18.012101700Z } +{ user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T12:45:38.858101700Z } +{ user: 6, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T12:48:22.451101700Z } +{ user: 1, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T12:57:45.823101700Z } +{ user: 13, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T13:04:19.055101700Z } +{ user: 8, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T13:07:28.314101700Z } +{ user: 3, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T13:10:36.390101700Z } +{ user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T13:18:39.057101700Z } +{ user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T13:22:17.975101700Z } +{ user: 3, event: 14, type: ACTION_REGISTER, timestamp: 2026-02-09T13:27:55.313101700Z } +{ user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T13:33:18.046101700Z } +{ user: 10, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T13:36:54.532101700Z } +{ user: 1, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T13:45:29.375101700Z } +{ user: 10, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T13:48:25.304101700Z } +{ user: 4, event: 12, type: ACTION_REGISTER, timestamp: 2026-02-09T13:56:31.696101700Z } +{ user: 3, event: 11, type: ACTION_REGISTER, timestamp: 2026-02-09T14:05:21.197101700Z } +{ user: 5, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T14:09:53.924101700Z } +{ user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T14:16:57.666101700Z } +{ user: 10, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T14:19:41.333101700Z } +{ user: 1, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T14:25:47.479101700Z } +{ user: 12, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T14:33:09.183101700Z } +{ user: 8, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T14:39:42.401101700Z } +{ user: 7, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T14:42:38.938101700Z } +{ user: 9, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T14:49:15.054101700Z } +{ user: 13, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T14:58:32.465101700Z } +{ user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T15:04:13.477101700Z } +{ user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T15:09:29.696101700Z } +{ user: 7, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T15:14:06.959101700Z } +{ user: 6, event: 13, type: ACTION_REGISTER, timestamp: 2026-02-09T15:22:27.353101700Z } +{ user: 2, event: 13, type: ACTION_REGISTER, timestamp: 2026-02-09T15:26:10.833101700Z } +{ user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:34:47.078101700Z } +{ user: 13, event: 11, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:59.971101700Z } +{ user: 6, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T15:42:02.612101700Z } +{ user: 7, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T15:48:33.821101700Z } +{ user: 3, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:27.903101700Z } +{ user: 6, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:59:45.809101700Z } +{ user: 10, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:59.341101700Z } +{ user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T16:11:32.690101700Z } +{ user: 11, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T16:20:35.821101700Z } +{ user: 12, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T16:26:44.023101700Z } +{ user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:34:24.192101700Z } +{ user: 10, event: 4, type: ACTION_LIKE, timestamp: 2026-02-09T16:35:48.130101700Z } +{ user: 3, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T16:38:43.786101700Z } +{ user: 9, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T16:45:09.253101700Z } +{ user: 1, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:17.755101700Z } +{ user: 5, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T16:54:23.642101700Z } +{ user: 13, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T16:56:58.958101700Z } +{ user: 12, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T17:03:17.852101700Z } +{ user: 3, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T17:12:44.196101700Z } +{ user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T17:16:13.204101700Z } +{ user: 9, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T17:21:57.190101700Z } +{ user: 12, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:09.151101700Z } +{ user: 7, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T17:33:24.620101700Z } +{ user: 12, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T17:38:34.743101700Z } +{ user: 7, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T17:41:16.647101700Z } +{ user: 10, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:30.693101700Z } +{ user: 5, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T17:47:10.257101700Z } +{ user: 12, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:56:37.585101700Z } +{ user: 7, event: 11, type: ACTION_REGISTER, timestamp: 2026-02-09T18:02:34.454101700Z } +{ user: 13, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T18:10:14.670101700Z } +{ user: 4, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T18:19:33.717101700Z } +{ user: 4, event: 11, type: ACTION_VIEW, timestamp: 2026-02-09T18:25:57.901101700Z } +{ user: 10, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:34:34.154101700Z } +{ user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T18:39:23.703101700Z } +{ user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T18:44:01.845101700Z } +{ user: 8, event: 12, type: ACTION_REGISTER, timestamp: 2026-02-09T18:51:57.721101700Z } +{ user: 6, event: 14, type: ACTION_REGISTER, timestamp: 2026-02-09T18:59:49.806101700Z } +{ user: 10, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:03:07.288101700Z } +{ user: 11, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T19:10:05.393101700Z } +{ user: 1, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:17:46.180101700Z } +{ user: 1, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T19:26:15.202101700Z } +12/02/2026 - 15:36:03.746 MSK -- Начинаю тестирование. Сгенерировано 72 событий +12/02/2026 - 15:36:03.746 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:03.746 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T12:36:03.745101700Z } +12/02/2026 - 15:36:04.359 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.364 MSK -- Верификация для события закончена: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T12:36:03.745101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.364 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.364 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T12:39:18.012101700Z } +12/02/2026 - 15:36:04.364 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.365 MSK -- Верификация для события закончена: { user: 7, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T12:39:18.012101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.365 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.365 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T12:45:38.858101700Z } +12/02/2026 - 15:36:04.365 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.366 MSK -- Верификация для события закончена: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T12:45:38.858101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.366 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.366 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T12:48:22.451101700Z } +12/02/2026 - 15:36:04.366 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.367 MSK -- Верификация для события закончена: { user: 6, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T12:48:22.451101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.367 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.367 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T12:57:45.823101700Z } +12/02/2026 - 15:36:04.367 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.368 MSK -- Верификация для события закончена: { user: 1, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T12:57:45.823101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.368 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.368 MSK -- Отправляю событие о действии пользователя: { user: 13, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T13:04:19.055101700Z } +12/02/2026 - 15:36:04.368 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.368 MSK -- Верификация для события закончена: { user: 13, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T13:04:19.055101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.368 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.369 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T13:07:28.314101700Z } +12/02/2026 - 15:36:04.369 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.371 MSK -- Верификация для события закончена: { user: 8, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T13:07:28.314101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.371 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.371 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T13:10:36.390101700Z } +12/02/2026 - 15:36:04.371 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.372 MSK -- Верификация для события закончена: { user: 3, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T13:10:36.390101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.372 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.372 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T13:18:39.057101700Z } +12/02/2026 - 15:36:04.372 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.373 MSK -- Верификация для события закончена: { user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T13:18:39.057101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.373 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.373 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T13:22:17.975101700Z } +12/02/2026 - 15:36:04.373 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.374 MSK -- Верификация для события закончена: { user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T13:22:17.975101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.374 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.374 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 14, type: ACTION_REGISTER, timestamp: 2026-02-09T13:27:55.313101700Z } +12/02/2026 - 15:36:04.374 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.375 MSK -- Верификация для события закончена: { user: 3, event: 14, type: ACTION_REGISTER, timestamp: 2026-02-09T13:27:55.313101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.375 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.375 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T13:33:18.046101700Z } +12/02/2026 - 15:36:04.375 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.375 MSK -- Верификация для события закончена: { user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T13:33:18.046101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.375 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.375 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T13:36:54.532101700Z } +12/02/2026 - 15:36:04.375 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.375 MSK -- Верификация для события закончена: { user: 10, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T13:36:54.532101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.375 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.375 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T13:45:29.375101700Z } +12/02/2026 - 15:36:04.375 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.375 MSK -- Верификация для события закончена: { user: 1, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T13:45:29.375101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.375 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.375 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T13:48:25.304101700Z } +12/02/2026 - 15:36:04.379 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.379 MSK -- Верификация для события закончена: { user: 10, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T13:48:25.304101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.379 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.379 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 12, type: ACTION_REGISTER, timestamp: 2026-02-09T13:56:31.696101700Z } +12/02/2026 - 15:36:04.379 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.380 MSK -- Верификация для события закончена: { user: 4, event: 12, type: ACTION_REGISTER, timestamp: 2026-02-09T13:56:31.696101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.380 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.380 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 11, type: ACTION_REGISTER, timestamp: 2026-02-09T14:05:21.197101700Z } +12/02/2026 - 15:36:04.380 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.381 MSK -- Верификация для события закончена: { user: 3, event: 11, type: ACTION_REGISTER, timestamp: 2026-02-09T14:05:21.197101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.381 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.381 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T14:09:53.924101700Z } +12/02/2026 - 15:36:04.381 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.381 MSK -- Верификация для события закончена: { user: 5, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T14:09:53.924101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.381 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.382 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T14:16:57.666101700Z } +12/02/2026 - 15:36:04.382 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.382 MSK -- Верификация для события закончена: { user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T14:16:57.666101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.382 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.382 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T14:19:41.333101700Z } +12/02/2026 - 15:36:04.382 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.383 MSK -- Верификация для события закончена: { user: 10, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T14:19:41.333101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.383 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.383 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T14:25:47.479101700Z } +12/02/2026 - 15:36:04.383 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.384 MSK -- Верификация для события закончена: { user: 1, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T14:25:47.479101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.384 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.384 MSK -- Отправляю событие о действии пользователя: { user: 12, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T14:33:09.183101700Z } +12/02/2026 - 15:36:04.384 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.385 MSK -- Верификация для события закончена: { user: 12, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T14:33:09.183101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.385 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.385 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T14:39:42.401101700Z } +12/02/2026 - 15:36:04.385 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.385 MSK -- Верификация для события закончена: { user: 8, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T14:39:42.401101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.385 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.385 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T14:42:38.938101700Z } +12/02/2026 - 15:36:04.385 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.386 MSK -- Верификация для события закончена: { user: 7, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T14:42:38.938101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.386 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.386 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T14:49:15.054101700Z } +12/02/2026 - 15:36:04.386 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.387 MSK -- Верификация для события закончена: { user: 9, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T14:49:15.054101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.387 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.387 MSK -- Отправляю событие о действии пользователя: { user: 13, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T14:58:32.465101700Z } +12/02/2026 - 15:36:04.387 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.388 MSK -- Верификация для события закончена: { user: 13, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T14:58:32.465101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.388 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.388 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T15:04:13.477101700Z } +12/02/2026 - 15:36:04.388 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.391 MSK -- Верификация для события закончена: { user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T15:04:13.477101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.391 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.391 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T15:09:29.696101700Z } +12/02/2026 - 15:36:04.392 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.393 MSK -- Верификация для события закончена: { user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T15:09:29.696101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.393 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.393 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T15:14:06.959101700Z } +12/02/2026 - 15:36:04.393 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.394 MSK -- Верификация для события закончена: { user: 7, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T15:14:06.959101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.394 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.394 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 13, type: ACTION_REGISTER, timestamp: 2026-02-09T15:22:27.353101700Z } +12/02/2026 - 15:36:04.394 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.395 MSK -- Верификация для события закончена: { user: 6, event: 13, type: ACTION_REGISTER, timestamp: 2026-02-09T15:22:27.353101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.395 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.395 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 13, type: ACTION_REGISTER, timestamp: 2026-02-09T15:26:10.833101700Z } +12/02/2026 - 15:36:04.395 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.396 MSK -- Верификация для события закончена: { user: 2, event: 13, type: ACTION_REGISTER, timestamp: 2026-02-09T15:26:10.833101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.396 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.396 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:34:47.078101700Z } +12/02/2026 - 15:36:04.396 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.396 MSK -- Верификация для события закончена: { user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:34:47.078101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.396 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.396 MSK -- Отправляю событие о действии пользователя: { user: 13, event: 11, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:59.971101700Z } +12/02/2026 - 15:36:04.397 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.397 MSK -- Верификация для события закончена: { user: 13, event: 11, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:59.971101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.397 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.397 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T15:42:02.612101700Z } +12/02/2026 - 15:36:04.397 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.397 MSK -- Верификация для события закончена: { user: 6, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T15:42:02.612101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.397 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.397 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T15:48:33.821101700Z } +12/02/2026 - 15:36:04.397 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.397 MSK -- Верификация для события закончена: { user: 7, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T15:48:33.821101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.397 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.397 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:27.903101700Z } +12/02/2026 - 15:36:04.397 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.397 MSK -- Верификация для события закончена: { user: 3, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:27.903101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.397 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.397 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:59:45.809101700Z } +12/02/2026 - 15:36:04.401 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.401 MSK -- Верификация для события закончена: { user: 6, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:59:45.809101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.401 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.401 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:59.341101700Z } +12/02/2026 - 15:36:04.402 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.402 MSK -- Верификация для события закончена: { user: 10, event: 14, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:59.341101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.402 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.402 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T16:11:32.690101700Z } +12/02/2026 - 15:36:04.402 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.402 MSK -- Верификация для события закончена: { user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T16:11:32.690101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.402 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.402 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T16:20:35.821101700Z } +12/02/2026 - 15:36:04.402 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.403 MSK -- Верификация для события закончена: { user: 11, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T16:20:35.821101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.403 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.403 MSK -- Отправляю событие о действии пользователя: { user: 12, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T16:26:44.023101700Z } +12/02/2026 - 15:36:04.403 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.403 MSK -- Верификация для события закончена: { user: 12, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T16:26:44.023101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.403 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.403 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:34:24.192101700Z } +12/02/2026 - 15:36:04.404 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.404 MSK -- Верификация для события закончена: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:34:24.192101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.404 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.404 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 4, type: ACTION_LIKE, timestamp: 2026-02-09T16:35:48.130101700Z } +12/02/2026 - 15:36:04.404 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.405 MSK -- Верификация для события закончена: { user: 10, event: 4, type: ACTION_LIKE, timestamp: 2026-02-09T16:35:48.130101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.405 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.405 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T16:38:43.786101700Z } +12/02/2026 - 15:36:04.405 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.405 MSK -- Верификация для события закончена: { user: 3, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T16:38:43.786101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.405 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.405 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T16:45:09.253101700Z } +12/02/2026 - 15:36:04.405 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.406 MSK -- Верификация для события закончена: { user: 9, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T16:45:09.253101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.406 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.406 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:17.755101700Z } +12/02/2026 - 15:36:04.406 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.406 MSK -- Верификация для события закончена: { user: 1, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:17.755101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.406 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.406 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T16:54:23.642101700Z } +12/02/2026 - 15:36:04.407 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.407 MSK -- Верификация для события закончена: { user: 5, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T16:54:23.642101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.407 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.407 MSK -- Отправляю событие о действии пользователя: { user: 13, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T16:56:58.958101700Z } +12/02/2026 - 15:36:04.407 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.407 MSK -- Верификация для события закончена: { user: 13, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T16:56:58.958101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.407 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.407 MSK -- Отправляю событие о действии пользователя: { user: 12, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T17:03:17.852101700Z } +12/02/2026 - 15:36:04.409 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.409 MSK -- Верификация для события закончена: { user: 12, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T17:03:17.852101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.409 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.409 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T17:12:44.196101700Z } +12/02/2026 - 15:36:04.409 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.410 MSK -- Верификация для события закончена: { user: 3, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T17:12:44.196101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.410 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.410 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T17:16:13.204101700Z } +12/02/2026 - 15:36:04.410 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.410 MSK -- Верификация для события закончена: { user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T17:16:13.204101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.410 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.410 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T17:21:57.190101700Z } +12/02/2026 - 15:36:04.410 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.412 MSK -- Верификация для события закончена: { user: 9, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T17:21:57.190101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.412 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.412 MSK -- Отправляю событие о действии пользователя: { user: 12, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:09.151101700Z } +12/02/2026 - 15:36:04.412 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.413 MSK -- Верификация для события закончена: { user: 12, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:09.151101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.413 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.413 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T17:33:24.620101700Z } +12/02/2026 - 15:36:04.413 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.413 MSK -- Верификация для события закончена: { user: 7, event: 13, type: ACTION_VIEW, timestamp: 2026-02-09T17:33:24.620101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.413 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.413 MSK -- Отправляю событие о действии пользователя: { user: 12, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T17:38:34.743101700Z } +12/02/2026 - 15:36:04.414 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.414 MSK -- Верификация для события закончена: { user: 12, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T17:38:34.743101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.414 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.414 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T17:41:16.647101700Z } +12/02/2026 - 15:36:04.414 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.414 MSK -- Верификация для события закончена: { user: 7, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T17:41:16.647101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.414 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.414 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:30.693101700Z } +12/02/2026 - 15:36:04.415 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.415 MSK -- Верификация для события закончена: { user: 10, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:30.693101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.415 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.415 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T17:47:10.257101700Z } +12/02/2026 - 15:36:04.415 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.415 MSK -- Верификация для события закончена: { user: 5, event: 12, type: ACTION_VIEW, timestamp: 2026-02-09T17:47:10.257101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.415 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.415 MSK -- Отправляю событие о действии пользователя: { user: 12, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:56:37.585101700Z } +12/02/2026 - 15:36:04.415 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.416 MSK -- Верификация для события закончена: { user: 12, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:56:37.585101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.416 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.416 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 11, type: ACTION_REGISTER, timestamp: 2026-02-09T18:02:34.454101700Z } +12/02/2026 - 15:36:04.416 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.416 MSK -- Верификация для события закончена: { user: 7, event: 11, type: ACTION_REGISTER, timestamp: 2026-02-09T18:02:34.454101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.417 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.417 MSK -- Отправляю событие о действии пользователя: { user: 13, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T18:10:14.670101700Z } +12/02/2026 - 15:36:04.417 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.417 MSK -- Верификация для события закончена: { user: 13, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T18:10:14.670101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.417 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.417 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T18:19:33.717101700Z } +12/02/2026 - 15:36:04.417 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.418 MSK -- Верификация для события закончена: { user: 4, event: 1, type: ACTION_REGISTER, timestamp: 2026-02-09T18:19:33.717101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.418 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.418 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 11, type: ACTION_VIEW, timestamp: 2026-02-09T18:25:57.901101700Z } +12/02/2026 - 15:36:04.418 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.418 MSK -- Верификация для события закончена: { user: 4, event: 11, type: ACTION_VIEW, timestamp: 2026-02-09T18:25:57.901101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.418 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.418 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:34:34.154101700Z } +12/02/2026 - 15:36:04.418 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.418 MSK -- Верификация для события закончена: { user: 10, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:34:34.154101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.418 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.418 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T18:39:23.703101700Z } +12/02/2026 - 15:36:04.421 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.421 MSK -- Верификация для события закончена: { user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T18:39:23.703101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.421 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.421 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T18:44:01.845101700Z } +12/02/2026 - 15:36:04.421 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.421 MSK -- Верификация для события закончена: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T18:44:01.845101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.421 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.421 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 12, type: ACTION_REGISTER, timestamp: 2026-02-09T18:51:57.721101700Z } +12/02/2026 - 15:36:04.421 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.421 MSK -- Верификация для события закончена: { user: 8, event: 12, type: ACTION_REGISTER, timestamp: 2026-02-09T18:51:57.721101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.421 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.421 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 14, type: ACTION_REGISTER, timestamp: 2026-02-09T18:59:49.806101700Z } +12/02/2026 - 15:36:04.421 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.423 MSK -- Верификация для события закончена: { user: 6, event: 14, type: ACTION_REGISTER, timestamp: 2026-02-09T18:59:49.806101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.423 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.423 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:03:07.288101700Z } +12/02/2026 - 15:36:04.423 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.423 MSK -- Верификация для события закончена: { user: 10, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:03:07.288101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.423 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.423 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T19:10:05.393101700Z } +12/02/2026 - 15:36:04.423 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.424 MSK -- Верификация для события закончена: { user: 11, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T19:10:05.393101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.424 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.424 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:17:46.180101700Z } +12/02/2026 - 15:36:04.424 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.424 MSK -- Верификация для события закончена: { user: 1, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:17:46.180101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.424 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 15:36:04.424 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T19:26:15.202101700Z } +12/02/2026 - 15:36:04.424 MSK -- [Ошибка]: Ошибка при отправке события: UNAVAILABLE: No servers found for collector +Совет: +Проверьте сервис Collector - удостоверьтесь, что он реализует gRPC сервис, а также корректно принимает сообщения о действиях пользователей и сохраняет их в топик Kafka - stats.user-actions.v1 +Убедитесь, что сервис Collector доступен как collector +Убедитесь, что jar-файл содержит корректные метаданные в файле MANIFEST.MF (подключите spring-boot-maven-plugin) +12/02/2026 - 15:36:04.424 MSK -- Верификация для события закончена: { user: 1, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T19:26:15.202101700Z } +-------------------------------- +-------------------------------- +12/02/2026 - 15:36:04.424 MSK -- Завершаю работу приложения +-------------------------------- +Обнаружено 72 ошибок. +-------------------------------- +Лог выполнения от 12/02/2026 - 17:30:03.223 MSK +-------------------------------- +12/02/2026 - 17:30:03.244 MSK -- [Trace]: Сгенерирован следующий набор событий о действиях пользователей: +{ user: 9, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T14:30:03.238680200Z } +{ user: 1, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T14:35:02.716680200Z } +{ user: 3, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:43:43.102680200Z } +{ user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T14:51:12.393680200Z } +{ user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:52:16.424680200Z } +{ user: 2, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T14:58:28.413680200Z } +{ user: 6, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T15:06:06.333680200Z } +{ user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:10:30.925680200Z } +{ user: 8, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T15:18:07.935680200Z } +{ user: 3, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:25:36.228680200Z } +{ user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:28:41.523680200Z } +{ user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:25.789680200Z } +{ user: 4, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T15:36:42.713680200Z } +{ user: 3, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T15:41:23.814680200Z } +{ user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T15:49:08.123680200Z } +{ user: 11, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:50.232680200Z } +{ user: 5, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:11.995680200Z } +{ user: 9, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T16:12:09.298680200Z } +{ user: 4, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T16:21:41.084680200Z } +{ user: 8, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T16:30:55.223680200Z } +{ user: 4, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T16:36:44.542680200Z } +{ user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:42:23.074680200Z } +{ user: 2, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T16:47:23.285680200Z } +{ user: 4, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T16:49:36.229680200Z } +{ user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:52.256680200Z } +{ user: 4, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:01:12.667680200Z } +{ user: 4, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:11:04.900680200Z } +{ user: 9, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:20:05.196680200Z } +{ user: 11, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:24:17.062680200Z } +{ user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:23.549680200Z } +{ user: 9, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T17:32:33.920680200Z } +{ user: 1, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:37:37.444680200Z } +{ user: 9, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:15.055680200Z } +{ user: 9, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:44:04.273680200Z } +{ user: 1, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T17:45:11.796680200Z } +{ user: 5, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:49:08.622680200Z } +{ user: 5, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T17:59:06.304680200Z } +{ user: 4, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T18:03:46.480680200Z } +{ user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:06:38.997680200Z } +{ user: 11, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T18:09:19.315680200Z } +{ user: 3, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T18:11:30.829680200Z } +{ user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T18:21:29.889680200Z } +{ user: 4, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T18:29:28.868680200Z } +{ user: 4, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:32:36.340680200Z } +{ user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T18:37:19.058680200Z } +{ user: 1, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T18:43:18.738680200Z } +{ user: 9, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:50:45.320680200Z } +{ user: 4, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T18:55:12.382680200Z } +{ user: 11, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T19:03:38.399680200Z } +{ user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T19:11:21.501680200Z } +{ user: 7, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T19:16:22.963680200Z } +{ user: 2, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T19:20:43.645680200Z } +{ user: 1, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T19:29:27.872680200Z } +{ user: 2, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T19:34:50.417680200Z } +{ user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T19:42:10.615680200Z } +{ user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T19:46:00.074680200Z } +{ user: 8, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:48:05.813680200Z } +{ user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:52:42.229680200Z } +{ user: 4, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T19:57:52.491680200Z } +{ user: 6, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T20:04:20.847680200Z } +{ user: 2, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T20:06:33.503680200Z } +{ user: 6, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T20:08:27.681680200Z } +{ user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T20:12:33.305680200Z } +{ user: 7, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:16:27.692680200Z } +{ user: 3, event: 8, type: ACTION_LIKE, timestamp: 2026-02-09T20:24:33.573680200Z } +{ user: 9, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T20:30:45.219680200Z } +{ user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T20:37:30.578680200Z } +{ user: 2, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T20:46:48.533680200Z } +{ user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T20:52:43.779680200Z } +{ user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:59:25.513680200Z } +{ user: 1, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T21:09:08.538680200Z } +{ user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:12:56.646680200Z } +{ user: 7, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T21:20:04.152680200Z } +{ user: 11, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:29:08.128680200Z } +{ user: 7, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T21:34:13.552680200Z } +{ user: 4, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T21:38:14.641680200Z } +{ user: 2, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T21:43:10.859680200Z } +{ user: 9, event: 6, type: ACTION_LIKE, timestamp: 2026-02-09T21:44:13.482680200Z } +{ user: 11, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T21:48:01.621680200Z } +{ user: 5, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T21:54:16.066680200Z } +{ user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T21:56:09.107680200Z } +{ user: 6, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T22:05:01.835680200Z } +12/02/2026 - 17:30:03.249 MSK -- Начинаю тестирование. Сгенерировано 82 событий +12/02/2026 - 17:30:03.249 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:03.249 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T14:30:03.238680200Z } +12/02/2026 - 17:30:04.731 MSK -- [Trace]: Событие отправлено: { user: 9, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T14:30:03.238680200Z } +12/02/2026 - 17:30:04.731 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T14:30:03.238680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:05.087 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 9, type: REGISTER, timestamp: 2026-02-09T14:30:03.238Z } +12/02/2026 - 17:30:05.088 MSK -- Событие REGISTER пользователя 9 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:30:05.090 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:05.091 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [9]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:05.092 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:06.102 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:06.113 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:30:06.293 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 0.80 } +12/02/2026 - 17:30:06.293 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 0.80 } +12/02/2026 - 17:30:06.293 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:06.293 MSK -- Верификация для события закончена: { user: 9, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T14:30:03.238680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:06.293 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:06.293 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T14:35:02.716680200Z } +12/02/2026 - 17:30:06.299 MSK -- [Trace]: Событие отправлено: { user: 1, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T14:35:02.716680200Z } +12/02/2026 - 17:30:06.299 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T14:35:02.716680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:06.306 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 10, type: REGISTER, timestamp: 2026-02-09T14:35:02.716Z } +12/02/2026 - 17:30:06.306 MSK -- Событие REGISTER пользователя 1 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:06.306 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:06.306 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [10]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:06.306 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:07.318 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:07.318 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:07.326 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 0.80 } +12/02/2026 - 17:30:07.326 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 0.80 } +12/02/2026 - 17:30:07.326 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:07.326 MSK -- Верификация для события закончена: { user: 1, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T14:35:02.716680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:07.326 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:07.326 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:43:43.102680200Z } +12/02/2026 - 17:30:07.330 MSK -- [Trace]: Событие отправлено: { user: 3, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:43:43.102680200Z } +12/02/2026 - 17:30:07.330 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:43:43.102680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:07.335 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 4, type: REGISTER, timestamp: 2026-02-09T14:43:43.102Z } +12/02/2026 - 17:30:07.335 MSK -- Событие REGISTER пользователя 3 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:07.335 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:07.335 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [4]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:07.336 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:08.351 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:08.351 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:08.360 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 0.80 } +12/02/2026 - 17:30:08.360 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 0.80 } +12/02/2026 - 17:30:08.360 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:08.360 MSK -- Верификация для события закончена: { user: 3, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:43:43.102680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:08.360 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:08.360 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T14:51:12.393680200Z } +12/02/2026 - 17:30:08.365 MSK -- [Trace]: Событие отправлено: { user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T14:51:12.393680200Z } +12/02/2026 - 17:30:08.365 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T14:51:12.393680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:08.370 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 5, type: VIEW, timestamp: 2026-02-09T14:51:12.393Z } +12/02/2026 - 17:30:08.370 MSK -- Событие VIEW пользователя 6 с мероприятием 5 - проверено +-------------------------------- +12/02/2026 - 17:30:08.370 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:08.370 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [5]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:08.370 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:09.377 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:09.377 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [5] +12/02/2026 - 17:30:09.384 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 5, score: 0.40 } +12/02/2026 - 17:30:09.384 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 5, score: 0.40 } +12/02/2026 - 17:30:09.384 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:09.384 MSK -- Верификация для события закончена: { user: 6, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T14:51:12.393680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:09.384 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:09.384 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:52:16.424680200Z } +12/02/2026 - 17:30:09.387 MSK -- [Trace]: Событие отправлено: { user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:52:16.424680200Z } +12/02/2026 - 17:30:09.387 MSK -- Ожидаю 10 секунд получения события { user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:52:16.424680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:09.394 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 10, event: 4, type: REGISTER, timestamp: 2026-02-09T14:52:16.424Z } +12/02/2026 - 17:30:09.394 MSK -- Событие REGISTER пользователя 10 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:09.394 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [10] для мероприятия [4] +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [10] +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [10] +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [10] +12/02/2026 - 17:30:09.404 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:09.404 MSK -- [Trace]: В результате действия [REGISTER] пользователя [10] с мероприятием [4] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:09.404 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:10.410 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:10.410 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:10.426 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 1.60 } +12/02/2026 - 17:30:10.426 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 1.60 } +12/02/2026 - 17:30:10.426 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:10.426 MSK -- Верификация для события закончена: { user: 10, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T14:52:16.424680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:10.426 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:10.426 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T14:58:28.413680200Z } +12/02/2026 - 17:30:10.433 MSK -- [Trace]: Событие отправлено: { user: 2, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T14:58:28.413680200Z } +12/02/2026 - 17:30:10.434 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T14:58:28.413680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:10.449 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 2, type: REGISTER, timestamp: 2026-02-09T14:58:28.413Z } +12/02/2026 - 17:30:10.449 MSK -- Событие REGISTER пользователя 2 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:30:10.449 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:10.450 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [2]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:10.450 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:11.462 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:11.462 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:30:11.468 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 0.80 } +12/02/2026 - 17:30:11.468 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 0.80 } +12/02/2026 - 17:30:11.468 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:11.468 MSK -- Верификация для события закончена: { user: 2, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T14:58:28.413680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:11.468 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:11.468 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T15:06:06.333680200Z } +12/02/2026 - 17:30:11.473 MSK -- [Trace]: Событие отправлено: { user: 6, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T15:06:06.333680200Z } +12/02/2026 - 17:30:11.473 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T15:06:06.333680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:11.480 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 1, type: VIEW, timestamp: 2026-02-09T15:06:06.333Z } +12/02/2026 - 17:30:11.481 MSK -- Событие VIEW пользователя 6 с мероприятием 1 - проверено +-------------------------------- +12/02/2026 - 17:30:11.481 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:11.481 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [1]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:11.481 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [5] равен [1,000000] (min=[0,400000], norm1=[0,632456], norm2=[0,632456]) +12/02/2026 - 17:30:11.484 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:11.540 MSK -- Событие { eventA: 1, eventB: 5, score: 1.00, timestamp: 2026-02-12T14:30:11.482Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:12.564 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:12.564 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [1] +12/02/2026 - 17:30:12.573 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 1, score: 0.40 } +12/02/2026 - 17:30:12.573 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 1, score: 0.40 } +12/02/2026 - 17:30:12.573 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:12.573 MSK -- Верификация для события закончена: { user: 6, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T15:06:06.333680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:12.573 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:12.573 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:10:30.925680200Z } +12/02/2026 - 17:30:12.577 MSK -- [Trace]: Событие отправлено: { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:10:30.925680200Z } +12/02/2026 - 17:30:12.578 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:10:30.925680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:12.586 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 7, type: VIEW, timestamp: 2026-02-09T15:10:30.925Z } +12/02/2026 - 17:30:12.586 MSK -- Событие VIEW пользователя 3 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:12.586 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:12.586 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [7]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:12.586 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [4] равен [0,500000] (min=[0,400000], norm1=[0,632456], norm2=[1,264911]) +12/02/2026 - 17:30:12.586 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:12.593 MSK -- Событие { eventA: 4, eventB: 7, score: 0.50, timestamp: 2026-02-12T14:30:12.581Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:13.599 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:13.599 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:13.606 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 0.40 } +12/02/2026 - 17:30:13.606 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 0.40 } +12/02/2026 - 17:30:13.606 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:13.606 MSK -- Верификация для события закончена: { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:10:30.925680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:13.606 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:13.607 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T15:18:07.935680200Z } +12/02/2026 - 17:30:13.610 MSK -- [Trace]: Событие отправлено: { user: 8, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T15:18:07.935680200Z } +12/02/2026 - 17:30:13.610 MSK -- Ожидаю 10 секунд получения события { user: 8, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T15:18:07.935680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:13.615 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 8, event: 3, type: REGISTER, timestamp: 2026-02-09T15:18:07.935Z } +12/02/2026 - 17:30:13.615 MSK -- Событие REGISTER пользователя 8 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:30:13.615 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:13.615 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [3]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:13.615 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:14.631 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:14.631 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:30:14.638 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 0.80 } +12/02/2026 - 17:30:14.638 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 0.80 } +12/02/2026 - 17:30:14.638 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:14.638 MSK -- Верификация для события закончена: { user: 8, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T15:18:07.935680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:14.638 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:14.638 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:25:36.228680200Z } +12/02/2026 - 17:30:14.641 MSK -- [Trace]: Событие отправлено: { user: 3, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:25:36.228680200Z } +12/02/2026 - 17:30:14.641 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:25:36.228680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 10, type: VIEW, timestamp: 2026-02-09T15:25:36.228Z } +12/02/2026 - 17:30:14.648 MSK -- Событие VIEW пользователя 3 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:14.648 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [3] для мероприятия [10] +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [3] +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [3] +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [3] +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:14.648 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [3] +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [4] равен [0,288675] (min=[0,400000], norm1=[1,095445], norm2=[1,264911]) +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [3] +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [3] +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [7] равен [0,577350] (min=[0,400000], norm1=[1,095445], norm2=[0,632456]) +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [3] +12/02/2026 - 17:30:14.650 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:14.650 MSK -- [Trace]: В результате действия [VIEW] пользователя [3] с мероприятием [10] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:14.650 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:14.656 MSK -- Событие { eventA: 4, eventB: 10, score: 0.29, timestamp: 2026-02-12T14:30:14.644Z } проверено +12/02/2026 - 17:30:14.656 MSK -- Событие { eventA: 7, eventB: 10, score: 0.58, timestamp: 2026-02-12T14:30:14.644Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:15.657 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:15.658 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:15.665 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 1.20 } +12/02/2026 - 17:30:15.665 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 1.20 } +12/02/2026 - 17:30:15.665 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:15.665 MSK -- Верификация для события закончена: { user: 3, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T15:25:36.228680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:15.665 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:15.665 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:28:41.523680200Z } +12/02/2026 - 17:30:15.670 MSK -- [Trace]: Событие отправлено: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:28:41.523680200Z } +12/02/2026 - 17:30:15.671 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:28:41.523680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 7, type: VIEW, timestamp: 2026-02-09T15:28:41.523Z } +12/02/2026 - 17:30:15.679 MSK -- Событие VIEW пользователя 9 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:15.679 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [9] для мероприятия [7] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [9] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [9] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [9] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [9] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [9] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [9] +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [9] равен [0,500000] (min=[0,400000], norm1=[0,894427], norm2=[0,894427]) +12/02/2026 - 17:30:15.679 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [9] +12/02/2026 - 17:30:15.680 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:15.680 MSK -- [Trace]: В результате действия [VIEW] пользователя [9] с мероприятием [7] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:15.680 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:15.685 MSK -- Событие { eventA: 7, eventB: 9, score: 0.50, timestamp: 2026-02-12T14:30:15.674Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:16.686 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:16.686 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:16.693 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 0.80 } +12/02/2026 - 17:30:16.693 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 0.80 } +12/02/2026 - 17:30:16.693 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:16.693 MSK -- Верификация для события закончена: { user: 9, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:28:41.523680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:16.693 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:16.693 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:25.789680200Z } +12/02/2026 - 17:30:16.696 MSK -- [Trace]: Событие отправлено: { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:25.789680200Z } +12/02/2026 - 17:30:16.696 MSK -- Ожидаю 10 секунд получения события { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:25.789680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 10, event: 7, type: VIEW, timestamp: 2026-02-09T15:35:25.789Z } +12/02/2026 - 17:30:16.701 MSK -- Событие VIEW пользователя 10 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:16.701 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [10] для мероприятия [7] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [4] равен [0,577350] (min=[0,800000], norm1=[1,095445], norm2=[1,264911]) +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [10] +12/02/2026 - 17:30:16.701 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:16.701 MSK -- [Trace]: В результате действия [VIEW] пользователя [10] с мероприятием [7] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:16.702 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:16.708 MSK -- Событие { eventA: 4, eventB: 7, score: 0.58, timestamp: 2026-02-12T14:30:16.699Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:17.719 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:17.719 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:17.725 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 1.20 } +12/02/2026 - 17:30:17.725 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 1.20 } +12/02/2026 - 17:30:17.725 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:17.725 MSK -- Верификация для события закончена: { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T15:35:25.789680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:17.725 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:17.725 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T15:36:42.713680200Z } +12/02/2026 - 17:30:17.728 MSK -- [Trace]: Событие отправлено: { user: 4, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T15:36:42.713680200Z } +12/02/2026 - 17:30:17.728 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T15:36:42.713680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:17.733 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 9, type: REGISTER, timestamp: 2026-02-09T15:36:42.713Z } +12/02/2026 - 17:30:17.733 MSK -- Событие REGISTER пользователя 4 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:30:17.733 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [9] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [1] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [2] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [3] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [4] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [5] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [7] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [10] для пользователя [4] +12/02/2026 - 17:30:17.734 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:17.734 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [9] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:17.734 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:18.740 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:18.741 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:30:18.748 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 1.60 } +12/02/2026 - 17:30:18.748 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 1.60 } +12/02/2026 - 17:30:18.748 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:18.748 MSK -- Верификация для события закончена: { user: 4, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T15:36:42.713680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:18.748 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:18.748 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T15:41:23.814680200Z } +12/02/2026 - 17:30:18.751 MSK -- [Trace]: Событие отправлено: { user: 3, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T15:41:23.814680200Z } +12/02/2026 - 17:30:18.751 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T15:41:23.814680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:18.758 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 8, type: REGISTER, timestamp: 2026-02-09T15:41:23.814Z } +12/02/2026 - 17:30:18.758 MSK -- Событие REGISTER пользователя 3 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:30:18.758 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:18.758 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [8]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:18.758 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [4] равен [0,707107] (min=[0,800000], norm1=[0,894427], norm2=[1,264911]) +12/02/2026 - 17:30:18.758 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [7] равен [0,408248] (min=[0,400000], norm1=[0,894427], norm2=[1,095445]) +12/02/2026 - 17:30:18.758 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [10] равен [0,408248] (min=[0,400000], norm1=[0,894427], norm2=[1,095445]) +12/02/2026 - 17:30:18.758 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:18.764 MSK -- Событие { eventA: 4, eventB: 8, score: 0.71, timestamp: 2026-02-12T14:30:18.754Z } проверено +12/02/2026 - 17:30:18.764 MSK -- Событие { eventA: 7, eventB: 8, score: 0.41, timestamp: 2026-02-12T14:30:18.754Z } проверено +12/02/2026 - 17:30:18.764 MSK -- Событие { eventA: 8, eventB: 10, score: 0.41, timestamp: 2026-02-12T14:30:18.754Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:19.776 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:19.776 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:30:19.784 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 0.80 } +12/02/2026 - 17:30:19.784 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 0.80 } +12/02/2026 - 17:30:19.784 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:19.784 MSK -- Верификация для события закончена: { user: 3, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T15:41:23.814680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:19.784 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:19.784 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T15:49:08.123680200Z } +12/02/2026 - 17:30:19.788 MSK -- [Trace]: Событие отправлено: { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T15:49:08.123680200Z } +12/02/2026 - 17:30:19.788 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T15:49:08.123680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:19.793 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 3, type: VIEW, timestamp: 2026-02-09T15:49:08.123Z } +12/02/2026 - 17:30:19.794 MSK -- Событие VIEW пользователя 3 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:30:19.794 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [3] для мероприятия [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [4] равен [0,288675] (min=[0,400000], norm1=[1,095445], norm2=[1,264911]) +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [7] равен [0,333333] (min=[0,400000], norm1=[1,095445], norm2=[1,095445]) +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [8] равен [0,408248] (min=[0,400000], norm1=[1,095445], norm2=[0,894427]) +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [3] +12/02/2026 - 17:30:19.794 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [10] равен [0,333333] (min=[0,400000], norm1=[1,095445], norm2=[1,095445]) +12/02/2026 - 17:30:19.794 MSK -- [Trace]: В результате действия [VIEW] пользователя [3] с мероприятием [3] было рассчитано 4 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:19.794 MSK -- Ожидаю 15 секунд получения 4 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:19.800 MSK -- Событие { eventA: 3, eventB: 4, score: 0.29, timestamp: 2026-02-12T14:30:19.790Z } проверено +12/02/2026 - 17:30:19.800 MSK -- Событие { eventA: 3, eventB: 7, score: 0.33, timestamp: 2026-02-12T14:30:19.790Z } проверено +12/02/2026 - 17:30:19.800 MSK -- Событие { eventA: 3, eventB: 8, score: 0.41, timestamp: 2026-02-12T14:30:19.790Z } проверено +12/02/2026 - 17:30:19.800 MSK -- Событие { eventA: 3, eventB: 10, score: 0.33, timestamp: 2026-02-12T14:30:19.790Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:20.804 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:20.804 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:30:20.811 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 1.20 } +12/02/2026 - 17:30:20.811 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 1.20 } +12/02/2026 - 17:30:20.811 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:20.811 MSK -- Верификация для события закончена: { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T15:49:08.123680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:20.811 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:20.811 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:50.232680200Z } +12/02/2026 - 17:30:20.815 MSK -- [Trace]: Событие отправлено: { user: 11, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:50.232680200Z } +12/02/2026 - 17:30:20.815 MSK -- Ожидаю 10 секунд получения события { user: 11, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:50.232680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 11, event: 10, type: REGISTER, timestamp: 2026-02-09T15:53:50.232Z } +12/02/2026 - 17:30:20.820 MSK -- Событие REGISTER пользователя 11 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:20.820 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [11] для мероприятия [10] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [11] +12/02/2026 - 17:30:20.820 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:20.820 MSK -- [Trace]: В результате действия [REGISTER] пользователя [11] с мероприятием [10] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:20.820 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:21.831 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:21.831 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:21.838 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 2.00 } +12/02/2026 - 17:30:21.838 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 2.00 } +12/02/2026 - 17:30:21.838 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:21.838 MSK -- Верификация для события закончена: { user: 11, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T15:53:50.232680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:21.838 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:21.838 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:11.995680200Z } +12/02/2026 - 17:30:21.841 MSK -- [Trace]: Событие отправлено: { user: 5, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:11.995680200Z } +12/02/2026 - 17:30:21.841 MSK -- Ожидаю 10 секунд получения события { user: 5, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:11.995680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:21.847 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 5, event: 7, type: VIEW, timestamp: 2026-02-09T16:03:11.995Z } +12/02/2026 - 17:30:21.848 MSK -- Событие VIEW пользователя 5 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:21.848 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [5] для мероприятия [7] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [5] +12/02/2026 - 17:30:21.848 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:21.848 MSK -- [Trace]: В результате действия [VIEW] пользователя [5] с мероприятием [7] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:21.848 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:22.849 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:22.849 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:22.856 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 1.60 } +12/02/2026 - 17:30:22.856 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 1.60 } +12/02/2026 - 17:30:22.856 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:22.857 MSK -- Верификация для события закончена: { user: 5, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:03:11.995680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:22.857 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:22.857 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T16:12:09.298680200Z } +12/02/2026 - 17:30:22.860 MSK -- [Trace]: Событие отправлено: { user: 9, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T16:12:09.298680200Z } +12/02/2026 - 17:30:22.860 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T16:12:09.298680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 2, type: VIEW, timestamp: 2026-02-09T16:12:09.298Z } +12/02/2026 - 17:30:22.866 MSK -- Событие VIEW пользователя 9 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:30:22.866 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [9] для мероприятия [2] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [1] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [3] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [4] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [5] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [7] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [7] равен [0,288675] (min=[0,400000], norm1=[1,095445], norm2=[1,264911]) +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [8] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [9] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [9] равен [0,288675] (min=[0,400000], norm1=[1,095445], norm2=[1,264911]) +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [10] для пользователя [9] +12/02/2026 - 17:30:22.866 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:22.866 MSK -- [Trace]: В результате действия [VIEW] пользователя [9] с мероприятием [2] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:22.866 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:22.873 MSK -- Событие { eventA: 2, eventB: 7, score: 0.29, timestamp: 2026-02-12T14:30:22.863Z } проверено +12/02/2026 - 17:30:22.873 MSK -- Событие { eventA: 2, eventB: 9, score: 0.29, timestamp: 2026-02-12T14:30:22.863Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:23.884 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:23.884 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:30:23.891 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 1.20 } +12/02/2026 - 17:30:23.891 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 1.20 } +12/02/2026 - 17:30:23.891 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:23.891 MSK -- Верификация для события закончена: { user: 9, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T16:12:09.298680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:23.891 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:23.891 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T16:21:41.084680200Z } +12/02/2026 - 17:30:23.894 MSK -- [Trace]: Событие отправлено: { user: 4, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T16:21:41.084680200Z } +12/02/2026 - 17:30:23.894 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T16:21:41.084680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 3, type: REGISTER, timestamp: 2026-02-09T16:21:41.084Z } +12/02/2026 - 17:30:23.899 MSK -- Событие REGISTER пользователя 4 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:30:23.899 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [3] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [9] равен [0,447214] (min=[0,800000], norm1=[1,414214], norm2=[1,264911]) +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [4] +12/02/2026 - 17:30:23.899 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:23.899 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [3] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:23.899 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:23.905 MSK -- Событие { eventA: 3, eventB: 9, score: 0.45, timestamp: 2026-02-12T14:30:23.897Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:24.915 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:24.915 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:30:24.922 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 2.00 } +12/02/2026 - 17:30:24.922 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 2.00 } +12/02/2026 - 17:30:24.922 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:24.922 MSK -- Верификация для события закончена: { user: 4, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T16:21:41.084680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:24.922 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:24.922 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T16:30:55.223680200Z } +12/02/2026 - 17:30:24.925 MSK -- [Trace]: Событие отправлено: { user: 8, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T16:30:55.223680200Z } +12/02/2026 - 17:30:24.925 MSK -- Ожидаю 10 секунд получения события { user: 8, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T16:30:55.223680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:24.930 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 8, event: 3, type: VIEW, timestamp: 2026-02-09T16:30:55.223Z } +12/02/2026 - 17:30:24.930 MSK -- Событие VIEW пользователя 8 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:30:24.930 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:24.930 MSK -- [Trace]: В результате действия [VIEW] пользователя [8] с мероприятием [3] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:24.930 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:25.945 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:25.945 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:30:25.952 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 2.00 } +12/02/2026 - 17:30:25.952 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 2.00 } +12/02/2026 - 17:30:25.953 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:25.953 MSK -- Верификация для события закончена: { user: 8, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T16:30:55.223680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:25.953 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:25.953 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T16:36:44.542680200Z } +12/02/2026 - 17:30:25.956 MSK -- [Trace]: Событие отправлено: { user: 4, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T16:36:44.542680200Z } +12/02/2026 - 17:30:25.956 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T16:36:44.542680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 4, type: REGISTER, timestamp: 2026-02-09T16:36:44.542Z } +12/02/2026 - 17:30:25.961 MSK -- Событие REGISTER пользователя 4 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:25.961 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [4] +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [1] для пользователя [4] +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [2] для пользователя [4] +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [3] для пользователя [4] +12/02/2026 - 17:30:25.961 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [3] равен [0,547723] (min=[1,200000], norm1=[1,549193], norm2=[1,414214]) +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [4] +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [7] для пользователя [4] +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [8] для пользователя [4] +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [4] +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [9] равен [0,408248] (min=[0,800000], norm1=[1,549193], norm2=[1,264911]) +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [4] +12/02/2026 - 17:30:25.962 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:25.962 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [4] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:25.962 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:25.967 MSK -- Событие { eventA: 3, eventB: 4, score: 0.55, timestamp: 2026-02-12T14:30:25.959Z } проверено +12/02/2026 - 17:30:25.967 MSK -- Событие { eventA: 4, eventB: 9, score: 0.41, timestamp: 2026-02-12T14:30:25.959Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:26.977 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:26.978 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:26.986 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 2.40 } +12/02/2026 - 17:30:26.986 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 2.40 } +12/02/2026 - 17:30:26.986 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:26.986 MSK -- Верификация для события закончена: { user: 4, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T16:36:44.542680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:26.986 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:26.986 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:42:23.074680200Z } +12/02/2026 - 17:30:26.990 MSK -- [Trace]: Событие отправлено: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:42:23.074680200Z } +12/02/2026 - 17:30:26.990 MSK -- Ожидаю 10 секунд получения события { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:42:23.074680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 8, event: 10, type: VIEW, timestamp: 2026-02-09T16:42:23.074Z } +12/02/2026 - 17:30:26.995 MSK -- Событие VIEW пользователя 8 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:26.995 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [8] для мероприятия [10] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [3] равен [0,365148] (min=[0,800000], norm1=[1,549193], norm2=[1,414214]) +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [8] +12/02/2026 - 17:30:26.995 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:26.995 MSK -- [Trace]: В результате действия [VIEW] пользователя [8] с мероприятием [10] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:26.995 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:27.000 MSK -- Событие { eventA: 3, eventB: 10, score: 0.37, timestamp: 2026-02-12T14:30:26.992Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:28.006 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:28.006 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:28.013 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 2.40 } +12/02/2026 - 17:30:28.013 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 2.40 } +12/02/2026 - 17:30:28.013 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:28.013 MSK -- Верификация для события закончена: { user: 8, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T16:42:23.074680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:28.013 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:28.013 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T16:47:23.285680200Z } +12/02/2026 - 17:30:28.016 MSK -- [Trace]: Событие отправлено: { user: 2, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T16:47:23.285680200Z } +12/02/2026 - 17:30:28.016 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T16:47:23.285680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 9, type: REGISTER, timestamp: 2026-02-09T16:47:23.285Z } +12/02/2026 - 17:30:28.022 MSK -- Событие REGISTER пользователя 2 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:30:28.022 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [2] для мероприятия [9] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [1] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [2] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [9] и [2] равен [0,707107] (min=[1,200000], norm1=[1,549193], norm2=[1,095445]) +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [3] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [4] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [5] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [7] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [8] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [10] для пользователя [2] +12/02/2026 - 17:30:28.022 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:28.022 MSK -- [Trace]: В результате действия [REGISTER] пользователя [2] с мероприятием [9] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:28.022 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:28.027 MSK -- Событие { eventA: 2, eventB: 9, score: 0.71, timestamp: 2026-02-12T14:30:28.019Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:29.036 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:29.036 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:30:29.042 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 2.40 } +12/02/2026 - 17:30:29.042 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 2.40 } +12/02/2026 - 17:30:29.042 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:29.042 MSK -- Верификация для события закончена: { user: 2, event: 9, type: ACTION_REGISTER, timestamp: 2026-02-09T16:47:23.285680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:29.042 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:29.042 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T16:49:36.229680200Z } +12/02/2026 - 17:30:29.045 MSK -- [Trace]: Событие отправлено: { user: 4, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T16:49:36.229680200Z } +12/02/2026 - 17:30:29.045 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T16:49:36.229680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 10, type: REGISTER, timestamp: 2026-02-09T16:49:36.229Z } +12/02/2026 - 17:30:29.051 MSK -- Событие REGISTER пользователя 4 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:29.051 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [10] +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [4] +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [4] +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [4] +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [3] равен [0,632456] (min=[1,600000], norm1=[1,788854], norm2=[1,414214]) +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [4] +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [4] равен [0,433013] (min=[1,200000], norm1=[1,788854], norm2=[1,549193]) +12/02/2026 - 17:30:29.051 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [4] +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [4] +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [4] +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [4] +12/02/2026 - 17:30:29.052 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [9] равен [0,288675] (min=[0,800000], norm1=[1,788854], norm2=[1,549193]) +12/02/2026 - 17:30:29.052 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [10] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:29.052 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:29.057 MSK -- Событие { eventA: 3, eventB: 10, score: 0.63, timestamp: 2026-02-12T14:30:29.048Z } проверено +12/02/2026 - 17:30:29.057 MSK -- Событие { eventA: 4, eventB: 10, score: 0.43, timestamp: 2026-02-12T14:30:29.048Z } проверено +12/02/2026 - 17:30:29.057 MSK -- Событие { eventA: 9, eventB: 10, score: 0.29, timestamp: 2026-02-12T14:30:29.048Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:30.061 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:30.061 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:30.069 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 3.20 } +12/02/2026 - 17:30:30.069 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 3.20 } +12/02/2026 - 17:30:30.069 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:30.069 MSK -- Верификация для события закончена: { user: 4, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T16:49:36.229680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:30.069 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:30.069 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:52.256680200Z } +12/02/2026 - 17:30:30.072 MSK -- [Trace]: Событие отправлено: { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:52.256680200Z } +12/02/2026 - 17:30:30.072 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:52.256680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:30.076 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 7, type: VIEW, timestamp: 2026-02-09T16:51:52.256Z } +12/02/2026 - 17:30:30.076 MSK -- Событие VIEW пользователя 3 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:30.076 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:30.076 MSK -- [Trace]: В результате действия [VIEW] пользователя [3] с мероприятием [7] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:30.076 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:31.087 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:31.087 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:31.094 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 1.60 } +12/02/2026 - 17:30:31.094 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 1.60 } +12/02/2026 - 17:30:31.094 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:31.094 MSK -- Верификация для события закончена: { user: 3, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T16:51:52.256680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:31.094 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:31.094 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:01:12.667680200Z } +12/02/2026 - 17:30:31.098 MSK -- [Trace]: Событие отправлено: { user: 4, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:01:12.667680200Z } +12/02/2026 - 17:30:31.098 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:01:12.667680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 8, type: VIEW, timestamp: 2026-02-09T17:01:12.667Z } +12/02/2026 - 17:30:31.103 MSK -- Событие VIEW пользователя 4 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:30:31.103 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [4] для мероприятия [8] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [3] равен [0,516398] (min=[0,800000], norm1=[1,095445], norm2=[1,414214]) +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [4] равен [0,707107] (min=[1,200000], norm1=[1,095445], norm2=[1,549193]) +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [9] равен [0,235702] (min=[0,400000], norm1=[1,095445], norm2=[1,549193]) +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [4] +12/02/2026 - 17:30:31.103 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [10] равен [0,408248] (min=[0,800000], norm1=[1,095445], norm2=[1,788854]) +12/02/2026 - 17:30:31.103 MSK -- [Trace]: В результате действия [VIEW] пользователя [4] с мероприятием [8] было рассчитано 4 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:31.104 MSK -- Ожидаю 15 секунд получения 4 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:31.109 MSK -- Событие { eventA: 3, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:30:31.100Z } проверено +12/02/2026 - 17:30:31.109 MSK -- Событие { eventA: 4, eventB: 8, score: 0.71, timestamp: 2026-02-12T14:30:31.100Z } проверено +12/02/2026 - 17:30:31.109 MSK -- Событие { eventA: 8, eventB: 9, score: 0.24, timestamp: 2026-02-12T14:30:31.101Z } проверено +12/02/2026 - 17:30:31.109 MSK -- Событие { eventA: 8, eventB: 10, score: 0.41, timestamp: 2026-02-12T14:30:31.101Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:32.118 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:32.118 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:30:32.127 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 1.20 } +12/02/2026 - 17:30:32.127 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 1.20 } +12/02/2026 - 17:30:32.127 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:32.127 MSK -- Верификация для события закончена: { user: 4, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:01:12.667680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:32.127 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:32.127 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:11:04.900680200Z } +12/02/2026 - 17:30:32.131 MSK -- [Trace]: Событие отправлено: { user: 4, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:11:04.900680200Z } +12/02/2026 - 17:30:32.131 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:11:04.900680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 2, type: VIEW, timestamp: 2026-02-09T17:11:04.900Z } +12/02/2026 - 17:30:32.137 MSK -- Событие VIEW пользователя 4 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:30:32.137 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [4] для мероприятия [2] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [1] для пользователя [4] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [3] для пользователя [4] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [3] равен [0,223607] (min=[0,400000], norm1=[1,264911], norm2=[1,414214]) +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [4] для пользователя [4] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [4] равен [0,204124] (min=[0,400000], norm1=[1,264911], norm2=[1,549193]) +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [5] для пользователя [4] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [7] для пользователя [4] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [8] для пользователя [4] +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [8] равен [0,288675] (min=[0,400000], norm1=[1,264911], norm2=[1,095445]) +12/02/2026 - 17:30:32.137 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [9] для пользователя [4] +12/02/2026 - 17:30:32.138 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [9] равен [0,816497] (min=[1,600000], norm1=[1,264911], norm2=[1,549193]) +12/02/2026 - 17:30:32.138 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [10] для пользователя [4] +12/02/2026 - 17:30:32.138 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [10] равен [0,176777] (min=[0,400000], norm1=[1,264911], norm2=[1,788854]) +12/02/2026 - 17:30:32.138 MSK -- [Trace]: В результате действия [VIEW] пользователя [4] с мероприятием [2] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:32.138 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:32.144 MSK -- Событие { eventA: 2, eventB: 3, score: 0.22, timestamp: 2026-02-12T14:30:32.134Z } проверено +12/02/2026 - 17:30:32.144 MSK -- Событие { eventA: 2, eventB: 4, score: 0.20, timestamp: 2026-02-12T14:30:32.134Z } проверено +12/02/2026 - 17:30:32.144 MSK -- Событие { eventA: 2, eventB: 8, score: 0.29, timestamp: 2026-02-12T14:30:32.134Z } проверено +12/02/2026 - 17:30:32.144 MSK -- Событие { eventA: 2, eventB: 9, score: 0.82, timestamp: 2026-02-12T14:30:32.134Z } проверено +12/02/2026 - 17:30:32.144 MSK -- Событие { eventA: 2, eventB: 10, score: 0.18, timestamp: 2026-02-12T14:30:32.134Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:33.145 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:33.145 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:30:33.152 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 1.60 } +12/02/2026 - 17:30:33.152 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 1.60 } +12/02/2026 - 17:30:33.152 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:33.152 MSK -- Верификация для события закончена: { user: 4, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:11:04.900680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:33.152 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:33.152 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:20:05.196680200Z } +12/02/2026 - 17:30:33.156 MSK -- [Trace]: Событие отправлено: { user: 9, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:20:05.196680200Z } +12/02/2026 - 17:30:33.156 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:20:05.196680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:33.161 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 9, type: VIEW, timestamp: 2026-02-09T17:20:05.196Z } +12/02/2026 - 17:30:33.161 MSK -- Событие VIEW пользователя 9 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:30:33.161 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:33.161 MSK -- [Trace]: В результате действия [VIEW] пользователя [9] с мероприятием [9] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:33.161 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:34.176 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:34.176 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:30:34.183 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 2.40 } +12/02/2026 - 17:30:34.183 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 2.40 } +12/02/2026 - 17:30:34.183 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:34.183 MSK -- Верификация для события закончена: { user: 9, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:20:05.196680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:34.183 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:34.183 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:24:17.062680200Z } +12/02/2026 - 17:30:34.186 MSK -- [Trace]: Событие отправлено: { user: 11, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:24:17.062680200Z } +12/02/2026 - 17:30:34.186 MSK -- Ожидаю 10 секунд получения события { user: 11, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:24:17.062680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 11, event: 9, type: VIEW, timestamp: 2026-02-09T17:24:17.062Z } +12/02/2026 - 17:30:34.191 MSK -- Событие VIEW пользователя 11 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:30:34.191 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [11] для мероприятия [9] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [1] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [2] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [3] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [4] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [5] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [7] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [8] для пользователя [11] +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:34.191 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [10] для пользователя [11] +12/02/2026 - 17:30:34.192 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [9] и [10] равен [0,400892] (min=[1,200000], norm1=[1,673320], norm2=[1,788854]) +12/02/2026 - 17:30:34.192 MSK -- [Trace]: В результате действия [VIEW] пользователя [11] с мероприятием [9] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:34.192 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:34.196 MSK -- Событие { eventA: 9, eventB: 10, score: 0.40, timestamp: 2026-02-12T14:30:34.190Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:35.201 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:35.201 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:30:35.207 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 2.80 } +12/02/2026 - 17:30:35.207 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 2.80 } +12/02/2026 - 17:30:35.207 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:35.207 MSK -- Верификация для события закончена: { user: 11, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T17:24:17.062680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:35.207 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:35.207 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:23.549680200Z } +12/02/2026 - 17:30:35.211 MSK -- [Trace]: Событие отправлено: { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:23.549680200Z } +12/02/2026 - 17:30:35.211 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:23.549680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 2, type: VIEW, timestamp: 2026-02-09T17:30:23.549Z } +12/02/2026 - 17:30:35.217 MSK -- Событие VIEW пользователя 3 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:30:35.217 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [3] для мероприятия [2] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [1] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [3] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [3] равен [0,400000] (min=[0,800000], norm1=[1,414214], norm2=[1,414214]) +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [4] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [4] равен [0,365148] (min=[0,800000], norm1=[1,414214], norm2=[1,549193]) +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [5] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [7] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [7] равен [0,447214] (min=[0,800000], norm1=[1,414214], norm2=[1,264911]) +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [8] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [8] равен [0,516398] (min=[0,800000], norm1=[1,414214], norm2=[1,095445]) +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [9] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [10] для пользователя [3] +12/02/2026 - 17:30:35.217 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [10] равен [0,316228] (min=[0,800000], norm1=[1,414214], norm2=[1,788854]) +12/02/2026 - 17:30:35.217 MSK -- [Trace]: В результате действия [VIEW] пользователя [3] с мероприятием [2] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:35.217 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:35.223 MSK -- Событие { eventA: 2, eventB: 3, score: 0.40, timestamp: 2026-02-12T14:30:35.214Z } проверено +12/02/2026 - 17:30:35.223 MSK -- Событие { eventA: 2, eventB: 4, score: 0.37, timestamp: 2026-02-12T14:30:35.214Z } проверено +12/02/2026 - 17:30:35.223 MSK -- Событие { eventA: 2, eventB: 7, score: 0.45, timestamp: 2026-02-12T14:30:35.214Z } проверено +12/02/2026 - 17:30:35.223 MSK -- Событие { eventA: 2, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:30:35.214Z } проверено +12/02/2026 - 17:30:35.223 MSK -- Событие { eventA: 2, eventB: 10, score: 0.32, timestamp: 2026-02-12T14:30:35.214Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:36.229 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:36.229 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:30:36.237 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 2.00 } +12/02/2026 - 17:30:36.237 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 2.00 } +12/02/2026 - 17:30:36.237 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:36.237 MSK -- Верификация для события закончена: { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T17:30:23.549680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:36.237 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:36.237 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T17:32:33.920680200Z } +12/02/2026 - 17:30:36.240 MSK -- [Trace]: Событие отправлено: { user: 9, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T17:32:33.920680200Z } +12/02/2026 - 17:30:36.240 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T17:32:33.920680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:36.247 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 6, type: REGISTER, timestamp: 2026-02-09T17:32:33.920Z } +12/02/2026 - 17:30:36.247 MSK -- Событие REGISTER пользователя 9 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:30:36.247 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:36.247 MSK -- [Trace]: Тестер: это первое взаимодействие с мероприятием [6]. Рассчитываем коэффициенты схожести с другими мероприятиями. +12/02/2026 - 17:30:36.247 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [2] равен [0,316228] (min=[0,400000], norm1=[0,894427], norm2=[1,414214]) +12/02/2026 - 17:30:36.247 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [7] равен [0,353553] (min=[0,400000], norm1=[0,894427], norm2=[1,264911]) +12/02/2026 - 17:30:36.247 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [9] равен [0,534522] (min=[0,800000], norm1=[0,894427], norm2=[1,673320]) +12/02/2026 - 17:30:36.247 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:36.253 MSK -- Событие { eventA: 2, eventB: 6, score: 0.32, timestamp: 2026-02-12T14:30:36.243Z } проверено +12/02/2026 - 17:30:36.253 MSK -- Событие { eventA: 6, eventB: 7, score: 0.35, timestamp: 2026-02-12T14:30:36.243Z } проверено +12/02/2026 - 17:30:36.253 MSK -- Событие { eventA: 6, eventB: 9, score: 0.53, timestamp: 2026-02-12T14:30:36.243Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:37.262 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:37.262 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:30:37.267 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 0.80 } +12/02/2026 - 17:30:37.267 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 0.80 } +12/02/2026 - 17:30:37.267 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:37.267 MSK -- Верификация для события закончена: { user: 9, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T17:32:33.920680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:37.267 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:37.267 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:37:37.444680200Z } +12/02/2026 - 17:30:37.271 MSK -- [Trace]: Событие отправлено: { user: 1, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:37:37.444680200Z } +12/02/2026 - 17:30:37.271 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:37:37.444680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 4, type: REGISTER, timestamp: 2026-02-09T17:37:37.444Z } +12/02/2026 - 17:30:37.276 MSK -- Событие REGISTER пользователя 1 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:37.276 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [1] для мероприятия [4] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [1] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [2] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [3] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [6] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [7] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [8] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [1] +12/02/2026 - 17:30:37.276 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [10] равен [0,625000] (min=[2,000000], norm1=[1,788854], norm2=[1,788854]) +12/02/2026 - 17:30:37.276 MSK -- [Trace]: В результате действия [REGISTER] пользователя [1] с мероприятием [4] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:37.276 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:37.283 MSK -- Событие { eventA: 4, eventB: 10, score: 0.63, timestamp: 2026-02-12T14:30:37.274Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:38.295 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:38.295 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:38.303 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 3.20 } +12/02/2026 - 17:30:38.303 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 3.20 } +12/02/2026 - 17:30:38.303 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:38.303 MSK -- Верификация для события закончена: { user: 1, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:37:37.444680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:38.303 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:38.303 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:15.055680200Z } +12/02/2026 - 17:30:38.307 MSK -- [Trace]: Событие отправлено: { user: 9, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:15.055680200Z } +12/02/2026 - 17:30:38.307 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:15.055680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 1, type: VIEW, timestamp: 2026-02-09T17:42:15.055Z } +12/02/2026 - 17:30:38.312 MSK -- Событие VIEW пользователя 9 с мероприятием 1 - проверено +-------------------------------- +12/02/2026 - 17:30:38.312 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [9] для мероприятия [1] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [2] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [2] равен [0,316228] (min=[0,400000], norm1=[0,894427], norm2=[1,414214]) +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [3] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [4] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [5] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [6] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [6] равен [0,500000] (min=[0,400000], norm1=[0,894427], norm2=[0,894427]) +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [7] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [7] равен [0,353553] (min=[0,400000], norm1=[0,894427], norm2=[1,264911]) +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [8] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [9] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [9] равен [0,267261] (min=[0,400000], norm1=[0,894427], norm2=[1,673320]) +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [10] для пользователя [9] +12/02/2026 - 17:30:38.312 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:38.312 MSK -- [Trace]: В результате действия [VIEW] пользователя [9] с мероприятием [1] было рассчитано 4 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:38.312 MSK -- Ожидаю 15 секунд получения 4 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:38.316 MSK -- Событие { eventA: 1, eventB: 2, score: 0.32, timestamp: 2026-02-12T14:30:38.309Z } проверено +12/02/2026 - 17:30:38.316 MSK -- Событие { eventA: 1, eventB: 6, score: 0.50, timestamp: 2026-02-12T14:30:38.309Z } проверено +12/02/2026 - 17:30:38.316 MSK -- Событие { eventA: 1, eventB: 7, score: 0.35, timestamp: 2026-02-12T14:30:38.309Z } проверено +12/02/2026 - 17:30:38.317 MSK -- Событие { eventA: 1, eventB: 9, score: 0.27, timestamp: 2026-02-12T14:30:38.309Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:39.327 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:39.327 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [1] +12/02/2026 - 17:30:39.335 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 1, score: 0.80 } +12/02/2026 - 17:30:39.335 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 1, score: 0.80 } +12/02/2026 - 17:30:39.335 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:39.335 MSK -- Верификация для события закончена: { user: 9, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T17:42:15.055680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:39.335 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:39.335 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:44:04.273680200Z } +12/02/2026 - 17:30:39.337 MSK -- [Trace]: Событие отправлено: { user: 9, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:44:04.273680200Z } +12/02/2026 - 17:30:39.337 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:44:04.273680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 8, type: VIEW, timestamp: 2026-02-09T17:44:04.273Z } +12/02/2026 - 17:30:39.342 MSK -- Событие VIEW пользователя 9 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:30:39.342 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [9] для мероприятия [8] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [9] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [1] равен [0,353553] (min=[0,400000], norm1=[1,264911], norm2=[0,894427]) +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [9] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [2] равен [0,670820] (min=[1,200000], norm1=[1,264911], norm2=[1,414214]) +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [9] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [9] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [9] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [6] для пользователя [9] +12/02/2026 - 17:30:39.342 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [6] равен [0,353553] (min=[0,400000], norm1=[1,264911], norm2=[0,894427]) +12/02/2026 - 17:30:39.343 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [9] +12/02/2026 - 17:30:39.343 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [7] равен [0,500000] (min=[0,800000], norm1=[1,264911], norm2=[1,264911]) +12/02/2026 - 17:30:39.343 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [9] +12/02/2026 - 17:30:39.343 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [9] равен [0,377964] (min=[0,800000], norm1=[1,264911], norm2=[1,673320]) +12/02/2026 - 17:30:39.343 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [9] +12/02/2026 - 17:30:39.343 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:39.343 MSK -- [Trace]: В результате действия [VIEW] пользователя [9] с мероприятием [8] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:39.343 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:39.348 MSK -- Событие { eventA: 1, eventB: 8, score: 0.35, timestamp: 2026-02-12T14:30:39.340Z } проверено +12/02/2026 - 17:30:39.348 MSK -- Событие { eventA: 2, eventB: 8, score: 0.67, timestamp: 2026-02-12T14:30:39.340Z } проверено +12/02/2026 - 17:30:39.348 MSK -- Событие { eventA: 6, eventB: 8, score: 0.35, timestamp: 2026-02-12T14:30:39.340Z } проверено +12/02/2026 - 17:30:39.348 MSK -- Событие { eventA: 7, eventB: 8, score: 0.50, timestamp: 2026-02-12T14:30:39.340Z } проверено +12/02/2026 - 17:30:39.348 MSK -- Событие { eventA: 8, eventB: 9, score: 0.38, timestamp: 2026-02-12T14:30:39.340Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:40.354 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:40.354 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:30:40.362 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 1.60 } +12/02/2026 - 17:30:40.362 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 1.60 } +12/02/2026 - 17:30:40.362 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:40.362 MSK -- Верификация для события закончена: { user: 9, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T17:44:04.273680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:40.362 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:40.362 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T17:45:11.796680200Z } +12/02/2026 - 17:30:40.365 MSK -- [Trace]: Событие отправлено: { user: 1, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T17:45:11.796680200Z } +12/02/2026 - 17:30:40.365 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T17:45:11.796680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 7, type: REGISTER, timestamp: 2026-02-09T17:45:11.796Z } +12/02/2026 - 17:30:40.371 MSK -- Событие REGISTER пользователя 1 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:40.371 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [1] для мероприятия [7] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [4] равен [0,577350] (min=[1,600000], norm1=[1,549193], norm2=[1,788854]) +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [6] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [1] +12/02/2026 - 17:30:40.371 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [10] равен [0,433013] (min=[1,200000], norm1=[1,549193], norm2=[1,788854]) +12/02/2026 - 17:30:40.371 MSK -- [Trace]: В результате действия [REGISTER] пользователя [1] с мероприятием [7] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:40.371 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:40.376 MSK -- Событие { eventA: 4, eventB: 7, score: 0.58, timestamp: 2026-02-12T14:30:40.368Z } проверено +12/02/2026 - 17:30:40.376 MSK -- Событие { eventA: 7, eventB: 10, score: 0.43, timestamp: 2026-02-12T14:30:40.368Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:41.389 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:41.389 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:41.396 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 2.40 } +12/02/2026 - 17:30:41.396 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 2.40 } +12/02/2026 - 17:30:41.396 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:41.396 MSK -- Верификация для события закончена: { user: 1, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T17:45:11.796680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:41.396 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:41.396 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:49:08.622680200Z } +12/02/2026 - 17:30:41.399 MSK -- [Trace]: Событие отправлено: { user: 5, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:49:08.622680200Z } +12/02/2026 - 17:30:41.399 MSK -- Ожидаю 10 секунд получения события { user: 5, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:49:08.622680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 5, event: 4, type: REGISTER, timestamp: 2026-02-09T17:49:08.622Z } +12/02/2026 - 17:30:41.404 MSK -- Событие REGISTER пользователя 5 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:41.404 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [5] для мероприятия [4] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [1] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [2] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [3] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [6] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [7] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [7] равен [0,645497] (min=[2,000000], norm1=[2,000000], norm2=[1,549193]) +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [8] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [5] +12/02/2026 - 17:30:41.404 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:41.404 MSK -- [Trace]: В результате действия [REGISTER] пользователя [5] с мероприятием [4] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:41.404 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:41.408 MSK -- Событие { eventA: 4, eventB: 7, score: 0.65, timestamp: 2026-02-12T14:30:41.401Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:42.422 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:42.422 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:42.430 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 4.00 } +12/02/2026 - 17:30:42.430 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 4.00 } +12/02/2026 - 17:30:42.430 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:42.430 MSK -- Верификация для события закончена: { user: 5, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T17:49:08.622680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:42.430 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:42.430 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T17:59:06.304680200Z } +12/02/2026 - 17:30:42.434 MSK -- [Trace]: Событие отправлено: { user: 5, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T17:59:06.304680200Z } +12/02/2026 - 17:30:42.434 MSK -- Ожидаю 10 секунд получения события { user: 5, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T17:59:06.304680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:42.439 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 5, event: 4, type: VIEW, timestamp: 2026-02-09T17:59:06.304Z } +12/02/2026 - 17:30:42.439 MSK -- Событие VIEW пользователя 5 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:42.439 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:42.439 MSK -- [Trace]: В результате действия [VIEW] пользователя [5] с мероприятием [4] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:42.439 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:43.440 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:43.440 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:43.448 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 4.00 } +12/02/2026 - 17:30:43.448 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 4.00 } +12/02/2026 - 17:30:43.448 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:43.448 MSK -- Верификация для события закончена: { user: 5, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T17:59:06.304680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:43.448 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:43.448 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T18:03:46.480680200Z } +12/02/2026 - 17:30:43.451 MSK -- [Trace]: Событие отправлено: { user: 4, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T18:03:46.480680200Z } +12/02/2026 - 17:30:43.451 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T18:03:46.480680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:43.455 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 1, type: VIEW, timestamp: 2026-02-09T18:03:46.480Z } +12/02/2026 - 17:30:43.455 MSK -- Событие VIEW пользователя 4 с мероприятием 1 - проверено +-------------------------------- +12/02/2026 - 17:30:43.455 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [4] для мероприятия [1] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [2] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [2] равен [0,516398] (min=[0,800000], norm1=[1,095445], norm2=[1,414214]) +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [3] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [3] равен [0,258199] (min=[0,400000], norm1=[1,095445], norm2=[1,414214]) +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [4] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [4] равен [0,182574] (min=[0,400000], norm1=[1,095445], norm2=[2,000000]) +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [5] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [6] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [7] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [8] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [8] равен [0,577350] (min=[0,800000], norm1=[1,095445], norm2=[1,264911]) +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [9] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [9] равен [0,436436] (min=[0,800000], norm1=[1,095445], norm2=[1,673320]) +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [10] для пользователя [4] +12/02/2026 - 17:30:43.456 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [10] равен [0,204124] (min=[0,400000], norm1=[1,095445], norm2=[1,788854]) +12/02/2026 - 17:30:43.456 MSK -- [Trace]: В результате действия [VIEW] пользователя [4] с мероприятием [1] было рассчитано 6 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:43.456 MSK -- Ожидаю 15 секунд получения 6 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:43.461 MSK -- Событие { eventA: 1, eventB: 2, score: 0.52, timestamp: 2026-02-12T14:30:43.454Z } проверено +12/02/2026 - 17:30:43.461 MSK -- Событие { eventA: 1, eventB: 3, score: 0.26, timestamp: 2026-02-12T14:30:43.454Z } проверено +12/02/2026 - 17:30:43.461 MSK -- Событие { eventA: 1, eventB: 4, score: 0.18, timestamp: 2026-02-12T14:30:43.454Z } проверено +12/02/2026 - 17:30:43.461 MSK -- Событие { eventA: 1, eventB: 8, score: 0.58, timestamp: 2026-02-12T14:30:43.454Z } проверено +12/02/2026 - 17:30:43.461 MSK -- Событие { eventA: 1, eventB: 9, score: 0.44, timestamp: 2026-02-12T14:30:43.454Z } проверено +12/02/2026 - 17:30:43.461 MSK -- Событие { eventA: 1, eventB: 10, score: 0.20, timestamp: 2026-02-12T14:30:43.454Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:44.467 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:44.467 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [1] +12/02/2026 - 17:30:44.473 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 1, score: 1.20 } +12/02/2026 - 17:30:44.473 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 1, score: 1.20 } +12/02/2026 - 17:30:44.473 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:44.473 MSK -- Верификация для события закончена: { user: 4, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T18:03:46.480680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:44.473 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:44.473 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:06:38.997680200Z } +12/02/2026 - 17:30:44.476 MSK -- [Trace]: Событие отправлено: { user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:06:38.997680200Z } +12/02/2026 - 17:30:44.476 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:06:38.997680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 7, type: REGISTER, timestamp: 2026-02-09T18:06:38.997Z } +12/02/2026 - 17:30:44.482 MSK -- Событие REGISTER пользователя 4 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:44.482 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [7] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [1] равен [0,408248] (min=[0,800000], norm1=[1,788854], norm2=[1,095445]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [2] равен [0,474342] (min=[1,200000], norm1=[1,788854], norm2=[1,414214]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [3] равен [0,474342] (min=[1,200000], norm1=[1,788854], norm2=[1,414214]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [4] равен [0,782624] (min=[2,800000], norm1=[1,788854], norm2=[2,000000]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [6] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [8] равен [0,530330] (min=[1,200000], norm1=[1,788854], norm2=[1,264911]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [9] равен [0,400892] (min=[1,200000], norm1=[1,788854], norm2=[1,673320]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [4] +12/02/2026 - 17:30:44.482 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [10] равен [0,625000] (min=[2,000000], norm1=[1,788854], norm2=[1,788854]) +12/02/2026 - 17:30:44.482 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [7] было рассчитано 7 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:44.482 MSK -- Ожидаю 15 секунд получения 7 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 1, eventB: 7, score: 0.41, timestamp: 2026-02-12T14:30:44.479Z } проверено +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 2, eventB: 7, score: 0.47, timestamp: 2026-02-12T14:30:44.479Z } проверено +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 3, eventB: 7, score: 0.47, timestamp: 2026-02-12T14:30:44.479Z } проверено +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 4, eventB: 7, score: 0.78, timestamp: 2026-02-12T14:30:44.479Z } проверено +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 7, eventB: 8, score: 0.53, timestamp: 2026-02-12T14:30:44.479Z } проверено +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 7, eventB: 9, score: 0.40, timestamp: 2026-02-12T14:30:44.479Z } проверено +12/02/2026 - 17:30:44.488 MSK -- Событие { eventA: 7, eventB: 10, score: 0.63, timestamp: 2026-02-12T14:30:44.479Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:45.493 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:45.493 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:45.499 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 3.20 } +12/02/2026 - 17:30:45.499 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 3.20 } +12/02/2026 - 17:30:45.499 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:45.499 MSK -- Верификация для события закончена: { user: 4, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:06:38.997680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:45.499 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:45.499 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T18:09:19.315680200Z } +12/02/2026 - 17:30:45.502 MSK -- [Trace]: Событие отправлено: { user: 11, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T18:09:19.315680200Z } +12/02/2026 - 17:30:45.502 MSK -- Ожидаю 10 секунд получения события { user: 11, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T18:09:19.315680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 11, event: 5, type: VIEW, timestamp: 2026-02-09T18:09:19.315Z } +12/02/2026 - 17:30:45.508 MSK -- Событие VIEW пользователя 11 с мероприятием 5 - проверено +-------------------------------- +12/02/2026 - 17:30:45.508 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [11] для мероприятия [5] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [1] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [2] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [3] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [4] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [6] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [7] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [8] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [9] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [9] равен [0,267261] (min=[0,400000], norm1=[0,894427], norm2=[1,673320]) +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [10] для пользователя [11] +12/02/2026 - 17:30:45.508 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [10] равен [0,250000] (min=[0,400000], norm1=[0,894427], norm2=[1,788854]) +12/02/2026 - 17:30:45.508 MSK -- [Trace]: В результате действия [VIEW] пользователя [11] с мероприятием [5] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:45.508 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:45.513 MSK -- Событие { eventA: 5, eventB: 9, score: 0.27, timestamp: 2026-02-12T14:30:45.505Z } проверено +12/02/2026 - 17:30:45.513 MSK -- Событие { eventA: 5, eventB: 10, score: 0.25, timestamp: 2026-02-12T14:30:45.505Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:46.522 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:46.523 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [5] +12/02/2026 - 17:30:46.528 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 5, score: 0.80 } +12/02/2026 - 17:30:46.528 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 5, score: 0.80 } +12/02/2026 - 17:30:46.528 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:46.529 MSK -- Верификация для события закончена: { user: 11, event: 5, type: ACTION_VIEW, timestamp: 2026-02-09T18:09:19.315680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:46.529 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:46.529 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T18:11:30.829680200Z } +12/02/2026 - 17:30:46.531 MSK -- [Trace]: Событие отправлено: { user: 3, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T18:11:30.829680200Z } +12/02/2026 - 17:30:46.531 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T18:11:30.829680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 10, type: REGISTER, timestamp: 2026-02-09T18:11:30.829Z } +12/02/2026 - 17:30:46.536 MSK -- Событие REGISTER пользователя 3 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:46.536 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [3] для мероприятия [10] +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [3] +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [3] +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [2] равен [0,298142] (min=[0,800000], norm1=[1,897367], norm2=[1,414214]) +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [3] +12/02/2026 - 17:30:46.536 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [3] равен [0,596285] (min=[1,600000], norm1=[1,897367], norm2=[1,414214]) +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [3] +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [4] равен [0,632456] (min=[2,400000], norm1=[1,897367], norm2=[2,000000]) +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [3] +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [6] для пользователя [3] +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [3] +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [7] равен [0,589256] (min=[2,000000], norm1=[1,897367], norm2=[1,788854]) +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [3] +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [8] равен [0,500000] (min=[1,200000], norm1=[1,897367], norm2=[1,264911]) +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [3] +12/02/2026 - 17:30:46.537 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:46.537 MSK -- [Trace]: В результате действия [REGISTER] пользователя [3] с мероприятием [10] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:46.537 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:46.541 MSK -- Событие { eventA: 2, eventB: 10, score: 0.30, timestamp: 2026-02-12T14:30:46.534Z } проверено +12/02/2026 - 17:30:46.541 MSK -- Событие { eventA: 3, eventB: 10, score: 0.60, timestamp: 2026-02-12T14:30:46.534Z } проверено +12/02/2026 - 17:30:46.541 MSK -- Событие { eventA: 4, eventB: 10, score: 0.63, timestamp: 2026-02-12T14:30:46.534Z } проверено +12/02/2026 - 17:30:46.541 MSK -- Событие { eventA: 7, eventB: 10, score: 0.59, timestamp: 2026-02-12T14:30:46.534Z } проверено +12/02/2026 - 17:30:46.541 MSK -- Событие { eventA: 8, eventB: 10, score: 0.50, timestamp: 2026-02-12T14:30:46.534Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:47.555 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:47.555 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:47.563 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 3.60 } +12/02/2026 - 17:30:47.563 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 3.60 } +12/02/2026 - 17:30:47.563 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:47.563 MSK -- Верификация для события закончена: { user: 3, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T18:11:30.829680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:47.563 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:47.563 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T18:21:29.889680200Z } +12/02/2026 - 17:30:47.567 MSK -- [Trace]: Событие отправлено: { user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T18:21:29.889680200Z } +12/02/2026 - 17:30:47.567 MSK -- Ожидаю 10 секунд получения события { user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T18:21:29.889680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 7, event: 4, type: REGISTER, timestamp: 2026-02-09T18:21:29.889Z } +12/02/2026 - 17:30:47.572 MSK -- Событие REGISTER пользователя 7 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:30:47.572 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [7] для мероприятия [4] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [1] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [2] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [3] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [6] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [7] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [8] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [7] +12/02/2026 - 17:30:47.572 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:47.572 MSK -- [Trace]: В результате действия [REGISTER] пользователя [7] с мероприятием [4] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:47.572 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:48.575 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:48.576 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:30:48.582 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 4.80 } +12/02/2026 - 17:30:48.582 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 4.80 } +12/02/2026 - 17:30:48.582 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:48.582 MSK -- Верификация для события закончена: { user: 7, event: 4, type: ACTION_REGISTER, timestamp: 2026-02-09T18:21:29.889680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:48.582 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:48.583 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T18:29:28.868680200Z } +12/02/2026 - 17:30:48.587 MSK -- [Trace]: Событие отправлено: { user: 4, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T18:29:28.868680200Z } +12/02/2026 - 17:30:48.587 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T18:29:28.868680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:48.592 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 3, type: LIKE, timestamp: 2026-02-09T18:29:28.868Z } +12/02/2026 - 17:30:48.592 MSK -- Событие LIKE пользователя 4 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:30:48.592 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:48.592 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [4] для мероприятия [3] +12/02/2026 - 17:30:48.592 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [4] +12/02/2026 - 17:30:48.592 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [1] равен [0,246183] (min=[0,400000], norm1=[1,483240], norm2=[1,095445]) +12/02/2026 - 17:30:48.592 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [2] равен [0,381385] (min=[0,800000], norm1=[1,483240], norm2=[1,414214]) +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [4] равен [0,369274] (min=[1,200000], norm1=[1,483240], norm2=[2,190890]) +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [6] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [7] равен [0,452267] (min=[1,200000], norm1=[1,483240], norm2=[1,788854]) +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [8] равен [0,426401] (min=[0,800000], norm1=[1,483240], norm2=[1,264911]) +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [9] равен [0,322329] (min=[0,800000], norm1=[1,483240], norm2=[1,673320]) +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [4] +12/02/2026 - 17:30:48.593 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [10] равен [0,568535] (min=[1,600000], norm1=[1,483240], norm2=[1,897367]) +12/02/2026 - 17:30:48.593 MSK -- [Trace]: В результате действия [LIKE] пользователя [4] с мероприятием [3] было рассчитано 7 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:48.593 MSK -- Ожидаю 15 секунд получения 7 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 1, eventB: 3, score: 0.25, timestamp: 2026-02-12T14:30:48.590Z } проверено +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 2, eventB: 3, score: 0.38, timestamp: 2026-02-12T14:30:48.590Z } проверено +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 3, eventB: 4, score: 0.37, timestamp: 2026-02-12T14:30:48.590Z } проверено +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 3, eventB: 7, score: 0.45, timestamp: 2026-02-12T14:30:48.590Z } проверено +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 3, eventB: 8, score: 0.43, timestamp: 2026-02-12T14:30:48.590Z } проверено +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 3, eventB: 9, score: 0.32, timestamp: 2026-02-12T14:30:48.590Z } проверено +12/02/2026 - 17:30:48.598 MSK -- Событие { eventA: 3, eventB: 10, score: 0.57, timestamp: 2026-02-12T14:30:48.590Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:49.608 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:49.608 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:30:49.616 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 2.20 } +12/02/2026 - 17:30:49.616 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 2.20 } +12/02/2026 - 17:30:49.616 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:49.616 MSK -- Верификация для события закончена: { user: 4, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T18:29:28.868680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:49.616 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:49.616 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:32:36.340680200Z } +12/02/2026 - 17:30:49.619 MSK -- [Trace]: Событие отправлено: { user: 4, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:32:36.340680200Z } +12/02/2026 - 17:30:49.619 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:32:36.340680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 8, type: REGISTER, timestamp: 2026-02-09T18:32:36.340Z } +12/02/2026 - 17:30:49.624 MSK -- Событие REGISTER пользователя 4 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:30:49.624 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [8] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [1] равен [0,516398] (min=[0,800000], norm1=[1,414214], norm2=[1,095445]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [2] равен [0,600000] (min=[1,200000], norm1=[1,414214], norm2=[1,414214]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [3] равен [0,572078] (min=[1,200000], norm1=[1,414214], norm2=[1,483240]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [4] равен [0,516398] (min=[1,600000], norm1=[1,414214], norm2=[2,190890]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [6] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [7] равен [0,632456] (min=[1,600000], norm1=[1,414214], norm2=[1,788854]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [9] равен [0,507093] (min=[1,200000], norm1=[1,414214], norm2=[1,673320]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [4] +12/02/2026 - 17:30:49.624 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [10] равен [0,596285] (min=[1,600000], norm1=[1,414214], norm2=[1,897367]) +12/02/2026 - 17:30:49.624 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [8] было рассчитано 7 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:49.624 MSK -- Ожидаю 15 секунд получения 7 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 1, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:30:49.622Z } проверено +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 2, eventB: 8, score: 0.60, timestamp: 2026-02-12T14:30:49.622Z } проверено +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 3, eventB: 8, score: 0.57, timestamp: 2026-02-12T14:30:49.622Z } проверено +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 4, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:30:49.622Z } проверено +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 7, eventB: 8, score: 0.63, timestamp: 2026-02-12T14:30:49.622Z } проверено +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 8, eventB: 9, score: 0.51, timestamp: 2026-02-12T14:30:49.622Z } проверено +12/02/2026 - 17:30:49.630 MSK -- Событие { eventA: 8, eventB: 10, score: 0.60, timestamp: 2026-02-12T14:30:49.622Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:50.637 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:50.637 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:30:50.643 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 2.00 } +12/02/2026 - 17:30:50.643 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 2.00 } +12/02/2026 - 17:30:50.643 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:50.644 MSK -- Верификация для события закончена: { user: 4, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T18:32:36.340680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:50.644 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:50.644 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T18:37:19.058680200Z } +12/02/2026 - 17:30:50.646 MSK -- [Trace]: Событие отправлено: { user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T18:37:19.058680200Z } +12/02/2026 - 17:30:50.646 MSK -- Ожидаю 10 секунд получения события { user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T18:37:19.058680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 10, event: 3, type: REGISTER, timestamp: 2026-02-09T18:37:19.058Z } +12/02/2026 - 17:30:50.652 MSK -- Событие REGISTER пользователя 10 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:30:50.652 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [10] для мероприятия [3] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [4] равен [0,527046] (min=[2,000000], norm1=[1,732051], norm2=[2,190890]) +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [6] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [7] равен [0,516398] (min=[1,600000], norm1=[1,732051], norm2=[1,788854]) +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [10] +12/02/2026 - 17:30:50.652 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:50.653 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [10] +12/02/2026 - 17:30:50.653 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:50.653 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [10] +12/02/2026 - 17:30:50.653 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:50.653 MSK -- [Trace]: В результате действия [REGISTER] пользователя [10] с мероприятием [3] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:50.653 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:50.657 MSK -- Событие { eventA: 3, eventB: 4, score: 0.53, timestamp: 2026-02-12T14:30:50.649Z } проверено +12/02/2026 - 17:30:50.657 MSK -- Событие { eventA: 3, eventB: 7, score: 0.52, timestamp: 2026-02-12T14:30:50.649Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:51.664 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:51.665 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:30:51.672 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 3.00 } +12/02/2026 - 17:30:51.672 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 3.00 } +12/02/2026 - 17:30:51.672 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:51.672 MSK -- Верификация для события закончена: { user: 10, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T18:37:19.058680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:51.672 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:51.672 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T18:43:18.738680200Z } +12/02/2026 - 17:30:51.674 MSK -- [Trace]: Событие отправлено: { user: 1, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T18:43:18.738680200Z } +12/02/2026 - 17:30:51.674 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T18:43:18.738680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:51.679 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 10, type: LIKE, timestamp: 2026-02-09T18:43:18.738Z } +12/02/2026 - 17:30:51.680 MSK -- Событие LIKE пользователя 1 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:51.680 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [1] для мероприятия [10] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [4] равен [0,561951] (min=[2,400000], norm1=[1,949359], norm2=[2,190890]) +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [6] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [7] равен [0,573539] (min=[2,000000], norm1=[1,949359], norm2=[1,788854]) +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [1] +12/02/2026 - 17:30:51.680 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:51.680 MSK -- [Trace]: В результате действия [LIKE] пользователя [1] с мероприятием [10] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:51.680 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:51.685 MSK -- Событие { eventA: 4, eventB: 10, score: 0.56, timestamp: 2026-02-12T14:30:51.677Z } проверено +12/02/2026 - 17:30:51.685 MSK -- Событие { eventA: 7, eventB: 10, score: 0.57, timestamp: 2026-02-12T14:30:51.677Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:52.695 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:52.695 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:52.702 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 3.80 } +12/02/2026 - 17:30:52.702 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 3.80 } +12/02/2026 - 17:30:52.702 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:52.702 MSK -- Верификация для события закончена: { user: 1, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T18:43:18.738680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:52.702 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:52.702 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:50:45.320680200Z } +12/02/2026 - 17:30:52.705 MSK -- [Trace]: Событие отправлено: { user: 9, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:50:45.320680200Z } +12/02/2026 - 17:30:52.705 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:50:45.320680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 7, type: REGISTER, timestamp: 2026-02-09T18:50:45.320Z } +12/02/2026 - 17:30:52.710 MSK -- Событие REGISTER пользователя 9 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:52.710 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [9] для мероприятия [7] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [1] равен [0,384900] (min=[0,800000], norm1=[1,897367], norm2=[1,095445]) +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [2] равен [0,447214] (min=[1,200000], norm1=[1,897367], norm2=[1,414214]) +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [6] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [6] равен [0,471405] (min=[0,800000], norm1=[1,897367], norm2=[0,894427]) +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [8] равен [0,596285] (min=[1,600000], norm1=[1,897367], norm2=[1,414214]) +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [9] равен [0,503953] (min=[1,600000], norm1=[1,897367], norm2=[1,673320]) +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [9] +12/02/2026 - 17:30:52.710 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:52.710 MSK -- [Trace]: В результате действия [REGISTER] пользователя [9] с мероприятием [7] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:52.710 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:52.714 MSK -- Событие { eventA: 1, eventB: 7, score: 0.38, timestamp: 2026-02-12T14:30:52.707Z } проверено +12/02/2026 - 17:30:52.714 MSK -- Событие { eventA: 2, eventB: 7, score: 0.45, timestamp: 2026-02-12T14:30:52.707Z } проверено +12/02/2026 - 17:30:52.714 MSK -- Событие { eventA: 6, eventB: 7, score: 0.47, timestamp: 2026-02-12T14:30:52.707Z } проверено +12/02/2026 - 17:30:52.714 MSK -- Событие { eventA: 7, eventB: 8, score: 0.60, timestamp: 2026-02-12T14:30:52.707Z } проверено +12/02/2026 - 17:30:52.714 MSK -- Событие { eventA: 7, eventB: 9, score: 0.50, timestamp: 2026-02-12T14:30:52.707Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:53.724 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:53.724 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:53.732 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 3.60 } +12/02/2026 - 17:30:53.732 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 3.60 } +12/02/2026 - 17:30:53.732 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:53.732 MSK -- Верификация для события закончена: { user: 9, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T18:50:45.320680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:53.732 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:53.732 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T18:55:12.382680200Z } +12/02/2026 - 17:30:53.735 MSK -- [Trace]: Событие отправлено: { user: 4, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T18:55:12.382680200Z } +12/02/2026 - 17:30:53.735 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T18:55:12.382680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 6, type: VIEW, timestamp: 2026-02-09T18:55:12.382Z } +12/02/2026 - 17:30:53.739 MSK -- Событие VIEW пользователя 4 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:30:53.739 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [4] для мероприятия [6] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [1] равен [0,666667] (min=[0,800000], norm1=[1,095445], norm2=[1,095445]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [2] равен [0,516398] (min=[0,800000], norm1=[1,095445], norm2=[1,414214]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [3] равен [0,210819] (min=[0,400000], norm1=[1,095445], norm2=[1,732051]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [4] равен [0,166667] (min=[0,400000], norm1=[1,095445], norm2=[2,190890]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [7] равен [0,577350] (min=[1,200000], norm1=[1,095445], norm2=[1,897367]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [8] равен [0,516398] (min=[0,800000], norm1=[1,095445], norm2=[1,414214]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [9] равен [0,654654] (min=[1,200000], norm1=[1,095445], norm2=[1,673320]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [4] +12/02/2026 - 17:30:53.739 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [10] равен [0,187317] (min=[0,400000], norm1=[1,095445], norm2=[1,949359]) +12/02/2026 - 17:30:53.739 MSK -- [Trace]: В результате действия [VIEW] пользователя [4] с мероприятием [6] было рассчитано 8 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:53.739 MSK -- Ожидаю 15 секунд получения 8 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:53.745 MSK -- [Trace]: Ожидалось событий 8, но получено событий 7. Пробую еще раз. +12/02/2026 - 17:30:53.747 MSK -- Событие { eventA: 1, eventB: 6, score: 0.67, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.747 MSK -- Событие { eventA: 2, eventB: 6, score: 0.52, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.747 MSK -- Событие { eventA: 3, eventB: 6, score: 0.21, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.747 MSK -- Событие { eventA: 4, eventB: 6, score: 0.17, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.748 MSK -- Событие { eventA: 6, eventB: 7, score: 0.58, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.748 MSK -- Событие { eventA: 6, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.748 MSK -- Событие { eventA: 6, eventB: 9, score: 0.65, timestamp: 2026-02-12T14:30:53.737Z } проверено +12/02/2026 - 17:30:53.748 MSK -- Событие { eventA: 6, eventB: 10, score: 0.19, timestamp: 2026-02-12T14:30:53.737Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:54.757 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:54.757 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:30:54.764 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 1.20 } +12/02/2026 - 17:30:54.764 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 1.20 } +12/02/2026 - 17:30:54.764 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:54.764 MSK -- Верификация для события закончена: { user: 4, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T18:55:12.382680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:54.764 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:54.764 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T19:03:38.399680200Z } +12/02/2026 - 17:30:54.766 MSK -- [Trace]: Событие отправлено: { user: 11, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T19:03:38.399680200Z } +12/02/2026 - 17:30:54.766 MSK -- Ожидаю 10 секунд получения события { user: 11, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T19:03:38.399680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 11, event: 10, type: LIKE, timestamp: 2026-02-09T19:03:38.399Z } +12/02/2026 - 17:30:54.771 MSK -- Событие LIKE пользователя 11 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:30:54.771 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [11] для мероприятия [10] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [5] равен [0,223607] (min=[0,400000], norm1=[2,000000], norm2=[0,894427]) +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [6] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [11] +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:54.771 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [11] +12/02/2026 - 17:30:54.772 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [9] равен [0,358569] (min=[1,200000], norm1=[2,000000], norm2=[1,673320]) +12/02/2026 - 17:30:54.772 MSK -- [Trace]: В результате действия [LIKE] пользователя [11] с мероприятием [10] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:54.772 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:54.776 MSK -- Событие { eventA: 5, eventB: 10, score: 0.22, timestamp: 2026-02-12T14:30:54.769Z } проверено +12/02/2026 - 17:30:54.776 MSK -- Событие { eventA: 9, eventB: 10, score: 0.36, timestamp: 2026-02-12T14:30:54.769Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:55.777 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:55.777 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:30:55.787 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 4.00 } +12/02/2026 - 17:30:55.787 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 4.00 } +12/02/2026 - 17:30:55.787 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:55.787 MSK -- Верификация для события закончена: { user: 11, event: 10, type: ACTION_LIKE, timestamp: 2026-02-09T19:03:38.399680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:55.787 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:55.787 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T19:11:21.501680200Z } +12/02/2026 - 17:30:55.789 MSK -- [Trace]: Событие отправлено: { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T19:11:21.501680200Z } +12/02/2026 - 17:30:55.789 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T19:11:21.501680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:55.795 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 2, type: VIEW, timestamp: 2026-02-09T19:11:21.501Z } +12/02/2026 - 17:30:55.795 MSK -- Событие VIEW пользователя 3 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:30:55.795 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:55.795 MSK -- [Trace]: В результате действия [VIEW] пользователя [3] с мероприятием [2] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:55.795 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:30:56.795 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:56.796 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:30:56.802 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 2.00 } +12/02/2026 - 17:30:56.802 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 2.00 } +12/02/2026 - 17:30:56.802 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:56.802 MSK -- Верификация для события закончена: { user: 3, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T19:11:21.501680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:56.802 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:56.802 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T19:16:22.963680200Z } +12/02/2026 - 17:30:56.805 MSK -- [Trace]: Событие отправлено: { user: 7, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T19:16:22.963680200Z } +12/02/2026 - 17:30:56.805 MSK -- Ожидаю 10 секунд получения события { user: 7, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T19:16:22.963680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 7, event: 1, type: VIEW, timestamp: 2026-02-09T19:16:22.963Z } +12/02/2026 - 17:30:56.810 MSK -- Событие VIEW пользователя 7 с мероприятием 1 - проверено +-------------------------------- +12/02/2026 - 17:30:56.810 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [7] для мероприятия [1] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [2] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [3] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [4] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [1] и [4] равен [0,288675] (min=[0,800000], norm1=[1,264911], norm2=[2,190890]) +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [5] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [6] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [7] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [8] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [9] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [1] и [10] для пользователя [7] +12/02/2026 - 17:30:56.810 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:56.810 MSK -- [Trace]: В результате действия [VIEW] пользователя [7] с мероприятием [1] было рассчитано 1 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:56.810 MSK -- Ожидаю 15 секунд получения 1 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:56.815 MSK -- Событие { eventA: 1, eventB: 4, score: 0.29, timestamp: 2026-02-12T14:30:56.807Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:57.830 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:57.830 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [1] +12/02/2026 - 17:30:57.838 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 1, score: 1.60 } +12/02/2026 - 17:30:57.838 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 1, score: 1.60 } +12/02/2026 - 17:30:57.838 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:57.838 MSK -- Верификация для события закончена: { user: 7, event: 1, type: ACTION_VIEW, timestamp: 2026-02-09T19:16:22.963680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:57.838 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:57.838 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T19:20:43.645680200Z } +12/02/2026 - 17:30:57.841 MSK -- [Trace]: Событие отправлено: { user: 2, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T19:20:43.645680200Z } +12/02/2026 - 17:30:57.841 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T19:20:43.645680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 5, type: REGISTER, timestamp: 2026-02-09T19:20:43.645Z } +12/02/2026 - 17:30:57.846 MSK -- Событие REGISTER пользователя 2 с мероприятием 5 - проверено +-------------------------------- +12/02/2026 - 17:30:57.846 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [2] для мероприятия [5] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [1] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [2] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [2] равен [0,447214] (min=[0,800000], norm1=[1,264911], norm2=[1,414214]) +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [3] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [4] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [6] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [7] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [8] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [9] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [9] равен [0,566947] (min=[1,200000], norm1=[1,264911], norm2=[1,673320]) +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [10] для пользователя [2] +12/02/2026 - 17:30:57.846 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:57.846 MSK -- [Trace]: В результате действия [REGISTER] пользователя [2] с мероприятием [5] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:57.846 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:57.850 MSK -- Событие { eventA: 2, eventB: 5, score: 0.45, timestamp: 2026-02-12T14:30:57.843Z } проверено +12/02/2026 - 17:30:57.850 MSK -- Событие { eventA: 5, eventB: 9, score: 0.57, timestamp: 2026-02-12T14:30:57.843Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:58.854 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:58.854 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [5] +12/02/2026 - 17:30:58.860 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 5, score: 1.60 } +12/02/2026 - 17:30:58.860 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 5, score: 1.60 } +12/02/2026 - 17:30:58.860 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:58.861 MSK -- Верификация для события закончена: { user: 2, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T19:20:43.645680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:58.861 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:58.861 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T19:29:27.872680200Z } +12/02/2026 - 17:30:58.863 MSK -- [Trace]: Событие отправлено: { user: 1, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T19:29:27.872680200Z } +12/02/2026 - 17:30:58.863 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T19:29:27.872680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 7, type: LIKE, timestamp: 2026-02-09T19:29:27.872Z } +12/02/2026 - 17:30:58.868 MSK -- Событие LIKE пользователя 1 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:58.868 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [1] для мероприятия [7] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [4] равен [0,655610] (min=[2,800000], norm1=[1,949359], norm2=[2,190890]) +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [6] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [1] +12/02/2026 - 17:30:58.868 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [10] равен [0,564288] (min=[2,200000], norm1=[1,949359], norm2=[2,000000]) +12/02/2026 - 17:30:58.868 MSK -- [Trace]: В результате действия [LIKE] пользователя [1] с мероприятием [7] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:58.868 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:58.872 MSK -- Событие { eventA: 4, eventB: 7, score: 0.66, timestamp: 2026-02-12T14:30:58.866Z } проверено +12/02/2026 - 17:30:58.872 MSK -- Событие { eventA: 7, eventB: 10, score: 0.56, timestamp: 2026-02-12T14:30:58.866Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:59.874 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:59.874 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:30:59.879 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 3.80 } +12/02/2026 - 17:30:59.879 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 3.80 } +12/02/2026 - 17:30:59.879 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:30:59.879 MSK -- Верификация для события закончена: { user: 1, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T19:29:27.872680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:30:59.879 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:30:59.879 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T19:34:50.417680200Z } +12/02/2026 - 17:30:59.881 MSK -- [Trace]: Событие отправлено: { user: 2, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T19:34:50.417680200Z } +12/02/2026 - 17:30:59.881 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T19:34:50.417680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 7, type: REGISTER, timestamp: 2026-02-09T19:34:50.417Z } +12/02/2026 - 17:30:59.887 MSK -- Событие REGISTER пользователя 2 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:30:59.887 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [2] для мероприятия [7] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [2] равен [0,659380] (min=[2,000000], norm1=[2,144761], norm2=[1,414214]) +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [5] равен [0,294884] (min=[0,800000], norm1=[2,144761], norm2=[1,264911]) +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [6] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [9] равен [0,668734] (min=[2,400000], norm1=[2,144761], norm2=[1,673320]) +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [2] +12/02/2026 - 17:30:59.887 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:30:59.887 MSK -- [Trace]: В результате действия [REGISTER] пользователя [2] с мероприятием [7] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:30:59.887 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:30:59.892 MSK -- Событие { eventA: 2, eventB: 7, score: 0.66, timestamp: 2026-02-12T14:30:59.884Z } проверено +12/02/2026 - 17:30:59.892 MSK -- Событие { eventA: 5, eventB: 7, score: 0.29, timestamp: 2026-02-12T14:30:59.884Z } проверено +12/02/2026 - 17:30:59.892 MSK -- Событие { eventA: 7, eventB: 9, score: 0.67, timestamp: 2026-02-12T14:30:59.884Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:00.893 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:00.893 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:31:00.899 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 4.60 } +12/02/2026 - 17:31:00.899 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 4.60 } +12/02/2026 - 17:31:00.899 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:00.899 MSK -- Верификация для события закончена: { user: 2, event: 7, type: ACTION_REGISTER, timestamp: 2026-02-09T19:34:50.417680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:00.899 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:00.899 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T19:42:10.615680200Z } +12/02/2026 - 17:31:00.902 MSK -- [Trace]: Событие отправлено: { user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T19:42:10.615680200Z } +12/02/2026 - 17:31:00.902 MSK -- Ожидаю 10 секунд получения события { user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T19:42:10.615680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 10, event: 2, type: REGISTER, timestamp: 2026-02-09T19:42:10.615Z } +12/02/2026 - 17:31:00.907 MSK -- Событие REGISTER пользователя 10 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:31:00.907 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [10] для мероприятия [2] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [1] для пользователя [10] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [3] для пользователя [10] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [3] равен [0,552052] (min=[1,600000], norm1=[1,673320], norm2=[1,732051]) +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [4] для пользователя [10] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [4] равен [0,436436] (min=[1,600000], norm1=[1,673320], norm2=[2,190890]) +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [5] для пользователя [10] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [6] для пользователя [10] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [7] для пользователя [10] +12/02/2026 - 17:31:00.907 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [7] равен [0,668734] (min=[2,400000], norm1=[1,673320], norm2=[2,144761]) +12/02/2026 - 17:31:00.908 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [8] для пользователя [10] +12/02/2026 - 17:31:00.908 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:00.908 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [9] для пользователя [10] +12/02/2026 - 17:31:00.908 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:00.908 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [10] для пользователя [10] +12/02/2026 - 17:31:00.908 MSK -- [Trace]: Тестер: пользователь [10] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:00.908 MSK -- [Trace]: В результате действия [REGISTER] пользователя [10] с мероприятием [2] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:00.908 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:00.912 MSK -- Событие { eventA: 2, eventB: 3, score: 0.55, timestamp: 2026-02-12T14:31:00.904Z } проверено +12/02/2026 - 17:31:00.912 MSK -- Событие { eventA: 2, eventB: 4, score: 0.44, timestamp: 2026-02-12T14:31:00.904Z } проверено +12/02/2026 - 17:31:00.912 MSK -- Событие { eventA: 2, eventB: 7, score: 0.67, timestamp: 2026-02-12T14:31:00.904Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:01.926 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:01.926 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:31:01.932 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 2.80 } +12/02/2026 - 17:31:01.932 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 2.80 } +12/02/2026 - 17:31:01.932 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:01.932 MSK -- Верификация для события закончена: { user: 10, event: 2, type: ACTION_REGISTER, timestamp: 2026-02-09T19:42:10.615680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:01.932 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:01.932 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T19:46:00.074680200Z } +12/02/2026 - 17:31:01.935 MSK -- [Trace]: Событие отправлено: { user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T19:46:00.074680200Z } +12/02/2026 - 17:31:01.935 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T19:46:00.074680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:01.939 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 10, type: VIEW, timestamp: 2026-02-09T19:46:00.074Z } +12/02/2026 - 17:31:01.940 MSK -- Событие VIEW пользователя 2 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:31:01.940 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [2] для мероприятия [10] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [2] равен [0,341882] (min=[1,200000], norm1=[2,097618], norm2=[1,673320]) +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [5] равен [0,301511] (min=[0,800000], norm1=[2,097618], norm2=[1,264911]) +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [6] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [7] равен [0,577920] (min=[2,600000], norm1=[2,097618], norm2=[2,144761]) +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [2] +12/02/2026 - 17:31:01.940 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [9] равен [0,455842] (min=[1,600000], norm1=[2,097618], norm2=[1,673320]) +12/02/2026 - 17:31:01.940 MSK -- [Trace]: В результате действия [VIEW] пользователя [2] с мероприятием [10] было рассчитано 4 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:01.940 MSK -- Ожидаю 15 секунд получения 4 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:01.944 MSK -- Событие { eventA: 2, eventB: 10, score: 0.34, timestamp: 2026-02-12T14:31:01.937Z } проверено +12/02/2026 - 17:31:01.944 MSK -- Событие { eventA: 5, eventB: 10, score: 0.30, timestamp: 2026-02-12T14:31:01.937Z } проверено +12/02/2026 - 17:31:01.944 MSK -- Событие { eventA: 7, eventB: 10, score: 0.58, timestamp: 2026-02-12T14:31:01.937Z } проверено +12/02/2026 - 17:31:01.944 MSK -- Событие { eventA: 9, eventB: 10, score: 0.46, timestamp: 2026-02-12T14:31:01.937Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:02.958 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:02.958 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:31:02.965 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 4.40 } +12/02/2026 - 17:31:02.965 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 4.40 } +12/02/2026 - 17:31:02.965 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:02.965 MSK -- Верификация для события закончена: { user: 2, event: 10, type: ACTION_VIEW, timestamp: 2026-02-09T19:46:00.074680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:02.965 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:02.965 MSK -- Отправляю событие о действии пользователя: { user: 8, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:48:05.813680200Z } +12/02/2026 - 17:31:02.968 MSK -- [Trace]: Событие отправлено: { user: 8, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:48:05.813680200Z } +12/02/2026 - 17:31:02.968 MSK -- Ожидаю 10 секунд получения события { user: 8, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:48:05.813680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 8, event: 4, type: VIEW, timestamp: 2026-02-09T19:48:05.813Z } +12/02/2026 - 17:31:02.973 MSK -- Событие VIEW пользователя 8 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:31:02.973 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [8] для мероприятия [4] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [1] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [2] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [3] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [3] равен [0,607644] (min=[2,400000], norm1=[2,280351], norm2=[1,732051]) +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [6] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [7] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [8] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пользователь [8] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [8] +12/02/2026 - 17:31:02.973 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [10] равен [0,585369] (min=[2,800000], norm1=[2,280351], norm2=[2,097618]) +12/02/2026 - 17:31:02.973 MSK -- [Trace]: В результате действия [VIEW] пользователя [8] с мероприятием [4] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:02.973 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:02.977 MSK -- Событие { eventA: 3, eventB: 4, score: 0.61, timestamp: 2026-02-12T14:31:02.970Z } проверено +12/02/2026 - 17:31:02.977 MSK -- Событие { eventA: 4, eventB: 10, score: 0.59, timestamp: 2026-02-12T14:31:02.970Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:03.983 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:03.983 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:31:03.990 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 5.20 } +12/02/2026 - 17:31:03.990 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 5.20 } +12/02/2026 - 17:31:03.990 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:03.990 MSK -- Верификация для события закончена: { user: 8, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T19:48:05.813680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:03.990 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:03.990 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:52:42.229680200Z } +12/02/2026 - 17:31:03.992 MSK -- [Trace]: Событие отправлено: { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:52:42.229680200Z } +12/02/2026 - 17:31:03.992 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:52:42.229680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:03.997 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 3, type: VIEW, timestamp: 2026-02-09T19:52:42.229Z } +12/02/2026 - 17:31:03.997 MSK -- Событие VIEW пользователя 3 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:31:03.997 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:03.997 MSK -- [Trace]: В результате действия [VIEW] пользователя [3] с мероприятием [3] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:03.997 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:31:05.002 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:05.002 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:31:05.007 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 3.00 } +12/02/2026 - 17:31:05.007 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 3.00 } +12/02/2026 - 17:31:05.007 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:05.007 MSK -- Верификация для события закончена: { user: 3, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T19:52:42.229680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:05.007 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:05.007 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T19:57:52.491680200Z } +12/02/2026 - 17:31:05.010 MSK -- [Trace]: Событие отправлено: { user: 4, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T19:57:52.491680200Z } +12/02/2026 - 17:31:05.010 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T19:57:52.491680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 6, type: REGISTER, timestamp: 2026-02-09T19:57:52.491Z } +12/02/2026 - 17:31:05.014 MSK -- Событие REGISTER пользователя 4 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:31:05.014 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [4] для мероприятия [6] +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [4] +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [1] равен [0,500000] (min=[0,800000], norm1=[1,264911], norm2=[1,264911]) +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [4] +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [2] равен [0,377964] (min=[0,800000], norm1=[1,264911], norm2=[1,673320]) +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [4] +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [3] равен [0,365148] (min=[0,800000], norm1=[1,264911], norm2=[1,732051]) +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [4] +12/02/2026 - 17:31:05.014 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [4] равен [0,277350] (min=[0,800000], norm1=[1,264911], norm2=[2,280351]) +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [4] +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [4] +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [7] равен [0,589768] (min=[1,600000], norm1=[1,264911], norm2=[2,144761]) +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [4] +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [8] равен [0,670820] (min=[1,200000], norm1=[1,264911], norm2=[1,414214]) +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [4] +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [9] равен [0,755929] (min=[1,600000], norm1=[1,264911], norm2=[1,673320]) +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [4] +12/02/2026 - 17:31:05.015 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [10] равен [0,301511] (min=[0,800000], norm1=[1,264911], norm2=[2,097618]) +12/02/2026 - 17:31:05.015 MSK -- [Trace]: В результате действия [REGISTER] пользователя [4] с мероприятием [6] было рассчитано 8 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:05.015 MSK -- Ожидаю 15 секунд получения 8 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 1, eventB: 6, score: 0.50, timestamp: 2026-02-12T14:31:05.012Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 2, eventB: 6, score: 0.38, timestamp: 2026-02-12T14:31:05.012Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 3, eventB: 6, score: 0.37, timestamp: 2026-02-12T14:31:05.012Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 4, eventB: 6, score: 0.28, timestamp: 2026-02-12T14:31:05.013Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 6, eventB: 7, score: 0.59, timestamp: 2026-02-12T14:31:05.013Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 6, eventB: 8, score: 0.67, timestamp: 2026-02-12T14:31:05.013Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 6, eventB: 9, score: 0.76, timestamp: 2026-02-12T14:31:05.013Z } проверено +12/02/2026 - 17:31:05.020 MSK -- Событие { eventA: 6, eventB: 10, score: 0.30, timestamp: 2026-02-12T14:31:05.013Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:06.032 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:06.032 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:31:06.038 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 1.60 } +12/02/2026 - 17:31:06.038 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 1.60 } +12/02/2026 - 17:31:06.038 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:06.038 MSK -- Верификация для события закончена: { user: 4, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T19:57:52.491680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:06.038 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:06.038 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T20:04:20.847680200Z } +12/02/2026 - 17:31:06.041 MSK -- [Trace]: Событие отправлено: { user: 6, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T20:04:20.847680200Z } +12/02/2026 - 17:31:06.041 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T20:04:20.847680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 3, type: VIEW, timestamp: 2026-02-09T20:04:20.847Z } +12/02/2026 - 17:31:06.046 MSK -- Событие VIEW пользователя 6 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:31:06.046 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [6] для мероприятия [3] +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [6] +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [1] равен [0,342997] (min=[0,800000], norm1=[1,843909], norm2=[1,264911]) +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [6] +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:06.046 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [5] равен [0,171499] (min=[0,400000], norm1=[1,843909], norm2=[1,264911]) +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [6] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [6] +12/02/2026 - 17:31:06.047 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:06.047 MSK -- [Trace]: В результате действия [VIEW] пользователя [6] с мероприятием [3] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:06.047 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:06.052 MSK -- Событие { eventA: 1, eventB: 3, score: 0.34, timestamp: 2026-02-12T14:31:06.044Z } проверено +12/02/2026 - 17:31:06.052 MSK -- Событие { eventA: 3, eventB: 5, score: 0.17, timestamp: 2026-02-12T14:31:06.044Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:07.062 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:07.062 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:31:07.069 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 3.40 } +12/02/2026 - 17:31:07.069 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 3.40 } +12/02/2026 - 17:31:07.069 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:07.069 MSK -- Верификация для события закончена: { user: 6, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T20:04:20.847680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:07.069 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:07.069 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T20:06:33.503680200Z } +12/02/2026 - 17:31:07.072 MSK -- [Trace]: Событие отправлено: { user: 2, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T20:06:33.503680200Z } +12/02/2026 - 17:31:07.072 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T20:06:33.503680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 4, type: VIEW, timestamp: 2026-02-09T20:06:33.503Z } +12/02/2026 - 17:31:07.079 MSK -- Событие VIEW пользователя 2 с мероприятием 4 - проверено +-------------------------------- +12/02/2026 - 17:31:07.079 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [2] для мероприятия [4] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [1] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [2] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [2] равен [0,505076] (min=[2,000000], norm1=[2,366432], norm2=[1,673320]) +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [3] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [5] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [5] равен [0,133631] (min=[0,400000], norm1=[2,366432], norm2=[1,264911]) +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [6] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [7] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [7] равен [0,630488] (min=[3,200000], norm1=[2,366432], norm2=[2,144761]) +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [8] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [9] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [9] равен [0,303046] (min=[1,200000], norm1=[2,366432], norm2=[1,673320]) +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [4] и [10] для пользователя [2] +12/02/2026 - 17:31:07.079 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [4] и [10] равен [0,644658] (min=[3,200000], norm1=[2,366432], norm2=[2,097618]) +12/02/2026 - 17:31:07.079 MSK -- [Trace]: В результате действия [VIEW] пользователя [2] с мероприятием [4] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:07.079 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:07.085 MSK -- Событие { eventA: 2, eventB: 4, score: 0.51, timestamp: 2026-02-12T14:31:07.076Z } проверено +12/02/2026 - 17:31:07.085 MSK -- Событие { eventA: 4, eventB: 5, score: 0.13, timestamp: 2026-02-12T14:31:07.076Z } проверено +12/02/2026 - 17:31:07.085 MSK -- Событие { eventA: 4, eventB: 7, score: 0.63, timestamp: 2026-02-12T14:31:07.076Z } проверено +12/02/2026 - 17:31:07.085 MSK -- Событие { eventA: 4, eventB: 9, score: 0.30, timestamp: 2026-02-12T14:31:07.076Z } проверено +12/02/2026 - 17:31:07.085 MSK -- Событие { eventA: 4, eventB: 10, score: 0.64, timestamp: 2026-02-12T14:31:07.076Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:08.097 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:08.097 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [4] +12/02/2026 - 17:31:08.104 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 4, score: 5.60 } +12/02/2026 - 17:31:08.104 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 4, score: 5.60 } +12/02/2026 - 17:31:08.104 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:08.104 MSK -- Верификация для события закончена: { user: 2, event: 4, type: ACTION_VIEW, timestamp: 2026-02-09T20:06:33.503680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:08.104 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:08.104 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T20:08:27.681680200Z } +12/02/2026 - 17:31:08.107 MSK -- [Trace]: Событие отправлено: { user: 6, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T20:08:27.681680200Z } +12/02/2026 - 17:31:08.107 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T20:08:27.681680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 8, type: REGISTER, timestamp: 2026-02-09T20:08:27.681Z } +12/02/2026 - 17:31:08.111 MSK -- Событие REGISTER пользователя 6 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:31:08.111 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [6] для мероприятия [8] +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [6] +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [1] равен [0,566947] (min=[1,200000], norm1=[1,673320], norm2=[1,264911]) +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [6] +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [6] +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [3] равен [0,518563] (min=[1,600000], norm1=[1,673320], norm2=[1,843909]) +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [6] +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [6] +12/02/2026 - 17:31:08.111 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [5] равен [0,188982] (min=[0,400000], norm1=[1,673320], norm2=[1,264911]) +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [6] для пользователя [6] +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [6] +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [6] +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [6] +12/02/2026 - 17:31:08.112 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:08.112 MSK -- [Trace]: В результате действия [REGISTER] пользователя [6] с мероприятием [8] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:08.112 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:08.117 MSK -- Событие { eventA: 1, eventB: 8, score: 0.57, timestamp: 2026-02-12T14:31:08.110Z } проверено +12/02/2026 - 17:31:08.117 MSK -- Событие { eventA: 3, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:31:08.110Z } проверено +12/02/2026 - 17:31:08.117 MSK -- Событие { eventA: 5, eventB: 8, score: 0.19, timestamp: 2026-02-12T14:31:08.110Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:09.128 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:09.128 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:31:09.136 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 2.80 } +12/02/2026 - 17:31:09.136 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 2.80 } +12/02/2026 - 17:31:09.136 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:09.136 MSK -- Верификация для события закончена: { user: 6, event: 8, type: ACTION_REGISTER, timestamp: 2026-02-09T20:08:27.681680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:09.136 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:09.136 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T20:12:33.305680200Z } +12/02/2026 - 17:31:09.139 MSK -- [Trace]: Событие отправлено: { user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T20:12:33.305680200Z } +12/02/2026 - 17:31:09.139 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T20:12:33.305680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 8, type: VIEW, timestamp: 2026-02-09T20:12:33.305Z } +12/02/2026 - 17:31:09.143 MSK -- Событие VIEW пользователя 1 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:31:09.143 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [1] для мероприятия [8] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [4] равен [0,472456] (min=[2,000000], norm1=[1,788854], norm2=[2,366432]) +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [6] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [7] равен [0,521286] (min=[2,000000], norm1=[1,788854], norm2=[2,144761]) +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [1] +12/02/2026 - 17:31:09.143 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [10] равен [0,533002] (min=[2,000000], norm1=[1,788854], norm2=[2,097618]) +12/02/2026 - 17:31:09.143 MSK -- [Trace]: В результате действия [VIEW] пользователя [1] с мероприятием [8] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:09.143 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:09.149 MSK -- Событие { eventA: 4, eventB: 8, score: 0.47, timestamp: 2026-02-12T14:31:09.141Z } проверено +12/02/2026 - 17:31:09.149 MSK -- Событие { eventA: 7, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:31:09.141Z } проверено +12/02/2026 - 17:31:09.149 MSK -- Событие { eventA: 8, eventB: 10, score: 0.53, timestamp: 2026-02-12T14:31:09.141Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:10.157 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:10.157 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:31:10.163 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 3.20 } +12/02/2026 - 17:31:10.163 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 3.20 } +12/02/2026 - 17:31:10.163 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:10.163 MSK -- Верификация для события закончена: { user: 1, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T20:12:33.305680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:10.163 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:10.163 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:16:27.692680200Z } +12/02/2026 - 17:31:10.165 MSK -- [Trace]: Событие отправлено: { user: 7, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:16:27.692680200Z } +12/02/2026 - 17:31:10.165 MSK -- Ожидаю 10 секунд получения события { user: 7, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:16:27.692680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 7, event: 6, type: REGISTER, timestamp: 2026-02-09T20:16:27.692Z } +12/02/2026 - 17:31:10.170 MSK -- Событие REGISTER пользователя 7 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:31:10.170 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [7] для мероприятия [6] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [1] равен [0,612372] (min=[1,200000], norm1=[1,549193], norm2=[1,264911]) +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [4] равен [0,436436] (min=[1,600000], norm1=[1,549193], norm2=[2,366432]) +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [7] +12/02/2026 - 17:31:10.170 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:10.170 MSK -- [Trace]: В результате действия [REGISTER] пользователя [7] с мероприятием [6] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:10.171 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:10.175 MSK -- Событие { eventA: 1, eventB: 6, score: 0.61, timestamp: 2026-02-12T14:31:10.168Z } проверено +12/02/2026 - 17:31:10.175 MSK -- Событие { eventA: 4, eventB: 6, score: 0.44, timestamp: 2026-02-12T14:31:10.168Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:11.185 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:11.185 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:31:11.202 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 2.40 } +12/02/2026 - 17:31:11.202 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 2.40 } +12/02/2026 - 17:31:11.202 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:11.202 MSK -- Верификация для события закончена: { user: 7, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:16:27.692680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:11.202 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:11.202 MSK -- Отправляю событие о действии пользователя: { user: 3, event: 8, type: ACTION_LIKE, timestamp: 2026-02-09T20:24:33.573680200Z } +12/02/2026 - 17:31:11.206 MSK -- [Trace]: Событие отправлено: { user: 3, event: 8, type: ACTION_LIKE, timestamp: 2026-02-09T20:24:33.573680200Z } +12/02/2026 - 17:31:11.206 MSK -- Ожидаю 10 секунд получения события { user: 3, event: 8, type: ACTION_LIKE, timestamp: 2026-02-09T20:24:33.573680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 3, event: 8, type: LIKE, timestamp: 2026-02-09T20:24:33.573Z } +12/02/2026 - 17:31:11.212 MSK -- Событие LIKE пользователя 3 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:31:11.212 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [3] для мероприятия [8] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [2] равен [0,388922] (min=[1,200000], norm1=[1,843909], norm2=[1,673320]) +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [3] равен [0,470588] (min=[1,600000], norm1=[1,843909], norm2=[1,843909]) +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [4] равен [0,458349] (min=[2,000000], norm1=[1,843909], norm2=[2,366432]) +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [6] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [7] равен [0,505722] (min=[2,000000], norm1=[1,843909], norm2=[2,144761]) +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пользователь [3] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [3] +12/02/2026 - 17:31:11.212 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [10] равен [0,517088] (min=[2,000000], norm1=[1,843909], norm2=[2,097618]) +12/02/2026 - 17:31:11.212 MSK -- [Trace]: В результате действия [LIKE] пользователя [3] с мероприятием [8] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:11.212 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:11.217 MSK -- Событие { eventA: 2, eventB: 8, score: 0.39, timestamp: 2026-02-12T14:31:11.209Z } проверено +12/02/2026 - 17:31:11.217 MSK -- Событие { eventA: 3, eventB: 8, score: 0.47, timestamp: 2026-02-12T14:31:11.209Z } проверено +12/02/2026 - 17:31:11.217 MSK -- Событие { eventA: 4, eventB: 8, score: 0.46, timestamp: 2026-02-12T14:31:11.209Z } проверено +12/02/2026 - 17:31:11.217 MSK -- Событие { eventA: 7, eventB: 8, score: 0.51, timestamp: 2026-02-12T14:31:11.209Z } проверено +12/02/2026 - 17:31:11.217 MSK -- Событие { eventA: 8, eventB: 10, score: 0.52, timestamp: 2026-02-12T14:31:11.209Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:12.229 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:12.229 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:31:12.236 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 3.40 } +12/02/2026 - 17:31:12.236 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 3.40 } +12/02/2026 - 17:31:12.236 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:12.236 MSK -- Верификация для события закончена: { user: 3, event: 8, type: ACTION_LIKE, timestamp: 2026-02-09T20:24:33.573680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:12.236 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:12.236 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T20:30:45.219680200Z } +12/02/2026 - 17:31:12.240 MSK -- [Trace]: Событие отправлено: { user: 9, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T20:30:45.219680200Z } +12/02/2026 - 17:31:12.240 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T20:30:45.219680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 5, type: REGISTER, timestamp: 2026-02-09T20:30:45.219Z } +12/02/2026 - 17:31:12.244 MSK -- Событие REGISTER пользователя 9 с мероприятием 5 - проверено +-------------------------------- +12/02/2026 - 17:31:12.244 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [9] для мероприятия [5] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [1] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [1] равен [0,408248] (min=[0,800000], norm1=[1,549193], norm2=[1,264911]) +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [2] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [2] равен [0,462910] (min=[1,200000], norm1=[1,549193], norm2=[1,673320]) +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [3] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [4] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [6] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [6] равен [0,333333] (min=[0,800000], norm1=[1,549193], norm2=[1,549193]) +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [7] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [7] равен [0,481543] (min=[1,600000], norm1=[1,549193], norm2=[2,144761]) +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [8] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [8] равен [0,280056] (min=[0,800000], norm1=[1,549193], norm2=[1,843909]) +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [9] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [9] равен [0,771517] (min=[2,000000], norm1=[1,549193], norm2=[1,673320]) +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [10] для пользователя [9] +12/02/2026 - 17:31:12.244 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:12.244 MSK -- [Trace]: В результате действия [REGISTER] пользователя [9] с мероприятием [5] было рассчитано 6 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:12.244 MSK -- Ожидаю 15 секунд получения 6 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:12.250 MSK -- Событие { eventA: 1, eventB: 5, score: 0.41, timestamp: 2026-02-12T14:31:12.242Z } проверено +12/02/2026 - 17:31:12.250 MSK -- Событие { eventA: 2, eventB: 5, score: 0.46, timestamp: 2026-02-12T14:31:12.242Z } проверено +12/02/2026 - 17:31:12.250 MSK -- Событие { eventA: 5, eventB: 6, score: 0.33, timestamp: 2026-02-12T14:31:12.242Z } проверено +12/02/2026 - 17:31:12.250 MSK -- Событие { eventA: 5, eventB: 7, score: 0.48, timestamp: 2026-02-12T14:31:12.242Z } проверено +12/02/2026 - 17:31:12.250 MSK -- Событие { eventA: 5, eventB: 8, score: 0.28, timestamp: 2026-02-12T14:31:12.242Z } проверено +12/02/2026 - 17:31:12.250 MSK -- Событие { eventA: 5, eventB: 9, score: 0.77, timestamp: 2026-02-12T14:31:12.242Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:13.256 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:13.256 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [5] +12/02/2026 - 17:31:13.263 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 5, score: 2.40 } +12/02/2026 - 17:31:13.263 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 5, score: 2.40 } +12/02/2026 - 17:31:13.263 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:13.263 MSK -- Верификация для события закончена: { user: 9, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T20:30:45.219680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:13.263 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:13.263 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T20:37:30.578680200Z } +12/02/2026 - 17:31:13.267 MSK -- [Trace]: Событие отправлено: { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T20:37:30.578680200Z } +12/02/2026 - 17:31:13.267 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T20:37:30.578680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 9, type: VIEW, timestamp: 2026-02-09T20:37:30.578Z } +12/02/2026 - 17:31:13.272 MSK -- Событие VIEW пользователя 6 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:31:13.272 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [6] для мероприятия [9] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [1] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [9] и [1] равен [0,530330] (min=[1,200000], norm1=[1,788854], norm2=[1,264911]) +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [2] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [3] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [9] и [3] равен [0,363803] (min=[1,200000], norm1=[1,788854], norm2=[1,843909]) +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [4] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [5] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [9] и [5] равен [0,866025] (min=[2,400000], norm1=[1,788854], norm2=[1,549193]) +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [6] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [7] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [8] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [9] и [8] равен [0,485071] (min=[1,600000], norm1=[1,788854], norm2=[1,843909]) +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [9] и [10] для пользователя [6] +12/02/2026 - 17:31:13.272 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:13.272 MSK -- [Trace]: В результате действия [VIEW] пользователя [6] с мероприятием [9] было рассчитано 4 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:13.272 MSK -- Ожидаю 15 секунд получения 4 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:13.278 MSK -- Событие { eventA: 1, eventB: 9, score: 0.53, timestamp: 2026-02-12T14:31:13.270Z } проверено +12/02/2026 - 17:31:13.278 MSK -- Событие { eventA: 3, eventB: 9, score: 0.36, timestamp: 2026-02-12T14:31:13.270Z } проверено +12/02/2026 - 17:31:13.278 MSK -- Событие { eventA: 5, eventB: 9, score: 0.87, timestamp: 2026-02-12T14:31:13.270Z } проверено +12/02/2026 - 17:31:13.278 MSK -- Событие { eventA: 8, eventB: 9, score: 0.49, timestamp: 2026-02-12T14:31:13.270Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:14.284 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:14.284 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:31:14.292 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 3.20 } +12/02/2026 - 17:31:14.292 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 3.20 } +12/02/2026 - 17:31:14.292 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:14.292 MSK -- Верификация для события закончена: { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T20:37:30.578680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:14.292 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:14.292 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T20:46:48.533680200Z } +12/02/2026 - 17:31:14.295 MSK -- [Trace]: Событие отправлено: { user: 2, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T20:46:48.533680200Z } +12/02/2026 - 17:31:14.295 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T20:46:48.533680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 10, type: REGISTER, timestamp: 2026-02-09T20:46:48.533Z } +12/02/2026 - 17:31:14.300 MSK -- Событие REGISTER пользователя 2 с мероприятием 10 - проверено +-------------------------------- +12/02/2026 - 17:31:14.300 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [2] для мероприятия [10] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [1] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [2] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [2] равен [0,436436] (min=[1,600000], norm1=[2,190890], norm2=[1,673320]) +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [3] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [4] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [4] равен [0,617213] (min=[3,200000], norm1=[2,190890], norm2=[2,366432]) +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [5] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [5] равен [0,353553] (min=[1,200000], norm1=[2,190890], norm2=[1,549193]) +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [6] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [7] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [7] равен [0,638442] (min=[3,000000], norm1=[2,190890], norm2=[2,144761]) +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [8] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [10] и [9] для пользователя [2] +12/02/2026 - 17:31:14.300 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [10] и [9] равен [0,510310] (min=[2,000000], norm1=[2,190890], norm2=[1,788854]) +12/02/2026 - 17:31:14.300 MSK -- [Trace]: В результате действия [REGISTER] пользователя [2] с мероприятием [10] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:14.300 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:14.306 MSK -- Событие { eventA: 2, eventB: 10, score: 0.44, timestamp: 2026-02-12T14:31:14.298Z } проверено +12/02/2026 - 17:31:14.306 MSK -- Событие { eventA: 4, eventB: 10, score: 0.62, timestamp: 2026-02-12T14:31:14.298Z } проверено +12/02/2026 - 17:31:14.306 MSK -- Событие { eventA: 5, eventB: 10, score: 0.35, timestamp: 2026-02-12T14:31:14.298Z } проверено +12/02/2026 - 17:31:14.306 MSK -- Событие { eventA: 7, eventB: 10, score: 0.64, timestamp: 2026-02-12T14:31:14.298Z } проверено +12/02/2026 - 17:31:14.306 MSK -- Событие { eventA: 9, eventB: 10, score: 0.51, timestamp: 2026-02-12T14:31:14.298Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:15.311 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:15.312 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [10] +12/02/2026 - 17:31:15.317 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 10, score: 4.80 } +12/02/2026 - 17:31:15.317 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 10, score: 4.80 } +12/02/2026 - 17:31:15.317 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:15.317 MSK -- Верификация для события закончена: { user: 2, event: 10, type: ACTION_REGISTER, timestamp: 2026-02-09T20:46:48.533680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:15.317 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:15.317 MSK -- Отправляю событие о действии пользователя: { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T20:52:43.779680200Z } +12/02/2026 - 17:31:15.321 MSK -- [Trace]: Событие отправлено: { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T20:52:43.779680200Z } +12/02/2026 - 17:31:15.321 MSK -- Ожидаю 10 секунд получения события { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T20:52:43.779680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:15.325 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 10, event: 7, type: VIEW, timestamp: 2026-02-09T20:52:43.779Z } +12/02/2026 - 17:31:15.325 MSK -- Событие VIEW пользователя 10 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:31:15.325 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:15.325 MSK -- [Trace]: В результате действия [VIEW] пользователя [10] с мероприятием [7] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:15.325 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:31:16.336 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:16.336 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:31:16.342 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 4.60 } +12/02/2026 - 17:31:16.342 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 4.60 } +12/02/2026 - 17:31:16.342 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:16.342 MSK -- Верификация для события закончена: { user: 10, event: 7, type: ACTION_VIEW, timestamp: 2026-02-09T20:52:43.779680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:16.342 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:16.342 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:59:25.513680200Z } +12/02/2026 - 17:31:16.344 MSK -- [Trace]: Событие отправлено: { user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:59:25.513680200Z } +12/02/2026 - 17:31:16.344 MSK -- Ожидаю 10 секунд получения события { user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:59:25.513680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 5, event: 6, type: REGISTER, timestamp: 2026-02-09T20:59:25.513Z } +12/02/2026 - 17:31:16.349 MSK -- Событие REGISTER пользователя 5 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:31:16.349 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [5] для мероприятия [6] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [4] равен [0,566947] (min=[2,400000], norm1=[1,788854], norm2=[2,366432]) +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [7] равен [0,521286] (min=[2,000000], norm1=[1,788854], norm2=[2,144761]) +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [5] +12/02/2026 - 17:31:16.349 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:16.349 MSK -- [Trace]: В результате действия [REGISTER] пользователя [5] с мероприятием [6] было рассчитано 2 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:16.349 MSK -- Ожидаю 15 секунд получения 2 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:16.353 MSK -- Событие { eventA: 4, eventB: 6, score: 0.57, timestamp: 2026-02-12T14:31:16.347Z } проверено +12/02/2026 - 17:31:16.353 MSK -- Событие { eventA: 6, eventB: 7, score: 0.52, timestamp: 2026-02-12T14:31:16.347Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:17.365 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:17.365 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:31:17.372 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 3.20 } +12/02/2026 - 17:31:17.372 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 3.20 } +12/02/2026 - 17:31:17.372 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:17.372 MSK -- Верификация для события закончена: { user: 5, event: 6, type: ACTION_REGISTER, timestamp: 2026-02-09T20:59:25.513680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:17.372 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:17.372 MSK -- Отправляю событие о действии пользователя: { user: 1, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T21:09:08.538680200Z } +12/02/2026 - 17:31:17.374 MSK -- [Trace]: Событие отправлено: { user: 1, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T21:09:08.538680200Z } +12/02/2026 - 17:31:17.374 MSK -- Ожидаю 10 секунд получения события { user: 1, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T21:09:08.538680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 1, event: 2, type: VIEW, timestamp: 2026-02-09T21:09:08.538Z } +12/02/2026 - 17:31:17.377 MSK -- Событие VIEW пользователя 1 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:31:17.377 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [1] для мероприятия [2] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [1] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [3] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [4] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [4] равен [0,566947] (min=[2,400000], norm1=[1,788854], norm2=[2,366432]) +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [5] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [6] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [7] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [7] равен [0,729800] (min=[2,800000], norm1=[1,788854], norm2=[2,144761]) +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [8] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [8] равен [0,485071] (min=[1,600000], norm1=[1,788854], norm2=[1,843909]) +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [9] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пользователь [1] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [10] для пользователя [1] +12/02/2026 - 17:31:17.377 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [10] равен [0,510310] (min=[2,000000], norm1=[1,788854], norm2=[2,190890]) +12/02/2026 - 17:31:17.377 MSK -- [Trace]: В результате действия [VIEW] пользователя [1] с мероприятием [2] было рассчитано 4 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:17.377 MSK -- Ожидаю 15 секунд получения 4 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:17.382 MSK -- Событие { eventA: 2, eventB: 4, score: 0.57, timestamp: 2026-02-12T14:31:17.376Z } проверено +12/02/2026 - 17:31:17.382 MSK -- Событие { eventA: 2, eventB: 7, score: 0.73, timestamp: 2026-02-12T14:31:17.376Z } проверено +12/02/2026 - 17:31:17.382 MSK -- Событие { eventA: 2, eventB: 8, score: 0.49, timestamp: 2026-02-12T14:31:17.376Z } проверено +12/02/2026 - 17:31:17.382 MSK -- Событие { eventA: 2, eventB: 10, score: 0.51, timestamp: 2026-02-12T14:31:17.376Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:18.389 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:18.389 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:31:18.396 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 3.20 } +12/02/2026 - 17:31:18.396 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 3.20 } +12/02/2026 - 17:31:18.396 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:18.396 MSK -- Верификация для события закончена: { user: 1, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T21:09:08.538680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:18.396 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:18.396 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:12:56.646680200Z } +12/02/2026 - 17:31:18.399 MSK -- [Trace]: Событие отправлено: { user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:12:56.646680200Z } +12/02/2026 - 17:31:18.399 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:12:56.646680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:18.404 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 6, type: VIEW, timestamp: 2026-02-09T21:12:56.646Z } +12/02/2026 - 17:31:18.405 MSK -- Событие VIEW пользователя 2 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:31:18.405 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [2] для мероприятия [6] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [2] равен [0,353553] (min=[1,200000], norm1=[1,897367], norm2=[1,788854]) +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [4] равен [0,623610] (min=[2,800000], norm1=[1,897367], norm2=[2,366432]) +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [5] равен [0,408248] (min=[1,200000], norm1=[1,897367], norm2=[1,549193]) +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [7] равен [0,589768] (min=[2,400000], norm1=[1,897367], norm2=[2,144761]) +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [9] равен [0,589256] (min=[2,000000], norm1=[1,897367], norm2=[1,788854]) +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [2] +12/02/2026 - 17:31:18.405 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [10] равен [0,288675] (min=[1,200000], norm1=[1,897367], norm2=[2,190890]) +12/02/2026 - 17:31:18.405 MSK -- [Trace]: В результате действия [VIEW] пользователя [2] с мероприятием [6] было рассчитано 6 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:18.405 MSK -- Ожидаю 15 секунд получения 6 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:18.410 MSK -- Событие { eventA: 2, eventB: 6, score: 0.35, timestamp: 2026-02-12T14:31:18.402Z } проверено +12/02/2026 - 17:31:18.410 MSK -- Событие { eventA: 4, eventB: 6, score: 0.62, timestamp: 2026-02-12T14:31:18.402Z } проверено +12/02/2026 - 17:31:18.410 MSK -- Событие { eventA: 5, eventB: 6, score: 0.41, timestamp: 2026-02-12T14:31:18.402Z } проверено +12/02/2026 - 17:31:18.410 MSK -- Событие { eventA: 6, eventB: 7, score: 0.59, timestamp: 2026-02-12T14:31:18.402Z } проверено +12/02/2026 - 17:31:18.410 MSK -- Событие { eventA: 6, eventB: 9, score: 0.59, timestamp: 2026-02-12T14:31:18.402Z } проверено +12/02/2026 - 17:31:18.410 MSK -- Событие { eventA: 6, eventB: 10, score: 0.29, timestamp: 2026-02-12T14:31:18.402Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:19.418 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:19.418 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:31:19.425 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 3.60 } +12/02/2026 - 17:31:19.425 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 3.60 } +12/02/2026 - 17:31:19.425 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:19.425 MSK -- Верификация для события закончена: { user: 2, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:12:56.646680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:19.425 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:19.425 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T21:20:04.152680200Z } +12/02/2026 - 17:31:19.428 MSK -- [Trace]: Событие отправлено: { user: 7, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T21:20:04.152680200Z } +12/02/2026 - 17:31:19.428 MSK -- Ожидаю 10 секунд получения события { user: 7, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T21:20:04.152680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:19.432 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 7, event: 3, type: REGISTER, timestamp: 2026-02-09T21:20:04.152Z } +12/02/2026 - 17:31:19.432 MSK -- Событие REGISTER пользователя 7 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:31:19.432 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:19.432 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [7] для мероприятия [3] +12/02/2026 - 17:31:19.432 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [1] равен [0,462910] (min=[1,200000], norm1=[2,049390], norm2=[1,264911]) +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [4] равен [0,659829] (min=[3,200000], norm1=[2,049390], norm2=[2,366432]) +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [6] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [6] равен [0,411476] (min=[1,600000], norm1=[2,049390], norm2=[1,897367]) +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [7] +12/02/2026 - 17:31:19.433 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:19.433 MSK -- [Trace]: В результате действия [REGISTER] пользователя [7] с мероприятием [3] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:19.433 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:19.437 MSK -- Событие { eventA: 1, eventB: 3, score: 0.46, timestamp: 2026-02-12T14:31:19.430Z } проверено +12/02/2026 - 17:31:19.437 MSK -- Событие { eventA: 3, eventB: 4, score: 0.66, timestamp: 2026-02-12T14:31:19.430Z } проверено +12/02/2026 - 17:31:19.437 MSK -- Событие { eventA: 3, eventB: 6, score: 0.41, timestamp: 2026-02-12T14:31:19.430Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:20.443 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:20.443 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:31:20.448 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 4.20 } +12/02/2026 - 17:31:20.448 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 4.20 } +12/02/2026 - 17:31:20.448 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:20.448 MSK -- Верификация для события закончена: { user: 7, event: 3, type: ACTION_REGISTER, timestamp: 2026-02-09T21:20:04.152680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:20.448 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:20.448 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:29:08.128680200Z } +12/02/2026 - 17:31:20.452 MSK -- [Trace]: Событие отправлено: { user: 11, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:29:08.128680200Z } +12/02/2026 - 17:31:20.452 MSK -- Ожидаю 10 секунд получения события { user: 11, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:29:08.128680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 11, event: 6, type: VIEW, timestamp: 2026-02-09T21:29:08.128Z } +12/02/2026 - 17:31:20.457 MSK -- Событие VIEW пользователя 11 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:31:20.457 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [11] для мероприятия [6] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [5] равен [0,516398] (min=[1,600000], norm1=[2,000000], norm2=[1,549193]) +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [9] равен [0,670820] (min=[2,400000], norm1=[2,000000], norm2=[1,788854]) +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [11] +12/02/2026 - 17:31:20.457 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [10] равен [0,365148] (min=[1,600000], norm1=[2,000000], norm2=[2,190890]) +12/02/2026 - 17:31:20.457 MSK -- [Trace]: В результате действия [VIEW] пользователя [11] с мероприятием [6] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:20.457 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:20.461 MSK -- Событие { eventA: 5, eventB: 6, score: 0.52, timestamp: 2026-02-12T14:31:20.455Z } проверено +12/02/2026 - 17:31:20.461 MSK -- Событие { eventA: 6, eventB: 9, score: 0.67, timestamp: 2026-02-12T14:31:20.455Z } проверено +12/02/2026 - 17:31:20.461 MSK -- Событие { eventA: 6, eventB: 10, score: 0.37, timestamp: 2026-02-12T14:31:20.455Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:21.462 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:21.462 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:31:21.469 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 4.00 } +12/02/2026 - 17:31:21.469 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 4.00 } +12/02/2026 - 17:31:21.469 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:21.469 MSK -- Верификация для события закончена: { user: 11, event: 6, type: ACTION_VIEW, timestamp: 2026-02-09T21:29:08.128680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:21.469 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:21.469 MSK -- Отправляю событие о действии пользователя: { user: 7, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T21:34:13.552680200Z } +12/02/2026 - 17:31:21.472 MSK -- [Trace]: Событие отправлено: { user: 7, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T21:34:13.552680200Z } +12/02/2026 - 17:31:21.472 MSK -- Ожидаю 10 секунд получения события { user: 7, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T21:34:13.552680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 7, event: 3, type: LIKE, timestamp: 2026-02-09T21:34:13.552Z } +12/02/2026 - 17:31:21.478 MSK -- Событие LIKE пользователя 7 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:31:21.478 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [7] для мероприятия [3] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [1] равен [0,452267] (min=[1,200000], norm1=[2,097618], norm2=[1,264911]) +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [4] равен [0,644658] (min=[3,200000], norm1=[2,097618], norm2=[2,366432]) +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [6] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [6] равен [0,381385] (min=[1,600000], norm1=[2,097618], norm2=[2,000000]) +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [7] +12/02/2026 - 17:31:21.478 MSK -- [Trace]: Тестер: пользователь [7] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:21.478 MSK -- [Trace]: В результате действия [LIKE] пользователя [7] с мероприятием [3] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:21.478 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:21.482 MSK -- Событие { eventA: 1, eventB: 3, score: 0.45, timestamp: 2026-02-12T14:31:21.474Z } проверено +12/02/2026 - 17:31:21.482 MSK -- Событие { eventA: 3, eventB: 4, score: 0.64, timestamp: 2026-02-12T14:31:21.474Z } проверено +12/02/2026 - 17:31:21.482 MSK -- Событие { eventA: 3, eventB: 6, score: 0.38, timestamp: 2026-02-12T14:31:21.474Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:22.497 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:22.497 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:31:22.505 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 4.40 } +12/02/2026 - 17:31:22.505 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 4.40 } +12/02/2026 - 17:31:22.505 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:22.506 MSK -- Верификация для события закончена: { user: 7, event: 3, type: ACTION_LIKE, timestamp: 2026-02-09T21:34:13.552680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:22.506 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:22.506 MSK -- Отправляю событие о действии пользователя: { user: 4, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T21:38:14.641680200Z } +12/02/2026 - 17:31:22.509 MSK -- [Trace]: Событие отправлено: { user: 4, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T21:38:14.641680200Z } +12/02/2026 - 17:31:22.509 MSK -- Ожидаю 10 секунд получения события { user: 4, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T21:38:14.641680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:22.514 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 4, event: 7, type: LIKE, timestamp: 2026-02-09T21:38:14.641Z } +12/02/2026 - 17:31:22.514 MSK -- Событие LIKE пользователя 4 с мероприятием 7 - проверено +-------------------------------- +12/02/2026 - 17:31:22.515 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [4] для мероприятия [7] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [1] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [1] равен [0,288675] (min=[0,800000], norm1=[2,190890], norm2=[1,264911]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [2] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [2] равен [0,714435] (min=[2,800000], norm1=[2,190890], norm2=[1,788854]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [3] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [3] равен [0,391675] (min=[1,800000], norm1=[2,190890], norm2=[2,097618]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [4] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [4] равен [0,617213] (min=[3,200000], norm1=[2,190890], norm2=[2,366432]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [5] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пользователь [4] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [6] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [6] равен [0,547723] (min=[2,400000], norm1=[2,190890], norm2=[2,000000]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [8] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [8] равен [0,495074] (min=[2,000000], norm1=[2,190890], norm2=[1,843909]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [9] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [9] равен [0,612372] (min=[2,400000], norm1=[2,190890], norm2=[1,788854]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [7] и [10] для пользователя [4] +12/02/2026 - 17:31:22.515 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [7] и [10] равен [0,625000] (min=[3,000000], norm1=[2,190890], norm2=[2,190890]) +12/02/2026 - 17:31:22.515 MSK -- [Trace]: В результате действия [LIKE] пользователя [4] с мероприятием [7] было рассчитано 8 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:22.516 MSK -- Ожидаю 15 секунд получения 8 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 1, eventB: 7, score: 0.29, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 2, eventB: 7, score: 0.71, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 3, eventB: 7, score: 0.39, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 4, eventB: 7, score: 0.62, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 6, eventB: 7, score: 0.55, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 7, eventB: 8, score: 0.50, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 7, eventB: 9, score: 0.61, timestamp: 2026-02-12T14:31:22.513Z } проверено +12/02/2026 - 17:31:22.520 MSK -- Событие { eventA: 7, eventB: 10, score: 0.62, timestamp: 2026-02-12T14:31:22.513Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:23.527 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:23.527 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [7] +12/02/2026 - 17:31:23.534 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 7, score: 4.80 } +12/02/2026 - 17:31:23.534 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 7, score: 4.80 } +12/02/2026 - 17:31:23.534 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:23.534 MSK -- Верификация для события закончена: { user: 4, event: 7, type: ACTION_LIKE, timestamp: 2026-02-09T21:38:14.641680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:23.534 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:23.534 MSK -- Отправляю событие о действии пользователя: { user: 2, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T21:43:10.859680200Z } +12/02/2026 - 17:31:23.538 MSK -- [Trace]: Событие отправлено: { user: 2, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T21:43:10.859680200Z } +12/02/2026 - 17:31:23.538 MSK -- Ожидаю 10 секунд получения события { user: 2, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T21:43:10.859680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 2, event: 8, type: VIEW, timestamp: 2026-02-09T21:43:10.859Z } +12/02/2026 - 17:31:23.542 MSK -- Событие VIEW пользователя 2 с мероприятием 8 - проверено +-------------------------------- +12/02/2026 - 17:31:23.542 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [2] для мероприятия [8] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [1] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [2] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [2] равен [0,573539] (min=[2,000000], norm1=[1,949359], norm2=[1,788854]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [3] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пользователь [2] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [4] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [4] равен [0,520266] (min=[2,400000], norm1=[1,949359], norm2=[2,366432]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [5] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [5] равен [0,397360] (min=[1,200000], norm1=[1,949359], norm2=[1,549193]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [6] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [6] равен [0,410391] (min=[1,600000], norm1=[1,949359], norm2=[2,000000]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [7] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [7] равен [0,561951] (min=[2,400000], norm1=[1,949359], norm2=[2,190890]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [9] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [9] равен [0,573539] (min=[2,000000], norm1=[1,949359], norm2=[1,788854]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [8] и [10] для пользователя [2] +12/02/2026 - 17:31:23.542 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [8] и [10] равен [0,561951] (min=[2,400000], norm1=[1,949359], norm2=[2,190890]) +12/02/2026 - 17:31:23.542 MSK -- [Trace]: В результате действия [VIEW] пользователя [2] с мероприятием [8] было рассчитано 7 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:23.542 MSK -- Ожидаю 15 секунд получения 7 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 2, eventB: 8, score: 0.57, timestamp: 2026-02-12T14:31:23.540Z } проверено +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 4, eventB: 8, score: 0.52, timestamp: 2026-02-12T14:31:23.540Z } проверено +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 5, eventB: 8, score: 0.40, timestamp: 2026-02-12T14:31:23.540Z } проверено +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 6, eventB: 8, score: 0.41, timestamp: 2026-02-12T14:31:23.540Z } проверено +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 7, eventB: 8, score: 0.56, timestamp: 2026-02-12T14:31:23.540Z } проверено +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 8, eventB: 9, score: 0.57, timestamp: 2026-02-12T14:31:23.540Z } проверено +12/02/2026 - 17:31:23.547 MSK -- Событие { eventA: 8, eventB: 10, score: 0.56, timestamp: 2026-02-12T14:31:23.540Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:24.551 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:24.551 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [8] +12/02/2026 - 17:31:24.556 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 8, score: 3.80 } +12/02/2026 - 17:31:24.556 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 8, score: 3.80 } +12/02/2026 - 17:31:24.556 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:24.556 MSK -- Верификация для события закончена: { user: 2, event: 8, type: ACTION_VIEW, timestamp: 2026-02-09T21:43:10.859680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:24.556 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:24.556 MSK -- Отправляю событие о действии пользователя: { user: 9, event: 6, type: ACTION_LIKE, timestamp: 2026-02-09T21:44:13.482680200Z } +12/02/2026 - 17:31:24.560 MSK -- [Trace]: Событие отправлено: { user: 9, event: 6, type: ACTION_LIKE, timestamp: 2026-02-09T21:44:13.482680200Z } +12/02/2026 - 17:31:24.560 MSK -- Ожидаю 10 секунд получения события { user: 9, event: 6, type: ACTION_LIKE, timestamp: 2026-02-09T21:44:13.482680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 9, event: 6, type: LIKE, timestamp: 2026-02-09T21:44:13.482Z } +12/02/2026 - 17:31:24.566 MSK -- Событие LIKE пользователя 9 с мероприятием 6 - проверено +-------------------------------- +12/02/2026 - 17:31:24.566 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Получена новая оценка (вес) [1,000000] пользователя [9] для мероприятия [6] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [1] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [1] равен [0,462910] (min=[1,200000], norm1=[2,049390], norm2=[1,264911]) +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [2] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [2] равен [0,327327] (min=[1,200000], norm1=[2,049390], norm2=[1,788854]) +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [3] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [4] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [5] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [5] равен [0,503953] (min=[1,600000], norm1=[2,049390], norm2=[1,549193]) +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [7] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [7] равен [0,534522] (min=[2,400000], norm1=[2,049390], norm2=[2,190890]) +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [8] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [8] равен [0,400501] (min=[1,600000], norm1=[2,049390], norm2=[1,949359]) +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [9] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [6] и [9] равен [0,654654] (min=[2,400000], norm1=[2,049390], norm2=[1,788854]) +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [6] и [10] для пользователя [9] +12/02/2026 - 17:31:24.566 MSK -- [Trace]: Тестер: пользователь [9] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:24.566 MSK -- [Trace]: В результате действия [LIKE] пользователя [9] с мероприятием [6] было рассчитано 6 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:24.566 MSK -- Ожидаю 15 секунд получения 6 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:24.570 MSK -- Событие { eventA: 1, eventB: 6, score: 0.46, timestamp: 2026-02-12T14:31:24.563Z } проверено +12/02/2026 - 17:31:24.570 MSK -- Событие { eventA: 2, eventB: 6, score: 0.33, timestamp: 2026-02-12T14:31:24.563Z } проверено +12/02/2026 - 17:31:24.570 MSK -- Событие { eventA: 5, eventB: 6, score: 0.50, timestamp: 2026-02-12T14:31:24.563Z } проверено +12/02/2026 - 17:31:24.570 MSK -- Событие { eventA: 6, eventB: 7, score: 0.53, timestamp: 2026-02-12T14:31:24.563Z } проверено +12/02/2026 - 17:31:24.570 MSK -- Событие { eventA: 6, eventB: 8, score: 0.40, timestamp: 2026-02-12T14:31:24.563Z } проверено +12/02/2026 - 17:31:24.570 MSK -- Событие { eventA: 6, eventB: 9, score: 0.65, timestamp: 2026-02-12T14:31:24.563Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:25.581 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:25.581 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [6] +12/02/2026 - 17:31:25.588 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 6, score: 4.20 } +12/02/2026 - 17:31:25.588 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 6, score: 4.20 } +12/02/2026 - 17:31:25.588 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:25.588 MSK -- Верификация для события закончена: { user: 9, event: 6, type: ACTION_LIKE, timestamp: 2026-02-09T21:44:13.482680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:25.588 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:25.588 MSK -- Отправляю событие о действии пользователя: { user: 11, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T21:48:01.621680200Z } +12/02/2026 - 17:31:25.591 MSK -- [Trace]: Событие отправлено: { user: 11, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T21:48:01.621680200Z } +12/02/2026 - 17:31:25.591 MSK -- Ожидаю 10 секунд получения события { user: 11, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T21:48:01.621680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 11, event: 5, type: REGISTER, timestamp: 2026-02-09T21:48:01.621Z } +12/02/2026 - 17:31:25.596 MSK -- Событие REGISTER пользователя 11 с мероприятием 5 - проверено +-------------------------------- +12/02/2026 - 17:31:25.596 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Получена новая оценка (вес) [0,800000] пользователя [11] для мероприятия [5] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [1] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [2] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [3] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [3]. Пересчёт не требуется. +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [4] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [6] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [6] равен [0,466569] (min=[1,600000], norm1=[1,673320], norm2=[2,049390]) +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [7] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [8] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пользователь [11] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [9] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [9] равен [0,801784] (min=[2,400000], norm1=[1,673320], norm2=[1,788854]) +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [5] и [10] для пользователя [11] +12/02/2026 - 17:31:25.596 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [5] и [10] равен [0,436436] (min=[1,600000], norm1=[1,673320], norm2=[2,190890]) +12/02/2026 - 17:31:25.596 MSK -- [Trace]: В результате действия [REGISTER] пользователя [11] с мероприятием [5] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:25.596 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:25.599 MSK -- Событие { eventA: 5, eventB: 6, score: 0.47, timestamp: 2026-02-12T14:31:25.593Z } проверено +12/02/2026 - 17:31:25.599 MSK -- Событие { eventA: 5, eventB: 9, score: 0.80, timestamp: 2026-02-12T14:31:25.593Z } проверено +12/02/2026 - 17:31:25.599 MSK -- Событие { eventA: 5, eventB: 10, score: 0.44, timestamp: 2026-02-12T14:31:25.593Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:26.609 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:26.609 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [5] +12/02/2026 - 17:31:26.614 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 5, score: 2.80 } +12/02/2026 - 17:31:26.614 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 5, score: 2.80 } +12/02/2026 - 17:31:26.614 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:26.614 MSK -- Верификация для события закончена: { user: 11, event: 5, type: ACTION_REGISTER, timestamp: 2026-02-09T21:48:01.621680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:26.614 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:26.614 MSK -- Отправляю событие о действии пользователя: { user: 5, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T21:54:16.066680200Z } +12/02/2026 - 17:31:26.617 MSK -- [Trace]: Событие отправлено: { user: 5, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T21:54:16.066680200Z } +12/02/2026 - 17:31:26.617 MSK -- Ожидаю 10 секунд получения события { user: 5, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T21:54:16.066680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 5, event: 3, type: VIEW, timestamp: 2026-02-09T21:54:16.066Z } +12/02/2026 - 17:31:26.621 MSK -- Событие VIEW пользователя 5 с мероприятием 3 - проверено +-------------------------------- +12/02/2026 - 17:31:26.621 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [5] для мероприятия [3] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [1] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [1]. Пересчёт не требуется. +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [2] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [2]. Пересчёт не требуется. +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [4] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [4] равен [0,694365] (min=[3,600000], norm1=[2,190890], norm2=[2,366432]) +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [5] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [5]. Пересчёт не требуется. +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [6] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [6] равен [0,445435] (min=[2,000000], norm1=[2,190890], norm2=[2,049390]) +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [7] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [3] и [7] равен [0,458333] (min=[2,200000], norm1=[2,190890], norm2=[2,190890]) +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [8] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [8]. Пересчёт не требуется. +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [9] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [9]. Пересчёт не требуется. +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [3] и [10] для пользователя [5] +12/02/2026 - 17:31:26.621 MSK -- [Trace]: Тестер: пользователь [5] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:26.621 MSK -- [Trace]: В результате действия [VIEW] пользователя [5] с мероприятием [3] было рассчитано 3 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:26.621 MSK -- Ожидаю 15 секунд получения 3 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:26.626 MSK -- Событие { eventA: 3, eventB: 4, score: 0.69, timestamp: 2026-02-12T14:31:26.619Z } проверено +12/02/2026 - 17:31:26.626 MSK -- Событие { eventA: 3, eventB: 6, score: 0.45, timestamp: 2026-02-12T14:31:26.619Z } проверено +12/02/2026 - 17:31:26.626 MSK -- Событие { eventA: 3, eventB: 7, score: 0.46, timestamp: 2026-02-12T14:31:26.619Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:27.640 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:27.640 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [3] +12/02/2026 - 17:31:27.645 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 3, score: 4.80 } +12/02/2026 - 17:31:27.645 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 3, score: 4.80 } +12/02/2026 - 17:31:27.645 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:27.645 MSK -- Верификация для события закончена: { user: 5, event: 3, type: ACTION_VIEW, timestamp: 2026-02-09T21:54:16.066680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:27.645 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:27.645 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T21:56:09.107680200Z } +12/02/2026 - 17:31:27.648 MSK -- [Trace]: Событие отправлено: { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T21:56:09.107680200Z } +12/02/2026 - 17:31:27.649 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T21:56:09.107680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:27.653 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 9, type: VIEW, timestamp: 2026-02-09T21:56:09.107Z } +12/02/2026 - 17:31:27.653 MSK -- Событие VIEW пользователя 6 с мероприятием 9 - проверено +-------------------------------- +12/02/2026 - 17:31:27.653 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:27.653 MSK -- [Trace]: В результате действия [VIEW] пользователя [6] с мероприятием [9] было рассчитано 0 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:27.653 MSK -- Для данного действия обновления коэффициента схожести не требуется +-------------------------------- +12/02/2026 - 17:31:28.654 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:28.654 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [9] +12/02/2026 - 17:31:28.660 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 9, score: 3.20 } +12/02/2026 - 17:31:28.660 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 9, score: 3.20 } +12/02/2026 - 17:31:28.660 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:28.660 MSK -- Верификация для события закончена: { user: 6, event: 9, type: ACTION_VIEW, timestamp: 2026-02-09T21:56:09.107680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:28.660 MSK -- Начинаю верификацию сервиса Collector +12/02/2026 - 17:31:28.660 MSK -- Отправляю событие о действии пользователя: { user: 6, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T22:05:01.835680200Z } +12/02/2026 - 17:31:28.662 MSK -- [Trace]: Событие отправлено: { user: 6, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T22:05:01.835680200Z } +12/02/2026 - 17:31:28.662 MSK -- Ожидаю 10 секунд получения события { user: 6, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T22:05:01.835680200Z } из топика stats.user-actions.v1 +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Начинаю верификацию полученного события: { user: 6, event: 2, type: VIEW, timestamp: 2026-02-09T22:05:01.835Z } +12/02/2026 - 17:31:28.667 MSK -- Событие VIEW пользователя 6 с мероприятием 2 - проверено +-------------------------------- +12/02/2026 - 17:31:28.667 MSK -- Начинаю верификацию сервиса Aggregator. Рассчитываю обновления коэффициента схожести с другими мероприятиями +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Получена новая оценка (вес) [0,400000] пользователя [6] для мероприятия [2] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [1] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [1] равен [0,500000] (min=[1,200000], norm1=[1,897367], norm2=[1,264911]) +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [3] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [3] равен [0,481125] (min=[2,000000], norm1=[1,897367], norm2=[2,190890]) +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [4] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [4]. Пересчёт не требуется. +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [5] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [5] равен [0,503953] (min=[1,600000], norm1=[1,897367], norm2=[1,673320]) +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [6] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [6]. Пересчёт не требуется. +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [7] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [7]. Пересчёт не требуется. +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [8] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [8] равен [0,648886] (min=[2,400000], norm1=[1,897367], norm2=[1,949359]) +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [9] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: коэффициент подобия мероприятий [2] и [9] равен [0,589256] (min=[2,000000], norm1=[1,897367], norm2=[1,788854]) +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пересчитываем коэффициент подобия мероприятий [2] и [10] для пользователя [6] +12/02/2026 - 17:31:28.667 MSK -- [Trace]: Тестер: пользователь [6] не взаимодействовал с мероприятием [10]. Пересчёт не требуется. +12/02/2026 - 17:31:28.667 MSK -- [Trace]: В результате действия [VIEW] пользователя [6] с мероприятием [2] было рассчитано 5 коэффициентов схожести с другими мероприятиями +12/02/2026 - 17:31:28.667 MSK -- Ожидаю 15 секунд получения 5 сообщений из топика stats.events-similarity.v1 +12/02/2026 - 17:31:28.672 MSK -- Событие { eventA: 1, eventB: 2, score: 0.50, timestamp: 2026-02-12T14:31:28.665Z } проверено +12/02/2026 - 17:31:28.672 MSK -- Событие { eventA: 2, eventB: 3, score: 0.48, timestamp: 2026-02-12T14:31:28.665Z } проверено +12/02/2026 - 17:31:28.672 MSK -- Событие { eventA: 2, eventB: 5, score: 0.50, timestamp: 2026-02-12T14:31:28.665Z } проверено +12/02/2026 - 17:31:28.672 MSK -- Событие { eventA: 2, eventB: 8, score: 0.65, timestamp: 2026-02-12T14:31:28.665Z } проверено +12/02/2026 - 17:31:28.672 MSK -- Событие { eventA: 2, eventB: 9, score: 0.59, timestamp: 2026-02-12T14:31:28.665Z } проверено +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:29.684 MSK -- Начинаю верификацию сервиса Analyzer +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:29.684 MSK -- Отправляю gRPC-запрос на получение количества взаимодействий с мероприятием [2] +12/02/2026 - 17:31:29.690 MSK -- Получено 1 событий от сервиса Analyzer: +{ event: 2, score: 3.60 } +12/02/2026 - 17:31:29.690 MSK -- [Trace]: Проверяю данные полученные от Analyzer: { event: 2, score: 3.60 } +12/02/2026 - 17:31:29.690 MSK -- [Trace]: Проверка завершена +-------------------------------- +12/02/2026 - 17:31:29.690 MSK -- Верификация для события закончена: { user: 6, event: 2, type: ACTION_VIEW, timestamp: 2026-02-09T22:05:01.835680200Z } +-------------------------------- +-------------------------------- +12/02/2026 - 17:31:29.690 MSK -- Завершаю работу приложения +-------------------------------- +Обнаружено 0 ошибок. diff --git a/infra/config-server/src/main/resources/application.yaml b/infra/config-server/src/main/resources/application.yaml index ab100f5..88d5b7c 100644 --- a/infra/config-server/src/main/resources/application.yaml +++ b/infra/config-server/src/main/resources/application.yaml @@ -14,6 +14,9 @@ spring: - classpath:config/user-service/ - classpath:config/request-service/ - classpath:config/comment-service/ + - classpath:config/collector/ + - classpath:config/aggregator/ + - classpath:config/analyzer/ server: port: 0 diff --git a/infra/config-server/src/main/resources/config/aggregator/aggregator.yaml b/infra/config-server/src/main/resources/config/aggregator/aggregator.yaml new file mode 100644 index 0000000..69b8729 --- /dev/null +++ b/infra/config-server/src/main/resources/config/aggregator/aggregator.yaml @@ -0,0 +1,10 @@ +kafka: + bootstrap: + servers: localhost:9092 + consumer: + group: stats.aggregator.action + poll: + timeout: 100 + topics: + stats-user-action-v1: stats.user-actions.v1 + stats-events-similarity-v1: stats.events-similarity.v1 \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/analyzer/analyzer.yaml b/infra/config-server/src/main/resources/config/analyzer/analyzer.yaml new file mode 100644 index 0000000..9b4904b --- /dev/null +++ b/infra/config-server/src/main/resources/config/analyzer/analyzer.yaml @@ -0,0 +1,35 @@ +spring: + datasource: + driverClassName: org.postgresql.Driver + url: jdbc:postgresql://localhost:6542/ewm_stats_db + username: stat_user + password: stat_password + + jpa: + hibernate: + ddl-auto: none + properties: + hibernate: + format_sql: true + dialect: org.hibernate.dialect.PostgreSQLDialect + default_schema: stats_analyzer + sql: + init: + mode: always + +kafka: + bootstrap: + servers: localhost:9092 + consumer: + group: + action: stats.analyzer.action + similarity: stats.analyzer.similarity + poll: + timeout: 100 + topics: + stats-user-action-v1: stats.user-actions.v1 + stats-events-similarity-v1: stats.events-similarity.v1 + +grpc: + server: + port: 0 \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/collector/collector.yaml b/infra/config-server/src/main/resources/config/collector/collector.yaml new file mode 100644 index 0000000..48443f7 --- /dev/null +++ b/infra/config-server/src/main/resources/config/collector/collector.yaml @@ -0,0 +1,9 @@ +kafka: + bootstrap: + servers: localhost:9092 + topics: + stats-user-action-v1: stats.user-actions.v1 + +grpc: + server: + port: 0 \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/comment-service/comment-service.yaml b/infra/config-server/src/main/resources/config/comment-service/comment-service.yaml index ba86393..bdf6f3e 100644 --- a/infra/config-server/src/main/resources/config/comment-service/comment-service.yaml +++ b/infra/config-server/src/main/resources/config/comment-service/comment-service.yaml @@ -23,4 +23,8 @@ stats-server: logging: level: root: INFO - ru.yandex.practicum.explorewithme.main: DEBUG \ No newline at end of file + ru.yandex.practicum.explorewithme.main: DEBUG + +grpc: + server: + port: -1 \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/event-service/event-service.yaml b/infra/config-server/src/main/resources/config/event-service/event-service.yaml index ba86393..9f22279 100644 --- a/infra/config-server/src/main/resources/config/event-service/event-service.yaml +++ b/infra/config-server/src/main/resources/config/event-service/event-service.yaml @@ -23,4 +23,20 @@ stats-server: logging: level: root: INFO - ru.yandex.practicum.explorewithme.main: DEBUG \ No newline at end of file + ru.yandex.practicum.explorewithme.main: DEBUG + +grpc: + server: + port: -1 + client: + collector: + address: discovery:///collector + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext + + analyzer: + address: discovery:///analyzer + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/request-service/request-service.yaml b/infra/config-server/src/main/resources/config/request-service/request-service.yaml index ba86393..9f22279 100644 --- a/infra/config-server/src/main/resources/config/request-service/request-service.yaml +++ b/infra/config-server/src/main/resources/config/request-service/request-service.yaml @@ -23,4 +23,20 @@ stats-server: logging: level: root: INFO - ru.yandex.practicum.explorewithme.main: DEBUG \ No newline at end of file + ru.yandex.practicum.explorewithme.main: DEBUG + +grpc: + server: + port: -1 + client: + collector: + address: discovery:///collector + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext + + analyzer: + address: discovery:///analyzer + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/stats-server/stats-server.yaml b/infra/config-server/src/main/resources/config/stats-server/stats-server.yaml deleted file mode 100644 index fdc6de4..0000000 --- a/infra/config-server/src/main/resources/config/stats-server/stats-server.yaml +++ /dev/null @@ -1,19 +0,0 @@ -server: - port: 9090 - -spring: - datasource: - url: jdbc:postgresql://localhost:6542/ewm_stats_db - username: stat_user - password: stat_password - jpa: - hibernate: - ddl-auto: update - show-sql: true - properties: - hibernate.format_sql: true - dialect: org.hibernate.dialect.PostgreSQLDialect -logging: - level: - org.hibernate.SQL: DEBUG - org.hibernate.type.descriptor.sql.BasicBinder: TRACE \ No newline at end of file diff --git a/infra/config-server/src/main/resources/config/user-service/user-service.yaml b/infra/config-server/src/main/resources/config/user-service/user-service.yaml index 64f11b1..520defe 100644 --- a/infra/config-server/src/main/resources/config/user-service/user-service.yaml +++ b/infra/config-server/src/main/resources/config/user-service/user-service.yaml @@ -23,4 +23,8 @@ stats-server: logging: level: root: INFO - ru.practicum.explorewithme.main: DEBUG \ No newline at end of file + ru.practicum.explorewithme.main: DEBUG + +grpc: + server: + port: -1 \ No newline at end of file diff --git a/pom.xml b/pom.xml index d9ce4a2..344f774 100644 --- a/pom.xml +++ b/pom.xml @@ -31,10 +31,12 @@ 3.6.1 2.6.0 3.1.0.RELEASE - 3.23.4 + 3.25.1 1.63.0 2023.0.3 1.18.30 + 0.2.0 + 2.0.7 3.11.0 @@ -97,6 +99,7 @@ org.springframework.retry spring-retry + ${spring-retry.version} @@ -111,6 +114,19 @@ ${lombok.version} provided + + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + diff --git a/stats/stats-server/pom.xml b/stats/aggregator/pom.xml similarity index 77% rename from stats/stats-server/pom.xml rename to stats/aggregator/pom.xml index c6fa37c..f909823 100644 --- a/stats/stats-server/pom.xml +++ b/stats/aggregator/pom.xml @@ -3,14 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ru.yandex.practicum stats 0.0.1-SNAPSHOT - stats-server + aggregator 21 @@ -21,71 +20,65 @@ ru.yandex.practicum - stats-dto + avro-schemas 0.0.1-SNAPSHOT - compile - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-actuator + ru.yandex.practicum + collector + 0.0.1-SNAPSHOT + compile - org.projectlombok - lombok + ru.yandex.practicum + common + 0.0.1-SNAPSHOT org.springframework.boot - spring-boot-starter-data-jpa + spring-boot-starter-web - org.postgresql - postgresql - runtime + org.springframework.boot + spring-boot-starter-actuator - org.mapstruct - mapstruct - ${mapstruct.version} + org.projectlombok + lombok + provided - com.h2database - h2 - runtime + org.springframework.cloud + spring-cloud-starter-config - org.springframework.cloud - spring-cloud-starter-config + org.springframework.retry + spring-retry org.springframework.cloud spring-cloud-starter-netflix-eureka-client - - - org.springframework.boot - spring-boot-maven-plugin - org.apache.maven.plugins maven-compiler-plugin + + org.springframework.boot + spring-boot-maven-plugin + diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/StatServerApp.java b/stats/aggregator/src/main/java/ru/yandex/practicum/AggregatorApp.java similarity index 53% rename from stats/stats-server/src/main/java/ru/yandex/practicum/StatServerApp.java rename to stats/aggregator/src/main/java/ru/yandex/practicum/AggregatorApp.java index 789c299..9e51296 100644 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/StatServerApp.java +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/AggregatorApp.java @@ -2,12 +2,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication -@ConfigurationPropertiesScan -public class StatServerApp { +@EnableDiscoveryClient +public class AggregatorApp { public static void main(String[] args) { - SpringApplication.run(StatServerApp.class, args); + SpringApplication.run(AggregatorApp.class, args); } } diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaClient.java b/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaClient.java new file mode 100644 index 0000000..1b7ee52 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaClient.java @@ -0,0 +1,18 @@ +package ru.yandex.practicum.config; + +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; + +import java.time.Duration; + +public interface KafkaClient { + + Consumer getConsumer(); + + Producer getProducer(); + + Duration getPollTimeout(); + + KafkaTopicsProperties getTopicsProperties(); +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaConfig.java b/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaConfig.java new file mode 100644 index 0000000..1809b50 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaConfig.java @@ -0,0 +1,94 @@ +package ru.yandex.practicum.config; + +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.apache.kafka.common.serialization.LongSerializer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.yandex.practicum.deserializer.UserActionDeserializer; +import ru.yandex.practicum.serializer.AvroSerializer; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaConfig { + + @Value("${kafka.bootstrap.servers}") + private String bootstrapServers; + + @Value("${kafka.consumer.group}") + private String groupId; + + @Value("${kafka.producer.client-id:aggregator-producer}") + private String clientId; + + @Value("${kafka.consumer.poll.timeout:1000}") + private long pollTimeout; + + @Autowired + private KafkaTopicsProperties topicsProperties; + + @Bean + @Scope("prototype") + public KafkaClient kafkaClient() { + return new KafkaClient() { + + private Consumer consumer; + private Producer producer; + + @Override + public Consumer getConsumer() { + if (consumer == null) { + consumer = createConsumer(); + } + return consumer; + } + + @Override + public Producer getProducer() { + if (producer == null) { + producer = createProducer(); + } + return producer; + } + + @Override + public Duration getPollTimeout() { + return Duration.ofMillis(pollTimeout); + } + + @Override + public KafkaTopicsProperties getTopicsProperties() { + return topicsProperties; + } + + private Consumer createConsumer() { + Map config = new HashMap<>(); + config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class); + config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, UserActionDeserializer.class); + config.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + return new KafkaConsumer<>(config); + } + + private Producer createProducer() { + Map config = new HashMap<>(); + config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class); + config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroSerializer.class); + return new KafkaProducer<>(config); + } + }; + } +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java b/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java new file mode 100644 index 0000000..460b7ab --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "spring.kafka.topics") +public class KafkaTopicsProperties { + private String userActions = "stats.user-actions.v1"; + private String eventsSimilarity = "stats.events-similarity.v1"; +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java b/stats/aggregator/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java new file mode 100644 index 0000000..3dd12a2 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java @@ -0,0 +1,84 @@ +package ru.yandex.practicum.consumer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.config.KafkaClient; + +import java.time.Duration; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserActionConsumer { + private final KafkaClient kafkaClient; + private Consumer consumer; + + public ConsumerRecords poll(Duration timeout) { + return getConsumer().poll(timeout); + } + + public void subscribe() { + getConsumer().subscribe(List.of(kafkaClient.getTopicsProperties().getUserActions())); + log.info("Подписка на топик: {}", kafkaClient.getTopicsProperties().getUserActions()); + } + + public void commitAsync(Map offsets) { + getConsumer().commitAsync(offsets, (offsetsMap, exception) -> { + if (exception != null) { + log.error("Ошибка асинхронного коммита оффсетов: {}", offsetsMap, exception); + } else { + log.debug("Асинхронный коммит оффсетов выполнен: {}", offsetsMap); + } + }); + } + + public void commitSync(Map offsets) { + try { + getConsumer().commitSync(offsets); + log.debug("Синхронный коммит оффсетов выполнен: {}", offsets); + } catch (Exception e) { + log.error("Ошибка синхронного коммита оффсетов", e); + throw e; + } + } + + public Consumer getRawConsumer() { + return getConsumer(); + } + + public void wakeup() { + if (consumer != null) { + log.info("Вызов wakeup для consumer"); + consumer.wakeup(); + } + } + + public void close() { + if (consumer != null) { + try { + consumer.wakeup(); + consumer.close(Duration.ofMillis(100)); + log.info("Consumer успешно закрыт"); + } catch (Exception e) { + log.error("Ошибка при закрытии consumer", e); + } finally { + consumer = null; + } + } + } + + private Consumer getConsumer() { + if (consumer == null) { + consumer = kafkaClient.getConsumer(); + } + return consumer; + } +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/mapper/SimilarityMapper.java b/stats/aggregator/src/main/java/ru/yandex/practicum/mapper/SimilarityMapper.java new file mode 100644 index 0000000..05e75ef --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/mapper/SimilarityMapper.java @@ -0,0 +1,24 @@ +package ru.yandex.practicum.mapper; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; + +import java.time.Instant; + +@Slf4j +@Component +public class SimilarityMapper { + + public EventSimilarityAvro toAvro(Long eventA, Long eventB, double score) { + long first = Math.min(eventA, eventB); + long second = Math.max(eventA, eventB); + + return EventSimilarityAvro.newBuilder() + .setEventA(first) + .setEventB(second) + .setScore(score) + .setTimestamp(Instant.now()) + .build(); + } +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java b/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java new file mode 100644 index 0000000..f4d8a62 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java @@ -0,0 +1,118 @@ +package ru.yandex.practicum.processor; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.ActionTypeAvro; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.mapper.SimilarityMapper; + +import java.time.Instant; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +@Component +@RequiredArgsConstructor +public class SimilarityCalculator { + private final SimilarityMapper similarityMapper; + private static final double VIEW_WEIGHT = 0.4; + private static final double REGISTER_WEIGHT = 0.8; + private static final double LIKE_WEIGHT = 1.0; + + private static final Map WEIGHTS = Map.of( + ActionTypeAvro.VIEW, VIEW_WEIGHT, + ActionTypeAvro.REGISTER, REGISTER_WEIGHT, + ActionTypeAvro.LIKE, LIKE_WEIGHT + ); + + private final Map> weightMatrix = new ConcurrentHashMap<>(); + private final Map weightSumByEvent = new ConcurrentHashMap<>(); + private final Map> minWeightsSums = new ConcurrentHashMap<>(); + private final Map> eventsByUser = new ConcurrentHashMap<>(); + + public List calculateSimilarity(UserActionAvro action) { + if (action == null) { + return Collections.emptyList(); + } + + long eventId = action.getEventId(); + long userId = action.getUserId(); + Instant actionTimestamp = action.getTimestamp(); + + double actionWeight = WEIGHTS.get(action.getActionType()); + + Map userWeights = weightMatrix.computeIfAbsent(eventId, + k -> new ConcurrentHashMap<>()); + double oldWeight = userWeights.getOrDefault(userId, 0.0); + + if (actionWeight > oldWeight) { + userWeights.put(userId, actionWeight); + + double totalWeight = weightSumByEvent.getOrDefault(eventId, 0.0); + totalWeight = totalWeight - oldWeight + actionWeight; + weightSumByEvent.put(eventId, totalWeight); + + Set userEvents = eventsByUser.computeIfAbsent(userId, + k -> ConcurrentHashMap.newKeySet()); + + List similarities = new ArrayList<>(); + + for (Long otherEventId : userEvents) { + if (otherEventId.equals(eventId)) continue; + + double similarity = recalculatePair(eventId, otherEventId, userId, + oldWeight, actionWeight); + + similarities.add(similarityMapper.toAvro( + eventId, + otherEventId, + similarity + )); + } + + userEvents.add(eventId); + return similarities; + } + + return Collections.emptyList(); + } + + private double recalculatePair(long eventA, long eventB, long userId, + double oldWeight, double newWeight) { + + double otherEventWeight = weightMatrix + .getOrDefault(eventB, Collections.emptyMap()) + .getOrDefault(userId, 0.0); + + double oldContribution = Math.min(oldWeight, otherEventWeight); + double newContribution = Math.min(newWeight, otherEventWeight); + double diff = newContribution - oldContribution; + + double minSum = getMinSum(eventA, eventB) + diff; + putMinSum(eventA, eventB, minSum); + + double totalA = weightSumByEvent.getOrDefault(eventA, 0.0); + double totalB = weightSumByEvent.getOrDefault(eventB, 0.0); + + if (totalA == 0.0 || totalB == 0.0) return 0.0; + + return minSum / (Math.sqrt(totalA) * Math.sqrt(totalB)); + } + + private void putMinSum(long eventA, long eventB, double sum) { + long first = Math.min(eventA, eventB); + long second = Math.max(eventA, eventB); + minWeightsSums.computeIfAbsent(first, k -> new ConcurrentHashMap<>()) + .put(second, sum); + } + + private double getMinSum(long eventA, long eventB) { + long first = Math.min(eventA, eventB); + long second = Math.max(eventA, eventB); + return minWeightsSums + .getOrDefault(first, Collections.emptyMap()) + .getOrDefault(second, 0.0); + } +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java b/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java new file mode 100644 index 0000000..1d1228c --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java @@ -0,0 +1,116 @@ +package ru.yandex.practicum.processor; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.errors.WakeupException; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.config.KafkaClient; +import ru.yandex.practicum.consumer.UserActionConsumer; +import ru.yandex.practicum.producer.EventSimilarityProducer; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +@RequiredArgsConstructor +public class SimilarityProcessor { + private final SimilarityCalculator calculator; + private final EventSimilarityProducer producer; + private final UserActionConsumer consumer; + private final KafkaClient kafkaClient; + private final Map currentOffsets = new HashMap<>(); + + public void start() { + log.info("Запуск SimilarityProcessor"); + + Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup)); + + try { + consumer.subscribe(); + Consumer kafkaConsumer = consumer.getRawConsumer(); + + int totalRecords = 0; + + while (true) { + ConsumerRecords records = + consumer.poll(kafkaClient.getPollTimeout()); + + for (ConsumerRecord record : records) { + if (record.value() instanceof UserActionAvro action) { + process(action); + manageOffsets(record, ++totalRecords, kafkaConsumer); + } + } + + if (!records.isEmpty()) { + consumer.commitAsync(getCurrentOffsets()); + log.debug("Коммит оффсетов после {} записей", records.count()); + } + } + } catch (WakeupException e) { + log.info("Получен сигнал завершения для SimilarityProcessor"); + } catch (Exception e) { + log.error("Ошибка в SimilarityProcessor", e); + } finally { + commitSyncOnShutdown(); + consumer.close(); + log.info("SimilarityProcessor завершен"); + } + } + + public void process(UserActionAvro action) { + List similarities = calculator.calculateSimilarity(action); + for (EventSimilarityAvro similarity : similarities) { + producer.send(similarity); + log.debug("Отправлено сходство: {} и {}, score={}", + similarity.getEventA(), similarity.getEventB(), similarity.getScore()); + } + } + + public void manageOffsets(ConsumerRecord record, + int count, + Consumer kafkaConsumer) { + currentOffsets.put( + new TopicPartition(record.topic(), record.partition()), + new OffsetAndMetadata(record.offset() + 1) + ); + + if (count % 10 == 0) { + kafkaConsumer.commitAsync(currentOffsets, (offsets, exception) -> { + if (exception != null) { + log.error("Ошибка промежуточного коммита оффсетов: {}", offsets, exception); + } else { + log.debug("Промежуточный коммит оффсетов выполнен: {}", offsets); + } + }); + } + } + + public void commitSyncOnShutdown() { + if (currentOffsets.isEmpty()) { + log.debug("Нет оффсетов для коммита"); + return; + } + + try { + consumer.commitSync(currentOffsets); + log.info("Финальный коммит оффсетов выполнен: {}", currentOffsets); + } catch (Exception e) { + log.error("Ошибка при финальном коммите оффсетов", e); + } + } + + public Map getCurrentOffsets() { + return new HashMap<>(currentOffsets); + } +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/producer/EventSimilarityProducer.java b/stats/aggregator/src/main/java/ru/yandex/practicum/producer/EventSimilarityProducer.java new file mode 100644 index 0000000..0291ec2 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/producer/EventSimilarityProducer.java @@ -0,0 +1,67 @@ +package ru.yandex.practicum.producer; + +import jakarta.annotation.PreDestroy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; +import ru.yandex.practicum.config.KafkaClient; + +import java.time.Duration; + +@Slf4j +@Component +@RequiredArgsConstructor +public class EventSimilarityProducer { + private final KafkaClient kafkaClient; + private Producer producer; + + public void send(EventSimilarityAvro similarity) { + long timestamp = similarity.getTimestamp().toEpochMilli(); + Long key = similarity.getEventA(); + + ProducerRecord record = new ProducerRecord<>( + kafkaClient.getTopicsProperties().getEventsSimilarity(), + null, + timestamp, + key, + similarity + ); + + getProducer().send(record, (metadata, exception) -> { + if (exception != null) { + log.error("Ошибка отправки сходства мероприятий {} и {}: {}", + similarity.getEventA(), similarity.getEventB(), exception.getMessage(), exception); + } else { + log.debug("Сходство отправлено: firstEvent={}, secondEvent={}, score={}, offset={}", + similarity.getEventA(), similarity.getEventB(), + similarity.getScore(), metadata.offset()); + } + }); + } + + @PreDestroy + public void close() { + if (producer != null) { + try { + producer.flush(); + producer.close(Duration.ofSeconds(30)); + log.info("Producer успешно закрыт"); + } catch (Exception e) { + log.error("Ошибка при закрытии producer", e); + } finally { + producer = null; + } + } + } + + private Producer getProducer() { + if (producer == null) { + producer = kafkaClient.getProducer(); + } + return producer; + } +} diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/runner/AggregatorRunner.java b/stats/aggregator/src/main/java/ru/yandex/practicum/runner/AggregatorRunner.java new file mode 100644 index 0000000..4135d91 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/runner/AggregatorRunner.java @@ -0,0 +1,21 @@ +package ru.yandex.practicum.runner; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.processor.SimilarityProcessor; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AggregatorRunner implements CommandLineRunner { + private final SimilarityProcessor similarityProcessor; + + @Override + public void run(String... args) { + log.info("Запуск AggregatorRunner"); + similarityProcessor.start(); + log.info("AggregatorRunner завершил запуск"); + } +} diff --git a/stats/aggregator/src/main/resources/application.yaml b/stats/aggregator/src/main/resources/application.yaml new file mode 100644 index 0000000..9f3b297 --- /dev/null +++ b/stats/aggregator/src/main/resources/application.yaml @@ -0,0 +1,26 @@ +spring: + application: + name: aggregator + + config: + import: "configserver:" + + cloud: + config: + fail-fast: true + retry: + useRandomPolicy: true + max-interval: 6000 + discovery: + enabled: true + serviceId: config-server + +server: + port: 0 + +eureka: + instance: + instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}} + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/stats/analyzer/pom.xml b/stats/analyzer/pom.xml new file mode 100644 index 0000000..eee83ec --- /dev/null +++ b/stats/analyzer/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + ru.yandex.practicum + stats + 0.0.1-SNAPSHOT + + + analyzer + + + 21 + 21 + UTF-8 + + + + + ru.yandex.practicum + avro-schemas + 0.0.1-SNAPSHOT + + + + ru.yandex.practicum + proto-schemas + 0.0.1-SNAPSHOT + + + + ru.yandex.practicum + common + 0.0.1-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.postgresql + postgresql + runtime + + + + net.devh + grpc-spring-boot-starter + + + + net.devh + grpc-server-spring-boot-starter + + + + org.apache.kafka + kafka-clients + + + + org.springframework.cloud + spring-cloud-starter-config + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + org.springframework.retry + spring-retry + + + + io.grpc + grpc-stub + + + + io.grpc + grpc-protobuf + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/AnalyzerApp.java b/stats/analyzer/src/main/java/ru/yandex/practicum/AnalyzerApp.java new file mode 100644 index 0000000..95af559 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/AnalyzerApp.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@SpringBootApplication +@EnableDiscoveryClient +public class AnalyzerApp { + public static void main(String[] args) { + SpringApplication.run(AnalyzerApp.class, args); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaClient.java b/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaClient.java new file mode 100644 index 0000000..a7589c0 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaClient.java @@ -0,0 +1,17 @@ +package ru.yandex.practicum.config; + +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; + +import java.time.Duration; + +public interface KafkaClient { + + Consumer getConsumerAction(); + + Consumer getConsumerSimilarity(); + + Duration getPollTimeout(); + + KafkaTopicsProperties getTopicsProperties(); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaConfig.java b/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaConfig.java new file mode 100644 index 0000000..eff4e5e --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaConfig.java @@ -0,0 +1,91 @@ +package ru.yandex.practicum.config; + +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.yandex.practicum.deserializer.EventSimilarityDeserializer; +import ru.yandex.practicum.deserializer.UserActionDeserializer; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaConfig { + + @Value("${kafka.bootstrap.servers}") + private String bootstrapServers; + + @Value("${kafka.consumer.group.action}") + private String groupAction; + + @Value("${kafka.consumer.group.similarity}") + private String groupSimilarity; + + @Value("${kafka.consumer.poll.timeout:1000}") + private long pollTimeout; + + @Autowired + private KafkaTopicsProperties topicsProperties; + + @Bean + @Scope("prototype") + public KafkaClient kafkaClient() { + return new KafkaClient() { + + private Consumer consumerAction; + private Consumer consumerSimilarity; + + @Override + public Consumer getConsumerAction() { + if (consumerAction == null) { + consumerAction = createConsumerAction(); + } + return consumerAction; + } + + @Override + public Consumer getConsumerSimilarity() { + if (consumerSimilarity == null) { + consumerSimilarity = createConsumerSimilarity(); + } + return consumerSimilarity; + } + + @Override + public Duration getPollTimeout() { + return Duration.ofMillis(pollTimeout); + } + + @Override + public KafkaTopicsProperties getTopicsProperties() { + return topicsProperties; + } + + private Consumer createConsumerAction() { + Map config = new HashMap<>(); + config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class); + config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, UserActionDeserializer.class); + config.put(ConsumerConfig.GROUP_ID_CONFIG, groupAction); + return new KafkaConsumer<>(config); + } + + private Consumer createConsumerSimilarity() { + Map config = new HashMap<>(); + config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class); + config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, EventSimilarityDeserializer.class); + config.put(ConsumerConfig.GROUP_ID_CONFIG, groupSimilarity); + return new KafkaConsumer<>(config); + } + }; + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java b/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java new file mode 100644 index 0000000..460b7ab --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "spring.kafka.topics") +public class KafkaTopicsProperties { + private String userActions = "stats.user-actions.v1"; + private String eventsSimilarity = "stats.events-similarity.v1"; +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/consumer/EventSimilarityConsumer.java b/stats/analyzer/src/main/java/ru/yandex/practicum/consumer/EventSimilarityConsumer.java new file mode 100644 index 0000000..07f66de --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/consumer/EventSimilarityConsumer.java @@ -0,0 +1,80 @@ +package ru.yandex.practicum.consumer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.config.KafkaClient; + +import java.time.Duration; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +@RequiredArgsConstructor +public class EventSimilarityConsumer { + private final KafkaClient kafkaClient; + private Consumer consumer; + + public ConsumerRecords poll(Duration timeout) { + return getConsumer().poll(timeout); + } + + public void subscribe() { + getConsumer().subscribe(List.of(kafkaClient.getTopicsProperties().getEventsSimilarity())); + log.info("Подписка на топик сходств: {}", kafkaClient.getTopicsProperties().getEventsSimilarity()); + } + + public void commitAsync(Map offsets) { + getConsumer().commitAsync(offsets, (offsetsMap, exception) -> { + if (exception != null) { + log.error("Ошибка асинхронного коммита оффсетов: {}", offsetsMap, exception); + } else { + log.debug("Асинхронный коммит оффсетов выполнен: {}", offsetsMap); + } + }); + } + + public void commitSync(Map offsets) { + try { + getConsumer().commitSync(offsets); + log.debug("Синхронный коммит оффсетов выполнен: {}", offsets); + } catch (Exception e) { + log.error("Ошибка синхронного коммита оффсетов", e); + throw e; + } + } + + public void wakeup() { + if (consumer != null) { + log.info("Вызов wakeup для consumer сходств"); + consumer.wakeup(); + } + } + + public void close() { + if (consumer != null) { + try { + consumer.wakeup(); + consumer.close(Duration.ofMillis(100)); + log.info("Consumer сходств успешно закрыт"); + } catch (Exception e) { + log.error("Ошибка при закрытии consumer сходств", e); + } finally { + consumer = null; + } + } + } + + public Consumer getConsumer() { + if (consumer == null) { + consumer = kafkaClient.getConsumerSimilarity(); + } + return consumer; + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java b/stats/analyzer/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java new file mode 100644 index 0000000..ac14685 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/consumer/UserActionConsumer.java @@ -0,0 +1,80 @@ +package ru.yandex.practicum.consumer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.config.KafkaClient; + +import java.time.Duration; +import java.util.List; +import java.util.Map; + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserActionConsumer { + private final KafkaClient kafkaClient; + private Consumer consumer; + + public ConsumerRecords poll(Duration timeout) { + return getConsumer().poll(timeout); + } + + public void subscribe() { + getConsumer().subscribe(List.of(kafkaClient.getTopicsProperties().getUserActions())); + log.info("Подписка на топик действий: {}", kafkaClient.getTopicsProperties().getUserActions()); + } + + public void commitAsync(Map offsets) { + getConsumer().commitAsync(offsets, (offsetsMap, exception) -> { + if (exception != null) { + log.error("Ошибка асинхронного коммита оффсетов: {}", offsetsMap, exception); + } else { + log.debug("Асинхронный коммит оффсетов выполнен: {}", offsetsMap); + } + }); + } + + public void commitSync(Map offsets) { + try { + getConsumer().commitSync(offsets); + log.debug("Синхронный коммит оффсетов выполнен: {}", offsets); + } catch (Exception e) { + log.error("Ошибка синхронного коммита оффсетов", e); + throw e; + } + } + + public void wakeup() { + if (consumer != null) { + log.info("Вызов wakeup для consumer действий"); + consumer.wakeup(); + } + } + + public void close() { + if (consumer != null) { + try { + consumer.wakeup(); + consumer.close(Duration.ofMillis(100)); + log.info("Consumer действий успешно закрыт"); + } catch (Exception e) { + log.error("Ошибка при закрытии consumer действий", e); + } finally { + consumer = null; + } + } + } + + public Consumer getConsumer() { + if (consumer == null) { + consumer = kafkaClient.getConsumerAction(); + } + return consumer; + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/controller/RecommendationsController.java b/stats/analyzer/src/main/java/ru/yandex/practicum/controller/RecommendationsController.java new file mode 100644 index 0000000..2755f63 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/controller/RecommendationsController.java @@ -0,0 +1,57 @@ +package ru.yandex.practicum.controller; + +import io.grpc.Status; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.server.service.GrpcService; +import ru.practicum.ewm.stats.proto.*; +import ru.yandex.practicum.service.RecommendationService; + +import java.util.stream.Stream; + +@Slf4j +@GrpcService +@RequiredArgsConstructor +public class RecommendationsController extends RecommendationsControllerGrpc.RecommendationsControllerImplBase { + private final RecommendationService recommendationService; + + @Override + public void getRecommendationsForUser(UserPredictionsRequestProto request, + StreamObserver responseObserver) { + log.info("gRPC запрос рекомендаций: userId={}, maxResults={}", + request.getUserId(), request.getMaxResults()); + handleStreamResponse(recommendationService.getRecommendationsForUser(request), responseObserver); + } + + @Override + public void getSimilarEvents(SimilarEventsRequestProto request, + StreamObserver responseObserver) { + log.info("gRPC запрос похожих событий: eventId={}, userId={}, maxResults={}", + request.getEventId(), request.getUserId(), request.getMaxResults()); + handleStreamResponse(recommendationService.getSimilarEvents(request), responseObserver); + } + + @Override + public void getInteractionsCount(InteractionsCountRequestProto request, + StreamObserver responseObserver) { + log.info("gRPC запрос количества взаимодействий: events={}", + request.getEventIdList()); + handleStreamResponse(recommendationService.getInteractionsCount(request), responseObserver); + } + + private void handleStreamResponse(Stream stream, + StreamObserver responseObserver) { + try (Stream safeStream = stream) { + safeStream.forEach(responseObserver::onNext); + responseObserver.onCompleted(); + log.debug("gRPC ответ успешно отправлен"); + } catch (Exception e) { + log.error("Ошибка при обработке gRPC запроса: {}", e.getMessage(), e); + responseObserver.onError(Status.INTERNAL + .withDescription(e.getMessage()) + .withCause(e) + .asRuntimeException()); + } + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandler.java b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandler.java new file mode 100644 index 0000000..667568b --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandler.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.handler; + +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; + +public interface EventSimilarityHandler { + void handle(EventSimilarityAvro eventSimilarityAvro); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandlerImpl.java b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandlerImpl.java new file mode 100644 index 0000000..67c4bd9 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/EventSimilarityHandlerImpl.java @@ -0,0 +1,26 @@ +package ru.yandex.practicum.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; +import ru.yandex.practicum.mapper.EventSimilarityMapper; +import ru.yandex.practicum.model.EventSimilarity; +import ru.yandex.practicum.service.EventSimilarityService; + +@Slf4j +@Component +@RequiredArgsConstructor +public class EventSimilarityHandlerImpl implements EventSimilarityHandler { + private final EventSimilarityService eventSimilarityService; + private final EventSimilarityMapper mapper; + + @Override + public void handle(EventSimilarityAvro avro) { + EventSimilarity entity = mapper.toEntity(avro); + eventSimilarityService.save(entity); + + log.debug("Сохранено сходство: {} и {}, score={}", + entity.getEventA(), entity.getEventB(), entity.getScore()); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandler.java b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandler.java new file mode 100644 index 0000000..9c45b04 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandler.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.handler; + +import ru.practicum.ewm.stats.avro.UserActionAvro; + +public interface UserActionHandler { + void handle(UserActionAvro userActionAvro); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandlerImpl.java b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandlerImpl.java new file mode 100644 index 0000000..7d7a233 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/handler/UserActionHandlerImpl.java @@ -0,0 +1,26 @@ +package ru.yandex.practicum.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.mapper.UserActionMapper; +import ru.yandex.practicum.model.UserAction; +import ru.yandex.practicum.service.UserActionService; + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserActionHandlerImpl implements UserActionHandler { + private final UserActionService userActionService; + private final UserActionMapper mapper; + + @Override + public void handle(UserActionAvro avro) { + UserAction entity = mapper.toEntity(avro); + userActionService.save(entity); + + log.debug("Сохранено действие: userId={}, eventId={}, weight={}", + entity.getUserId(), entity.getEventId(), entity.getUserScore()); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/EventSimilarityMapper.java b/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/EventSimilarityMapper.java new file mode 100644 index 0000000..4ae3298 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/EventSimilarityMapper.java @@ -0,0 +1,17 @@ +package ru.yandex.practicum.mapper; + +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; +import ru.yandex.practicum.model.EventSimilarity; + +@Component +public class EventSimilarityMapper { + + public EventSimilarity toEntity(EventSimilarityAvro avro) { + return EventSimilarity.builder() + .eventA(avro.getEventA()) + .eventB(avro.getEventB()) + .score(avro.getScore()) + .build(); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/RecommendationsMapper.java b/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/RecommendationsMapper.java new file mode 100644 index 0000000..75bb270 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/RecommendationsMapper.java @@ -0,0 +1,43 @@ +package ru.yandex.practicum.mapper; + +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.yandex.practicum.model.EventSimilarity; + +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +@Component +public class RecommendationsMapper { + + public Stream mapToProto( + List eventSimilarities, Long currentEventId) { + return eventSimilarities.stream() + .map(s -> { + long recommendedEventId = (s.getEventA().equals(currentEventId)) + ? s.getEventB() + : s.getEventA(); + return RecommendedEventProto.newBuilder() + .setEventId(recommendedEventId) + .setScore(s.getScore()) + .build(); + }); + } + + public Stream mapToProto(Map scoreByEvent) { + return scoreByEvent.entrySet().stream() + .map(entry -> RecommendedEventProto.newBuilder() + .setEventId(entry.getKey()) + .setScore(entry.getValue()) + .build()); + } + + public Stream mapFromAggregation(List aggregationResults) { + return aggregationResults.stream() + .map(row -> RecommendedEventProto.newBuilder() + .setEventId((Long) row[0]) + .setScore((Double) row[1]) + .build()); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java b/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java new file mode 100644 index 0000000..dc0a2dc --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java @@ -0,0 +1,28 @@ +package ru.yandex.practicum.mapper; + +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.ActionTypeAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.model.UserAction; + +import java.util.Map; + +@Component +public class UserActionMapper { + + private static final Map WEIGHTS = Map.of( + ActionTypeAvro.VIEW, 0.4, + ActionTypeAvro.REGISTER, 0.8, + ActionTypeAvro.LIKE, 1.0 + ); + + public UserAction toEntity(UserActionAvro avro) { + + return UserAction.builder() + .userId(avro.getUserId()) + .eventId(avro.getEventId()) + .userScore(WEIGHTS.get(avro.getActionType())) + .timestamp(avro.getTimestamp()) + .build(); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/model/ActionType.java b/stats/analyzer/src/main/java/ru/yandex/practicum/model/ActionType.java new file mode 100644 index 0000000..f0b7790 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/model/ActionType.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.model; + +public enum ActionType { + VIEW, + REGISTER, + LIKE +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/model/EventSimilarity.java b/stats/analyzer/src/main/java/ru/yandex/practicum/model/EventSimilarity.java new file mode 100644 index 0000000..fa0df25 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/model/EventSimilarity.java @@ -0,0 +1,27 @@ +package ru.yandex.practicum.model; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "event_similarities", schema = "stats_analyzer") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +public class EventSimilarity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "event_a") + private Long eventA; + + @Column(name = "event_b") + private Long eventB; + + private Double score; +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/model/UserAction.java b/stats/analyzer/src/main/java/ru/yandex/practicum/model/UserAction.java new file mode 100644 index 0000000..fd580b6 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/model/UserAction.java @@ -0,0 +1,33 @@ +package ru.yandex.practicum.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.Instant; + +@Entity +@Table(name = "user_actions", schema = "stats_analyzer") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +public class UserAction { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "user_id") + private Long userId; + + @Column(name = "event_id") + private Long eventId; + + @Column(name = "user_score") + private Double userScore; + + @Column(name = "timestamp_action") + private Instant timestamp; +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java b/stats/analyzer/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java new file mode 100644 index 0000000..c534ad4 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/processor/SimilarityProcessor.java @@ -0,0 +1,119 @@ +package ru.yandex.practicum.processor; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.errors.WakeupException; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; +import ru.yandex.practicum.config.KafkaClient; +import ru.yandex.practicum.consumer.EventSimilarityConsumer; +import ru.yandex.practicum.handler.EventSimilarityHandler; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +@RequiredArgsConstructor +public class SimilarityProcessor { + + private final EventSimilarityConsumer consumer; + private final EventSimilarityHandler handler; + private final KafkaClient kafkaClient; + private final Map currentOffsets = new HashMap<>(); + + public void start() { + log.info("Запуск SimilarityProcessor"); + + Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup)); + + try { + consumer.subscribe(); + Consumer kafkaConsumer = consumer.getConsumer(); + + int totalRecords = 0; + + while (true) { + ConsumerRecords records = + consumer.poll(kafkaClient.getPollTimeout()); + + for (ConsumerRecord record : records) { + process(record); + manageOffsets(record, ++totalRecords, kafkaConsumer); + } + + if (!records.isEmpty()) { + consumer.commitAsync(getCurrentOffsets()); + log.debug("Коммит оффсетов после {} записей", records.count()); + } + } + } catch (WakeupException e) { + log.info("Получен сигнал завершения для SimilarityProcessor"); + } catch (Exception e) { + log.error("Ошибка в SimilarityProcessor", e); + } finally { + commitSyncOnShutdown(); + consumer.close(); + log.info("SimilarityProcessor завершен"); + } + } + + public void process(ConsumerRecord record) { + if (record.value() instanceof EventSimilarityAvro similarity) { + try { + handler.handle(similarity); + log.debug("Обработано сходство: eventA={}, eventB={}, score={}", + similarity.getEventA(), similarity.getEventB(), similarity.getScore()); + } catch (Exception e) { + log.error("Ошибка обработки сходства мероприятий {} и {}: {}", + similarity.getEventA(), similarity.getEventB(), e.getMessage(), e); + throw e; + } + } else { + log.warn("Получен record неверного типа: {}", record.value() != null ? + record.value().getClass().getName() : "null"); + } + } + + public void manageOffsets(ConsumerRecord record, + int count, Consumer kafkaConsumer) { + currentOffsets.put( + new TopicPartition(record.topic(), record.partition()), + new OffsetAndMetadata(record.offset() + 1) + ); + + if (count % 10 == 0) { + kafkaConsumer.commitAsync(currentOffsets, (offsets, exception) -> { + if (exception != null) { + log.error("Ошибка промежуточного коммита оффсетов: {}", offsets, exception); + } else { + log.debug("Промежуточный коммит оффсетов выполнен: {}", offsets); + } + }); + } + } + + public void commitSyncOnShutdown() { + if (currentOffsets.isEmpty()) { + log.debug("Нет оффсетов для коммита"); + return; + } + + try { + consumer.commitSync(currentOffsets); + log.info("Финальный коммит оффсетов выполнен: {}", currentOffsets); + } catch (Exception e) { + log.error("Ошибка при финальном коммите оффсетов", e); + } + } + + public Map getCurrentOffsets() { + return new HashMap<>(currentOffsets); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java b/stats/analyzer/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java new file mode 100644 index 0000000..6dfc0e8 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java @@ -0,0 +1,120 @@ +package ru.yandex.practicum.processor; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.errors.WakeupException; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.config.KafkaClient; +import ru.yandex.practicum.consumer.UserActionConsumer; +import ru.yandex.practicum.handler.UserActionHandler; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserActionProcessor implements Runnable { + private final UserActionConsumer consumer; + private final UserActionHandler handler; + private final KafkaClient kafkaClient; + private final Map currentOffsets = new HashMap<>(); + private Consumer kafkaConsumer; + + @Override + public void run() { + log.info("Запуск UserActionProcessor"); + + Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup)); + + try { + consumer.subscribe(); + kafkaConsumer = consumer.getConsumer(); + + int totalRecords = 0; + + while (true) { + ConsumerRecords records = + consumer.poll(kafkaClient.getPollTimeout()); + + for (ConsumerRecord record : records) { + process(record); + manageOffsets(record, ++totalRecords, kafkaConsumer); + } + + if (!records.isEmpty()) { + consumer.commitAsync(getCurrentOffsets()); + log.debug("Коммит оффсетов после {} записей", records.count()); + } + } + } catch (WakeupException e) { + log.info("Получен сигнал завершения для UserActionProcessor"); + } catch (Exception e) { + log.error("Ошибка в UserActionProcessor", e); + } finally { + commitSyncOnShutdown(); + consumer.close(); + log.info("UserActionProcessor завершен"); + } + } + + public void process(ConsumerRecord record) { + if (record.value() instanceof UserActionAvro action) { + try { + handler.handle(action); + log.debug("Обработано действие пользователя: userId={}, eventId={}, actionType={}", + action.getUserId(), action.getEventId(), action.getActionType()); + } catch (Exception e) { + log.error("Ошибка обработки действия пользователя {}: {}", + action.getUserId(), e.getMessage(), e); + throw e; + } + } else { + log.warn("Получен record неверного типа: {}", record.value() != null ? + record.value().getClass().getName() : "null"); + } + } + + public void manageOffsets(ConsumerRecord record, + int count, Consumer kafkaConsumer) { + currentOffsets.put( + new TopicPartition(record.topic(), record.partition()), + new OffsetAndMetadata(record.offset() + 1) + ); + + if (count % 10 == 0) { + kafkaConsumer.commitAsync(currentOffsets, (offsets, exception) -> { + if (exception != null) { + log.error("Ошибка промежуточного коммита оффсетов: {}", offsets, exception); + } else { + log.debug("Промежуточный коммит оффсетов выполнен: {}", offsets); + } + }); + } + } + + public void commitSyncOnShutdown() { + if (currentOffsets.isEmpty()) { + log.debug("Нет оффсетов для коммита"); + return; + } + + try { + consumer.commitSync(currentOffsets); + log.info("Финальный коммит оффсетов выполнен: {}", currentOffsets); + } catch (Exception e) { + log.error("Ошибка при финальном коммите оффсетов", e); + } + } + + public Map getCurrentOffsets() { + return new HashMap<>(currentOffsets); + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/repository/EventSimilarityRepository.java b/stats/analyzer/src/main/java/ru/yandex/practicum/repository/EventSimilarityRepository.java new file mode 100644 index 0000000..204de11 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/repository/EventSimilarityRepository.java @@ -0,0 +1,58 @@ +package ru.yandex.practicum.repository; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import ru.yandex.practicum.model.EventSimilarity; + +import java.util.List; +import java.util.Optional; + +public interface EventSimilarityRepository extends JpaRepository { + + Optional findByEventAAndEventB(Long eventA, Long eventB); + + @Query("SELECT s FROM EventSimilarity s WHERE s.eventA = :eventId OR s.eventB = :eventId") + List findAllByEventId(@Param("eventId") Long eventId); + + @Query(""" + SELECT s FROM EventSimilarity s + WHERE (s.eventA IN :recentEvents AND s.eventB NOT IN :interactedEvents) + OR (s.eventB IN :recentEvents AND s.eventA NOT IN :interactedEvents) + ORDER BY s.score DESC + """) + List findNewSimilarEvents( + @Param("recentEvents") List recentEvents, + @Param("interactedEvents") List interactedEvents, + Pageable pageable); + + @Query(""" + SELECT s FROM EventSimilarity s + WHERE (s.eventA = :eventId OR s.eventB = :eventId) + AND NOT EXISTS ( + SELECT 1 FROM UserAction ua + WHERE ua.userId = :userId + AND ua.eventId = CASE + WHEN s.eventA = :eventId THEN s.eventB + ELSE s.eventA + END + ) + ORDER BY s.score DESC + """) + List findSimilarEventsForUser( + @Param("eventId") Long eventId, + @Param("userId") Long userId, + Pageable pageable); + + @Query(""" + SELECT s FROM EventSimilarity s + WHERE (s.eventA = :candidateId AND s.eventB IN :userEvents) + OR (s.eventB = :candidateId AND s.eventA IN :userEvents) + ORDER BY s.score DESC + """) + List findNeighboursAmongUserEvents( + @Param("candidateId") Long candidateId, + @Param("userEvents") List userEvents, + Pageable pageable); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/repository/UserActionRepository.java b/stats/analyzer/src/main/java/ru/yandex/practicum/repository/UserActionRepository.java new file mode 100644 index 0000000..8cf3ab4 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/repository/UserActionRepository.java @@ -0,0 +1,34 @@ +package ru.yandex.practicum.repository; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import ru.yandex.practicum.model.UserAction; + +import java.util.List; +import java.util.Optional; +import java.util.Set; + +public interface UserActionRepository extends JpaRepository { + + Optional findByUserIdAndEventId(Long userId, Long eventId); + + Set findEventIdsByUserId(Long userId); + + List findByEventIdIn(Set eventIds); + + @Query("SELECT a.eventId FROM UserAction a WHERE a.userId = :userId ORDER BY a.timestamp DESC") + List findRecentEventIdsByUserId(@Param("userId") Long userId, Pageable pageable); + + @Query("SELECT a FROM UserAction a WHERE a.userId = :userId") + List findAllByUserId(@Param("userId") Long userId); + + @Query(""" + SELECT a.eventId, SUM(a.userScore) + FROM UserAction a + WHERE a.eventId IN :eventIds + GROUP BY a.eventId + """) + List sumScoresByEventIds(@Param("eventIds") List eventIds); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/runner/AnalyzerRunner.java b/stats/analyzer/src/main/java/ru/yandex/practicum/runner/AnalyzerRunner.java new file mode 100644 index 0000000..a20dc6e --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/runner/AnalyzerRunner.java @@ -0,0 +1,23 @@ +package ru.yandex.practicum.runner; + +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.processor.SimilarityProcessor; +import ru.yandex.practicum.processor.UserActionProcessor; + +@Component +@RequiredArgsConstructor +public class AnalyzerRunner implements CommandLineRunner { + private final UserActionProcessor userActionProcessor; + private final SimilarityProcessor similarityProcessor; + + @Override + public void run(String... args) throws Exception { + Thread userActionThread = new Thread(userActionProcessor); + userActionThread.setName("UserActionHandlerThread"); + userActionThread.start(); + + similarityProcessor.start(); + } +} \ No newline at end of file diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityService.java b/stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityService.java new file mode 100644 index 0000000..5990267 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityService.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.service; + +import ru.yandex.practicum.model.EventSimilarity; + +public interface EventSimilarityService { + void save(EventSimilarity eventSimilarity); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityServiceImpl.java b/stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityServiceImpl.java new file mode 100644 index 0000000..dfd6859 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/service/EventSimilarityServiceImpl.java @@ -0,0 +1,48 @@ +package ru.yandex.practicum.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.yandex.practicum.model.EventSimilarity; +import ru.yandex.practicum.repository.EventSimilarityRepository; + +import java.util.Optional; + +@Slf4j +@Service +@RequiredArgsConstructor +public class EventSimilarityServiceImpl implements EventSimilarityService { + private final EventSimilarityRepository eventSimilarityRepository; + + @Override + @Transactional + public void save(EventSimilarity eventSimilarity) { + Optional maybeSimilarity = eventSimilarityRepository + .findByEventAAndEventB( + eventSimilarity.getEventA(), + eventSimilarity.getEventB() + ); + + if (maybeSimilarity.isPresent()) { + EventSimilarity oldSimilarity = maybeSimilarity.get(); + + if (!oldSimilarity.getScore().equals(eventSimilarity.getScore())) { + oldSimilarity.setScore(eventSimilarity.getScore()); + eventSimilarityRepository.save(oldSimilarity); + + log.debug("Обновлено сходство: {} и {}, score={}", + oldSimilarity.getEventA(), + oldSimilarity.getEventB(), + oldSimilarity.getScore()); + } + } else { + eventSimilarityRepository.save(eventSimilarity); + + log.debug("Добавлено новое сходство: {} и {}, score={}", + eventSimilarity.getEventA(), + eventSimilarity.getEventB(), + eventSimilarity.getScore()); + } + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationService.java b/stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationService.java new file mode 100644 index 0000000..82067af --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationService.java @@ -0,0 +1,17 @@ +package ru.yandex.practicum.service; + +import ru.practicum.ewm.stats.proto.InteractionsCountRequestProto; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.SimilarEventsRequestProto; +import ru.practicum.ewm.stats.proto.UserPredictionsRequestProto; + +import java.util.stream.Stream; + +public interface RecommendationService { + + Stream getRecommendationsForUser(UserPredictionsRequestProto request); + + Stream getSimilarEvents(SimilarEventsRequestProto request); + + Stream getInteractionsCount(InteractionsCountRequestProto request); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationServiceImpl.java b/stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationServiceImpl.java new file mode 100644 index 0000000..90a0c17 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/service/RecommendationServiceImpl.java @@ -0,0 +1,165 @@ +package ru.yandex.practicum.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.proto.InteractionsCountRequestProto; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.SimilarEventsRequestProto; +import ru.practicum.ewm.stats.proto.UserPredictionsRequestProto; +import ru.yandex.practicum.mapper.RecommendationsMapper; +import ru.yandex.practicum.model.EventSimilarity; +import ru.yandex.practicum.model.UserAction; +import ru.yandex.practicum.repository.EventSimilarityRepository; +import ru.yandex.practicum.repository.UserActionRepository; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Slf4j +@Service +@RequiredArgsConstructor +public class RecommendationServiceImpl implements RecommendationService { + private final UserActionRepository userActionRepository; + private final EventSimilarityRepository eventSimilarityRepository; + private final RecommendationsMapper recommendationsMapper; + + @Override + public Stream getRecommendationsForUser(UserPredictionsRequestProto request) { + Long userId = request.getUserId(); + int maxResults = request.getMaxResults(); + + Pageable recentPage = PageRequest.of(0, maxResults, + Sort.by(Sort.Direction.DESC, "timestamp")); + List recentUserEvents = userActionRepository.findRecentEventIdsByUserId(userId, recentPage); + + if (recentUserEvents.isEmpty()) { + log.info("У пользователя userId={} нет взаимодействий, рекомендации не найдены", userId); + return Stream.empty(); + } + + Set allUserEvents = userActionRepository.findEventIdsByUserId(userId); + + Pageable similarPage = PageRequest.of(0, maxResults, Sort.by(Sort.Direction.DESC, "score")); + List candidates = eventSimilarityRepository.findNewSimilarEvents( + recentUserEvents, + new ArrayList<>(allUserEvents), + similarPage + ); + + if (candidates.isEmpty()) { + log.info("Не найдено похожих мероприятий для пользователя userId={}", userId); + return Stream.empty(); + } + + Map userScores = userActionRepository.findAllByUserId(userId) + .stream() + .collect(Collectors.toMap( + UserAction::getEventId, + UserAction::getUserScore, + (existing, replacement) -> existing + )); + + Map predictedScores = predictScores(candidates, recentUserEvents, userScores, maxResults); + + List> sorted = predictedScores.entrySet().stream() + .filter(entry -> entry.getValue() > 0) + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(maxResults) + .collect(Collectors.toList()); + + Map result = new LinkedHashMap<>(); + sorted.forEach(entry -> result.put(entry.getKey(), entry.getValue())); + + log.info("Сформировано {} рекомендаций для пользователя userId={}", result.size(), userId); + return recommendationsMapper.mapToProto(result); + } + + @Override + public Stream getSimilarEvents(SimilarEventsRequestProto request) { + Long eventId = request.getEventId(); + Long userId = request.getUserId(); + int maxResults = request.getMaxResults(); + + Pageable pageable = PageRequest.of(0, maxResults, Sort.by(Sort.Direction.DESC, "score")); + List similarities = eventSimilarityRepository.findSimilarEventsForUser( + eventId, userId, pageable + ); + + log.info("Найдено {} похожих мероприятий для eventId={}, userId={}", + similarities.size(), eventId, userId); + + return recommendationsMapper.mapToProto(similarities, eventId); + } + + @Override + public Stream getInteractionsCount(InteractionsCountRequestProto request) { + List eventIds = request.getEventIdList(); + Map sumOfScoresByEvent = new HashMap<>(); + List userActions = userActionRepository.findByEventIdIn(new HashSet<>(eventIds)); + + for (UserAction userAction : userActions) { + long eventId = userAction.getEventId(); + double sum = sumOfScoresByEvent.getOrDefault(eventId, 0.0); + double score = userAction.getUserScore(); + sum += score; + sumOfScoresByEvent.put(eventId, sum); + } + + log.info("Рассчитаны суммы взаимодействий для {} мероприятий", sumOfScoresByEvent.size()); + + return recommendationsMapper.mapToProto(sumOfScoresByEvent); + } + + private Map predictScores(List candidates, + List recentUserEvents, + Map userScores, + int maxResults) { + Map predictedScores = new HashMap<>(); + + Pageable neighboursPage = PageRequest.of( + 0, maxResults, Sort.by(Sort.Direction.DESC, "score")); + + for (EventSimilarity candidate : candidates) { + long candidateId = recentUserEvents.contains(candidate.getEventA()) + ? candidate.getEventB() + : candidate.getEventA(); + + List neighbours = eventSimilarityRepository.findNeighboursAmongUserEvents( + candidateId, recentUserEvents, neighboursPage + ); + + if (neighbours.isEmpty()) { + log.debug("Нет соседей среди просмотренных для кандидата {}", candidateId); + continue; + } + + double weightedSum = 0.0; + double similaritySum = 0.0; + + for (EventSimilarity neighbour : neighbours) { + long neighbourId = neighbour.getEventA().equals(candidateId) + ? neighbour.getEventB() + : neighbour.getEventA(); + + Double score = userScores.get(neighbourId); + if (score != null && score > 0) { + weightedSum += score * neighbour.getScore(); + similaritySum += neighbour.getScore(); + } + } + + if (similaritySum > 0) { + double predictedScore = weightedSum / similaritySum; + predictedScores.put(candidateId, predictedScore); + log.debug("Предсказана оценка {} для мероприятия {}", predictedScore, candidateId); + } + } + + return predictedScores; + } +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionService.java b/stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionService.java new file mode 100644 index 0000000..073d5b3 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionService.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.service; + +import ru.yandex.practicum.model.UserAction; + +public interface UserActionService { + void save(UserAction userAction); +} diff --git a/stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionServiceImpl.java b/stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionServiceImpl.java new file mode 100644 index 0000000..e9e8659 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/yandex/practicum/service/UserActionServiceImpl.java @@ -0,0 +1,38 @@ +package ru.yandex.practicum.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.yandex.practicum.model.UserAction; +import ru.yandex.practicum.repository.UserActionRepository; + +import java.util.Optional; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserActionServiceImpl implements UserActionService { + private final UserActionRepository userActionRepository; + + @Override + public void save(UserAction userAction) { + Optional maybeUserAction = userActionRepository.findByUserIdAndEventId( + userAction.getUserId(), userAction.getEventId()); + + if (maybeUserAction.isPresent()) { + UserAction oldUserAction = maybeUserAction.get(); + if (userAction.getUserScore() > oldUserAction.getUserScore()) { + oldUserAction.setUserScore(userAction.getUserScore()); + userActionRepository.save(oldUserAction); + + log.debug("Обновлен вес пользователя: userId={}, eventId={}, score={}", + oldUserAction.getUserId(), oldUserAction.getEventId(), oldUserAction.getUserScore()); + } + } else { + userActionRepository.save(userAction); + + log.debug("Добавлено новое действие: userId={}, eventId={}, score={}", + userAction.getUserId(), userAction.getEventId(), userAction.getUserScore()); + } + } +} diff --git a/stats/analyzer/src/main/resources/application.yaml b/stats/analyzer/src/main/resources/application.yaml new file mode 100644 index 0000000..19095f9 --- /dev/null +++ b/stats/analyzer/src/main/resources/application.yaml @@ -0,0 +1,23 @@ +spring: + application: + name: analyzer + + config: + import: "configserver:" + + cloud: + config: + fail-fast: true + retry: + useRandomPolicy: true + max-interval: 6000 + discovery: + enabled: true + serviceId: config-server + +eureka: + instance: + instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}} + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/stats/analyzer/src/main/resources/schema.sql b/stats/analyzer/src/main/resources/schema.sql new file mode 100644 index 0000000..935e1df --- /dev/null +++ b/stats/analyzer/src/main/resources/schema.sql @@ -0,0 +1,27 @@ +-- Создание схемы +CREATE SCHEMA IF NOT EXISTS stats_analyzer; + +DROP TABLE IF EXISTS stats_analyzer.event_similarities CASCADE; +DROP TABLE IF EXISTS stats_analyzer.user_actions CASCADE; + +-- Создание таблицы действий пользователей +CREATE TABLE IF NOT EXISTS stats_analyzer.user_actions ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + user_id BIGINT NOT NULL, + event_id BIGINT NOT NULL, + user_score DOUBLE PRECISION NOT NULL, + timestamp_action TIMESTAMP NOT NULL +); + +-- Создание таблицы сходства событий +CREATE TABLE stats_analyzer.event_similarities ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + event_a BIGINT NOT NULL, + event_b BIGINT NOT NULL, + score DOUBLE PRECISION NOT NULL +); + +-- Индекс для быстрого поиска по паре событий +CREATE UNIQUE INDEX idx_event_similarities_pair ON stats_analyzer.event_similarities(event_a, event_b); +-- Индекс для быстрого поиска похожих мероприятий +CREATE INDEX IF NOT EXISTS idx_event_similarities_score ON stats_analyzer.event_similarities(score DESC); \ No newline at end of file diff --git a/stats/collector/pom.xml b/stats/collector/pom.xml new file mode 100644 index 0000000..a8f5b1a --- /dev/null +++ b/stats/collector/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + + ru.yandex.practicum + stats + 0.0.1-SNAPSHOT + + + collector + + + 21 + 21 + UTF-8 + + + + + ru.yandex.practicum + avro-schemas + 0.0.1-SNAPSHOT + + + + ru.yandex.practicum + proto-schemas + 0.0.1-SNAPSHOT + + + + ru.yandex.practicum + common + 0.0.1-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-actuator + + + + net.devh + grpc-spring-boot-starter + + + + net.devh + grpc-server-spring-boot-starter + + + + org.projectlombok + lombok + provided + + + + org.projectlombok + lombok-mapstruct-binding + + + + org.mapstruct + mapstruct + + + + org.mapstruct + mapstruct-processor + + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + + org.apache.kafka + kafka-clients + + + + org.springframework.cloud + spring-cloud-starter-config + + + + org.springframework.retry + spring-retry + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/stats/collector/src/main/java/ru/yandex/practicum/CollectorApp.java b/stats/collector/src/main/java/ru/yandex/practicum/CollectorApp.java new file mode 100644 index 0000000..4e6424e --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/CollectorApp.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@SpringBootApplication +@EnableDiscoveryClient +public class CollectorApp { + public static void main(String[] args) { + SpringApplication.run(CollectorApp.class, args); + } +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaClient.java b/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaClient.java new file mode 100644 index 0000000..1b7ee52 --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaClient.java @@ -0,0 +1,18 @@ +package ru.yandex.practicum.config; + +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; + +import java.time.Duration; + +public interface KafkaClient { + + Consumer getConsumer(); + + Producer getProducer(); + + Duration getPollTimeout(); + + KafkaTopicsProperties getTopicsProperties(); +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaConfig.java b/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaConfig.java new file mode 100644 index 0000000..08fe8e2 --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaConfig.java @@ -0,0 +1,74 @@ +package ru.yandex.practicum.config; + +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.LongSerializer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.yandex.practicum.serializer.AvroSerializer; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaConfig { + + @Value("${kafka.bootstrap.servers}") + private String bootstrapServers; + + @Value("${kafka.producer.client-id:collector-producer}") + private String clientId; + + @Value("${kafka.consumer.poll.timeout:1000}") + private long pollTimeout; + + @Autowired + private KafkaTopicsProperties topicsProperties; + + @Bean + @Scope("prototype") + public KafkaClient kafkaClient() { + return new KafkaClient() { + + private Producer producer; + + @Override + public Producer getProducer() { + if (producer == null) { + producer = createProducer(); + } + return producer; + } + + @Override + public Consumer getConsumer() { + throw new UnsupportedOperationException("Consumer не поддерживается в Collector"); + } + + @Override + public Duration getPollTimeout() { + return Duration.ofMillis(pollTimeout); + } + + @Override + public KafkaTopicsProperties getTopicsProperties() { + return topicsProperties; + } + + private Producer createProducer() { + Map config = new HashMap<>(); + config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class); + config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroSerializer.class); + return new KafkaProducer<>(config); + } + }; + } +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java b/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java new file mode 100644 index 0000000..10407e0 --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/config/KafkaTopicsProperties.java @@ -0,0 +1,12 @@ +package ru.yandex.practicum.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "spring.kafka.topics") +public class KafkaTopicsProperties { + private String userActions = "stats.user-actions.v1"; +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/controller/UserActionGrpcController.java b/stats/collector/src/main/java/ru/yandex/practicum/controller/UserActionGrpcController.java new file mode 100644 index 0000000..72b4878 --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/controller/UserActionGrpcController.java @@ -0,0 +1,47 @@ +package ru.yandex.practicum.controller; + +import com.google.protobuf.Empty; +import io.grpc.Status; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.server.service.GrpcService; +import ru.practicum.ewm.stats.proto.UserActionControllerGrpc; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.yandex.practicum.processor.UserActionProcessor; + +@Slf4j +@GrpcService +@RequiredArgsConstructor +public class UserActionGrpcController extends UserActionControllerGrpc.UserActionControllerImplBase { + + private final UserActionProcessor processor; + + @Override + public void collectUserAction(UserActionProto request, StreamObserver responseObserver) { + log.info("Получен запрос на обработку действия: userId={}, eventId={}, action={}", + request.getUserId(), request.getEventId(), request.getActionType()); + + try { + processor.process(request); + + responseObserver.onNext(Empty.getDefaultInstance()); + responseObserver.onCompleted(); + + log.info("Действие пользователя успешно обработано: userId={}", + request.getUserId()); + + } catch (IllegalArgumentException e) { + log.warn("Некорректный запрос: {}", e.getMessage()); + responseObserver.onError(Status.INVALID_ARGUMENT + .withDescription(e.getMessage()) + .asRuntimeException()); + + } catch (Exception e) { + log.error("Ошибка обработки действия пользователя: {}", e.getMessage(), e); + responseObserver.onError(Status.INTERNAL + .withDescription("Внутренняя ошибка сервера") + .asRuntimeException()); + } + } +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java b/stats/collector/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java new file mode 100644 index 0000000..edacf19 --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/mapper/UserActionMapper.java @@ -0,0 +1,41 @@ +package ru.yandex.practicum.mapper; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.ActionTypeAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.practicum.ewm.stats.proto.ActionTypeProto; +import ru.practicum.ewm.stats.proto.UserActionProto; + +import java.time.Instant; + +@Slf4j +@Component +public class UserActionMapper { + + public UserActionAvro mapToAvro(UserActionProto proto) { + Instant instant = Instant.ofEpochSecond( + proto.getTimestamp().getSeconds(), + proto.getTimestamp().getNanos() + ); + + ActionTypeAvro actionType = convertActionType(proto.getActionType()); + + return UserActionAvro.newBuilder() + .setUserId(proto.getUserId()) + .setEventId(proto.getEventId()) + .setActionType(actionType) + .setTimestamp(instant) + .build(); + } + + private ActionTypeAvro convertActionType(ActionTypeProto protoType) { + return switch (protoType) { + case VIEW -> ActionTypeAvro.VIEW; + case REGISTER -> ActionTypeAvro.REGISTER; + case LIKE -> ActionTypeAvro.LIKE; + case UNRECOGNIZED -> throw new IllegalArgumentException( + "Неизвестный тип действия: " + protoType); + }; + } +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java b/stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java new file mode 100644 index 0000000..8b4facd --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessor.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.processor; + +import ru.practicum.ewm.stats.proto.UserActionProto; + +public interface UserActionProcessor { + void process(UserActionProto userActionProto); +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessorImpl.java b/stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessorImpl.java new file mode 100644 index 0000000..9316a3a --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/processor/UserActionProcessorImpl.java @@ -0,0 +1,25 @@ +package ru.yandex.practicum.processor; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.yandex.practicum.mapper.UserActionMapper; +import ru.yandex.practicum.producer.UserActionProducer; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserActionProcessorImpl implements UserActionProcessor { + + private final UserActionProducer producer; + private final UserActionMapper mapper; + + @Override + public void process(UserActionProto userActionProto) { + UserActionAvro avro = mapper.mapToAvro(userActionProto); + producer.sendUserAction(avro); + log.debug("Действие пользователя обработано: userId={}", userActionProto.getUserId()); + } +} diff --git a/stats/collector/src/main/java/ru/yandex/practicum/producer/UserActionProducer.java b/stats/collector/src/main/java/ru/yandex/practicum/producer/UserActionProducer.java new file mode 100644 index 0000000..0773269 --- /dev/null +++ b/stats/collector/src/main/java/ru/yandex/practicum/producer/UserActionProducer.java @@ -0,0 +1,74 @@ +package ru.yandex.practicum.producer; + +import jakarta.annotation.PreDestroy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.config.KafkaClient; + +import java.time.Duration; + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserActionProducer { + private final KafkaClient kafkaClient; + private Producer producer; + + public void sendUserAction(UserActionAvro userAction) { + if (userAction == null) { + log.warn("Попытка отправить null UserAction"); + return; + } + + Producer kafkaProducer = getProducer(); + if (kafkaProducer == null) { + log.error("Producer недоступен"); + return; + } + + ProducerRecord record = new ProducerRecord<>( + kafkaClient.getTopicsProperties().getUserActions(), + null, + userAction.getTimestamp().toEpochMilli(), + userAction.getUserId(), + userAction + ); + + kafkaProducer.send(record, (metadata, exception) -> { + if (exception != null) { + log.error("Ошибка отправки действия userId={}: {}", + userAction.getUserId(), exception.getMessage(), exception); + } else { + log.debug("Действие отправлено: userId={}, topic={}, offset={}", + userAction.getUserId(), metadata.topic(), metadata.offset()); + } + }); + } + + @PreDestroy + public void close() { + if (producer != null) { + try { + producer.flush(); + producer.close(Duration.ofSeconds(30)); + log.info("Producer успешно закрыт"); + } catch (Exception e) { + log.error("Ошибка при закрытии producer", e); + } finally { + producer = null; + } + } + } + + private Producer getProducer() { + if (producer == null) { + producer = kafkaClient.getProducer(); + } + return producer; + } +} \ No newline at end of file diff --git a/stats/collector/src/main/resources/application.yaml b/stats/collector/src/main/resources/application.yaml new file mode 100644 index 0000000..6e4785c --- /dev/null +++ b/stats/collector/src/main/resources/application.yaml @@ -0,0 +1,26 @@ +spring: + application: + name: collector + + config: + import: "configserver:" + + cloud: + config: + fail-fast: true + retry: + useRandomPolicy: true + max-interval: 6000 + discovery: + enabled: true + serviceId: config-server + +server: + port: 0 + +eureka: + instance: + instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}} + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/stats/stats-dto/pom.xml b/stats/common/pom.xml similarity index 56% rename from stats/stats-dto/pom.xml rename to stats/common/pom.xml index 500a307..e008ed7 100644 --- a/stats/stats-dto/pom.xml +++ b/stats/common/pom.xml @@ -3,20 +3,27 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ru.yandex.practicum stats 0.0.1-SNAPSHOT - stats-dto + common + + + 21 + 21 + UTF-8 + - org.springframework.boot - spring-boot-starter-validation + ru.yandex.practicum + avro-schemas + 0.0.1-SNAPSHOT - + + \ No newline at end of file diff --git a/stats/common/src/main/java/ru/yandex/practicum/deserializer/BaseAvroDeserializer.java b/stats/common/src/main/java/ru/yandex/practicum/deserializer/BaseAvroDeserializer.java new file mode 100644 index 0000000..83c6984 --- /dev/null +++ b/stats/common/src/main/java/ru/yandex/practicum/deserializer/BaseAvroDeserializer.java @@ -0,0 +1,47 @@ +package ru.yandex.practicum.deserializer; + +import org.apache.avro.Schema; +import org.apache.avro.io.BinaryDecoder; +import org.apache.avro.io.DatumReader; +import org.apache.avro.io.DecoderFactory; +import org.apache.avro.specific.SpecificDatumReader; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.common.serialization.Deserializer; +import ru.yandex.practicum.exception.DeserializationException; + +import java.util.Map; + +public class BaseAvroDeserializer implements Deserializer { + + private final DecoderFactory decoderFactory; + private final DatumReader reader; + + public BaseAvroDeserializer(Schema schema) { + this(DecoderFactory.get(), schema); + } + + public BaseAvroDeserializer(DecoderFactory decoderFactory, Schema schema) { + this.decoderFactory = decoderFactory; + this.reader = new SpecificDatumReader<>(schema); + } + + @Override + public void configure(Map configs, boolean isKey) { + } + + @Override + public T deserialize(String topic, byte[] data) { + if (data == null) return null; + try { + BinaryDecoder decoder = decoderFactory.binaryDecoder(data, null); + return reader.read(null, decoder); + } catch (Exception e) { + throw new DeserializationException("Ошибка десереализации данных из топика [" + topic + "]", e); + } + } + + @Override + public void close() { + Deserializer.super.close(); + } +} diff --git a/stats/common/src/main/java/ru/yandex/practicum/deserializer/EventSimilarityDeserializer.java b/stats/common/src/main/java/ru/yandex/practicum/deserializer/EventSimilarityDeserializer.java new file mode 100644 index 0000000..ed619c4 --- /dev/null +++ b/stats/common/src/main/java/ru/yandex/practicum/deserializer/EventSimilarityDeserializer.java @@ -0,0 +1,9 @@ +package ru.yandex.practicum.deserializer; + +import ru.practicum.ewm.stats.avro.EventSimilarityAvro; + +public class EventSimilarityDeserializer extends BaseAvroDeserializer { + public EventSimilarityDeserializer() { + super(EventSimilarityAvro.getClassSchema()); + } +} diff --git a/stats/common/src/main/java/ru/yandex/practicum/deserializer/UserActionDeserializer.java b/stats/common/src/main/java/ru/yandex/practicum/deserializer/UserActionDeserializer.java new file mode 100644 index 0000000..98e5f0b --- /dev/null +++ b/stats/common/src/main/java/ru/yandex/practicum/deserializer/UserActionDeserializer.java @@ -0,0 +1,9 @@ +package ru.yandex.practicum.deserializer; + +import ru.practicum.ewm.stats.avro.UserActionAvro; + +public class UserActionDeserializer extends BaseAvroDeserializer { + public UserActionDeserializer() { + super(UserActionAvro.getClassSchema()); + } +} diff --git a/stats/common/src/main/java/ru/yandex/practicum/exception/DeserializationException.java b/stats/common/src/main/java/ru/yandex/practicum/exception/DeserializationException.java new file mode 100644 index 0000000..3a65a5b --- /dev/null +++ b/stats/common/src/main/java/ru/yandex/practicum/exception/DeserializationException.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.exception; + +public class DeserializationException extends RuntimeException { + public DeserializationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/stats/common/src/main/java/ru/yandex/practicum/serializer/AvroSerializer.java b/stats/common/src/main/java/ru/yandex/practicum/serializer/AvroSerializer.java new file mode 100644 index 0000000..1987704 --- /dev/null +++ b/stats/common/src/main/java/ru/yandex/practicum/serializer/AvroSerializer.java @@ -0,0 +1,31 @@ +package ru.yandex.practicum.serializer; + +import org.apache.avro.io.BinaryEncoder; +import org.apache.avro.io.DatumWriter; +import org.apache.avro.io.EncoderFactory; +import org.apache.avro.specific.SpecificDatumWriter; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.common.errors.SerializationException; +import org.apache.kafka.common.serialization.Serializer; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class AvroSerializer implements Serializer { + private final EncoderFactory encoderFactory = EncoderFactory.get(); + private BinaryEncoder encoder; + + public byte[] serialize(String topic, SpecificRecordBase data) { + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + if (data != null) { + DatumWriter writer = new SpecificDatumWriter<>(data.getSchema()); + encoder = encoderFactory.binaryEncoder(out, encoder); + writer.write(data, encoder); + encoder.flush(); + } + return out.toByteArray(); + } catch (IOException ex) { + throw new SerializationException("Ошибка сериализации данных для топика [" + topic + "]", ex); + } + } +} diff --git a/stats/pom.xml b/stats/pom.xml index c6c54a8..899f035 100644 --- a/stats/pom.xml +++ b/stats/pom.xml @@ -15,17 +15,15 @@ pom + serialization + common stats-client - stats-dto - stats-server + collector + aggregator + analyzer - - org.springframework.boot - spring-boot-starter-web - - org.projectlombok lombok diff --git a/stats/serialization/avro-schemas/pom.xml b/stats/serialization/avro-schemas/pom.xml new file mode 100644 index 0000000..555a3dd --- /dev/null +++ b/stats/serialization/avro-schemas/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + ru.yandex.practicum + serialization + 0.0.1-SNAPSHOT + + + avro-schemas + + + 21 + 21 + UTF-8 + + + + + org.apache.avro + avro + + + + org.apache.kafka + kafka-clients + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.avro + avro-maven-plugin + + + schemas + generate-sources + + idl-protocol + + + ${project.basedir}/src/main/avro/ + ${project.build.directory}/generated-sources + String + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.5.0 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources + + + + + + + + \ No newline at end of file diff --git a/stats/serialization/avro-schemas/src/main/avro/stats/EventSimilarity.avdl b/stats/serialization/avro-schemas/src/main/avro/stats/EventSimilarity.avdl new file mode 100644 index 0000000..7df6860 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/avro/stats/EventSimilarity.avdl @@ -0,0 +1,9 @@ +@namespace("ru.practicum.ewm.stats.avro") +protocol EventSimilarityProtocol { + record EventSimilarityAvro{ + long eventA; + long eventB; + double score; + timestamp_ms timestamp; + } +} diff --git a/stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl b/stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl new file mode 100644 index 0000000..70b3798 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl @@ -0,0 +1,15 @@ +@namespace("ru.practicum.ewm.stats.avro") +protocol UserActionProtocol { + record UserActionAvro { + long userId; + long eventId; + ActionTypeAvro actionType; + timestamp_ms timestamp; + } + + enum ActionTypeAvro { + VIEW, + REGISTER, + LIKE + } +} diff --git a/stats/serialization/pom.xml b/stats/serialization/pom.xml new file mode 100644 index 0000000..64bf7df --- /dev/null +++ b/stats/serialization/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + ru.yandex.practicum + stats + 0.0.1-SNAPSHOT + ../pom.xml + + + serialization + pom + + + 21 + 21 + UTF-8 + + + + avro-schemas + proto-schemas + + + \ No newline at end of file diff --git a/stats/serialization/proto-schemas/pom.xml b/stats/serialization/proto-schemas/pom.xml new file mode 100644 index 0000000..00c3887 --- /dev/null +++ b/stats/serialization/proto-schemas/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + ru.yandex.practicum + serialization + 0.0.1-SNAPSHOT + + + + proto-schemas + + + 21 + 21 + UTF-8 + + + + + io.grpc + grpc-stub + + + + io.grpc + grpc-protobuf + + + + jakarta.annotation + jakarta.annotation-api + 1.3.5 + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + com.google.protobuf:protoc:${protobuf.version}:exe:windows-x86_64 + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:windows-x86_64 + + ${project.basedir}/src/main/protobuf + + ${project.build.directory}/generated-sources/protobuf + false + + + + + compile + compile-custom + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.5.0 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/protobuf + + + + + + + + \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/interactions_count_request.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/interactions_count_request.proto new file mode 100644 index 0000000..3db323d --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/interactions_count_request.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package stats.messages.action; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +message InteractionsCountRequestProto { + repeated int64 eventId = 1; +} \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/recommended_event.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/recommended_event.proto new file mode 100644 index 0000000..61e2bba --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/recommended_event.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +package stats.messages.action; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +message RecommendedEventProto { + int64 eventId = 1; + double score = 2; +} \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/similar_events_request.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/similar_events_request.proto new file mode 100644 index 0000000..29135c7 --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/similar_events_request.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package stats.messages.action; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +message SimilarEventsRequestProto { + int64 eventId = 1; + int64 user_id = 2; + int32 max_results = 3; +} \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_action.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_action.proto new file mode 100644 index 0000000..134f33b --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_action.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +package stats.messages.action; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +import "google/protobuf/timestamp.proto"; + +message UserActionProto { + int64 user_id = 1; + int64 event_id = 2; + ActionTypeProto action_type = 3; + google.protobuf.Timestamp timestamp = 4; +} + +enum ActionTypeProto { + VIEW = 0; + REGISTER = 1; + LIKE = 2; +} \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_predictions_request.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_predictions_request.proto new file mode 100644 index 0000000..9b89dd1 --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/user_predictions_request.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +package stats.messages.action; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +message UserPredictionsRequestProto { + int64 user_id = 1; + int32 max_results = 2; +} \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/services/recommendations_controller.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/services/recommendations_controller.proto new file mode 100644 index 0000000..b320c54 --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/services/recommendations_controller.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package stats.service.dashboard; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +import "stats/messages/interactions_count_request.proto"; +import "stats/messages/recommended_event.proto"; +import "stats/messages/similar_events_request.proto"; +import "stats/messages/user_predictions_request.proto"; + +service RecommendationsController { + rpc GetRecommendationsForUser (messages.action.UserPredictionsRequestProto) + returns (stream messages.action.RecommendedEventProto); + + rpc GetSimilarEvents (messages.action.SimilarEventsRequestProto) + returns (stream messages.action.RecommendedEventProto); + + rpc GetInteractionsCount (messages.action.InteractionsCountRequestProto) + returns (stream messages.action.RecommendedEventProto); +} \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/services/user_action_controller.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/services/user_action_controller.proto new file mode 100644 index 0000000..a546c9c --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/services/user_action_controller.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package stats.service.collector; + +option java_multiple_files = true; +option java_package = "ru.practicum.ewm.stats.proto"; + +import "stats/messages/user_action.proto"; +import "google/protobuf/empty.proto"; + +service UserActionController { + rpc CollectUserAction (messages.action.UserActionProto) + returns (google.protobuf.Empty); +} \ No newline at end of file diff --git a/stats/stats-client/pom.xml b/stats/stats-client/pom.xml index f00d66c..6d103be 100644 --- a/stats/stats-client/pom.xml +++ b/stats/stats-client/pom.xml @@ -19,36 +19,42 @@ + + ru.yandex.practicum + proto-schemas + 0.0.1-SNAPSHOT + compile + + org.springframework.boot - spring-boot-starter-web + spring-boot-starter org.projectlombok lombok - true + provided - ru.yandex.practicum - stats-dto - 0.0.1-SNAPSHOT + net.devh + grpc-spring-boot-starter org.springframework.cloud - spring-cloud-starter-netflix-eureka-client + spring-cloud-starter-config org.springframework.cloud - spring-cloud-starter-config + spring-cloud-commons org.springframework.cloud - spring-cloud-commons + spring-cloud-starter-openfeign diff --git a/stats/stats-client/src/main/java/ru/yandex/practicum/StatsClientApp.java b/stats/stats-client/src/main/java/ru/yandex/practicum/StatsClientApp.java deleted file mode 100644 index 8c3fb01..0000000 --- a/stats/stats-client/src/main/java/ru/yandex/practicum/StatsClientApp.java +++ /dev/null @@ -1,77 +0,0 @@ -package ru.yandex.practicum; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestClient; -import org.springframework.web.util.UriBuilder; -import ru.yandex.practicum.exception.StatsClientException; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; - -import static ru.yandex.practicum.constants.DateTimeConstants.DATE_TIME_PATTERN; - -@Slf4j -@Component -public class StatsClientApp { - private final RestClient restClient; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN); - - public StatsClientApp(@Value("${stats-server.url:http://localhost:9090}") String serverUrl) { - this.restClient = RestClient.builder() - .baseUrl(serverUrl) - .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .build(); - } - - public void saveHit(CreateEndpointHitDto createEndpointHitDto) { - try { - restClient.post() - .uri("/hit") - .body(createEndpointHitDto) - .retrieve() - .toBodilessEntity(); - - log.debug("Запись обращения к эндпоинту успешно сохранена: приложение {}, URI {}", - createEndpointHitDto.app(), createEndpointHitDto.uri()); - } catch (Exception exception) { - log.error("Ошибка при сохранении статистики: {}", exception.getMessage()); - throw new StatsClientException("Endpoint statistics could not be saved", exception); - } - } - - public List getStats(LocalDateTime start, LocalDateTime end, - List uris, boolean unique) { - try { - List result = restClient.get() - .uri(uriBuilder -> { - UriBuilder builder = uriBuilder.path("/stats") - .queryParam("start", start.format(formatter)) - .queryParam("end", end.format(formatter)); - - if (uris != null && !uris.isEmpty()) { - uris.forEach(uri -> builder.queryParam("uris", uri)); - } - - builder.queryParam("unique", unique); - - return builder.build(); - }) - .retrieve() - .body(new ParameterizedTypeReference<>() { - }); - - log.debug("Получено записей статистики: {}", result != null ? result.size() : 0); - - return result; - } catch (Exception exception) { - log.error("Ошибка при получении статистики: {}", exception.getMessage()); - throw new StatsClientException("Statistics could not be retrieved", exception); - } - } -} diff --git a/stats/stats-client/src/main/java/ru/yandex/practicum/client/AnalyzerClient.java b/stats/stats-client/src/main/java/ru/yandex/practicum/client/AnalyzerClient.java new file mode 100644 index 0000000..af5a893 --- /dev/null +++ b/stats/stats-client/src/main/java/ru/yandex/practicum/client/AnalyzerClient.java @@ -0,0 +1,58 @@ +package ru.yandex.practicum.client; + +import io.grpc.StatusRuntimeException; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.client.inject.GrpcClient; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.proto.*; + +import java.util.Iterator; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +@Slf4j +@Service +public class AnalyzerClient { + + @GrpcClient("analyzer") + private RecommendationsControllerGrpc.RecommendationsControllerBlockingStub analyzerStub; + + public Stream getRecommendationsForUser(UserPredictionsRequestProto request) { + try { + Iterator iterator = analyzerStub.getRecommendationsForUser(request); + return asStream(iterator); + } catch (StatusRuntimeException e) { + log.error("Ошибка получения рекомендаций: {}", e.getMessage()); + return Stream.empty(); + } + } + + public Stream getSimilarEvents(SimilarEventsRequestProto request) { + try { + Iterator iterator = analyzerStub.getSimilarEvents(request); + return asStream(iterator); + } catch (StatusRuntimeException e) { + log.error("Ошибка получения похожих событий: {}", e.getMessage()); + return Stream.empty(); + } + } + + public Stream getInteractionsCount(InteractionsCountRequestProto request) { + try { + Iterator iterator = analyzerStub.getInteractionsCount(request); + return asStream(iterator); + } catch (StatusRuntimeException e) { + log.error("Ошибка получения количества взаимодействий: {}", e.getMessage()); + return Stream.empty(); + } + } + + private Stream asStream(Iterator iterator) { + return StreamSupport.stream( + Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), + false + ); + } +} diff --git a/stats/stats-client/src/main/java/ru/yandex/practicum/client/CollectorClient.java b/stats/stats-client/src/main/java/ru/yandex/practicum/client/CollectorClient.java new file mode 100644 index 0000000..cec9d14 --- /dev/null +++ b/stats/stats-client/src/main/java/ru/yandex/practicum/client/CollectorClient.java @@ -0,0 +1,27 @@ +package ru.yandex.practicum.client; + +import io.grpc.StatusRuntimeException; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.client.inject.GrpcClient; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.proto.UserActionControllerGrpc; +import ru.practicum.ewm.stats.proto.UserActionProto; + +@Slf4j +@Service +public class CollectorClient { + + @GrpcClient("collector") + private UserActionControllerGrpc.UserActionControllerBlockingStub collectorStub; + + public void sendUserAction(UserActionProto action) { + try { + collectorStub.collectUserAction(action); + log.debug("Действие отправлено: userId={}, eventId={}", + action.getUserId(), action.getEventId()); + } catch (StatusRuntimeException e) { + log.error("Ошибка отправки действия: {}", e.getMessage()); + throw e; + } + } +} diff --git a/stats/stats-client/src/main/java/ru/yandex/practicum/exception/StatsClientException.java b/stats/stats-client/src/main/java/ru/yandex/practicum/exception/StatsClientException.java deleted file mode 100644 index ee42c9a..0000000 --- a/stats/stats-client/src/main/java/ru/yandex/practicum/exception/StatsClientException.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.yandex.practicum.exception; - -public class StatsClientException extends RuntimeException { - public StatsClientException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/stats/stats-dto/src/main/java/ru/yandex/practicum/CreateEndpointHitDto.java b/stats/stats-dto/src/main/java/ru/yandex/practicum/CreateEndpointHitDto.java deleted file mode 100644 index d262ea8..0000000 --- a/stats/stats-dto/src/main/java/ru/yandex/practicum/CreateEndpointHitDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.yandex.practicum; - -import com.fasterxml.jackson.annotation.JsonFormat; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDateTime; - -import static ru.yandex.practicum.constants.DateTimeConstants.DATE_TIME_PATTERN; - -public record CreateEndpointHitDto( - - @NotBlank(message = "Название приложения не может быть пустым") - String app, - - @NotBlank(message = "URI не может быть пустым") - String uri, - - @NotBlank(message = "IP адрес не может быть пустым") - String ip, - - @NotNull(message = "Временная метка не может быть null") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_TIME_PATTERN) - LocalDateTime timestamp -) { -} diff --git a/stats/stats-dto/src/main/java/ru/yandex/practicum/StatsRequest.java b/stats/stats-dto/src/main/java/ru/yandex/practicum/StatsRequest.java deleted file mode 100644 index 7e31d6b..0000000 --- a/stats/stats-dto/src/main/java/ru/yandex/practicum/StatsRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.yandex.practicum; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; - -import static ru.yandex.practicum.constants.DateTimeConstants.DATE_TIME_PATTERN; - -public record StatsRequest( - - LocalDateTime start, - - LocalDateTime end, - - List uris, - - boolean unique -) { - public static StatsRequest of(String start, String end, List uris, boolean unique) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN); - return new StatsRequest( - LocalDateTime.parse(start, formatter), - LocalDateTime.parse(end, formatter), - uris, - unique - ); - } -} diff --git a/stats/stats-dto/src/main/java/ru/yandex/practicum/ViewStatsDto.java b/stats/stats-dto/src/main/java/ru/yandex/practicum/ViewStatsDto.java deleted file mode 100644 index 660b8fd..0000000 --- a/stats/stats-dto/src/main/java/ru/yandex/practicum/ViewStatsDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package ru.yandex.practicum; - -public record ViewStatsDto( - - String app, - - String uri, - - Long hits -) { -} diff --git a/stats/stats-dto/src/main/java/ru/yandex/practicum/constants/DateTimeConstants.java b/stats/stats-dto/src/main/java/ru/yandex/practicum/constants/DateTimeConstants.java deleted file mode 100644 index 10d19ff..0000000 --- a/stats/stats-dto/src/main/java/ru/yandex/practicum/constants/DateTimeConstants.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.yandex.practicum.constants; - -public final class DateTimeConstants { - - private DateTimeConstants() { - } - - public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; -} diff --git a/stats/stats-server/Dockerfile b/stats/stats-server/Dockerfile deleted file mode 100644 index 0ff1817..0000000 --- a/stats/stats-server/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM eclipse-temurin:21-jre-jammy -VOLUME /tmp -ARG JAR_FILE=target/*.jar -COPY ${JAR_FILE} app.jar -ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/controller/StatsController.java b/stats/stats-server/src/main/java/ru/yandex/practicum/controller/StatsController.java deleted file mode 100644 index 0d7c10e..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/controller/StatsController.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.yandex.practicum.controller; - -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.CreateEndpointHitDto; -import ru.yandex.practicum.StatsRequest; -import ru.yandex.practicum.ViewStatsDto; -import ru.yandex.practicum.exception.BadRequestException; -import ru.yandex.practicum.service.StatsService; - -import java.util.List; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class StatsController { - private final StatsService statsService; - - @PostMapping("/hit") - @ResponseStatus(HttpStatus.CREATED) - public void createHit(@RequestBody @Valid CreateEndpointHitDto createEndpointHitDto) { - log.debug("Controller: createHit requestBody={}", createEndpointHitDto); - statsService.createHit(createEndpointHitDto); - } - - @GetMapping("/stats") - public List getStats(@RequestParam("start") String start, @RequestParam("end") String end, - @RequestParam(value = "uris", required = false) List uris, - @RequestParam(value = "unique", defaultValue = "false") boolean unique) { - StatsRequest request = StatsRequest.of(start, end, uris, unique); - - if (request.start().isAfter(request.end())) { - throw new BadRequestException("Дата начала должна быть раньше даты окончания"); - } - - log.debug("Controller: getStats request={}", request); - return statsService.getStats(request); - } -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/exception/BadRequestException.java b/stats/stats-server/src/main/java/ru/yandex/practicum/exception/BadRequestException.java deleted file mode 100644 index 4340bf4..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/exception/BadRequestException.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.yandex.practicum.exception; - -public class BadRequestException extends RuntimeException { - public BadRequestException(String message) { - super(message); - } -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorHandler.java b/stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorHandler.java deleted file mode 100644 index 294cc02..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.yandex.practicum.exception; - -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@RestControllerAdvice -public class ErrorHandler { - @ExceptionHandler(BadRequestException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorResponse handleBadRequestException(BadRequestException exception, HttpServletRequest request) { - return buildResponse(HttpStatus.BAD_REQUEST, exception, request); - } - - private ErrorResponse buildResponse( - HttpStatus httpStatus, Exception exception, HttpServletRequest request) { - return buildResponse(httpStatus, exception.getMessage(), exception, request); - } - - private ErrorResponse buildResponse( - HttpStatus httpStatus, String message, Exception exception, HttpServletRequest request) { - String path = request.getRequestURI(); - String httpMethod = request.getMethod(); - int statusCode = httpStatus.value(); - String error = httpStatus.getReasonPhrase(); - - return new ErrorResponse(path, httpMethod, statusCode, error, message); - } -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorResponse.java b/stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorResponse.java deleted file mode 100644 index c8ea4fa..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/exception/ErrorResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.yandex.practicum.exception; - -public record ErrorResponse( - - String path, - - String httpMethod, - - int statusCode, - - String error, - - String message -) { -} \ No newline at end of file diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/mapper/EndpointHitMapper.java b/stats/stats-server/src/main/java/ru/yandex/practicum/mapper/EndpointHitMapper.java deleted file mode 100644 index 7ffff00..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/mapper/EndpointHitMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.yandex.practicum.mapper; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import ru.yandex.practicum.CreateEndpointHitDto; -import ru.yandex.practicum.model.EndpointHit; - -@Mapper(componentModel = "spring") -public interface EndpointHitMapper { - - @Mapping(target = "id", ignore = true) - EndpointHit fromNewRequest(CreateEndpointHitDto request); -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/model/EndpointHit.java b/stats/stats-server/src/main/java/ru/yandex/practicum/model/EndpointHit.java deleted file mode 100644 index 47110dd..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/model/EndpointHit.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.yandex.practicum.model; - -import jakarta.persistence.*; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "endpoint_hits") -@Getter -@Setter -@EqualsAndHashCode(onlyExplicitlyIncluded = true) -public class EndpointHit { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @EqualsAndHashCode.Include - @Column(name = "hit_id") - private Long id; - - private String app; - - private String uri; - - private String ip; - - private LocalDateTime timestamp; -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/repository/StatsRepository.java b/stats/stats-server/src/main/java/ru/yandex/practicum/repository/StatsRepository.java deleted file mode 100644 index 586129d..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/repository/StatsRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -package ru.yandex.practicum.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import ru.yandex.practicum.ViewStatsDto; -import ru.yandex.practicum.model.EndpointHit; - -import java.time.LocalDateTime; -import java.util.List; - -public interface StatsRepository extends JpaRepository { - @Query(""" - SELECT new ru.yandex.practicum.ViewStatsDto(e.app, e.uri, COUNT(DISTINCT e.ip)) - FROM EndpointHit e - WHERE e.timestamp BETWEEN :start AND :end - AND (:uris IS NULL OR e.uri IN :uris) - GROUP BY e.app, e.uri - ORDER BY COUNT(DISTINCT e.ip) DESC - """) - List getUniqueStats(@Param("start") LocalDateTime start, - @Param("end") LocalDateTime end, - @Param("uris") List uris); - - @Query(""" - SELECT new ru.yandex.practicum.ViewStatsDto(e.app, e.uri, COUNT(e.ip)) - FROM EndpointHit e - WHERE e.timestamp BETWEEN :start AND :end - AND (:uris IS NULL OR e.uri IN :uris) - GROUP BY e.app, e.uri - ORDER BY COUNT(e.ip) DESC - """) - List getStats(@Param("start") LocalDateTime start, - @Param("end") LocalDateTime end, - @Param("uris") List uris); -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsService.java b/stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsService.java deleted file mode 100644 index 0d19776..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsService.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.yandex.practicum.service; - -import ru.yandex.practicum.CreateEndpointHitDto; -import ru.yandex.practicum.StatsRequest; -import ru.yandex.practicum.ViewStatsDto; - -import java.util.List; - -public interface StatsService { - void createHit(CreateEndpointHitDto createEndpointHitDto); - - List getStats(StatsRequest request); -} diff --git a/stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsServiceImpl.java b/stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsServiceImpl.java deleted file mode 100644 index 43c8418..0000000 --- a/stats/stats-server/src/main/java/ru/yandex/practicum/service/StatsServiceImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.yandex.practicum.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import ru.yandex.practicum.CreateEndpointHitDto; -import ru.yandex.practicum.StatsRequest; -import ru.yandex.practicum.ViewStatsDto; -import ru.yandex.practicum.mapper.EndpointHitMapper; -import ru.yandex.practicum.model.EndpointHit; -import ru.yandex.practicum.repository.StatsRepository; - -import java.util.List; - -@Slf4j -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class StatsServiceImpl implements StatsService { - private final StatsRepository statsRepository; - private final EndpointHitMapper hitMapper; - - @Override - @Transactional - public void createHit(CreateEndpointHitDto createEndpointHitDto) { - EndpointHit hit = hitMapper.fromNewRequest(createEndpointHitDto); - hit = statsRepository.save(hit); - log.info("Отправлен запрос на сохранение информации id={}", hit.getId()); - } - - @Override - public List getStats(StatsRequest request) { - List uris = (request.uris() == null || request.uris().isEmpty()) - ? null - : request.uris(); - - List result = request.unique() - ? statsRepository.getUniqueStats(request.start(), request.end(), uris) - : statsRepository.getStats(request.start(), request.end(), uris); - - log.info("Размер полученного списка статистики: {}", result.size()); - return result; - } -} diff --git a/stats/stats-server/src/main/resources/application.yaml b/stats/stats-server/src/main/resources/application.yaml deleted file mode 100644 index 50188d5..0000000 --- a/stats/stats-server/src/main/resources/application.yaml +++ /dev/null @@ -1,21 +0,0 @@ -spring: - application: - name: stats-server - config: - import: "configserver:" - cloud: - config: - discovery: - enabled: true - service-id: config-server - fail-fast: true - -server: - port: 0 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ - instance: - prefer-ip-address: true \ No newline at end of file diff --git a/stats/stats-server/src/main/resources/schema.sql b/stats/stats-server/src/main/resources/schema.sql deleted file mode 100644 index 6af3298..0000000 --- a/stats/stats-server/src/main/resources/schema.sql +++ /dev/null @@ -1,10 +0,0 @@ -DROP TABLE IF EXISTS endpoint_hits; - -create TABLE IF NOT EXISTS endpoint_hits ( - hit_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - app VARCHAR(255) NOT NULL, - uri VARCHAR(2000) NOT NULL, - ip VARCHAR(45) NOT NULL, - timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL -); -create index IF NOT EXISTS idx_endpoint_hits_app_uri_timestamp ON endpoint_hits(app, uri, timestamp); \ No newline at end of file From ffa96b00173a8ff67f1969d43b75be906bf99565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9A=D0=B0?= =?UTF-8?q?=D0=BD?= Date: Thu, 12 Feb 2026 21:33:56 +0300 Subject: [PATCH 2/4] fix: protobuf version conflict --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 344f774..f4a9010 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 3.6.1 2.6.0 3.1.0.RELEASE - 3.25.1 + 3.23.4 1.63.0 2023.0.3 1.18.30 From 2a3f561654a9cf558ded76fbfe2eb7adcee7d1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9A=D0=B0?= =?UTF-8?q?=D0=BD?= Date: Fri, 13 Feb 2026 15:04:18 +0300 Subject: [PATCH 3/4] fix: configure protobuf plugin for multi-platform build --- .../main/java/ru/yandex/practicum/model/Event.java | 1 + pom.xml | 2 +- stats/pom.xml | 8 -------- stats/serialization/proto-schemas/pom.xml | 13 ++++++++++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java b/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java index a2d428f..ec202c8 100644 --- a/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java +++ b/core/event-service/src/main/java/ru/yandex/practicum/model/Event.java @@ -55,6 +55,7 @@ public class Event { private Location location; @Column(nullable = false) + @Builder.Default private Boolean paid = false; @Column(name = "participant_limit", nullable = false) diff --git a/pom.xml b/pom.xml index f4a9010..a7afedf 100644 --- a/pom.xml +++ b/pom.xml @@ -343,4 +343,4 @@ - + \ No newline at end of file diff --git a/stats/pom.xml b/stats/pom.xml index 899f035..5575284 100644 --- a/stats/pom.xml +++ b/stats/pom.xml @@ -23,12 +23,4 @@ analyzer - - - org.projectlombok - lombok - - - - diff --git a/stats/serialization/proto-schemas/pom.xml b/stats/serialization/proto-schemas/pom.xml index 00c3887..e719658 100644 --- a/stats/serialization/proto-schemas/pom.xml +++ b/stats/serialization/proto-schemas/pom.xml @@ -38,6 +38,14 @@ + + + kr.motd.maven + os-maven-plugin + 1.7.1 + + + org.apache.maven.plugins @@ -49,12 +57,11 @@ protobuf-maven-plugin 0.6.1 - com.google.protobuf:protoc:${protobuf.version}:exe:windows-x86_64 + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} grpc-java - io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:windows-x86_64 + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} ${project.basedir}/src/main/protobuf - ${project.build.directory}/generated-sources/protobuf false From 905e3729ec82e971787cd99ad45d7bfcf19e8b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9A=D0=B0?= =?UTF-8?q?=D0=BD?= Date: Mon, 16 Feb 2026 11:53:44 +0300 Subject: [PATCH 4/4] fix: reorder fields and fix double comparison in SimilarityCalculator --- .../yandex/practicum/processor/SimilarityCalculator.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java b/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java index f4d8a62..ca1cf66 100644 --- a/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java +++ b/stats/aggregator/src/main/java/ru/yandex/practicum/processor/SimilarityCalculator.java @@ -16,17 +16,17 @@ @Component @RequiredArgsConstructor public class SimilarityCalculator { - private final SimilarityMapper similarityMapper; private static final double VIEW_WEIGHT = 0.4; private static final double REGISTER_WEIGHT = 0.8; private static final double LIKE_WEIGHT = 1.0; + private static final double EPSILON = 1e-10; private static final Map WEIGHTS = Map.of( ActionTypeAvro.VIEW, VIEW_WEIGHT, ActionTypeAvro.REGISTER, REGISTER_WEIGHT, ActionTypeAvro.LIKE, LIKE_WEIGHT ); - + private final SimilarityMapper similarityMapper; private final Map> weightMatrix = new ConcurrentHashMap<>(); private final Map weightSumByEvent = new ConcurrentHashMap<>(); private final Map> minWeightsSums = new ConcurrentHashMap<>(); @@ -39,7 +39,6 @@ public List calculateSimilarity(UserActionAvro action) { long eventId = action.getEventId(); long userId = action.getUserId(); - Instant actionTimestamp = action.getTimestamp(); double actionWeight = WEIGHTS.get(action.getActionType()); @@ -96,7 +95,9 @@ private double recalculatePair(long eventA, long eventB, long userId, double totalA = weightSumByEvent.getOrDefault(eventA, 0.0); double totalB = weightSumByEvent.getOrDefault(eventB, 0.0); - if (totalA == 0.0 || totalB == 0.0) return 0.0; + if (Math.abs(totalA) < EPSILON || Math.abs(totalB) < EPSILON) { + return 0.0; + } return minSum / (Math.sqrt(totalA) * Math.sqrt(totalB)); }