diff --git a/cart/server.js b/cart/server.js index d9f7f5617..1d85ad7e2 100644 --- a/cart/server.js +++ b/cart/server.js @@ -1,16 +1,17 @@ const instana = require('instana-nodejs-sensor'); -const redis = require('redis'); -const request = require('request'); -const bodyParser = require('body-parser'); -const express = require('express'); - // init tracing +// MUST be done before loading anything else! instana({ tracing: { enabled: true } }); +const redis = require('redis'); +const request = require('request'); +const bodyParser = require('body-parser'); +const express = require('express'); + var redisConnected = false; const app = express(); @@ -66,6 +67,24 @@ app.delete('/cart/:id', (req, res) => { }); }); +// rename cart i.e. at login +app.get('/rename/:from/:to', (req, res) => { + redisClient.get(req.params.from, (err, data) => { + if(err) { + console.log('ERROR', err); + res.status(500).send(err); + } else { + if(data == null) { + res.status(404).send('cart not found'); + } else { + var cart = JSON.parse(data); + saveCart(req.params.to, cart); + res.json(cart); + } + } + }); +}); + // update/create cart app.get('/add/:id/:sku/:qty', (req, res) => { // check quantity diff --git a/catalogue/server.js b/catalogue/server.js index 73562c4bb..def849f9e 100644 --- a/catalogue/server.js +++ b/catalogue/server.js @@ -1,16 +1,17 @@ const instana = require('instana-nodejs-sensor'); -const mongoClient = require('mongodb').MongoClient; -const mongoObjectID = require('mongodb').ObjectID; -const bodyParser = require('body-parser'); -const express = require('express'); - // init tracing +// MUST be done before loading anything else! instana({ tracing: { enabled: true } }); +const mongoClient = require('mongodb').MongoClient; +const mongoObjectID = require('mongodb').ObjectID; +const bodyParser = require('body-parser'); +const express = require('express'); + // MongoDB var db; var collection; diff --git a/dispatch/src/main.go b/dispatch/src/main.go index 71acd4fe7..c0c92688c 100644 --- a/dispatch/src/main.go +++ b/dispatch/src/main.go @@ -8,7 +8,7 @@ import ( "github.com/streadway/amqp" "github.com/instana/golang-sensor" ot "github.com/opentracing/opentracing-go" - // ext "github.com/opentracing/opentracing-go/ext" + ext "github.com/opentracing/opentracing-go/ext" ) const ( @@ -77,6 +77,33 @@ func failOnError(err error, msg string) { } } +func createSpan(headers map[string]interface{}) { + // headers is map[string]interface{} + // carrier is map[string]string + carrier := make(ot.TextMapCarrier) + // convert by copying k, v + for k, v := range headers { + carrier[k] = v.(string) + } + + // opentracing + var span ot.Span + tracer := ot.GlobalTracer() + spanContext, err := tracer.Extract(ot.HTTPHeaders, carrier) + if err == nil { + log.Println("Creating span") + // create span + span = tracer.StartSpan("dispatch", ot.ChildOf(spanContext), ext.SpanKindConsumer) + ext.MessageBusDestination.Set(span, "orders") + ext.Component.Set(span, "dispatch") + defer span.Finish() + time.Sleep(42 * time.Millisecond) + } else { + log.Println("Failed to get span context") + log.Println(err) + } +} + func main() { // Instana tracing @@ -106,6 +133,8 @@ func main() { for d := range msgs { log.Printf("Order %s\n", d.Body) + log.Printf("Headers %v\n", d.Headers) + go createSpan(d.Headers) } } }() diff --git a/payment/payment.py b/payment/payment.py index 2be9c79d8..cecaa4475 100644 --- a/payment/payment.py +++ b/payment/payment.py @@ -4,6 +4,8 @@ import logging import uuid import requests +import opentracing as ot +import opentracing.ext.tags as tags from flask import Flask from flask import request from flask import jsonify @@ -36,7 +38,26 @@ def pay(id): def queueOrder(order): app.logger.info('queue order') - publisher.publish(order) + # RabbitMQ is not currently traced automatically + # opentracing tracer is automatically set to Instana tracer + # start a span + context = ot.tracer.current_context() + span = ot.tracer.start_span(operation_name='queue-order', + child_of=ot.tracer.current_context(), + tags={ + tags.SPAN_KIND: 'producer', + tags.COMPONENT: 'payment', + 'message_bus.destination': 'orders' + } + ) + + headers = {} + ot.tracer.inject(span.context, ot.Format.HTTP_HEADERS, headers) + app.logger.info('msg headers {}'.format(headers)) + + publisher.publish(order, headers) + + span.finish() # RabbitMQ publisher = Publisher(app.logger) diff --git a/payment/rabbitmq.py b/payment/rabbitmq.py index c60489cc8..b91ab2f16 100644 --- a/payment/rabbitmq.py +++ b/payment/rabbitmq.py @@ -24,22 +24,23 @@ def _connect(self): self._channel.exchange_declare(exchange=self.EXCHANGE, exchange_type=self.TYPE, durable=True) self._logger.info('connected to broker') - def _publish(self, msg): + def _publish(self, msg, headers): self._channel.basic_publish(exchange=self.EXCHANGE, routing_key=self.ROUTING_KEY, + properties=pika.BasicProperties(headers=headers), body=json.dumps(msg).encode()) self._logger.info('message sent') #Publish msg, reconnecting if necessary. - def publish(self, msg): + def publish(self, msg, headers): if self._channel is None: self._connect() try: - self._publish(msg) + self._publish(msg, headers) except pika.exceptions.ConnectionClosed: self._logger.info('reconnecting to queue') self._connect() - self._publish(msg) + self._publish(msg, headers) def close(self): if self._conn and self._conn.is_open: diff --git a/user/server.js b/user/server.js index 324b51e61..cf06dfd07 100644 --- a/user/server.js +++ b/user/server.js @@ -1,17 +1,18 @@ const instana = require('instana-nodejs-sensor'); -const mongoClient = require('mongodb').MongoClient; -const mongoObjectID = require('mongodb').ObjectID; -const redis = require('redis'); -const bodyParser = require('body-parser'); -const express = require('express'); - // init tracing +// MUST be done before loading anything else! instana({ tracing: { enabled: true } }); +const mongoClient = require('mongodb').MongoClient; +const mongoObjectID = require('mongodb').ObjectID; +const redis = require('redis'); +const bodyParser = require('body-parser'); +const express = require('express'); + // MongoDB var db; var collection; @@ -39,11 +40,14 @@ app.get('/health', (req, res) => { // use REDIS INCR to track anonymous users app.get('/uniqueid', (req, res) => { // get number from Redis - redisClient.incr('user', (err, r) => { + redisClient.incr('anonymous-counter', (err, r) => { if(!err) { res.json({ uuid: 'anonymous-' + r }); + } else { + console.log('ERROR', err); + res.status(500).send(err); } }); });