From 4745f2393cf53e78c3fded25dedf9ae2a59e2f34 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Mon, 2 Nov 2020 12:08:31 +0100 Subject: [PATCH] Add datacenter tag to entry-spans This will add a random "datacenter" tag on the entries where supported to improve showcasing geo capabilities. --- cart/server.js | 18 +++++++ catalogue/server.js | 18 +++++++ dispatch/main.go | 17 +++++++ payment/payment.py | 26 ++++++++++ ratings/composer.json | 3 +- .../InstanaDataCenterListener.php | 46 ++++++++++++++++++ ratings/html/src/Kernel.php | 7 +++ shipping/pom.xml | 8 +++- .../shipping/ShippingServiceApplication.java | 47 +++++++++++++++++-- user/server.js | 18 +++++++ 10 files changed, 201 insertions(+), 7 deletions(-) create mode 100644 ratings/html/src/EventListener/InstanaDataCenterListener.php diff --git a/cart/server.js b/cart/server.js index 2f5ea36..eb58c53 100644 --- a/cart/server.js +++ b/cart/server.js @@ -48,6 +48,24 @@ app.use((req, res, next) => { next(); }); +app.use((req, res, next) => { + let dcs = [ + "us-east1", + "us-east2", + "us-east3", + "us-east4", + "us-central1", + "us-west1", + "us-west2", + "eu-west3", + "eu-west4" + ]; + let span = instana.currentSpan(); + span.annotate('custom.sdk.tags.datacenter', dcs[Math.floor(Math.random() * dcs.length)]); + + next(); +}); + app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); diff --git a/catalogue/server.js b/catalogue/server.js index eabe4cc..9049bfe 100644 --- a/catalogue/server.js +++ b/catalogue/server.js @@ -38,6 +38,24 @@ app.use((req, res, next) => { next(); }); +app.use((req, res, next) => { + let dcs = [ + "us-east1", + "us-east2", + "us-east3", + "us-east4", + "us-central1", + "us-west1", + "us-west2", + "eu-west3", + "eu-west4" + ]; + let span = instana.currentSpan(); + span.annotate('custom.sdk.tags.datacenter', dcs[Math.floor(Math.random() * dcs.length)]); + + next(); +}); + app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); diff --git a/dispatch/main.go b/dispatch/main.go index 1073412..255ac24 100644 --- a/dispatch/main.go +++ b/dispatch/main.go @@ -26,6 +26,18 @@ var ( rabbitCloseError chan *amqp.Error rabbitReady chan bool errorPercent int + + dataCenters = []string{ + "us-east1", + "us-east2", + "us-east3", + "us-east4", + "us-central1", + "us-west1", + "us-west2", + "eu-west3", + "eu-west4", + } ) func connectToRabbitMQ(uri string) *amqp.Connection { @@ -115,6 +127,9 @@ func createSpan(headers map[string]interface{}, order string) { log.Println("Creating child span") // create child span span = tracer.StartSpan("getOrder", ot.ChildOf(spanContext)) + + fakeDataCenter := dataCenters[rand.Intn(len(dataCenters))] + span.SetTag("datacenter", fakeDataCenter) } else { log.Println(err) log.Println("Failed to get context from headers") @@ -154,6 +169,8 @@ func processSale(parentSpan ot.Span) { } func main() { + rand.Seed(time.Now().Unix()) + // Instana tracing ot.InitGlobalTracer(instana.NewTracerWithOptions(&instana.Options{ Service: Service, diff --git a/payment/payment.py b/payment/payment.py index 4518fad..4629404 100644 --- a/payment/payment.py +++ b/payment/payment.py @@ -1,3 +1,5 @@ +import random + import instana import os import sys @@ -171,6 +173,29 @@ def countItems(items): return count +class InstanaDataCenterMiddleware(): + data_centers = [ + "us-east1", + "us-east2", + "us-east3", + "us-east4", + "us-central1", + "us-west1", + "us-west2", + "eu-west3", + "eu-west4" + ] + + def __init__(self, app): + self.app = app + + def __call__(self, environ, start_response): + span = ot.tracer.active_span + + span.log_kv({'datacenter': random.choice(self.data_centers)}) + + return self.app(environ, start_response) + # RabbitMQ publisher = Publisher(app.logger) @@ -182,4 +207,5 @@ if __name__ == "__main__": app.logger.info('Payment gateway {}'.format(PAYMENT_GATEWAY)) port = int(os.getenv("SHOP_PAYMENT_PORT", "8080")) app.logger.info('Starting on port {}'.format(port)) + app.wsgi_app = InstanaDataCenterMiddleware(app.wsgi_app) app.run(host='0.0.0.0', port=port) diff --git a/ratings/composer.json b/ratings/composer.json index 6cd3c44..e9ed27a 100644 --- a/ratings/composer.json +++ b/ratings/composer.json @@ -13,7 +13,8 @@ "symfony/dependency-injection": "^5.0", "symfony/framework-bundle": "^5.0", "doctrine/annotations": "^1.10", - "symfony/monolog-bundle": "^3.5" + "symfony/monolog-bundle": "^3.5", + "instana/instana-php-sdk": "^1.10" }, "autoload": { "psr-4": { diff --git a/ratings/html/src/EventListener/InstanaDataCenterListener.php b/ratings/html/src/EventListener/InstanaDataCenterListener.php new file mode 100644 index 0000000..235247b --- /dev/null +++ b/ratings/html/src/EventListener/InstanaDataCenterListener.php @@ -0,0 +1,46 @@ +logger = $logger; + } + + public function __invoke() + { + try { + $entry = Tracer::getEntrySpan(); + + $dataCenter = self::$dataCenters[array_rand(self::$dataCenters)]; + $entry->annotate('datacenter', $dataCenter); + + $this->logger->info(sprintf('Annotated DataCenter %s', $dataCenter)); + } catch (InstanaRuntimeException $exception) { + $this->logger->error('Unable to annotate entry span: %s', $exception->getMessage()); + } + } +} diff --git a/ratings/html/src/Kernel.php b/ratings/html/src/Kernel.php index 9d85ec7..bedcbb3 100644 --- a/ratings/html/src/Kernel.php +++ b/ratings/html/src/Kernel.php @@ -6,6 +6,7 @@ namespace Instana\RobotShop\Ratings; use Instana\RobotShop\Ratings\Controller\HealthController; use Instana\RobotShop\Ratings\Controller\RatingsApiController; +use Instana\RobotShop\Ratings\EventListener\InstanaDataCenterListener; use Instana\RobotShop\Ratings\Integration\InstanaHeadersLoggingProcessor; use Instana\RobotShop\Ratings\Service\CatalogueService; use Instana\RobotShop\Ratings\Service\HealthCheckService; @@ -120,6 +121,12 @@ class Kernel extends BaseKernel implements EventSubscriberInterface ->addMethodCall('setLogger', [new Reference('logger')]) ->addTag('controller.service_arguments') ->setAutowired(true); + + $c->register(InstanaDataCenterListener::class) + ->addTag('kernel.event_listener', [ + 'event' => 'kernel.request' + ]) + ->setAutowired(true); } protected function configureRoutes(RouteCollectionBuilder $routes) diff --git a/shipping/pom.xml b/shipping/pom.xml index 008e7c4..ab98920 100644 --- a/shipping/pom.xml +++ b/shipping/pom.xml @@ -36,6 +36,12 @@ spring-boot-starter-actuator + + com.instana + instana-java-sdk + 1.2.0 + + mysql mysql-connector-java @@ -46,7 +52,7 @@ httpclient 4.5.12 - + org.springframework.boot spring-boot-starter-test diff --git a/shipping/src/main/java/com/instana/robotshop/shipping/ShippingServiceApplication.java b/shipping/src/main/java/com/instana/robotshop/shipping/ShippingServiceApplication.java index 0dcfc93..1aec167 100644 --- a/shipping/src/main/java/com/instana/robotshop/shipping/ShippingServiceApplication.java +++ b/shipping/src/main/java/com/instana/robotshop/shipping/ShippingServiceApplication.java @@ -1,7 +1,10 @@ package com.instana.robotshop.shipping; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; +import com.instana.sdk.support.SpanSupport; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -11,14 +14,33 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.retry.annotation.EnableRetry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import java.util.Random; @SpringBootApplication @EnableRetry -public class ShippingServiceApplication { +@EnableWebMvc +public class ShippingServiceApplication implements WebMvcConfigurer { - public static void main(String[] args) { - SpringApplication.run(ShippingServiceApplication.class, args); - } + private static final String[] DATA_CENTERS = { + "us-east1", + "us-east2", + "us-east3", + "us-east4", + "us-central1", + "us-west1", + "us-west2", + "eu-west3", + "eu-west4" + }; + + public static void main(String[] args) { + SpringApplication.run(ShippingServiceApplication.class, args); + } @Bean public BeanPostProcessor dataSourceWrapper() { @@ -26,7 +48,7 @@ public class ShippingServiceApplication { } @Order(Ordered.HIGHEST_PRECEDENCE) - private class DataSourcePostProcessor implements BeanPostProcessor { + private static class DataSourcePostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { if (bean instanceof DataSource) { @@ -40,4 +62,19 @@ public class ShippingServiceApplication { return bean; } } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new InstanaDatacenterTagInterceptor()); + } + + private static class InstanaDatacenterTagInterceptor extends HandlerInterceptorAdapter { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + SpanSupport.annotate("datacenter", DATA_CENTERS[new Random().nextInt(DATA_CENTERS.length)]); + + return super.preHandle(request, response, handler); + } + } } diff --git a/user/server.js b/user/server.js index 917c6bb..dbdd2f0 100644 --- a/user/server.js +++ b/user/server.js @@ -41,6 +41,24 @@ app.use((req, res, next) => { next(); }); +app.use((req, res, next) => { + let dcs = [ + "us-east1", + "us-east2", + "us-east3", + "us-east4", + "us-central1", + "us-west1", + "us-west2", + "eu-west3", + "eu-west4" + ]; + let span = instana.currentSpan(); + span.annotate('custom.sdk.tags.datacenter', dcs[Math.floor(Math.random() * dcs.length)]); + + next(); +}); + app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json());