diff --git a/Dockerfile.core b/Dockerfile.core
index 38d79d6..fa591f6 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.4-RELEASE
+ARG ARTIFACT_VERSION=2.0.5-SNAPSHOT
RUN mkdir -p /build
WORKDIR /build
COPY . /build
@@ -7,7 +7,7 @@ RUN mvn clean install
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.4-RELEASE
+ARG ARTIFACT_VERSION=2.0.5-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 8a5204b..9e98941 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.4-RELEASE
+ARG ARTIFACT_VERSION=2.0.5-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.4-RELEASE
+ARG ARTIFACT_VERSION=2.0.5-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 8a45c62..786616e 100644
--- a/litmus-cache/pom.xml
+++ b/litmus-cache/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-cache
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-cache
diff --git a/litmus-client/pom.xml b/litmus-client/pom.xml
index 5c935c0..2e7dab0 100644
--- a/litmus-client/pom.xml
+++ b/litmus-client/pom.xml
@@ -5,11 +5,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-client
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-client
@@ -43,7 +43,7 @@
com.navi.medici
litmus-model
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
diff --git a/litmus-core/pom.xml b/litmus-core/pom.xml
index 8e6b500..7d1ce6e 100644
--- a/litmus-core/pom.xml
+++ b/litmus-core/pom.xml
@@ -5,11 +5,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-core
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-core
@@ -31,25 +31,25 @@
com.navi.medici
litmus-model
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
com.navi.medici
litmus-db
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
com.navi.medici
litmus-cache
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
com.navi.medici
litmus-util
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
@@ -57,17 +57,6 @@
spring-boot-starter-web
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- com.squareup.okhttp3
- okhttp
-
-
-
-
javax.servlet
javax.servlet-api
@@ -92,7 +81,6 @@
1.6.8
-
diff --git a/litmus-core/src/main/resources/application.properties b/litmus-core/src/main/resources/application.properties
index 13edcfe..fedceb4 100644
--- a/litmus-core/src/main/resources/application.properties
+++ b/litmus-core/src/main/resources/application.properties
@@ -1,5 +1,6 @@
server.servlet.context-path=/litmus-core
spring.main.banner-mode=off
+spring.application.name = litmus-core
server.port = ${PORT:12000}
spring.datasource.hikari.maximum-pool-size=${DB_POOL_MAX_SIZE:2}
spring.datasource.hikari.minimum-idle=${DB_POOL_MIN_IDLE:1}
diff --git a/litmus-db/pom.xml b/litmus-db/pom.xml
index 1460c9f..83e4404 100644
--- a/litmus-db/pom.xml
+++ b/litmus-db/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-db
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-db
@@ -27,7 +27,7 @@
com.navi.medici
litmus-model
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
diff --git a/litmus-liquibase/pom.xml b/litmus-liquibase/pom.xml
index 04d451a..ca18e55 100644
--- a/litmus-liquibase/pom.xml
+++ b/litmus-liquibase/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-liquibase
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-liquibase
diff --git a/litmus-mock/pom.xml b/litmus-mock/pom.xml
index 6626706..767da83 100644
--- a/litmus-mock/pom.xml
+++ b/litmus-mock/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-mock
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-mock
@@ -16,13 +16,13 @@
com.navi.medici
litmus-model
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
com.navi.medici
litmus-client
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
diff --git a/litmus-model/pom.xml b/litmus-model/pom.xml
index 6c672c2..a0c4d9d 100644
--- a/litmus-model/pom.xml
+++ b/litmus-model/pom.xml
@@ -5,11 +5,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-model
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-model
diff --git a/litmus-proxy/pom.xml b/litmus-proxy/pom.xml
index b0f64df..24fcd9d 100644
--- a/litmus-proxy/pom.xml
+++ b/litmus-proxy/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-proxy
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
jar
litmus-proxy
@@ -17,13 +17,19 @@
com.navi.medici
litmus-model
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
com.navi.medici
litmus-client
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
+
+
+
+ com.navi.medici
+ litmus-util
+ 2.0.5-SNAPSHOT
@@ -33,21 +39,16 @@
org.springframework.boot
- spring-boot-starter-actuator
-
-
- com.squareup.okhttp3
- okhttp
-
-
+ spring-boot-starter-test
+ test
+
org.springdoc
springdoc-openapi-ui
1.6.8
-
diff --git a/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java b/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java
index b146f0c..9e435e8 100644
--- a/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java
+++ b/litmus-proxy/src/main/java/com/navi/medici/LitmusProxyApp.java
@@ -2,8 +2,10 @@ package com.navi.medici;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
+@ComponentScan(basePackages = {"com.navi.medici"})
public class LitmusProxyApp {
public static void main(String[] args) {
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 b9e9369..c94ffce 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
@@ -5,6 +5,7 @@ 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;
@@ -18,10 +19,13 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/v1/proxy")
@Log4j2
-public record LitmusProxyController(Litmus litmus, LitmusService litmusService) {
+@RequiredArgsConstructor
+public class LitmusProxyController {
+
+ private final LitmusService litmusService;
@GetMapping(value = "/experiment", produces = MediaType.APPLICATION_JSON_VALUE)
- @Timed(value = "litmus.proxy.fetch.experiment", percentiles = {0.95, 0.99}, extraTags = {"mt", "fetch"} )
+ @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetch"} )
public ResponseEntity> fetch(@RequestParam("name") String experimentName) {
var result = litmusService.fetchExperimentResponse(experimentName);
@@ -29,7 +33,7 @@ public record LitmusProxyController(Litmus litmus, LitmusService litmusService)
}
@GetMapping(value = "/variant", produces = MediaType.APPLICATION_JSON_VALUE)
- @Timed(value = "litmus.proxy.fetch.experiment", percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchVariants"})
+ @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchVariants"})
public ResponseEntity> fetchVariants(@RequestParam("name") String variantName) {
var variant = litmusService.fetchVariant(variantName);
@@ -37,6 +41,7 @@ public record LitmusProxyController(Litmus litmus, LitmusService litmusService)
}
@PostMapping(value = "/batch/experiments", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchBatchExperiment"})
public ResponseEntity> fetchBatchExperiment(@RequestBody FetchBatchExperimentRequest fetchBatchExperimentRequest) {
var response = litmusService.batchExperimentResponse(fetchBatchExperimentRequest);
@@ -44,6 +49,7 @@ public record LitmusProxyController(Litmus litmus, LitmusService litmusService)
}
@PostMapping(value = "/batch/variants", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ @Timed(percentiles = {0.95, 0.99}, extraTags = {"mt", "fetchBatchVariantExperiment"})
public ResponseEntity> fetchBatchVariantExperiment(@RequestBody FetchBatchVariantRequest fetchBatchVariantRequest) {
var response = litmusService.batchVariantResponse(fetchBatchVariantRequest);
diff --git a/litmus-proxy/src/main/resources/application.properties b/litmus-proxy/src/main/resources/application.properties
index e3d7c36..4c72bfc 100644
--- a/litmus-proxy/src/main/resources/application.properties
+++ b/litmus-proxy/src/main/resources/application.properties
@@ -1,5 +1,7 @@
+spring.main.banner-mode=off
server.port=${PORT:13000}
server.servlet.context-path=/litmus-proxy
+spring.application.name = litmus-proxy
management.server.port=4001
management.endpoints.web.exposure.include=prometheus,health,info,metric,heapdump,threaddump
diff --git a/litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java b/litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java
new file mode 100644
index 0000000..7e7d9c4
--- /dev/null
+++ b/litmus-proxy/src/test/java/com/navi/medici/service/LitmusServiceImplTest.java
@@ -0,0 +1,90 @@
+package com.navi.medici.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+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 com.navi.medici.variants.Variant;
+import java.util.List;
+import junit.framework.TestCase;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LitmusServiceImplTest {
+ @Mock
+ Litmus litmus;
+
+ @InjectMocks
+ LitmusServiceImpl litmusService;
+
+ @Test
+ public void testBatchExperimentResponse() {
+ var request = FetchBatchExperimentRequest.builder()
+ .experimentNames(List.of("dummy-1", "dummy-2"))
+ .build();
+ var response = litmusService.batchExperimentResponse(request);
+
+ response.stream().map(ExperimentResponse::getResult).forEach(Assert::assertFalse);
+ }
+
+ @Test
+ public void testBatchExperimentResponse100Rollout() {
+ var request = FetchBatchExperimentRequest.builder()
+ .experimentNames(List.of("dummy-1", "dummy-2"))
+ .build();
+ when(litmus.isEnabled(anyString())).thenReturn(true);
+
+ var response = litmusService.batchExperimentResponse(request);
+
+ response.stream().map(ExperimentResponse::getResult).forEach(Assert::assertTrue);
+ }
+
+ @Test
+ public void testSingleExperimentResponse() {
+ when(litmus.isEnabled(anyString())).thenReturn(true);
+
+ var response = litmusService.fetchExperimentResponse("random-string");
+
+ assertTrue(response.getResult());
+ }
+
+ @Test
+ public void testVariant() {
+ when(litmus.getVariant(anyString())).thenReturn(Variant.builder()
+ .name("test-variant-name")
+ .build());
+
+ var response = litmusService.fetchVariant("random-variant");
+
+ assertEquals(response.getVariant().getName(), "test-variant-name");
+ }
+
+ @Test
+ public void testBatchVariant() {
+ var request = FetchBatchVariantRequest.builder()
+ .experimentNames(List.of("dummy-1", "dummy-2"))
+ .build();
+
+ when(litmus.getVariant(anyString())).thenReturn(Variant.builder().build());
+ var response = litmusService.batchVariantResponse(request);
+
+ response.stream()
+ .map(ExperimentVariantResponse::getVariant)
+ .map(Variant::isEnabled)
+ .forEach(Assert::assertFalse);
+
+
+ }
+}
\ No newline at end of file
diff --git a/litmus-util/pom.xml b/litmus-util/pom.xml
index 1bca6a1..96272b7 100644
--- a/litmus-util/pom.xml
+++ b/litmus-util/pom.xml
@@ -4,11 +4,11 @@
litmus
com.navi.medici
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-util
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
litmus-util
@@ -16,13 +16,19 @@
io.micrometer
micrometer-registry-prometheus
- 1.7.0
+ 1.9.0
org.springframework.boot
spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
diff --git a/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java b/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java
index 3a1a8af..faaf1cf 100644
--- a/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java
+++ b/litmus-util/src/main/java/com/navi/medici/metrics/MetricsRegistry.java
@@ -3,21 +3,27 @@ package com.navi.medici.metrics;
import com.navi.medici.exceptions.LitmusException;
import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.MeterRegistry;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
-@Component
+@Configuration
public class MetricsRegistry {
+ @Value("${spring.application.name}")
+ private String appName;
+
@Bean
MeterRegistryCustomizer metricsCommonTags() {
InetAddress inetAddress = inetAddress();
return registry -> registry.config()
- .commonTags("app.name", "litmus")
+ .commonTags("app.name", appName)
.commonTags("host.ip", inetAddress.getHostAddress().trim())
.commonTags("host.name", inetAddress.getHostName().trim());
}
diff --git a/pom.xml b/pom.xml
index 9eb40e5..0f47296 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.navi.medici
litmus
- 2.0.4-RELEASE
+ 2.0.5-SNAPSHOT
pom
litmus