From 47135fad6e922d5da870c3e6746f7811450b6779 Mon Sep 17 00:00:00 2001 From: chandresh pancholi Date: Thu, 6 Oct 2022 03:22:17 +0530 Subject: [PATCH] 1. sending version metrics, 2. memory footprint optimisation --- .../medici/client/HttpExperimentFetcher.java | 2 +- .../navi/medici/event/EventDispatcher.java | 3 ++ .../com/navi/medici/litmus/DefaultLitmus.java | 49 ++++++++++++++++--- .../LitmusExperimentRepository.java | 3 +- .../main/resources/META-INF/LITMUS-CLIENT.MF | 1 + .../experiment/ExperimentServiceImpl.java | 3 +- .../repository/ExperimentRepository.java | 2 + .../navi/medici/container/MockContainer.java | 3 +- .../medici/controller/MockController.java | 3 +- .../clickstream/LitmusExperimentEvent.java | 3 ++ 10 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 litmus-client/src/main/resources/META-INF/LITMUS-CLIENT.MF diff --git a/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java b/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java index 828eb0e..7d0cca3 100644 --- a/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java +++ b/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java @@ -46,7 +46,7 @@ public class HttpExperimentFetcher implements ExperimentFetcher { URL experimentUrl = litmusURLs .getLitmusExperimentsURL(projectName, projectNamePrefix); Request request = new Request.Builder() - .url(String.format("%s?vertical=%s&polling_time=%s", experimentUrl, vertical, pollingTime)) + .url(String.format("%s/vertical?vertical=%s&polling_time=%s", experimentUrl, vertical, pollingTime)) .build(); try (Response response = OkHttpClientContainer.getInstance().newCall(request).execute()) { diff --git a/litmus-client/src/main/java/com/navi/medici/event/EventDispatcher.java b/litmus-client/src/main/java/com/navi/medici/event/EventDispatcher.java index dfec0b4..802839c 100644 --- a/litmus-client/src/main/java/com/navi/medici/event/EventDispatcher.java +++ b/litmus-client/src/main/java/com/navi/medici/event/EventDispatcher.java @@ -11,6 +11,7 @@ import com.navi.medici.request.v1.LitmusExperiment; import com.navi.medici.util.JacksonUtils; import com.navi.medici.variants.Variant; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import lombok.extern.log4j.Log4j2; @@ -34,6 +35,7 @@ public class EventDispatcher { String variantName = variant != null ? variant.getName() : null; if (litmusExperiment != null) { + litmusContext.setClickStreamPayload(Optional.empty()); var litmusExperimentEvent = LitmusExperimentEvent.builder() .experimentId(litmusExperiment.getExperimentId()) .experimentName(litmusExperiment.getName()) @@ -41,6 +43,7 @@ public class EventDispatcher { .result(result) .appName(litmusConfig.getAppName()) .vertical(litmusConfig.getVertical()) + .context(litmusContext) .build(); var event = ClickStreamEvent.builder() diff --git a/litmus-client/src/main/java/com/navi/medici/litmus/DefaultLitmus.java b/litmus-client/src/main/java/com/navi/medici/litmus/DefaultLitmus.java index 3a6580c..0fa7947 100644 --- a/litmus-client/src/main/java/com/navi/medici/litmus/DefaultLitmus.java +++ b/litmus-client/src/main/java/com/navi/medici/litmus/DefaultLitmus.java @@ -26,16 +26,26 @@ import com.navi.medici.util.VariantUtil; import com.navi.medici.variants.Variant; import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.prometheus.client.Histogram; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Properties; import java.util.function.BiFunction; +import java.util.jar.Attributes; +import java.util.jar.Manifest; import lombok.extern.log4j.Log4j2; @Log4j2 public class DefaultLitmus implements Litmus { + public static final Variant DISABLED_VARIANT = new Variant("disabled", null, false, null); @@ -82,6 +92,8 @@ public class DefaultLitmus implements Litmus { this.strategyMap = strategyMap; this.contextProvider = contextProvider; this.eventDispatcher = eventDispatcher; + + version(litmusConfig); } @Override @@ -114,7 +126,6 @@ public class DefaultLitmus implements Litmus { BiFunction fallbackAction) { boolean enabled = checkEnabled(experimentName, context, fallbackAction); - //Todo clickstream integration return enabled; } @@ -125,15 +136,21 @@ public class DefaultLitmus implements Litmus { BiFunction fallbackAction) { LitmusExperiment litmusExperiment = experimentRepository.getLitmusExperiment(experimentName); boolean enabled; -// LitmusContext enhancedContext = context.applyStaticFields(config); if (litmusExperiment == null) { enabled = fallbackAction.apply(experimentName, context); } else if (!litmusExperiment.isEnabled()) { enabled = false; - } else if (litmusExperiment.getStrategies().size() == 0 - || litmusExperiment.getType() == ExperimentType.RELEASE) { - return true; + } else if (litmusExperiment.getStrategies().isEmpty()) { + if (litmusExperiment.getType() == ExperimentType.RELEASE) { + enabled = true; + } else if (litmusExperiment.getType() == ExperimentType.KILL_SWITCH) { + enabled = false; + } else { + //it's default case where strategies are empty + enabled = false; + } + } else { enabled = litmusExperiment.getStrategies().stream() @@ -160,6 +177,7 @@ public class DefaultLitmus implements Litmus { .increment(); this.eventDispatcher.publish(context, litmusExperiment, enabled, null); + log.info("experiment_name: {}, result: {}", experimentName, enabled); return enabled; } @@ -217,7 +235,7 @@ public class DefaultLitmus implements Litmus { : defaultValue; this.eventDispatcher.publish(context, litmusExperiment, enabled, variant); - log.info("experiment_name: {}, result: {}", experimentName, enabled); + log.info("experiment_name: {}, result: {}", experimentName, variant.toString()); Counter.builder("litmus_client_experiment_variant") .tag("experiment_name", experimentName) @@ -240,6 +258,25 @@ public class DefaultLitmus implements Litmus { } + /** + * Emit litmus version to prometheus to track litmus-client version used by services + */ + private void version(LitmusConfig litmusConfig) { + try { + URLClassLoader cl = (URLClassLoader) this.getClass().getClassLoader(); + Manifest manifest = new Manifest(cl.getResourceAsStream("META-INF/LITMUS-CLIENT.MF")); + Attributes attr = manifest.getMainAttributes(); + Counter.builder("litmus_client_version") + .tag("vertical", litmusConfig.getVertical()) + .tag("app_name", litmusConfig.getAppName()) + .tag("version", attr.getValue("Implementation-Version")) + .register(litmusConfig.getMeterRegistry()) + .increment(); + } catch (IOException e) { + log.error("could not load MANIFEST.MF", e); + } + + } } diff --git a/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java b/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java index 4a839c6..d6f9402 100644 --- a/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java +++ b/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java @@ -51,7 +51,8 @@ public class LitmusExperimentRepository implements ExperimentRepository { } if (litmusConfig.isSynchronousFetchOnInitialisation()) { - updateExperiments(litmusConfig.getVertical(), litmusConfig.getFetchLitmusExperimentsInterval()).run(); + //polling time goes back to last 5 years to fetch all the live experiments at boot time + updateExperiments(litmusConfig.getVertical(), 157680000L).run(); } this.inMemoryCache = new InMemoryCache(this.experimentCollection); diff --git a/litmus-client/src/main/resources/META-INF/LITMUS-CLIENT.MF b/litmus-client/src/main/resources/META-INF/LITMUS-CLIENT.MF new file mode 100644 index 0000000..ebfd02a --- /dev/null +++ b/litmus-client/src/main/resources/META-INF/LITMUS-CLIENT.MF @@ -0,0 +1 @@ +Implementation-Version: 2.0.5-SNAPSHOT diff --git a/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java b/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java index 646fc4f..7f1a717 100644 --- a/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java +++ b/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java @@ -14,6 +14,7 @@ import com.navi.medici.response.LitmusExperimentCollection; import com.navi.medici.strategy.ActivationStrategy; import com.navi.medici.util.JacksonUtils; import com.navi.medici.variants.VariantDefinition; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -62,7 +63,7 @@ public record ExperimentServiceImpl(IExperimentQuery experimentQuery, .peek(le -> { //This is to reduce sending strategy string over network if (RELEASE.equals(le.getType()) || KILL_SWITCH.equals(le.getType())) { - le.setStrategies(null); + le.setStrategies(new ArrayList<>()); } }).collect(Collectors.toList()); diff --git a/litmus-db/src/main/java/com/navi/medici/repository/ExperimentRepository.java b/litmus-db/src/main/java/com/navi/medici/repository/ExperimentRepository.java index 456fabb..ac615ae 100644 --- a/litmus-db/src/main/java/com/navi/medici/repository/ExperimentRepository.java +++ b/litmus-db/src/main/java/com/navi/medici/repository/ExperimentRepository.java @@ -25,4 +25,6 @@ public interface ExperimentRepository extends CrudRepository findByVerticalAndUpdatedTime(@Param("vertical") String vertical, @Param("lastPollingTime") LocalDateTime lastPollingTime, @Param("currentTime") LocalDateTime currentTime); + + List findByVertical(String vertical); } diff --git a/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java b/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java index d807ff7..72f3a6c 100644 --- a/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java +++ b/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java @@ -13,13 +13,14 @@ public class MockContainer { @Bean public Litmus litmus(MeterRegistry meterRegistry) { var litmusConfig = LitmusConfig.builder() - .litmusAPI("https://dev-litmus-core.np.navi-tech.in/litmus-core/v1") + .litmusAPI("https://qa-litmus-core.np.navi-tech.in/litmus-core/v1") .appName("litmus-mock") .instanceId("test-instance") .litmusContextProvider(new CustomLitmusContextProvider()) .clickStreamAPI("https://dev-janus.np.navi-tech.in/events/json") .vertical("PL") .meterRegistry(meterRegistry) + .synchronousFetchOnInitialisation(true) .build(); Litmus litmus = new DefaultLitmus(litmusConfig); diff --git a/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java b/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java index 0a9be00..0747416 100644 --- a/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java +++ b/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java @@ -22,11 +22,12 @@ public class MockController { @GetMapping("/mock") public String test(@RequestParam("experiment") String experiment) { var result = litmus.isEnabled(experiment); - log.info("result ----> {}", result); +// log.info("result ----> {}", result); return "result ==> " + result; } +//experiment-on-font-colour @GetMapping("/variants/mock") public Variant variants(@RequestParam("experiment") String experiment) { var result = litmus.getVariant(experiment); diff --git a/litmus-model/src/main/java/com/navi/medici/clickstream/LitmusExperimentEvent.java b/litmus-model/src/main/java/com/navi/medici/clickstream/LitmusExperimentEvent.java index b48c550..e067106 100644 --- a/litmus-model/src/main/java/com/navi/medici/clickstream/LitmusExperimentEvent.java +++ b/litmus-model/src/main/java/com/navi/medici/clickstream/LitmusExperimentEvent.java @@ -1,6 +1,7 @@ package com.navi.medici.clickstream; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.navi.medici.context.LitmusContext; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -26,4 +27,6 @@ public class LitmusExperimentEvent { String appName; String vertical; + + LitmusContext context; }