diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java index 05e446338..6f892ce2d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java @@ -28,6 +28,9 @@ import com.iqser.red.service.peristence.v1.server.multitenancy.MultiTenancyWebCo import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.PersistenceServiceProcessorConfiguration; +import io.micrometer.core.aop.TimedAspect; +import io.micrometer.core.instrument.MeterRegistry; + @EnableAsync @EnableRetry @EnableScheduling @@ -47,6 +50,11 @@ public class Application { SpringApplication.run(Application.class, args); } + @Bean + public TimedAspect timedAspect(MeterRegistry registry) { + + return new TimedAspect(registry); + } @Bean public RetryTemplate retryTemplate(FileManagementServiceSettings settings) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java index 09ea003d3..11c1ad320 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java @@ -16,6 +16,7 @@ import com.iqser.red.service.redaction.v1.model.ChangeType; import com.iqser.red.service.redaction.v1.model.ManualRedactionType; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; +import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -28,7 +29,7 @@ public class AnalysisFlagsCalculationService { private final RedactionLogService redactionLogService; private final ViewedPagesPersistenceService viewedPagesPersistenceService; - + @Timed("redactmanager_calculateFlags") public void calculateFlags(String dossierId, String fileId) { long startTime = System.currentTimeMillis(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index d71ee28f1..471f7ec8d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -21,6 +21,7 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.peristence.v1.server.integration.utils.MetricValidationUtils; import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; @@ -43,6 +44,7 @@ import com.iqser.red.service.redaction.v1.model.RedactionLog; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; import feign.FeignException; +import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.SneakyThrows; public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @@ -77,7 +79,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private FileClient fileClient; - @Test @SneakyThrows public void testManualRedaction3641() { @@ -195,6 +196,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING); + } @@ -588,6 +590,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId()); assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); + MetricValidationUtils.validateMetric(prometheusMeterRegistry,"redactmanager_calculateFlags",1,null); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index 7fef5b600..b8a12e816 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -84,6 +84,7 @@ import com.iqser.red.service.redaction.v1.model.RedactionResult; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.SneakyThrows; @RunWith(SpringRunner.class) @@ -165,24 +166,21 @@ public abstract class AbstractPersistenceServerServiceTest { protected EntryRepository entryRepository; @Autowired protected IndexInformationRepository indexInformationRepository; - @Autowired protected FalsePositiveEntryRepository falsePositiveEntryRepository; - @Autowired protected FalseRecommendationEntryRepository falseRecommendationEntryRepository; - @Autowired protected ApplicationConfigRepository applicationConfigRepository; - @Autowired protected TenantsClient tenantsClient; - @Autowired protected TenantRepository tenantRepository; - @Autowired - private JdbcTemplate jdbcTemplate; + protected JdbcTemplate jdbcTemplate; + @Autowired + protected PrometheusMeterRegistry prometheusMeterRegistry; + @Before diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/MetricValidationUtils.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/MetricValidationUtils.java new file mode 100644 index 000000000..8781e33a2 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/MetricValidationUtils.java @@ -0,0 +1,29 @@ +package com.iqser.red.service.peristence.v1.server.integration.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/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml index 8ec4cff06..e5c64fd6d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml @@ -66,9 +66,11 @@ metrics: management: endpoint: - metrics.enabled: false + metrics.enabled: true + prometheus.enabled: true health.enabled: true endpoints.web.exposure.include: prometheus, health, metrics + metrics.export.prometheus.enabled: true logging.level.root: info