diff --git a/Dockerfile.core b/Dockerfile.core
index 751318b..358733b 100644
--- a/Dockerfile.core
+++ b/Dockerfile.core
@@ -1,5 +1,5 @@
FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/maven:3.8.3-openjdk-17-slim as builder
-ARG ARTIFACT_VERSION=2.0.2-SNAPSHOT
+ARG ARTIFACT_VERSION=2.0.3-SNAPSHOT
RUN mkdir -p /build
WORKDIR /build
COPY . /build
@@ -7,7 +7,7 @@ RUN mvn clean install -DskipTests
RUN mvn clean verify -DskipTests -Dartifact.version=${ARTIFACT_VERSION}
FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/openjdk:17-slim-bullseye
-ARG ARTIFACT_VERSION=2.0.2-SNAPSHOT
+ARG ARTIFACT_VERSION=2.0.3-SNAPSHOT
RUN mkdir -p /usr/local
RUN apt-get update -y && apt-get -y install fontconfig libpng-dev
WORKDIR /usr/local/
diff --git a/Dockerfile.proxy b/Dockerfile.proxy
index 1c2b24c..f8be5ba 100644
--- a/Dockerfile.proxy
+++ b/Dockerfile.proxy
@@ -1,5 +1,5 @@
FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/maven:3.8.3-openjdk-17-slim as builder
-ARG ARTIFACT_VERSION=2.0.2-SNAPSHOT
+ARG ARTIFACT_VERSION=2.0.3-SNAPSHOT
RUN mkdir -p /build
WORKDIR /build
COPY . /build
@@ -7,7 +7,7 @@ RUN mvn clean install -DskipTests
RUN mvn clean verify -DskipTests -Dartifact.version=${ARTIFACT_VERSION}
FROM 193044292705.dkr.ecr.ap-south-1.amazonaws.com/common/openjdk:17-slim-bullseye
-ARG ARTIFACT_VERSION=2.0.2-SNAPSHOT
+ARG ARTIFACT_VERSION=2.0.3-SNAPSHOT
RUN mkdir -p /usr/local
RUN apt-get update -y && apt-get -y install fontconfig libpng-dev
WORKDIR /usr/local/
diff --git a/litmus-cache/pom.xml b/litmus-cache/pom.xml
index a2678d3..05c265c 100644
--- a/litmus-cache/pom.xml
+++ b/litmus-cache/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-cache
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-cache
diff --git a/litmus-client/pom.xml b/litmus-client/pom.xml
index 90e498d..0cff693 100644
--- a/litmus-client/pom.xml
+++ b/litmus-client/pom.xml
@@ -5,11 +5,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-client
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-client
@@ -43,7 +43,7 @@
com.navi.medici
litmus-model
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
diff --git a/litmus-client/src/main/java/com/navi/medici/client/ClickStreamClient.java b/litmus-client/src/main/java/com/navi/medici/client/ClickStreamClient.java
index 857d6a6..8e85b3c 100644
--- a/litmus-client/src/main/java/com/navi/medici/client/ClickStreamClient.java
+++ b/litmus-client/src/main/java/com/navi/medici/client/ClickStreamClient.java
@@ -5,6 +5,7 @@ import com.navi.medici.clickstream.ClickStreamPayload;
import com.navi.medici.config.LitmusConfig;
import com.navi.medici.response.LitmusExperimentResponse;
import com.navi.medici.util.JacksonUtils;
+import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.extern.log4j.Log4j2;
@@ -32,6 +33,7 @@ public class ClickStreamClient {
this.meterRegistry = meterRegistry;
}
+ @Timed(value = "litmus_client_click_stream_publish_latency", percentiles = {0.90, 0.95, 0.99})
public void publish(String experimentName, ClickStreamPayload payload) {
String requestBody = JacksonUtils.objectToString(payload);
Request request = new Request.Builder()
@@ -56,15 +58,14 @@ public class ClickStreamClient {
log.error("clickstream ingestion received non-2xx. status: {}", response.code());
}
} catch (Exception e) {
- Counter.builder("litmus_client_click_stream_event_ingestion")
+ log.error("clickstream event ingestion failed. ", e);
+ Counter.builder("litmus_client_click_stream_event_ingestion_failed")
.tag("vertical", vertical)
.tag("experiment_name", experimentName)
.tag("app_name", appName)
.tag("exception", e.getMessage())
.register(meterRegistry)
.increment();
-
- log.error("clickstream event ingestion failed. ", e);
}
}
}
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 b9394dc..afd411e 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
@@ -7,6 +7,7 @@ import com.navi.medici.response.LitmusExperimentResponse;
import com.navi.medici.response.LitmusResponse;
import com.navi.medici.util.JacksonUtils;
import com.navi.medici.util.LitmusURLs;
+import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import java.net.URL;
@@ -40,6 +41,7 @@ public class HttpExperimentFetcher implements ExperimentFetcher {
}
@Override
+ @Timed(value = "litmus_client_fetch_experiments_latency", percentiles = {0.90, 0.95, 0.99})
public LitmusExperimentResponse fetchExperiments(String vertical, Long pollingTime) throws LitmusException {
URL experimentUrl = litmusURLs
.getLitmusExperimentsURL(projectName, projectNamePrefix);
@@ -100,6 +102,7 @@ public class HttpExperimentFetcher implements ExperimentFetcher {
}
}
+ @Timed(value = "litmus_client_segment_id_exists_latency", percentiles = {0.90, 0.95, 0.99})
public LitmusResponse> segmentIdExists(String segmentName, String id) {
URL segmentIdUrl = this.litmusURLs.getSegmentIdURL();
Request request = new Request.Builder()
diff --git a/litmus-client/src/main/java/com/navi/medici/client/OkHttpClientContainer.java b/litmus-client/src/main/java/com/navi/medici/client/OkHttpClientContainer.java
index 3ca58c2..452af94 100644
--- a/litmus-client/src/main/java/com/navi/medici/client/OkHttpClientContainer.java
+++ b/litmus-client/src/main/java/com/navi/medici/client/OkHttpClientContainer.java
@@ -17,7 +17,7 @@ public class OkHttpClientContainer {
okHttpClient = new OkHttpClient.Builder()
.readTimeout(1, TimeUnit.SECONDS)
.callTimeout(1, TimeUnit.SECONDS)
- .connectTimeout(1, TimeUnit.SECONDS)
+ .connectTimeout(10, TimeUnit.SECONDS)
.build();
}
}
diff --git a/litmus-core/pom.xml b/litmus-core/pom.xml
index c391c73..8badf5e 100644
--- a/litmus-core/pom.xml
+++ b/litmus-core/pom.xml
@@ -5,11 +5,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-core
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-core
@@ -31,25 +31,25 @@
com.navi.medici
litmus-model
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
com.navi.medici
litmus-db
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
com.navi.medici
litmus-cache
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
com.navi.medici
litmus-util
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
diff --git a/litmus-db/pom.xml b/litmus-db/pom.xml
index fddf879..2381e8c 100644
--- a/litmus-db/pom.xml
+++ b/litmus-db/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-db
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-db
@@ -27,7 +27,7 @@
com.navi.medici
litmus-model
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
diff --git a/litmus-liquibase/pom.xml b/litmus-liquibase/pom.xml
index 6b9a955..622d148 100644
--- a/litmus-liquibase/pom.xml
+++ b/litmus-liquibase/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-liquibase
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-liquibase
diff --git a/litmus-mock/pom.xml b/litmus-mock/pom.xml
index 621fd8c..19f9bc1 100644
--- a/litmus-mock/pom.xml
+++ b/litmus-mock/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-mock
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-mock
@@ -16,13 +16,13 @@
com.navi.medici
litmus-model
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
com.navi.medici
litmus-client
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
diff --git a/litmus-model/pom.xml b/litmus-model/pom.xml
index 8da069a..b52bcc3 100644
--- a/litmus-model/pom.xml
+++ b/litmus-model/pom.xml
@@ -5,11 +5,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-model
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-model
diff --git a/litmus-proxy/pom.xml b/litmus-proxy/pom.xml
index 8247c26..ea6e152 100644
--- a/litmus-proxy/pom.xml
+++ b/litmus-proxy/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-proxy
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
jar
litmus-proxy
@@ -17,13 +17,13 @@
com.navi.medici
litmus-model
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
com.navi.medici
litmus-client
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
@@ -31,8 +31,6 @@
spring-boot-starter-web
-
-
org.springframework.boot
spring-boot-starter-actuator
@@ -44,6 +42,12 @@
+
+ org.springdoc
+ springdoc-openapi-ui
+ 1.6.8
+
+
diff --git a/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java b/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java
index cfe048c..b9e9369 100644
--- a/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java
+++ b/litmus-proxy/src/main/java/com/navi/medici/controller/LitmusProxyController.java
@@ -1,12 +1,16 @@
package com.navi.medici.controller;
import com.navi.medici.litmus.Litmus;
+import com.navi.medici.model.request.v1.FetchBatchExperimentRequest;
+import com.navi.medici.model.request.v1.FetchBatchVariantRequest;
+import com.navi.medici.service.LitmusService;
import io.micrometer.core.annotation.Timed;
-import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@@ -14,12 +18,12 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/v1/proxy")
@Log4j2
-public record LitmusProxyController(Litmus litmus) {
+public record LitmusProxyController(Litmus litmus, LitmusService litmusService) {
@GetMapping(value = "/experiment", produces = MediaType.APPLICATION_JSON_VALUE)
@Timed(value = "litmus.proxy.fetch.experiment", percentiles = {0.95, 0.99}, extraTags = {"mt", "fetch"} )
public ResponseEntity> fetch(@RequestParam("name") String experimentName) {
- var result = litmus.isEnabled(experimentName);
+ var result = litmusService.fetchExperimentResponse(experimentName);
return ResponseEntity.ok(result);
}
@@ -27,9 +31,24 @@ public record LitmusProxyController(Litmus litmus) {
@GetMapping(value = "/variant", produces = MediaType.APPLICATION_JSON_VALUE)
@Timed(value = "litmus.proxy.fetch.experiment", percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchVariants"})
public ResponseEntity> fetchVariants(@RequestParam("name") String variantName) {
- var variant = litmus.getVariant(variantName);
+ var variant = litmusService.fetchVariant(variantName);
return ResponseEntity.ok(variant);
}
+ @PostMapping(value = "/batch/experiments", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity> fetchBatchExperiment(@RequestBody FetchBatchExperimentRequest fetchBatchExperimentRequest) {
+ var response = litmusService.batchExperimentResponse(fetchBatchExperimentRequest);
+
+ return ResponseEntity.ok(response);
+ }
+
+ @PostMapping(value = "/batch/variants", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity> fetchBatchVariantExperiment(@RequestBody FetchBatchVariantRequest fetchBatchVariantRequest) {
+ var response = litmusService.batchVariantResponse(fetchBatchVariantRequest);
+
+ return ResponseEntity.ok(response);
+ }
+
+
}
diff --git a/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/ExperimentResponse.java b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/ExperimentResponse.java
new file mode 100644
index 0000000..4c48bfa
--- /dev/null
+++ b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/ExperimentResponse.java
@@ -0,0 +1,19 @@
+package com.navi.medici.model.request.v1;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.FieldDefaults;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@FieldDefaults(level = AccessLevel.PRIVATE)
+public class ExperimentResponse {
+ String experimentName;
+
+ Boolean response;
+}
diff --git a/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/ExperimentVariantResponse.java b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/ExperimentVariantResponse.java
new file mode 100644
index 0000000..8735186
--- /dev/null
+++ b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/ExperimentVariantResponse.java
@@ -0,0 +1,17 @@
+package com.navi.medici.model.request.v1;
+
+import com.navi.medici.variants.Variant;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ExperimentVariantResponse {
+ String experimentName;
+
+ Variant variant;
+}
diff --git a/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/FetchBatchExperimentRequest.java b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/FetchBatchExperimentRequest.java
new file mode 100644
index 0000000..3ee410a
--- /dev/null
+++ b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/FetchBatchExperimentRequest.java
@@ -0,0 +1,20 @@
+package com.navi.medici.model.request.v1;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.FieldDefaults;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@FieldDefaults(level = AccessLevel.PRIVATE)
+public class FetchBatchExperimentRequest {
+ @JsonProperty("experiment_names")
+ List experimentNames;
+}
diff --git a/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/FetchBatchVariantRequest.java b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/FetchBatchVariantRequest.java
new file mode 100644
index 0000000..f2ffb90
--- /dev/null
+++ b/litmus-proxy/src/main/java/com/navi/medici/model/request/v1/FetchBatchVariantRequest.java
@@ -0,0 +1,20 @@
+package com.navi.medici.model.request.v1;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.FieldDefaults;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@FieldDefaults(level = AccessLevel.PRIVATE)
+public class FetchBatchVariantRequest {
+ @JsonProperty("experiment_names")
+ List experimentNames;
+}
diff --git a/litmus-proxy/src/main/java/com/navi/medici/service/LitmusService.java b/litmus-proxy/src/main/java/com/navi/medici/service/LitmusService.java
new file mode 100644
index 0000000..c05426b
--- /dev/null
+++ b/litmus-proxy/src/main/java/com/navi/medici/service/LitmusService.java
@@ -0,0 +1,17 @@
+package com.navi.medici.service;
+
+import com.navi.medici.model.request.v1.ExperimentResponse;
+import com.navi.medici.model.request.v1.ExperimentVariantResponse;
+import com.navi.medici.model.request.v1.FetchBatchExperimentRequest;
+import com.navi.medici.model.request.v1.FetchBatchVariantRequest;
+import java.util.List;
+
+public interface LitmusService {
+ List batchExperimentResponse(FetchBatchExperimentRequest fetchBatchExperimentRequest);
+
+ ExperimentResponse fetchExperimentResponse(String experimentName);
+
+ ExperimentVariantResponse fetchVariant(String experimentName);
+
+ List batchVariantResponse(FetchBatchVariantRequest fetchBatchVariantRequest);
+}
diff --git a/litmus-proxy/src/main/java/com/navi/medici/service/LitmusServiceImpl.java b/litmus-proxy/src/main/java/com/navi/medici/service/LitmusServiceImpl.java
new file mode 100644
index 0000000..dd5e39e
--- /dev/null
+++ b/litmus-proxy/src/main/java/com/navi/medici/service/LitmusServiceImpl.java
@@ -0,0 +1,61 @@
+package com.navi.medici.service;
+
+import com.navi.medici.litmus.Litmus;
+import com.navi.medici.model.request.v1.ExperimentResponse;
+import com.navi.medici.model.request.v1.ExperimentVariantResponse;
+import com.navi.medici.model.request.v1.FetchBatchExperimentRequest;
+import com.navi.medici.model.request.v1.FetchBatchVariantRequest;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Service;
+
+@Service
+@Log4j2
+public record LitmusServiceImpl(Litmus litmus) implements LitmusService {
+
+ @Override
+ public List batchExperimentResponse(FetchBatchExperimentRequest fetchBatchExperimentRequest) {
+ return fetchBatchExperimentRequest.getExperimentNames().stream().map(experimentName -> {
+ var result = litmus.isEnabled(experimentName);
+
+ return ExperimentResponse.builder()
+ .response(result)
+ .experimentName(experimentName)
+ .build();
+ }).collect(Collectors.toList());
+ }
+
+ @Override
+ public ExperimentResponse fetchExperimentResponse(String experimentName) {
+ var result = litmus.isEnabled(experimentName);
+ return ExperimentResponse.builder()
+ .experimentName(experimentName)
+ .response(result)
+ .build();
+ }
+
+ @Override
+ public ExperimentVariantResponse fetchVariant(String experimentName) {
+ var result = litmus.getVariant(experimentName);
+
+ return ExperimentVariantResponse.builder()
+ .variant(result)
+ .experimentName(experimentName)
+ .build();
+ }
+
+ @Override
+ public List batchVariantResponse(FetchBatchVariantRequest fetchBatchVariantRequest) {
+ return fetchBatchVariantRequest.getExperimentNames().stream().map(experimentName -> {
+ var result = litmus.getVariant(experimentName);
+
+ return ExperimentVariantResponse.builder()
+ .variant(result)
+ .experimentName(experimentName)
+ .build();
+ }).collect(Collectors.toList());
+ }
+
+
+}
diff --git a/litmus-proxy/src/main/resources/application.properties b/litmus-proxy/src/main/resources/application.properties
index 71cfc09..e3d7c36 100644
--- a/litmus-proxy/src/main/resources/application.properties
+++ b/litmus-proxy/src/main/resources/application.properties
@@ -11,3 +11,4 @@ management.metrics.kafka.producer.enabled=true
litmus.api.endpoint=${LITMUS_API_ENDPOINT:https://dev-litmus-core.np.navi-tech.in/litmus-core/v1}
clickstream.api.endpoint=${CLICK_STREAM_API_ENDPOINT:https://dev-janus.np.navi-tech.in/events/json}
+springdoc.swagger-ui.path=/swagger-ui.html
\ No newline at end of file
diff --git a/litmus-util/pom.xml b/litmus-util/pom.xml
index 07de400..69f98a2 100644
--- a/litmus-util/pom.xml
+++ b/litmus-util/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-util
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
litmus-util
diff --git a/pom.xml b/pom.xml
index c68199e..7505746 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.navi.medici
litmus
- 2.0.2-SNAPSHOT
+ 2.0.3-SNAPSHOT
pom
litmus