diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml
index 68aa4cd2e5..43e2687d74 100644
--- a/spring-cloud-modules/pom.xml
+++ b/spring-cloud-modules/pom.xml
@@ -55,6 +55,7 @@
spring-cloud-data-flow
spring-cloud-sleuth
spring-cloud-openfeign-2
+ spring-cloud-open-telemetry
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml b/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml
new file mode 100644
index 0000000000..8a6833095c
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml
@@ -0,0 +1,30 @@
+version: "4.0"
+
+services:
+ product-service:
+ platform: linux/x86_64
+ build: spring-cloud-open-telemetry1/
+ ports:
+ - "8080:8080"
+
+ price-service:
+ platform: linux/x86_64
+ build: spring-cloud-open-telemetry2/
+ ports:
+ - "8081"
+
+ jaeger-service:
+ image: jaegertracing/all-in-one:latest
+ ports:
+ - "16686:16686"
+ - "14250"
+
+ collector:
+ image: otel/opentelemetry-collector:0.47.0
+ command: [ "--config=/etc/otel-collector-config.yml" ]
+ volumes:
+ - ./otel-config.yml:/etc/otel-collector-config.yml
+ ports:
+ - "4317:4317"
+ depends_on:
+ - jaeger-service
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml b/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml
new file mode 100644
index 0000000000..886c10a1c3
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml
@@ -0,0 +1,23 @@
+receivers:
+ otlp:
+ protocols:
+ grpc:
+ http:
+
+processors:
+ batch:
+
+exporters:
+ logging:
+ logLevel: debug
+ jaeger:
+ endpoint: jaeger-service:14250
+ tls:
+ insecure: true
+
+service:
+ pipelines:
+ traces:
+ receivers: [ otlp ]
+ processors: [ batch ]
+ exporters: [ logging, jaeger ]
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/pom.xml
new file mode 100644
index 0000000000..69b3a1a478
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/pom.xml
@@ -0,0 +1,22 @@
+
+ 4.0.0
+ com.baeldung.spring.cloud
+ spring-cloud-open-telemetry
+ 1.0.0-SNAPSHOT
+ spring-cloud-open-telemetry
+ pom
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ spring-cloud-open-telemetry1
+ spring-cloud-open-telemetry2
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile
new file mode 100644
index 0000000000..8bae52cec4
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile
@@ -0,0 +1,7 @@
+FROM adoptopenjdk/openjdk11:alpine
+
+COPY target/spring-cloud-open-telemetry1-1.0.0-SNAPSHOT.jar spring-cloud-open-telemetry.jar
+
+EXPOSE 8081
+
+ENTRYPOINT ["java","-jar","/spring-cloud-open-telemetry.jar"]
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml
new file mode 100644
index 0000000000..5011590e73
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml
@@ -0,0 +1,116 @@
+
+
+ 4.0.0
+ spring-cloud-open-telemetry1
+ com.baeldung.spring.cloud
+ 1.0.0-SNAPSHOT
+ spring-cloud-open-telemetry1
+ jar
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-open-telemetry
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot-dependencies.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${release.train.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-sleuth-otel-dependencies
+ ${spring-cloud-sleuth-otel.version}
+ import
+ pom
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-sleuth
+
+
+ org.springframework.cloud
+ spring-cloud-sleuth-brave
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-sleuth-otel-autoconfigure
+
+
+ io.opentelemetry
+ opentelemetry-exporter-otlp-trace
+
+
+ io.grpc
+ grpc-okhttp
+ ${grpc-okhttp.version}
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+
+ spring-milestones
+ https://repo.spring.io/milestone
+
+
+
+
+ spring-milestones
+ https://repo.spring.io/milestone
+
+
+
+
+ 2.5.7
+ 2020.0.4
+ 1.0.0-M12
+ 1.42.1
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java
new file mode 100644
index 0000000000..8427603340
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.opentelemetry;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ProductApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ProductApplication.class, args);
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java
new file mode 100644
index 0000000000..d8b43b61a5
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java
@@ -0,0 +1,34 @@
+package com.baeldung.opentelemetry.api.client;
+
+import com.baeldung.opentelemetry.model.Price;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.client.RestTemplate;
+
+@Component
+public class PriceClient {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(PriceClient.class);
+
+ private final RestTemplate restTemplate;
+
+ @Autowired
+ public PriceClient(RestTemplate restTemplate) {
+ this.restTemplate = restTemplate;
+ }
+
+ @Value("${priceClient.baseUrl}")
+ private String baseUrl;
+
+ public Price getPrice(@PathVariable("id") long productId){
+ LOGGER.info("Fetching Price Details With Product Id {}", productId);
+ String url = String.format("%s/price/%d", baseUrl, productId);
+ ResponseEntity price = restTemplate.getForEntity(url, Price.class);
+ return price.getBody();
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java
new file mode 100644
index 0000000000..5d8ba4beac
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java
@@ -0,0 +1,15 @@
+package com.baeldung.opentelemetry.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestConfiguration {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java
new file mode 100644
index 0000000000..5586f5e9d0
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java
@@ -0,0 +1,36 @@
+package com.baeldung.opentelemetry.controller;
+
+import com.baeldung.opentelemetry.api.client.PriceClient;
+import com.baeldung.opentelemetry.model.Product;
+import com.baeldung.opentelemetry.repository.ProductRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ProductController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductController.class);
+
+ private final PriceClient priceClient;
+
+ private final ProductRepository productRepository;
+
+ @Autowired
+ public ProductController(PriceClient priceClient, ProductRepository productRepository) {
+ this.priceClient = priceClient;
+ this.productRepository = productRepository;
+ }
+
+ @GetMapping(path = "/product/{id}")
+ public Product getProductDetails(@PathVariable("id") long productId){
+ LOGGER.info("Getting Product and Price Details With Product Id {}", productId);
+ Product product = productRepository.getProduct(productId);
+ product.setPrice(priceClient.getPrice(productId));
+
+ return product;
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java
new file mode 100644
index 0000000000..0ab031f517
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java
@@ -0,0 +1,22 @@
+package com.baeldung.opentelemetry.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.client.HttpServerErrorException;
+
+
+@RestControllerAdvice
+public class ProductControllerAdvice {
+
+ @ExceptionHandler(ProductNotFoundException.class)
+ public ResponseEntity