RED-4188 added timed dependencies and metric for calculateFlags since this method is calld several times per file each time something happens inside it

This commit is contained in:
Timo Bejan 2023-02-09 12:54:36 +02:00
parent 21d2087e9f
commit 00a6b2f075
6 changed files with 51 additions and 10 deletions

View File

@ -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.peristence.v1.server.settings.FileManagementServiceSettings;
import com.iqser.red.service.persistence.management.v1.processor.PersistenceServiceProcessorConfiguration; import com.iqser.red.service.persistence.management.v1.processor.PersistenceServiceProcessorConfiguration;
import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.MeterRegistry;
@EnableAsync @EnableAsync
@EnableRetry @EnableRetry
@EnableScheduling @EnableScheduling
@ -47,6 +50,11 @@ public class Application {
SpringApplication.run(Application.class, args); SpringApplication.run(Application.class, args);
} }
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
@Bean @Bean
public RetryTemplate retryTemplate(FileManagementServiceSettings settings) { public RetryTemplate retryTemplate(FileManagementServiceSettings settings) {

View File

@ -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.ManualRedactionType;
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
import io.micrometer.core.annotation.Timed;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -28,7 +29,7 @@ public class AnalysisFlagsCalculationService {
private final RedactionLogService redactionLogService; private final RedactionLogService redactionLogService;
private final ViewedPagesPersistenceService viewedPagesPersistenceService; private final ViewedPagesPersistenceService viewedPagesPersistenceService;
@Timed("redactmanager_calculateFlags")
public void calculateFlags(String dossierId, String fileId) { public void calculateFlags(String dossierId, String fileId) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();

View File

@ -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.FileTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; 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.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.peristence.v1.server.service.FileManagementStorageService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; 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 com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
import feign.FeignException; import feign.FeignException;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import lombok.SneakyThrows; import lombok.SneakyThrows;
public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
@ -77,7 +79,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
@Autowired @Autowired
private FileClient fileClient; private FileClient fileClient;
@Test @Test
@SneakyThrows @SneakyThrows
public void testManualRedaction3641() { public void testManualRedaction3641() {
@ -195,6 +196,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
} }
@ -588,6 +590,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId()); loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId());
assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED);
MetricValidationUtils.validateMetric(prometheusMeterRegistry,"redactmanager_calculateFlags",1,null);
} }
} }

View File

@ -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.StorageAutoConfiguration;
import com.iqser.red.storage.commons.service.StorageService; import com.iqser.red.storage.commons.service.StorageService;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ -165,24 +166,21 @@ public abstract class AbstractPersistenceServerServiceTest {
protected EntryRepository entryRepository; protected EntryRepository entryRepository;
@Autowired @Autowired
protected IndexInformationRepository indexInformationRepository; protected IndexInformationRepository indexInformationRepository;
@Autowired @Autowired
protected FalsePositiveEntryRepository falsePositiveEntryRepository; protected FalsePositiveEntryRepository falsePositiveEntryRepository;
@Autowired @Autowired
protected FalseRecommendationEntryRepository falseRecommendationEntryRepository; protected FalseRecommendationEntryRepository falseRecommendationEntryRepository;
@Autowired @Autowired
protected ApplicationConfigRepository applicationConfigRepository; protected ApplicationConfigRepository applicationConfigRepository;
@Autowired @Autowired
protected TenantsClient tenantsClient; protected TenantsClient tenantsClient;
@Autowired @Autowired
protected TenantRepository tenantRepository; protected TenantRepository tenantRepository;
@Autowired @Autowired
private JdbcTemplate jdbcTemplate; protected JdbcTemplate jdbcTemplate;
@Autowired
protected PrometheusMeterRegistry prometheusMeterRegistry;
@Before @Before

View File

@ -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);
}
}
}

View File

@ -66,9 +66,11 @@ metrics:
management: management:
endpoint: endpoint:
metrics.enabled: false metrics.enabled: true
prometheus.enabled: true
health.enabled: true health.enabled: true
endpoints.web.exposure.include: prometheus, health, metrics endpoints.web.exposure.include: prometheus, health, metrics
metrics.export.prometheus.enabled: true
logging.level.root: info logging.level.root: info