From 7177717172be5770dcf0153792e954c1a27cada4 Mon Sep 17 00:00:00 2001 From: akshat-sonic Date: Mon, 1 May 2023 19:10:49 +0530 Subject: [PATCH] TP-26660 | add option for refreshing the metric from backend --- .../controller/v2/ExperimentControllerV2.java | 7 +++++ .../ExperimentMetricResultScheduler.java | 9 +++++- .../ExperimentMetricResultService.java | 4 +++ .../ExperimentMetricResultServiceImpl.java | 29 +++++++++++++++---- .../src/main/resources/application.properties | 5 ++-- .../ExperimentMetricMappingQueryImpl.java | 5 ++++ .../IExperimentMetricMappingQuery.java | 2 ++ .../ExperimentMetricMappingRepository.java | 3 ++ 8 files changed, 55 insertions(+), 9 deletions(-) diff --git a/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java b/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java index 34548e5..4ada00d 100644 --- a/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java +++ b/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java @@ -142,4 +142,11 @@ public class ExperimentControllerV2 { log.info("updating status of tesseract_id: {} to {}", response.getTesseractId(), response.getStatus().toString()); experimentMetricResultService.updateStatusOfTesseractId(response); } + + @PutMapping("/refresh-metric") + @Timed(value = "experiment.refresh.metric.result", percentiles = {0.95, 0.99}) + public void refreshMetricResultOfExperiment(@RequestParam("name") String experimentName) { + log.info("refresh metric request result received for experiment: {}", experimentName); + experimentMetricResultService.refreshMetricResult(experimentName); + } } diff --git a/litmus-core/src/main/java/com/navi/medici/scheduler/ExperimentMetricResultScheduler.java b/litmus-core/src/main/java/com/navi/medici/scheduler/ExperimentMetricResultScheduler.java index 05c290f..ee576d7 100644 --- a/litmus-core/src/main/java/com/navi/medici/scheduler/ExperimentMetricResultScheduler.java +++ b/litmus-core/src/main/java/com/navi/medici/scheduler/ExperimentMetricResultScheduler.java @@ -24,7 +24,7 @@ public class ExperimentMetricResultScheduler { private final MeterRegistry meterRegistry; @Value("${experiment.metric.fetch.limit.per.interval}") - private Integer experimentMetricFetchLimitPerInterval; + private int experimentMetricFetchLimitPerInterval; @Scheduled(cron = "${experiment.metric.fetch.cron}") @SchedulerLock(name = "ExperimentMetricResultScheduler_fetchExperimentMetricResult", lockAtMostForString = "PT10S") @@ -35,4 +35,11 @@ public class ExperimentMetricResultScheduler { Gauge.builder("queries_scheduled_per_interval", experimentMetricMappings, List::size) .register(meterRegistry); } + + @Scheduled(cron = "${experiment.metric.job.reset.cron}") + @SchedulerLock(name = "ExperimentMetricResultScheduler_resetExperimentMericJob", lockAtMostForString = "PT10S") + public void setExperimentMetricJobsToFalse() { + log.info("scheduling resetting of experiment metric jobs"); + experimentMetricResultService.setJobsToFalse(); + } } diff --git a/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultService.java b/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultService.java index 2818a83..3f33957 100644 --- a/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultService.java +++ b/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultService.java @@ -11,4 +11,8 @@ public interface ExperimentMetricResultService { void registerExperimentMetricQueries(List experimentMetricMappings); void updateStatusOfTesseractId(TesseractIdStatusResponse response); + + void setJobsToFalse(); + + void refreshMetricResult(String experimentName); } diff --git a/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultServiceImpl.java b/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultServiceImpl.java index 5e2a456..38ee367 100644 --- a/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultServiceImpl.java +++ b/litmus-core/src/main/java/com/navi/medici/service/experimentmetricresult/ExperimentMetricResultServiceImpl.java @@ -10,6 +10,7 @@ import com.navi.medici.entity.ExperimentMetricResultEntity; import com.navi.medici.entity.MetricEntity; import com.navi.medici.entity.TesseractIdStatusEntity; import com.navi.medici.enums.ExperimentMetricType; +import com.navi.medici.exceptions.LitmusExperimentNotFoundException; import com.navi.medici.metrics.MetricsUtils; import com.navi.medici.query.experiment.IExperimentQuery; import com.navi.medici.query.experimentmetricmapping.IExperimentMetricMappingQuery; @@ -125,8 +126,6 @@ public class ExperimentMetricResultServiceImpl implements ExperimentMetricResult throw new RuntimeException(String.format("Failed to process metric query: %s", metricQuery), e); } }); - } else { - setJobsToFalse(); } } @@ -149,11 +148,23 @@ public class ExperimentMetricResultServiceImpl implements ExperimentMetricResult }); } - private void setJobsToFalse() { + @Override + public void setJobsToFalse() { - log.info("setting all experiment-metric jobs to false"); + log.info("setting all experiment-metric jobs to false that are true"); List experimentMetricMappings; - experimentMetricMappings = experimentMetricMappingQuery.findAll(); + experimentMetricMappings = experimentMetricMappingQuery.findByIsJobRun(true); + experimentMetricMappings.forEach(experimentMetricMapping -> { + experimentMetricMapping.setJobRun(false); + experimentMetricMappingQuery.save(experimentMetricMapping); + }); + } + + @Override + public void refreshMetricResult(String experimentName) { + log.info("setting all metric mapping jobs to false for experiment: {}", experimentName); + ExperimentEntity experiment = getExperimentEntityFromName(experimentName); + List experimentMetricMappings = experimentMetricMappingQuery.findByExperiment(experiment); experimentMetricMappings.forEach(experimentMetricMapping -> { experimentMetricMapping.setJobRun(false); experimentMetricMappingQuery.save(experimentMetricMapping); @@ -191,4 +202,12 @@ public class ExperimentMetricResultServiceImpl implements ExperimentMetricResult variableMap.put(Constants.DAY_INTERVAL_FOR_TOTAL_USERS, litmusCoreConfig.getQueryDayIntervalForTotalUsers()); return variableMap; } + + private ExperimentEntity getExperimentEntityFromName(String experimentName) { + Optional experimentEntity = experimentQuery.findByName(experimentName); + if (experimentEntity.isEmpty()) { + throw new LitmusExperimentNotFoundException("Experiment with name : " + experimentName + " is not present"); + } + return experimentEntity.get(); + } } diff --git a/litmus-core/src/main/resources/application.properties b/litmus-core/src/main/resources/application.properties index 7941000..aad2ae1 100644 --- a/litmus-core/src/main/resources/application.properties +++ b/litmus-core/src/main/resources/application.properties @@ -20,12 +20,10 @@ server.tomcat.mbeanregistry.enabled=true spring.jmx.enabled=true management.metrics.kafka.consumer.enabled=true management.metrics.kafka.producer.enabled=true - kafka.servers=${KAFKA_SERVER:localhost:9092} audit.kafka.servers=${AUDIT_KAFKA_SERVER:localhost:9092} kafka.auditlog.topic=${AUDIT_LOG_TOPIC:audit-logs} kms.base-url=${KMS_BASE_URL:http://google.com} - redis.host=${REDIS_HOST:127.0.0.1} redis.port=6379 redis.expected.insertions=99999 @@ -55,7 +53,8 @@ tesseract.interval.function.multiplier=${TESSERACT_INTERVAL_FUNCTION_MULTIPLIER: kafka.experiment.metric.result.topic=${KAFKA_EXPERIMENT_METRIC_RESULT_TOPIC:common-litmus-experiment-metric-result-topic} kafka.litmus.consumer.group=${KAFKA_LITMUS_CONSUMER_GROUP:dev-kafka} #metrics -experiment.metric.fetch.cron=${EXPERIMENT_METRIC_FETCH_CRON:0 0/1 0-7 * * ?} +experiment.metric.fetch.cron=${EXPERIMENT_METRIC_FETCH_CRON:0 * * ? * *} +experiment.metric.job.reset.cron=${EXPERIMENT_METRIC_JOB_RESET_CRON:0 58 23 ? * *} experiment.metric.fetch.limit.per.interval=${EXPERIMENT_METRIC_FETCH_LIMIT_PER_INTERVAL:5} population.graph.data.days.interval=${POPULATION_GRAPH_DATA_DAYS_INTERVAL:3} query.schedule.and.end.time.diff.hours=${QUERY_SCHEDULE_AND_END_TIME_DIFF_HOURS:2} diff --git a/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/ExperimentMetricMappingQueryImpl.java b/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/ExperimentMetricMappingQueryImpl.java index c3cc449..e05765a 100644 --- a/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/ExperimentMetricMappingQueryImpl.java +++ b/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/ExperimentMetricMappingQueryImpl.java @@ -45,4 +45,9 @@ public class ExperimentMetricMappingQueryImpl implements IExperimentMetricMappin public Optional findByExperimentAndMetric(ExperimentEntity experiment, MetricEntity metric) { return experimentMetricMappingRepository.findByExperimentAndMetric(experiment, metric); } + + @Override + public List findByIsJobRun(boolean isJobRun) { + return experimentMetricMappingRepository.findByIsJobRun(isJobRun); + } } diff --git a/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/IExperimentMetricMappingQuery.java b/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/IExperimentMetricMappingQuery.java index 01ad57a..96ccfb2 100644 --- a/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/IExperimentMetricMappingQuery.java +++ b/litmus-db/src/main/java/com/navi/medici/query/experimentmetricmapping/IExperimentMetricMappingQuery.java @@ -19,4 +19,6 @@ public interface IExperimentMetricMappingQuery { List findByExperiment(ExperimentEntity experiment); Optional findByExperimentAndMetric(ExperimentEntity experiment, MetricEntity metric); + + List findByIsJobRun(boolean isJobRun); } diff --git a/litmus-db/src/main/java/com/navi/medici/repository/ExperimentMetricMappingRepository.java b/litmus-db/src/main/java/com/navi/medici/repository/ExperimentMetricMappingRepository.java index 05f868e..a3c2bca 100644 --- a/litmus-db/src/main/java/com/navi/medici/repository/ExperimentMetricMappingRepository.java +++ b/litmus-db/src/main/java/com/navi/medici/repository/ExperimentMetricMappingRepository.java @@ -23,4 +23,7 @@ public interface ExperimentMetricMappingRepository extends CrudRepository findByExperiment(ExperimentEntity experiment); Optional findByExperimentAndMetric(ExperimentEntity experiment, MetricEntity metric); + + @Query(value = "select * from experiment_metric_mapping emm where emm.is_job_run=:isJobRun", nativeQuery = true) + List findByIsJobRun(boolean isJobRun); }