1. sending version metrics, 2. memory footprint optimisation

This commit is contained in:
chandresh pancholi
2022-10-06 03:22:17 +05:30
parent 4cc54cf1fa
commit 47135fad6e
10 changed files with 61 additions and 11 deletions

View File

@@ -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()) {

View File

@@ -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()

View File

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

View File

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

View File

@@ -0,0 +1 @@
Implementation-Version: 2.0.5-SNAPSHOT

View File

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

View File

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

View File

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

View File

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

View File

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