From a2c9ed15c2d143848db7890e1c6b522892a38a84 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Wed, 8 Feb 2023 20:02:13 +0200 Subject: [PATCH] RED-4609 - adjusted some metrics, added tests for metrics --- .../server/queue/IndexingMessageReceiver.java | 1 - .../v1/server/service/TextStorageService.java | 2 +- .../AbstractElasticsearchIntegrationTest.java | 4 +- .../service/MetricsIntegrationTest.java | 90 +++++++++++++++++++ .../service/utils/MetricValidationUtils.java | 29 ++++++ .../src/test/resources/application.yml | 10 +++ 6 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/MetricsIntegrationTest.java create mode 100644 search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/utils/MetricValidationUtils.java diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java index da4b033..01a9ffe 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/queue/IndexingMessageReceiver.java @@ -148,7 +148,6 @@ public class IndexingMessageReceiver { } - @Timed("redactmanager_indexFile") private void indexFile(Dossier dossier, FileModel file) { fileStatusProcessingUpdateClient.indexing(dossier.getId(), file.getId()); diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/TextStorageService.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/TextStorageService.java index 2474feb..edabd62 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/TextStorageService.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/TextStorageService.java @@ -19,7 +19,7 @@ public class TextStorageService { private final StorageService storageService; - @Timed("redactmanager_getText-search") + @Timed("redactmanager_getTextSearchService") public Text getText(String dossierId, String fileId) { try { diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java index 7212026..4f24c4a 100644 --- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java +++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java @@ -54,10 +54,10 @@ public abstract class AbstractElasticsearchIntegrationTest { } @Autowired - private IndexCreatorService indexCreationService; + protected IndexCreatorService indexCreationService; @Autowired - private StorageService storageService; + protected StorageService storageService; @Configuration @EnableAutoConfiguration(exclude = {StorageAutoConfiguration.class, RabbitAutoConfiguration.class}) diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/MetricsIntegrationTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/MetricsIntegrationTest.java new file mode 100644 index 0000000..62b5c4e --- /dev/null +++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/MetricsIntegrationTest.java @@ -0,0 +1,90 @@ +package com.iqser.red.service.search.v1.server.service; + +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.io.ClassPathResource; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.search.v1.model.IndexMessage; +import com.iqser.red.service.search.v1.model.IndexMessageType; +import com.iqser.red.service.search.v1.model.SearchRequest; +import com.iqser.red.service.search.v1.server.client.DossierClient; +import com.iqser.red.service.search.v1.server.client.FileStatusClient; +import com.iqser.red.service.search.v1.server.client.FileStatusProcessingUpdateClient; +import com.iqser.red.service.search.v1.server.client.IndexInformationClient; +import com.iqser.red.service.search.v1.server.controller.SearchController; +import com.iqser.red.service.search.v1.server.model.Text; +import com.iqser.red.service.search.v1.server.queue.IndexingMessageReceiver; +import com.iqser.red.service.search.v1.server.service.utils.MetricValidationUtils; + +import io.micrometer.prometheus.PrometheusMeterRegistry; +import lombok.SneakyThrows; + +public class MetricsIntegrationTest extends AbstractElasticsearchIntegrationTest { + + @Autowired + private ObjectMapper objectMapper; + @Autowired + private IndexingMessageReceiver indexingMessageReceiver; + @Autowired + private PrometheusMeterRegistry prometheusMeterRegistry; + @Autowired + private SearchController searchController; + @MockBean + private FileStatusClient fileStatusClient; + @MockBean + private DossierClient dossierClient; + @MockBean + private FileStatusProcessingUpdateClient fileStatusProcessingUpdateClient; + @MockBean + private IndexInformationClient indexInformationClient; + @MockBean + private RabbitTemplate rabbitTemplate; + + + @Test + @SneakyThrows + public void testMetrics() { + + var dossier = new Dossier(); + dossier.setId("1"); + when(dossierClient.getDossierById("1", true, true)).thenReturn(dossier); + + var file = new FileModel(); + file.setDossierId("1"); + file.setId("1"); + file.setWorkflowStatus(WorkflowStatus.NEW); + when(fileStatusClient.getFileStatus("1", "1")).thenReturn(file); + + ClassPathResource textResource = new ClassPathResource("files/Text2.json"); + Text text = objectMapper.readValue(textResource.getInputStream(), Text.class); + storageService.storeJSONObject(TextStorageService.StorageIdUtils.getStorageId("1", "1", FileType.SIMPLIFIED_TEXT), text); + + IndexMessage indexRequest = new IndexMessage(); + indexRequest.setDossierId("1"); + indexRequest.setFileId("1"); + indexRequest.setDossierTemplateId("1"); + indexRequest.setMessageType(IndexMessageType.INSERT); + indexingMessageReceiver.receiveIndexingRequest(indexRequest); + + indexRequest.setMessageType(IndexMessageType.UPDATE); + indexingMessageReceiver.receiveIndexingRequest(indexRequest); + + searchController.getDossierStatus(SearchRequest.builder().queryString("test").build()); + + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_indexDocument", 1, null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_updateDocument", 1, null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_getTextSearchService", 1, null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_search", 1, null); + + } + +} diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/utils/MetricValidationUtils.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/utils/MetricValidationUtils.java new file mode 100644 index 0000000..8778c63 --- /dev/null +++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/utils/MetricValidationUtils.java @@ -0,0 +1,29 @@ +package com.iqser.red.service.search.v1.server.service.utils; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.concurrent.TimeUnit; + +import io.micrometer.prometheus.PrometheusMeterRegistry; +import io.micrometer.prometheus.PrometheusTimer; +import lombok.experimental.UtilityClass; + +@UtilityClass +public class MetricValidationUtils { + + public static void validateMetric(PrometheusMeterRegistry registry, String name, int invocationCount, Integer time) { + + var metricOptional = registry.getMeters().stream().filter(m -> m.getId().getName().equalsIgnoreCase(name)).findAny(); + assertThat(metricOptional.isPresent()).isTrue(); + PrometheusTimer metric = (PrometheusTimer) metricOptional.get(); + assertThat(metric.count()).isGreaterThanOrEqualTo(invocationCount); + if (time != null) { + // for actually timing the method ... + assertThat(metric.mean(TimeUnit.MILLISECONDS)).isGreaterThan(time); + } else { + // everything takes at least one nano-second - test the meter is correctly initialized + assertThat(metric.mean(TimeUnit.NANOSECONDS)).isGreaterThan(1); + } + } + +} diff --git a/search-service-v1/search-service-server-v1/src/test/resources/application.yml b/search-service-v1/search-service-server-v1/src/test/resources/application.yml index ed0f0fa..fa75b5a 100644 --- a/search-service-v1/search-service-server-v1/src/test/resources/application.yml +++ b/search-service-v1/search-service-server-v1/src/test/resources/application.yml @@ -18,3 +18,13 @@ storage: elasticsearch: hosts: - 'localhost' + +management: + endpoint: + metrics.enabled: true + prometheus.enabled: true + health.enabled: true + endpoints.web.exposure.include: prometheus, health, metrics + metrics.export.prometheus.enabled: true + +persistence-service.url: 'http://mock.url'