1. sending version metrics, 2. memory footprint optimisation
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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.<LitmusExperimentEvent>builder()
|
||||
|
||||
@@ -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<String, LitmusContext, Boolean> fallbackAction) {
|
||||
boolean enabled = checkEnabled(experimentName, context, fallbackAction);
|
||||
|
||||
|
||||
//Todo clickstream integration
|
||||
return enabled;
|
||||
}
|
||||
@@ -125,15 +136,21 @@ public class DefaultLitmus implements Litmus {
|
||||
BiFunction<String, LitmusContext, Boolean> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Implementation-Version: 2.0.5-SNAPSHOT
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -25,4 +25,6 @@ public interface ExperimentRepository extends CrudRepository<ExperimentEntity, L
|
||||
List<ExperimentEntity> findByVerticalAndUpdatedTime(@Param("vertical") String vertical,
|
||||
@Param("lastPollingTime") LocalDateTime lastPollingTime,
|
||||
@Param("currentTime") LocalDateTime currentTime);
|
||||
|
||||
List<ExperimentEntity> findByVertical(String vertical);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user