diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..00df371
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,15 @@
+@Library('jenkins-ci-automation@master') _
+
+BlibliPipeline ([
+ type : "java",
+ modules: [
+ Docker: null,
+ Analysis: null
+ ],
+ deploy_branch_regex : "(master|release/.+)",
+ application : [
+ tribe : "rnd",
+ squad : "backend",
+ service_name : "blibli-backend-framework"
+ ]
+])
\ No newline at end of file
diff --git a/blibli-backend-framework-aggregate-query/pom.xml b/blibli-backend-framework-aggregate-query/pom.xml
index b9fd997..28380cd 100644
--- a/blibli-backend-framework-aggregate-query/pom.xml
+++ b/blibli-backend-framework-aggregate-query/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-api-client/pom.xml b/blibli-backend-framework-api-client/pom.xml
index c6fe6b7..dfd1a23 100644
--- a/blibli-backend-framework-api-client/pom.xml
+++ b/blibli-backend-framework-api-client/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
@@ -19,7 +19,6 @@
com.blibli.oss
blibli-backend-framework-sleuth
- provided
org.springframework
diff --git a/blibli-backend-framework-api-client/src/main/java/com/blibli/oss/backend/apiclient/sleuth/SleuthGlobalApiClientInterceptor.java b/blibli-backend-framework-api-client/src/main/java/com/blibli/oss/backend/apiclient/sleuth/SleuthGlobalApiClientInterceptor.java
index c1cd239..d8c53aa 100644
--- a/blibli-backend-framework-api-client/src/main/java/com/blibli/oss/backend/apiclient/sleuth/SleuthGlobalApiClientInterceptor.java
+++ b/blibli-backend-framework-api-client/src/main/java/com/blibli/oss/backend/apiclient/sleuth/SleuthGlobalApiClientInterceptor.java
@@ -1,7 +1,7 @@
package com.blibli.oss.backend.apiclient.sleuth;
import brave.Tracer;
-import brave.propagation.ExtraFieldPropagation;
+import brave.baggage.BaggageField;
import com.blibli.oss.backend.apiclient.interceptor.GlobalApiClientInterceptor;
import com.blibli.oss.backend.apiclient.properties.ApiClientProperties;
import com.blibli.oss.backend.sleuth.configuration.SleuthConfiguration;
@@ -23,7 +23,7 @@ public Mono filter(ClientRequest request, ExchangeFunction next)
if (properties.getSleuth().isEnabled() && tracer.currentSpan() != null) {
return Mono.fromCallable(() -> {
ClientRequest.Builder builder = ClientRequest.from(request);
- ExtraFieldPropagation.getAll(tracer.currentSpan().context()).forEach((key, value) -> {
+ BaggageField.getAllValues(tracer.currentSpan().context()).forEach((key, value) -> {
builder.header(SleuthConfiguration.HTTP_BAGGAGE_PREFIX + key, value);
});
return builder.build();
diff --git a/blibli-backend-framework-api-client/src/test/java/com/blibli/oss/backend/apiclient/controller/SleuthController.java b/blibli-backend-framework-api-client/src/test/java/com/blibli/oss/backend/apiclient/controller/SleuthController.java
index b236b9c..3c52be1 100644
--- a/blibli-backend-framework-api-client/src/test/java/com/blibli/oss/backend/apiclient/controller/SleuthController.java
+++ b/blibli-backend-framework-api-client/src/test/java/com/blibli/oss/backend/apiclient/controller/SleuthController.java
@@ -1,7 +1,7 @@
package com.blibli.oss.backend.apiclient.controller;
import brave.Tracer;
-import brave.propagation.ExtraFieldPropagation;
+import brave.baggage.BaggageField;
import com.blibli.oss.backend.apiclient.client.SleuthApiClient;
import com.blibli.oss.backend.apiclient.client.model.GenericResponse;
import com.blibli.oss.backend.sleuth.configuration.SleuthConfiguration;
@@ -33,8 +33,8 @@ public class SleuthController {
)
public Mono
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
org.springframework.kafka
spring-kafka
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/KafkaAutoConfiguration.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/KafkaAutoConfiguration.java
index c603231..3ce48dc 100644
--- a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/KafkaAutoConfiguration.java
+++ b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/KafkaAutoConfiguration.java
@@ -3,25 +3,22 @@
import com.blibli.oss.backend.kafka.interceptor.InterceptorUtil;
import com.blibli.oss.backend.kafka.interceptor.log.LogKafkaConsumerInterceptor;
import com.blibli.oss.backend.kafka.interceptor.log.LogKafkaProducerInterceptor;
-import com.blibli.oss.backend.kafka.listener.KafkaListenerBeanProcessor;
+import com.blibli.oss.backend.kafka.listener.aspectj.KafkaListenerAspect;
import com.blibli.oss.backend.kafka.producer.KafkaProducer;
import com.blibli.oss.backend.kafka.properties.KafkaProperties;
import com.blibli.oss.backend.kafka.repository.KafkaProducerAwareBeanProcessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Setter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.kafka.config.KafkaListenerConfigUtils;
-import org.springframework.kafka.config.KafkaListenerEndpointRegistry;
import org.springframework.kafka.core.KafkaTemplate;
@Configuration
-@EnableConfigurationProperties({
- KafkaProperties.class
-})
+@EnableConfigurationProperties({KafkaProperties.class})
public class KafkaAutoConfiguration implements ApplicationContextAware {
@Setter
@@ -51,15 +48,10 @@ public KafkaProducerAwareBeanProcessor kafkaProducerAwareBeanProcessor(KafkaProd
return new KafkaProducerAwareBeanProcessor(kafkaProducer);
}
- @SuppressWarnings("rawtypes")
- @Bean(KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
- public KafkaListenerBeanProcessor kafkaListenerBeanProcessor() {
- return new KafkaListenerBeanProcessor();
- }
-
- @Bean(KafkaListenerConfigUtils.KAFKA_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME)
- public KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry() {
- return new KafkaListenerEndpointRegistry();
+ @Bean
+ @ConditionalOnProperty(value = "blibli.backend.kafka.aspectj", havingValue = "true", matchIfMissing = true)
+ public KafkaListenerAspect kafkaListenerAspect() {
+ return new KafkaListenerAspect();
}
}
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/interceptor/InterceptorUtil.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/interceptor/InterceptorUtil.java
index c1c3e3d..7c3693a 100644
--- a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/interceptor/InterceptorUtil.java
+++ b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/interceptor/InterceptorUtil.java
@@ -1,14 +1,17 @@
package com.blibli.oss.backend.kafka.interceptor;
import com.blibli.oss.backend.kafka.model.ProducerEvent;
+import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.core.OrderComparator;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+@Slf4j
public final class InterceptorUtil {
public static ProducerEvent fireBeforeSend(ProducerEvent producerEvent, List producerInterceptors) {
@@ -19,24 +22,42 @@ public static ProducerEvent fireBeforeSend(ProducerEvent producerEvent, List producerEvent, List producerInterceptors) {
- for (KafkaConsumerInterceptor interceptor : producerInterceptors) {
- if (interceptor.beforeConsume(producerEvent)) {
- return true;
+ public static boolean fireBeforeConsume(Object bean, Method method, List kafkaConsumerInterceptors, ConsumerRecord event) {
+ for (KafkaConsumerInterceptor interceptor : kafkaConsumerInterceptors) {
+ try {
+ if (interceptor.isSupport(bean, method)) {
+ if (interceptor.beforeConsume(event)) {
+ return true;
+ }
+ }
+ } catch (Throwable throwable) {
+ log.error("Error while invoke interceptor", throwable);
}
}
return false;
}
- public static void fireAfterSuccessConsume(ConsumerRecord producerEvent, List producerInterceptors) {
- for (KafkaConsumerInterceptor interceptor : producerInterceptors) {
- interceptor.afterSuccessConsume(producerEvent);
+ public static void fireAfterSuccessConsume(Object bean, Method method, List kafkaConsumerInterceptors, ConsumerRecord event) {
+ for (KafkaConsumerInterceptor interceptor : kafkaConsumerInterceptors) {
+ try {
+ if (interceptor.isSupport(bean, method)) {
+ interceptor.afterSuccessConsume(event);
+ }
+ } catch (Throwable throwable) {
+ log.error("Error while invoke interceptor", throwable);
+ }
}
}
- public static void fireAfterErrorConsume(ConsumerRecord producerEvent, Throwable throwable, List producerInterceptors) {
- for (KafkaConsumerInterceptor interceptor : producerInterceptors) {
- interceptor.afterFailedConsume(producerEvent, throwable);
+ public static void fireAfterErrorConsume(Object bean, Method method, List kafkaConsumerInterceptors, ConsumerRecord event, Throwable throwable) {
+ for (KafkaConsumerInterceptor interceptor : kafkaConsumerInterceptors) {
+ try {
+ if (interceptor.isSupport(bean, method)) {
+ interceptor.afterFailedConsume(event, throwable);
+ }
+ } catch (Throwable e) {
+ log.error("Error while invoke interceptor", e);
+ }
}
}
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaListenerBeanProcessor.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaListenerBeanProcessor.java
deleted file mode 100644
index d47f697..0000000
--- a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaListenerBeanProcessor.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.blibli.oss.backend.kafka.listener;
-
-import org.springframework.aop.framework.Advised;
-import org.springframework.aop.support.AopUtils;
-import org.springframework.kafka.annotation.KafkaListener;
-import org.springframework.kafka.annotation.KafkaListenerAnnotationBeanPostProcessor;
-import org.springframework.util.ReflectionUtils;
-
-import java.lang.reflect.Method;
-
-public class KafkaListenerBeanProcessor extends KafkaListenerAnnotationBeanPostProcessor {
-
- @Override
- protected void processKafkaListener(KafkaListener kafkaListener, Method method, Object bean, String beanName) {
- Method methodToUse = checkProxy(method, bean);
- KafkaListenerEndpoint endpoint = new KafkaListenerEndpoint();
- endpoint.setMethod(methodToUse);
- processListener(endpoint, kafkaListener, bean, methodToUse, beanName);
- }
-
- private Method checkProxy(Method methodArg, Object bean) {
- Method method = methodArg;
- if (AopUtils.isJdkDynamicProxy(bean)) {
- try {
- // Found a @KafkaListener method on the target class for this JDK proxy ->
- // is it also present on the proxy itself?
- method = bean.getClass().getMethod(method.getName(), method.getParameterTypes());
- Class>[] proxiedInterfaces = ((Advised) bean).getProxiedInterfaces();
- for (Class> iface : proxiedInterfaces) {
- try {
- method = iface.getMethod(method.getName(), method.getParameterTypes());
- break;
- } catch (@SuppressWarnings("unused") NoSuchMethodException noMethod) {
- // NOSONAR
- }
- }
- } catch (SecurityException ex) {
- ReflectionUtils.handleReflectionException(ex);
- } catch (NoSuchMethodException ex) {
- throw new IllegalStateException(String.format(
- "@KafkaListener method '%s' found on bean target class '%s', " +
- "but not found in any interface(s) for bean JDK proxy. Either " +
- "pull the method up to an interface or switch to subclass (CGLIB) " +
- "proxies by setting proxy-target-class/proxyTargetClass " +
- "attribute to 'true'", method.getName(),
- method.getDeclaringClass().getSimpleName()), ex);
- }
- }
- return method;
- }
-}
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaListenerEndpoint.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaListenerEndpoint.java
deleted file mode 100644
index 2163785..0000000
--- a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaListenerEndpoint.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.blibli.oss.backend.kafka.listener;
-
-import com.blibli.oss.backend.kafka.interceptor.InterceptorUtil;
-import com.blibli.oss.backend.kafka.interceptor.KafkaConsumerInterceptor;
-import org.springframework.beans.factory.ListableBeanFactory;
-import org.springframework.kafka.config.MethodKafkaListenerEndpoint;
-import org.springframework.kafka.listener.KafkaListenerErrorHandler;
-import org.springframework.kafka.listener.adapter.BatchMessagingMessageListenerAdapter;
-import org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter;
-import org.springframework.kafka.support.converter.BatchMessageConverter;
-import org.springframework.kafka.support.converter.MessageConverter;
-import org.springframework.kafka.support.converter.RecordMessageConverter;
-
-import java.util.Collections;
-import java.util.List;
-
-public class KafkaListenerEndpoint extends MethodKafkaListenerEndpoint {
-
- private KafkaListenerErrorHandler errorHandler;
-
- @Override
- public void setErrorHandler(KafkaListenerErrorHandler errorHandler) {
- super.setErrorHandler(errorHandler);
- this.errorHandler = errorHandler;
- }
-
- @Override
- protected MessagingMessageListenerAdapter createMessageListenerInstance(MessageConverter messageConverter) {
- MessagingMessageListenerAdapter listener;
- if (isBatchListener()) {
- BatchMessagingMessageListenerAdapter messageListener = new BatchMessagingMessageListenerAdapter<>(getBean(), getMethod(), this.errorHandler);
- if (messageConverter instanceof BatchMessageConverter) {
- messageListener.setBatchMessageConverter((BatchMessageConverter) messageConverter);
- }
- listener = messageListener;
- } else {
- List interceptors = Collections.emptyList();
- if (getBeanFactory() instanceof ListableBeanFactory) {
- ListableBeanFactory listableBeanFactory = (ListableBeanFactory) getBeanFactory();
- interceptors = InterceptorUtil.getConsumerInterceptors(listableBeanFactory);
- }
- KafkaMessageListener messageListener = new KafkaMessageListener(getBean(), getMethod(), this.errorHandler, interceptors);
- if (messageConverter instanceof RecordMessageConverter) {
- messageListener.setMessageConverter((RecordMessageConverter) messageConverter);
- }
- listener = messageListener;
- }
- if (getBeanResolver() != null) {
- listener.setBeanResolver(getBeanResolver());
- }
- return listener;
- }
-}
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaMessageListener.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaMessageListener.java
deleted file mode 100644
index 8596083..0000000
--- a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/KafkaMessageListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.blibli.oss.backend.kafka.listener;
-
-import com.blibli.oss.backend.kafka.interceptor.InterceptorUtil;
-import com.blibli.oss.backend.kafka.interceptor.KafkaConsumerInterceptor;
-import org.apache.kafka.clients.consumer.Consumer;
-import org.apache.kafka.clients.consumer.ConsumerRecord;
-import org.springframework.kafka.listener.KafkaListenerErrorHandler;
-import org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter;
-import org.springframework.kafka.support.Acknowledgment;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class KafkaMessageListener extends RecordMessagingMessageListenerAdapter {
-
- private final List interceptors;
-
- public KafkaMessageListener(Object bean, Method method, KafkaListenerErrorHandler errorHandler, List interceptors) {
- super(bean, method, errorHandler);
- this.interceptors = getSupportedKafkaConsumerInterceptors(bean, method, interceptors);
- }
-
- private List getSupportedKafkaConsumerInterceptors(Object bean, Method method, List interceptors) {
- return interceptors.stream()
- .filter(interceptor -> interceptor.isSupport(bean, method))
- .collect(Collectors.toList());
- }
-
- @Override
- public void onMessage(ConsumerRecord record, Acknowledgment acknowledgment, Consumer, ?> consumer) {
- try {
- boolean skip = InterceptorUtil.fireBeforeConsume(record, interceptors);
- if (!skip) super.onMessage(record, acknowledgment, consumer);
- InterceptorUtil.fireAfterSuccessConsume(record, interceptors);
- } catch (Throwable throwable) {
- InterceptorUtil.fireAfterErrorConsume(record, throwable, interceptors);
- throw throwable;
- }
- }
-}
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/aspectj/KafkaListenerAspect.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/aspectj/KafkaListenerAspect.java
new file mode 100644
index 0000000..0fc6a6e
--- /dev/null
+++ b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/listener/aspectj/KafkaListenerAspect.java
@@ -0,0 +1,100 @@
+package com.blibli.oss.backend.kafka.listener.aspectj;
+
+import com.blibli.oss.backend.kafka.interceptor.InterceptorUtil;
+import com.blibli.oss.backend.kafka.interceptor.KafkaConsumerInterceptor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.core.OrderComparator;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Aspect
+public class KafkaListenerAspect implements ApplicationContextAware, InitializingBean {
+
+ private List kafkaConsumerInterceptors;
+
+ @Setter
+ private ApplicationContext applicationContext;
+
+
+ @Around(value = "@annotation(org.springframework.kafka.annotation.KafkaListener)")
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ if (isConsumerRecordArgument(joinPoint) && joinPoint.getSignature() instanceof MethodSignature) {
+
+ ConsumerRecord record = getConsumerRecord(joinPoint);
+
+ Object bean = joinPoint.getTarget();
+ Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
+
+ try {
+ if (InterceptorUtil.fireBeforeConsume(bean, method, kafkaConsumerInterceptors, record)) {
+ return null; // cancel process
+ } else {
+ Object response = joinPoint.proceed(joinPoint.getArgs());
+ InterceptorUtil.fireAfterSuccessConsume(bean, method, kafkaConsumerInterceptors, record);
+ return response;
+ }
+ } catch (Throwable throwable) {
+ InterceptorUtil.fireAfterErrorConsume(bean, method, kafkaConsumerInterceptors, record, throwable);
+ throw throwable;
+ }
+ } else {
+ return joinPoint.proceed(joinPoint.getArgs());
+ }
+ }
+
+ private boolean isConsumerRecordArgument(ProceedingJoinPoint joinPoint) {
+ Object[] arguments = joinPoint.getArgs();
+ if (arguments == null || arguments.length == 0) {
+ return false;
+ }
+
+ for (Object o : joinPoint.getArgs()) {
+ if (o instanceof ConsumerRecord) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ private ConsumerRecord getConsumerRecord(ProceedingJoinPoint joinPoint) {
+ for (Object arg : joinPoint.getArgs()) {
+ if (arg instanceof ConsumerRecord) {
+ return (ConsumerRecord) arg;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ this.kafkaConsumerInterceptors = getKafkaConsumerInterceptors();
+ }
+
+ public List getKafkaConsumerInterceptors() {
+ List interceptors = Collections.emptyList();
+
+ Map beans = applicationContext.getBeansOfType(KafkaConsumerInterceptor.class);
+ if (!beans.isEmpty()) {
+ interceptors = new ArrayList<>(beans.values());
+ }
+
+ OrderComparator.sort(interceptors);
+ return interceptors;
+ }
+}
diff --git a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/properties/KafkaProperties.java b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/properties/KafkaProperties.java
index 32eb2d7..2f53b87 100644
--- a/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/properties/KafkaProperties.java
+++ b/blibli-backend-framework-kafka/src/main/java/com/blibli/oss/backend/kafka/properties/KafkaProperties.java
@@ -13,6 +13,8 @@
@ConfigurationProperties("blibli.backend.kafka")
public class KafkaProperties {
+ private boolean aspectj = true;
+
private LoggingProperties logging = new LoggingProperties();
@Data
diff --git a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/consumer/KafkaConsumerInterceptorTest.java b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/consumer/KafkaConsumerInterceptorTest.java
index a4b9a11..64da459 100644
--- a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/consumer/KafkaConsumerInterceptorTest.java
+++ b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/consumer/KafkaConsumerInterceptorTest.java
@@ -8,10 +8,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -25,13 +22,16 @@
import reactor.core.scheduler.Schedulers;
import java.lang.reflect.Method;
+import java.util.Collections;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = KafkaConsumerInterceptorTest.Application.class)
@EmbeddedKafka(
+ partitions = 1,
topics = {KafkaConsumerInterceptorTest.TOPIC, KafkaConsumerInterceptorTest.TOPIC_GOODBYE}
)
@DirtiesContext
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class KafkaConsumerInterceptorTest {
public static final String TOPIC = "KafkaConsumerInterceptorTest";
@@ -58,7 +58,7 @@ class KafkaConsumerInterceptorTest {
@BeforeEach
void setUp() {
consumer = KafkaHelper.newConsumer(broker);
- broker.consumeFromEmbeddedTopics(consumer, TOPIC);
+ consumer.subscribe(Collections.singletonList(TOPIC));
helloInterceptor.reset();
counterInterceptor.reset();
@@ -70,14 +70,15 @@ void tearDown() {
}
@Test
+ @Order(4)
void testListener() throws InterruptedException {
- kafkaProducer.sendAndSubscribe(TOPIC, "key", "value", Schedulers.elastic());
+ kafkaProducer.sendAndSubscribe(TOPIC, "key", "value", Schedulers.boundedElastic());
Thread.sleep(2_000L); // wait 5 seconds until message received by listener
- Assertions.assertEquals(helloListener.key, "key");
- Assertions.assertEquals(helloListener.value, "value");
+ Assertions.assertEquals(helloListener.getKey(), "key");
+ Assertions.assertEquals(helloListener.getValue(), "value");
- kafkaProducer.sendAndSubscribe(TOPIC, "key", "value", Schedulers.elastic());
+ kafkaProducer.sendAndSubscribe(TOPIC, "key", "value", Schedulers.boundedElastic());
Thread.sleep(2_000L); // wait 5 seconds until message received by listener
Assertions.assertEquals(helloInterceptor.beforeConsume, "value");
@@ -87,8 +88,19 @@ void testListener() throws InterruptedException {
}
@Test
+ @Order(3)
+ void testListenerWithInterceptor() throws InterruptedException {
+ kafkaProducer.sendAndSubscribe(TOPIC_GOODBYE, "key", "value", Schedulers.boundedElastic());
+ Thread.sleep(4_000L); // wait 5 seconds until message received by listener
+
+ Assertions.assertEquals(1, counterInterceptor.getBeforeConsume());
+ Assertions.assertEquals(1, counterInterceptor.getAfterSuccessConsume());
+ }
+
+ @Test
+ @Order(2)
void testInterceptorError() throws InterruptedException {
- kafkaProducer.sendAndSubscribe(TOPIC, "error", "value", Schedulers.elastic());
+ kafkaProducer.sendAndSubscribe(TOPIC, "error", "value", Schedulers.boundedElastic());
Thread.sleep(2_000L); // wait 5 seconds until message received by listener
Assertions.assertEquals(helloInterceptor.beforeConsume, "value");
@@ -98,8 +110,9 @@ void testInterceptorError() throws InterruptedException {
}
@Test
+ @Order(1)
void testInterceptorSkip() throws InterruptedException {
- kafkaProducer.sendAndSubscribe(TOPIC, "skip", "value", Schedulers.elastic());
+ kafkaProducer.sendAndSubscribe(TOPIC, "skip", "value", Schedulers.boundedElastic());
Thread.sleep(2_000L); // wait 5 seconds until message received by listener
Assertions.assertNotEquals(helloListener.value, "skip");
@@ -107,15 +120,6 @@ void testInterceptorSkip() throws InterruptedException {
Assertions.assertEquals(0, counterInterceptor.getAfterSuccessConsume());
}
- @Test
- void testInterceptorIsSupported() throws InterruptedException {
- kafkaProducer.sendAndSubscribe(TOPIC_GOODBYE, "key", "value", Schedulers.elastic());
- Thread.sleep(4_000L); // wait 5 seconds until message received by listener
-
- Assertions.assertEquals(1, counterInterceptor.getBeforeConsume());
- Assertions.assertEquals(1, counterInterceptor.getAfterSuccessConsume());
- }
-
@SpringBootApplication
public static class Application {
diff --git a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/producer/KafkaProducerInterceptorTest.java b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/producer/KafkaProducerInterceptorTest.java
index 8b8ca51..e0aac31 100644
--- a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/producer/KafkaProducerInterceptorTest.java
+++ b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/interceptor/producer/KafkaProducerInterceptorTest.java
@@ -26,6 +26,8 @@
import reactor.core.scheduler.Schedulers;
import reactor.test.StepVerifier;
+import java.util.Collections;
+
import static org.junit.jupiter.api.Assertions.*;
@ExtendWith(SpringExtension.class)
@@ -52,7 +54,7 @@ class KafkaProducerInterceptorTest {
@BeforeEach
void setUp() {
consumer = KafkaHelper.newConsumer(broker);
- broker.consumeFromEmbeddedTopics(consumer, TOPIC);
+ consumer.subscribe(Collections.singletonList(TOPIC));
}
@AfterEach
@@ -63,7 +65,7 @@ void tearDown() {
@Test
void testInterceptor() {
errorFlag.setError(false);
- kafkaProducer.sendAndSubscribe(TOPIC, "key", "value", Schedulers.elastic());
+ kafkaProducer.sendAndSubscribe(TOPIC, "key", "value", Schedulers.boundedElastic());
ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, TOPIC);
diff --git a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/producer/KafkaProducerTest.java b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/producer/KafkaProducerTest.java
index fe7f903..0bf5e1f 100644
--- a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/producer/KafkaProducerTest.java
+++ b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/producer/KafkaProducerTest.java
@@ -20,6 +20,9 @@
import org.springframework.test.context.junit.jupiter.SpringExtension;
import reactor.core.scheduler.Schedulers;
+import java.util.Arrays;
+import java.util.Collections;
+
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = KafkaProducerTest.Application.class)
@EmbeddedKafka(
@@ -29,7 +32,7 @@
@DirtiesContext
class KafkaProducerTest {
- public static final String SAMPLE_TOPIC = "SAMPLE_TOPIC";
+ public static final String SAMPLE_TOPIC = "HELLO";
@Autowired
private KafkaProducer kafkaProducer;
@@ -42,7 +45,7 @@ class KafkaProducerTest {
@BeforeEach
void setUp() {
consumer = KafkaHelper.newConsumer(broker);
- broker.consumeFromEmbeddedTopics(consumer, SAMPLE_TOPIC);
+ consumer.subscribe(Collections.singletonList(SAMPLE_TOPIC));
}
@AfterEach
@@ -52,45 +55,45 @@ void tearDown() {
@Test
void testSendSuccess() {
- kafkaProducer.send(SAMPLE_TOPIC, "key", "kafka value").subscribe();
- ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC);
+ kafkaProducer.send(SAMPLE_TOPIC, "key 1", "kafka value 1").subscribe();
+ ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC, 5000L);
- Assertions.assertEquals(record.key(), "key");
- Assertions.assertEquals(record.value(), "kafka value");
+ Assertions.assertEquals(record.key(), "key 1");
+ Assertions.assertEquals(record.value(), "kafka value 1");
}
@Test
void testSendLazy() {
Assertions.assertThrows(IllegalStateException.class, () -> {
- kafkaProducer.send(SAMPLE_TOPIC, "key", "kafka value"); // not subscribe it
+ kafkaProducer.send(SAMPLE_TOPIC, "key 2", "kafka value 2"); // not subscribe it
ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC, 5_000L);
});
}
@Test
void testSendOn() {
- kafkaProducer.sendOn(SAMPLE_TOPIC, "key", "kafka value", Schedulers.elastic()).subscribe();
- ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC);
+ kafkaProducer.sendOn(SAMPLE_TOPIC, "key 3", "kafka value 3", Schedulers.boundedElastic()).subscribe();
+ ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC, 5000L);
- Assertions.assertEquals(record.key(), "key");
- Assertions.assertEquals(record.value(), "kafka value");
+ Assertions.assertEquals(record.key(), "key 3");
+ Assertions.assertEquals(record.value(), "kafka value 3");
}
@Test
void testSendOnLazy() {
Assertions.assertThrows(IllegalStateException.class, () -> {
- kafkaProducer.sendOn(SAMPLE_TOPIC, "key", "kafka value", Schedulers.elastic()); // not subscribe it
+ kafkaProducer.sendOn(SAMPLE_TOPIC, "key 4", "kafka value 4", Schedulers.boundedElastic()); // not subscribe it
ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC, 5_000L);
});
}
@Test
void testSendAndSubscribe() {
- kafkaProducer.sendAndSubscribe(SAMPLE_TOPIC, "key", "kafka value", Schedulers.elastic());
- ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC);
+ kafkaProducer.sendAndSubscribe(SAMPLE_TOPIC, "key 5", "kafka value 5", Schedulers.boundedElastic());
+ ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, SAMPLE_TOPIC, 5000L);
- Assertions.assertEquals(record.key(), "key");
- Assertions.assertEquals(record.value(), "kafka value");
+ Assertions.assertEquals(record.key(), "key 5");
+ Assertions.assertEquals(record.value(), "kafka value 5");
}
@SpringBootApplication
diff --git a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/repository/KafkaRepositoryTest.java b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/repository/KafkaRepositoryTest.java
index dd85ef9..fc60bf3 100644
--- a/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/repository/KafkaRepositoryTest.java
+++ b/blibli-backend-framework-kafka/src/test/java/com/blibli/oss/backend/kafka/repository/KafkaRepositoryTest.java
@@ -27,6 +27,8 @@
import org.springframework.test.context.junit.jupiter.SpringExtension;
import reactor.core.scheduler.Schedulers;
+import java.util.Collections;
+
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = KafkaRepositoryTest.Application.class)
@EmbeddedKafka(
@@ -54,7 +56,7 @@ public class KafkaRepositoryTest {
@BeforeEach
void setUp() {
consumer = KafkaHelper.newConsumer(broker);
- broker.consumeFromEmbeddedTopics(consumer, TOPIC);
+ consumer.subscribe(Collections.singletonList(TOPIC));
}
@AfterEach
@@ -64,7 +66,7 @@ void tearDown() {
@Test
void testProductSuccess() throws JsonProcessingException {
- productKafkaRepository.sendAndSubscribe(Product.builder().id("id").name("name").build(), Schedulers.elastic());
+ productKafkaRepository.sendAndSubscribe(Product.builder().id("id").name("name").build(), Schedulers.boundedElastic());
ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, TOPIC);
Assertions.assertEquals(record.key(), "id");
@@ -72,7 +74,7 @@ void testProductSuccess() throws JsonProcessingException {
Assertions.assertEquals(product.getId(), "id");
Assertions.assertEquals(product.getName(), "name");
- productKafkaRepository.sendAndSubscribe(Product.builder().id("id").name("name").build(), Schedulers.elastic());
+ productKafkaRepository.sendAndSubscribe(Product.builder().id("id").name("name").build(), Schedulers.boundedElastic());
record = KafkaTestUtils.getSingleRecord(consumer, TOPIC);
Assertions.assertEquals(record.key(), "id");
@@ -83,7 +85,7 @@ record = KafkaTestUtils.getSingleRecord(consumer, TOPIC);
@Test
void testCustomerSuccess() throws JsonProcessingException {
- customerKafkaRepository.sendAndSubscribe(Customer.builder().id("id").name("name").build(), Schedulers.elastic());
+ customerKafkaRepository.sendAndSubscribe(Customer.builder().id("id").name("name").build(), Schedulers.boundedElastic());
ConsumerRecord record = KafkaTestUtils.getSingleRecord(consumer, TOPIC);
Assertions.assertEquals(record.key(), "id");
diff --git a/blibli-backend-framework-kafka/src/test/resources/application.properties b/blibli-backend-framework-kafka/src/test/resources/application.properties
index acfa050..6646704 100644
--- a/blibli-backend-framework-kafka/src/test/resources/application.properties
+++ b/blibli-backend-framework-kafka/src/test/resources/application.properties
@@ -1,6 +1,9 @@
spring.kafka.bootstrap-servers=${spring.embedded.kafka.brokers}
spring.kafka.consumer.group-id=test
+blibli.backend.kafka.aspectj=true
blibli.backend.kafka.logging.before-send=true
blibli.backend.kafka.logging.before-consume=true
blibli.backend.kafka.logging.after-success-consume=true
-blibli.backend.kafka.logging.after-failed-consume=true
\ No newline at end of file
+blibli.backend.kafka.logging.after-failed-consume=true
+
+logging.level.org.springframework.kafka.test=debug
\ No newline at end of file
diff --git a/blibli-backend-framework-mandatory-parameter/pom.xml b/blibli-backend-framework-mandatory-parameter/pom.xml
index e60f2cf..55b55a4 100644
--- a/blibli-backend-framework-mandatory-parameter/pom.xml
+++ b/blibli-backend-framework-mandatory-parameter/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/MandatoryParameterHelper.java b/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/MandatoryParameterHelper.java
index c0a2564..98ff732 100644
--- a/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/MandatoryParameterHelper.java
+++ b/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/MandatoryParameterHelper.java
@@ -1,6 +1,6 @@
package com.blibli.oss.backend.mandatoryparameter.helper;
-import brave.propagation.ExtraFieldPropagation;
+import brave.baggage.BaggageField;
import brave.propagation.TraceContext;
import com.blibli.oss.backend.mandatoryparameter.model.MandatoryParameter;
import com.blibli.oss.backend.mandatoryparameter.sleuth.MandatoryParameterSleuth;
@@ -18,11 +18,11 @@ public static MandatoryParameter toSleuth(TraceContext traceContext, MandatoryPa
public static MandatoryParameter fromSleuth(TraceContext traceContext) {
return MandatoryParameter.builder()
- .storeId(ExtraFieldPropagation.get(traceContext, MandatoryParameterSleuth.STORE_ID))
- .clientId(ExtraFieldPropagation.get(traceContext, MandatoryParameterSleuth.CLIENT_ID))
- .channelId(ExtraFieldPropagation.get(traceContext, MandatoryParameterSleuth.CHANNEL_ID))
- .requestId(ExtraFieldPropagation.get(traceContext, MandatoryParameterSleuth.REQUEST_ID))
- .username(ExtraFieldPropagation.get(traceContext, MandatoryParameterSleuth.USERNAME))
+ .storeId(BaggageField.getByName(traceContext, MandatoryParameterSleuth.STORE_ID).getValue(traceContext))
+ .clientId(BaggageField.getByName(traceContext, MandatoryParameterSleuth.CLIENT_ID).getValue(traceContext))
+ .channelId(BaggageField.getByName(traceContext, MandatoryParameterSleuth.CHANNEL_ID).getValue(traceContext))
+ .requestId(BaggageField.getByName(traceContext, MandatoryParameterSleuth.REQUEST_ID).getValue(traceContext))
+ .username(BaggageField.getByName(traceContext, MandatoryParameterSleuth.USERNAME).getValue(traceContext))
.build();
}
diff --git a/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/SleuthHelper.java b/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/SleuthHelper.java
index 7a9c9a1..4509fba 100644
--- a/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/SleuthHelper.java
+++ b/blibli-backend-framework-mandatory-parameter/src/main/java/com/blibli/oss/backend/mandatoryparameter/helper/SleuthHelper.java
@@ -1,14 +1,14 @@
package com.blibli.oss.backend.mandatoryparameter.helper;
-import brave.propagation.ExtraFieldPropagation;
+import brave.baggage.BaggageField;
import brave.propagation.TraceContext;
import org.springframework.util.StringUtils;
public class SleuthHelper {
public static void putExtraField(TraceContext traceContext, String name, String value) {
- if (!StringUtils.isEmpty(value)) {
- ExtraFieldPropagation.set(traceContext, name, value);
+ if (StringUtils.hasText(value)) {
+ BaggageField.getByName(traceContext, name).updateValue(traceContext, value);
}
}
diff --git a/blibli-backend-framework-newrelic/pom.xml b/blibli-backend-framework-newrelic/pom.xml
index e18915d..237d1e5 100644
--- a/blibli-backend-framework-newrelic/pom.xml
+++ b/blibli-backend-framework-newrelic/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/aspect/ReactiveMongoRepositoryAspectTest.java b/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/aspect/ReactiveMongoRepositoryAspectTest.java
index 9eb55b7..8ce5215 100644
--- a/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/aspect/ReactiveMongoRepositoryAspectTest.java
+++ b/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/aspect/ReactiveMongoRepositoryAspectTest.java
@@ -24,11 +24,14 @@
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
+import org.springframework.data.repository.query.FluentQuery;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import reactor.util.context.Context;
+import java.util.function.Function;
+
import static com.blibli.oss.backend.newrelic.injector.NewRelicTokenInjectorFilter.TOKEN_CONTEXT_KEY;
import static com.blibli.oss.backend.newrelic.injector.NewRelicTokenInjectorFilter.TRANSACTION_CONTEXT_KEY;
import static org.mockito.ArgumentMatchers.argThat;
@@ -218,6 +221,11 @@ public Mono exists(Example example) {
throw new RuntimeException("NOT IMPLEMENTED");
}
+ @Override
+ public > P findBy(Example example, Function, P> queryFunction) {
+ return null;
+ }
+
@Override
public Flux findAll(Sort sort) {
throw new RuntimeException("NOT IMPLEMENTED");
@@ -293,6 +301,11 @@ public Mono delete(DummyData entity) {
throw new RuntimeException("NOT IMPLEMENTED");
}
+ @Override
+ public Mono deleteAllById(Iterable extends String> strings) {
+ return null;
+ }
+
@Override
public Mono deleteAll(Iterable extends DummyData> entities) {
throw new RuntimeException("NOT IMPLEMENTED");
diff --git a/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/injector/NewRelicTokenInjectorFilterTest.java b/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/injector/NewRelicTokenInjectorFilterTest.java
index 51854c1..61187d8 100644
--- a/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/injector/NewRelicTokenInjectorFilterTest.java
+++ b/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/injector/NewRelicTokenInjectorFilterTest.java
@@ -17,8 +17,8 @@
import java.util.Optional;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
diff --git a/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/integration/NewRelicIntegrationTest.java b/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/integration/NewRelicIntegrationTest.java
index 62224db..2c38c41 100644
--- a/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/integration/NewRelicIntegrationTest.java
+++ b/blibli-backend-framework-newrelic/src/test/java/com/blibli/oss/backend/newrelic/integration/NewRelicIntegrationTest.java
@@ -6,8 +6,8 @@
import com.newrelic.api.agent.Token;
import com.newrelic.api.agent.TracedMethod;
import com.newrelic.api.agent.Transaction;
-import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -94,7 +94,7 @@ public void testFilter() {
.jsonPath("$.data")
.isEqualTo("I say Hello World to NAMA");
- Assert.assertEquals("Command HelloWorldCommandImpl.HelloWorldCommandImpl.execute(..)", segmentNameCaptor.getValue());
+ Assertions.assertEquals("Command HelloWorldCommandImpl.HelloWorldCommandImpl.execute(..)", segmentNameCaptor.getValue());
verify(newRelicAgent).getTransaction();
verify(transaction).startSegment(segmentNameCaptor.capture());
diff --git a/blibli-backend-framework-reactor/pom.xml b/blibli-backend-framework-reactor/pom.xml
index 718c8a0..371d5fa 100644
--- a/blibli-backend-framework-reactor/pom.xml
+++ b/blibli-backend-framework-reactor/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-scheduler-platform/pom.xml b/blibli-backend-framework-scheduler-platform/pom.xml
index 8e13b5e..a7d613b 100644
--- a/blibli-backend-framework-scheduler-platform/pom.xml
+++ b/blibli-backend-framework-scheduler-platform/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-sleuth/README.md b/blibli-backend-framework-sleuth/README.md
index 13c48d0..93d48f8 100644
--- a/blibli-backend-framework-sleuth/README.md
+++ b/blibli-backend-framework-sleuth/README.md
@@ -46,16 +46,16 @@ Sleuth module will automatically register all fields, so we can set and get extr
private Tracer tracer;
// set extra field
-ExtraFieldPropagation.set(span.context(), "Hello", "Value");
-ExtraFieldPropagation.set(span.context(), "World", "Value");
-ExtraFieldPropagation.set(span.context(), "ClientId", "Value");
-ExtraFieldPropagation.set(span.context(), "StoreId", "Value");
+BaggageField.getByName(span.context(), "Hello").updateValue(span.context(), "Value");
+BaggageField.getByName(span.context(), "World").updateValue(span.context(), "Value");
+BaggageField.getByName(span.context(), "ClientId").updateValue(span.context(), "Value");
+BaggageField.getByName(span.context(), "StoreId").updateValue(span.context(), "Value");
// get extra field
-String hello = ExtraFieldPropagation.get(span.context(), "Hello");
-String world = ExtraFieldPropagation.get(span.context(), "World");
-String clientId = ExtraFieldPropagation.get(span.context(), "ClientId");
-String storeId = ExtraFieldPropagation.get(span.context(), "StoreId");
+String hello = BaggageField.getByName(span.context(), "Hello").getValue(span.context());
+String world = BaggageField.getByName(span.context(), "World").getValue(span.context());
+String clientId = BaggageField.getByName(span.context(), "ClientId").getValue(span.context());
+String storeId = BaggageField.getByName(span.context(), "StoreId").getValue(span.context());
```
@@ -75,7 +75,7 @@ public class ExampleSleuthWebFilter implements SleuthWebFilter {
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain, Span currentSpan) {
// do something with currentSpan
- ExtraFieldPropagation.set(currentSpan.context(), "Key", "Value");
+ BaggageField.getByName(currentSpan.context(), "Key").updateValue(currentSpan.context(), "Value");
return chain.filter(exchange);
}
diff --git a/blibli-backend-framework-sleuth/pom.xml b/blibli-backend-framework-sleuth/pom.xml
index 5fc9f2a..a31b04d 100644
--- a/blibli-backend-framework-sleuth/pom.xml
+++ b/blibli-backend-framework-sleuth/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/configuration/SleuthConfiguration.java b/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/configuration/SleuthConfiguration.java
index 720efab..535e699 100644
--- a/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/configuration/SleuthConfiguration.java
+++ b/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/configuration/SleuthConfiguration.java
@@ -1,17 +1,12 @@
package com.blibli.oss.backend.sleuth.configuration;
-import brave.propagation.B3Propagation;
-import brave.propagation.ExtraFieldCustomizer;
-import brave.propagation.ExtraFieldPropagation;
-import brave.propagation.Propagation;
-import com.blibli.oss.backend.sleuth.fields.SleuthExtraFieldConfiguration;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.sleuth.autoconfig.SleuthProperties;
+import com.blibli.oss.backend.sleuth.fields.SleuthExtraFieldCustomizer;
+import com.blibli.oss.backend.sleuth.fields.SleuthExtraFields;
+import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.stream.Collectors;
@Configuration
public class SleuthConfiguration {
@@ -19,66 +14,9 @@ public class SleuthConfiguration {
public static final String HTTP_BAGGAGE_PREFIX = "baggage-";
public static final String MESSAGING_BAGGAGE_PREFIX = "baggage_";
- @Autowired(required = false)
- private ExtraFieldPropagation.FactoryBuilder extraFieldPropagationFactoryBuilder;
-
- @Autowired(required = false)
- private List extraFieldCustomizers = new ArrayList<>();
-
- /**
- * This bean is copied from TraceAutoConfiguration class,
- * with some modification to support extra fields that can integrated for http and messaging
- *
- * @param extraFieldConfiguration extra field configuration
- * @param sleuthProperties sleuth properties
- * @return new bean
- * @see org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration
- * @see org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration#sleuthPropagation(SleuthProperties)
- */
- @Bean
- public Propagation.Factory sleuthPropagation(SleuthExtraFieldConfiguration extraFieldConfiguration, SleuthProperties sleuthProperties) {
- // modification to merge baggage from properties and from bean
- List baggageKeys = extraFieldConfiguration.getExtraFields(sleuthProperties.getBaggageKeys());
- if (baggageKeys.isEmpty()
- && sleuthProperties.getPropagationKeys().isEmpty()
- && extraFieldCustomizers.isEmpty()
- && this.extraFieldPropagationFactoryBuilder == null
- && sleuthProperties.getLocalKeys().isEmpty()) {
- return B3Propagation.FACTORY;
- }
- ExtraFieldPropagation.FactoryBuilder factoryBuilder;
- if (this.extraFieldPropagationFactoryBuilder != null) {
- factoryBuilder = this.extraFieldPropagationFactoryBuilder;
- } else {
- factoryBuilder = ExtraFieldPropagation
- .newFactoryBuilder(B3Propagation.FACTORY);
- }
- if (!baggageKeys.isEmpty()) {
- factoryBuilder
- // for HTTP
- .addPrefixedFields(HTTP_BAGGAGE_PREFIX, baggageKeys)
- // for messaging
- .addPrefixedFields(MESSAGING_BAGGAGE_PREFIX, baggageKeys);
- }
- if (!sleuthProperties.getPropagationKeys().isEmpty()) {
- for (String key : sleuthProperties.getPropagationKeys()) {
- factoryBuilder.addField(key);
- }
- }
- if (!sleuthProperties.getLocalKeys().isEmpty()) {
- for (String key : sleuthProperties.getLocalKeys()) {
- factoryBuilder.addRedactedField(key);
- }
- }
- for (ExtraFieldCustomizer customizer : this.extraFieldCustomizers) {
- customizer.customize(factoryBuilder);
- }
- return factoryBuilder.build();
- }
-
@Bean
- public SleuthExtraFieldConfiguration sleuthExtraFieldConfiguration() {
- return new SleuthExtraFieldConfiguration();
+ public SleuthExtraFieldCustomizer sleuthExtraFieldCustomizer(ObjectProvider sleuthExtraFields) {
+ return new SleuthExtraFieldCustomizer(sleuthExtraFields.stream().collect(Collectors.toList()));
}
}
diff --git a/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/fields/SleuthExtraFieldConfiguration.java b/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/fields/SleuthExtraFieldConfiguration.java
deleted file mode 100644
index 9e6c27d..0000000
--- a/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/fields/SleuthExtraFieldConfiguration.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.blibli.oss.backend.sleuth.fields;
-
-import lombok.Setter;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-public class SleuthExtraFieldConfiguration implements ApplicationContextAware, InitializingBean {
-
- @Setter
- private ApplicationContext applicationContext;
-
- private Collection extraFields;
-
- @Override
- public void afterPropertiesSet() throws Exception {
- extraFields = applicationContext.getBeansOfType(SleuthExtraFields.class).values();
- }
-
- public List getExtraFields(List otherFields) {
- List fields = new ArrayList<>();
- extraFields.forEach(sleuthExtraFields -> fields.addAll(sleuthExtraFields.getFields()));
- fields.addAll(otherFields);
- return fields;
- }
-}
diff --git a/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/fields/SleuthExtraFieldCustomizer.java b/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/fields/SleuthExtraFieldCustomizer.java
new file mode 100644
index 0000000..c4ce22f
--- /dev/null
+++ b/blibli-backend-framework-sleuth/src/main/java/com/blibli/oss/backend/sleuth/fields/SleuthExtraFieldCustomizer.java
@@ -0,0 +1,28 @@
+package com.blibli.oss.backend.sleuth.fields;
+
+import brave.baggage.BaggageField;
+import brave.baggage.BaggagePropagation;
+import brave.baggage.BaggagePropagationConfig;
+import brave.baggage.BaggagePropagationCustomizer;
+import com.blibli.oss.backend.sleuth.configuration.SleuthConfiguration;
+import lombok.AllArgsConstructor;
+
+import java.util.List;
+
+@AllArgsConstructor
+public class SleuthExtraFieldCustomizer implements BaggagePropagationCustomizer {
+
+ private List sleuthExtraFields;
+
+ @Override
+ public void customize(BaggagePropagation.FactoryBuilder factoryBuilder) {
+ sleuthExtraFields.forEach(fields -> {
+ fields.getFields().forEach(field -> {
+ factoryBuilder.add(BaggagePropagationConfig.SingleBaggageField.newBuilder(BaggageField.create(field))
+ .addKeyName(SleuthConfiguration.HTTP_BAGGAGE_PREFIX + field)
+ .addKeyName(SleuthConfiguration.MESSAGING_BAGGAGE_PREFIX + field)
+ .build());
+ });
+ });
+ }
+}
diff --git a/blibli-backend-framework-sleuth/src/test/java/com/blibli/oss/backend/sleuth/SleuthTest.java b/blibli-backend-framework-sleuth/src/test/java/com/blibli/oss/backend/sleuth/SleuthTest.java
index 1f1fedb..9de71ad 100644
--- a/blibli-backend-framework-sleuth/src/test/java/com/blibli/oss/backend/sleuth/SleuthTest.java
+++ b/blibli-backend-framework-sleuth/src/test/java/com/blibli/oss/backend/sleuth/SleuthTest.java
@@ -2,7 +2,7 @@
import brave.Span;
import brave.Tracer;
-import brave.propagation.ExtraFieldPropagation;
+import brave.baggage.BaggageField;
import com.blibli.oss.backend.sleuth.fields.SleuthExtraFields;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -28,26 +28,23 @@ public class SleuthTest {
void testExists() {
Span span = tracer.newTrace();
- ExtraFieldPropagation.set(span.context(), "Eko", "Value");
- ExtraFieldPropagation.set(span.context(), "Kurniawan", "Value");
- ExtraFieldPropagation.set(span.context(), "Khannedy", "Value");
- ExtraFieldPropagation.set(span.context(), "Hello", "Value");
- ExtraFieldPropagation.set(span.context(), "World", "Value");
-
- assertEquals("Value", ExtraFieldPropagation.get(span.context(), "Eko"));
- assertEquals("Value", ExtraFieldPropagation.get(span.context(), "Kurniawan"));
- assertEquals("Value", ExtraFieldPropagation.get(span.context(), "Khannedy"));
- assertEquals("Value", ExtraFieldPropagation.get(span.context(), "Hello"));
- assertEquals("Value", ExtraFieldPropagation.get(span.context(), "World"));
+ BaggageField.getByName(span.context(), "Eko").updateValue(span.context(), "Value");
+ BaggageField.getByName(span.context(), "Kurniawan").updateValue(span.context(), "Value");
+ BaggageField.getByName(span.context(), "Khannedy").updateValue(span.context(), "Value");
+ BaggageField.getByName(span.context(), "Hello").updateValue(span.context(), "Value");
+ BaggageField.getByName(span.context(), "World").updateValue(span.context(), "Value");
+
+ assertEquals("Value", BaggageField.getByName(span.context(), "Eko").getValue(span.context()));
+ assertEquals("Value", BaggageField.getByName(span.context(), "Kurniawan").getValue(span.context()));
+ assertEquals("Value", BaggageField.getByName(span.context(), "Khannedy").getValue(span.context()));
+ assertEquals("Value", BaggageField.getByName(span.context(), "Hello").getValue(span.context()));
+ assertEquals("Value", BaggageField.getByName(span.context(), "World").getValue(span.context()));
}
@Test
void testNotExists() {
Span span = tracer.newTrace();
-
- ExtraFieldPropagation.set(span.context(), "NotExists", "Value");
-
- assertNull(ExtraFieldPropagation.get(span.context(), "NotExists"));
+ assertNull(BaggageField.getByName(span.context(), "NotExists"));
}
@SpringBootApplication
diff --git a/blibli-backend-framework-sleuth/src/test/resources/application.properties b/blibli-backend-framework-sleuth/src/test/resources/application.properties
index 8943478..5ac887b 100644
--- a/blibli-backend-framework-sleuth/src/test/resources/application.properties
+++ b/blibli-backend-framework-sleuth/src/test/resources/application.properties
@@ -1,3 +1,6 @@
-spring.sleuth.baggage-keys[0]=Eko
-spring.sleuth.baggage-keys[1]=Kurniawan
-spring.sleuth.baggage-keys[2]=Khannedy
\ No newline at end of file
+spring.sleuth.baggage.remote-fields[0]=Eko
+spring.sleuth.baggage.remote-fields[1]=Kurniawan
+spring.sleuth.baggage.remote-fields[2]=Khannedy
+spring.sleuth.baggage.local-fields[0]=Eko
+spring.sleuth.baggage.local-fields[1]=Kurniawan
+spring.sleuth.baggage.local-fields[2]=Khannedy
\ No newline at end of file
diff --git a/blibli-backend-framework-swagger/pom.xml b/blibli-backend-framework-swagger/pom.xml
index c3651bc..805cb42 100644
--- a/blibli-backend-framework-swagger/pom.xml
+++ b/blibli-backend-framework-swagger/pom.xml
@@ -5,11 +5,23 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
blibli-backend-framework-swagger
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
+
+
diff --git a/blibli-backend-framework-validation/pom.xml b/blibli-backend-framework-validation/pom.xml
index 4401218..86e4530 100644
--- a/blibli-backend-framework-validation/pom.xml
+++ b/blibli-backend-framework-validation/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/blibli-backend-framework-version/pom.xml b/blibli-backend-framework-version/pom.xml
index 97d96c7..41cf9ea 100644
--- a/blibli-backend-framework-version/pom.xml
+++ b/blibli-backend-framework-version/pom.xml
@@ -5,7 +5,7 @@
blibli-backend-framework
com.blibli.oss
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
4.0.0
diff --git a/pom.xml b/pom.xml
index 50744af..b93a49b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,9 +23,9 @@
- scm:git:git@github.com:bliblidotcom/blibli-backend-framework.git
- scm:git:git@github.com:bliblidotcom/blibli-backend-framework.git
- https://github.com/bliblidotcom/blibli-backend-framework
+ scm:git:ssh://git@stash.gdn-app.com:7999/springbootplugin/blibli-backend-framework.git
+ scm:git:ssh://git@stash.gdn-app.com:7999/springbootplugin/blibli-backend-framework.git
+ HEAD
@@ -47,20 +47,20 @@
org.springframework.boot
spring-boot-starter-parent
- 2.3.0.RELEASE
+ 2.7.0
com.blibli.oss
blibli-backend-framework
- 0.0.9-SNAPSHOT
+ 2.7.0-SNAPSHOT
blibli-backend-framework
Blibli.com Backend Framework
1.8
- Hoxton.SR4
+ 2021.0.3
1.2.26
${project.version}
0.6
@@ -210,49 +210,62 @@
-
- org.sonatype.plugins
- nexus-staging-maven-plugin
- 1.6.7
- true
-
- ossrh
- https://s01.oss.sonatype.org/
- false
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.5
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
- --pinentry-mode
- loopback
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- ossrh
- https://s01.oss.sonatype.org/content/repositories/snapshots
-
- ossrh
- https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
+ libs-releases-local.artifactory.gdn-app.com
+ libs-releases-local.artifactory.gdn-app.com
+ https://artifactory.gdn-app.com/artifactory/libs-releases-local
+
+ libs-snapshots-local.artifactory.gdn-app.com
+ libs-snapshots-local.artifactory.gdn-app.com
+ https://artifactory.gdn-app.com/artifactory/libs-snapshots-local
+
+
+
+
+
+
+
+
+
+
+
+