tracing tweaks

This commit is contained in:
Steve Waterworth
2018-01-31 17:27:17 +00:00
parent e778bd7f5b
commit 3f5034a102
6 changed files with 98 additions and 23 deletions

View File

@@ -1,16 +1,17 @@
const instana = require('instana-nodejs-sensor'); 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 // init tracing
// MUST be done before loading anything else!
instana({ instana({
tracing: { tracing: {
enabled: true enabled: true
} }
}); });
const redis = require('redis');
const request = require('request');
const bodyParser = require('body-parser');
const express = require('express');
var redisConnected = false; var redisConnected = false;
const app = express(); 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 // update/create cart
app.get('/add/:id/:sku/:qty', (req, res) => { app.get('/add/:id/:sku/:qty', (req, res) => {
// check quantity // check quantity

View File

@@ -1,16 +1,17 @@
const instana = require('instana-nodejs-sensor'); 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 // init tracing
// MUST be done before loading anything else!
instana({ instana({
tracing: { tracing: {
enabled: true enabled: true
} }
}); });
const mongoClient = require('mongodb').MongoClient;
const mongoObjectID = require('mongodb').ObjectID;
const bodyParser = require('body-parser');
const express = require('express');
// MongoDB // MongoDB
var db; var db;
var collection; var collection;

View File

@@ -8,7 +8,7 @@ import (
"github.com/streadway/amqp" "github.com/streadway/amqp"
"github.com/instana/golang-sensor" "github.com/instana/golang-sensor"
ot "github.com/opentracing/opentracing-go" ot "github.com/opentracing/opentracing-go"
// ext "github.com/opentracing/opentracing-go/ext" ext "github.com/opentracing/opentracing-go/ext"
) )
const ( 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() { func main() {
// Instana tracing // Instana tracing
@@ -106,6 +133,8 @@ func main() {
for d := range msgs { for d := range msgs {
log.Printf("Order %s\n", d.Body) log.Printf("Order %s\n", d.Body)
log.Printf("Headers %v\n", d.Headers)
go createSpan(d.Headers)
} }
} }
}() }()

View File

@@ -4,6 +4,8 @@ import time
import logging import logging
import uuid import uuid
import requests import requests
import opentracing as ot
import opentracing.ext.tags as tags
from flask import Flask from flask import Flask
from flask import request from flask import request
from flask import jsonify from flask import jsonify
@@ -36,7 +38,26 @@ def pay(id):
def queueOrder(order): def queueOrder(order):
app.logger.info('queue 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 # RabbitMQ
publisher = Publisher(app.logger) publisher = Publisher(app.logger)

View File

@@ -24,22 +24,23 @@ class Publisher:
self._channel.exchange_declare(exchange=self.EXCHANGE, exchange_type=self.TYPE, durable=True) self._channel.exchange_declare(exchange=self.EXCHANGE, exchange_type=self.TYPE, durable=True)
self._logger.info('connected to broker') self._logger.info('connected to broker')
def _publish(self, msg): def _publish(self, msg, headers):
self._channel.basic_publish(exchange=self.EXCHANGE, self._channel.basic_publish(exchange=self.EXCHANGE,
routing_key=self.ROUTING_KEY, routing_key=self.ROUTING_KEY,
properties=pika.BasicProperties(headers=headers),
body=json.dumps(msg).encode()) body=json.dumps(msg).encode())
self._logger.info('message sent') self._logger.info('message sent')
#Publish msg, reconnecting if necessary. #Publish msg, reconnecting if necessary.
def publish(self, msg): def publish(self, msg, headers):
if self._channel is None: if self._channel is None:
self._connect() self._connect()
try: try:
self._publish(msg) self._publish(msg, headers)
except pika.exceptions.ConnectionClosed: except pika.exceptions.ConnectionClosed:
self._logger.info('reconnecting to queue') self._logger.info('reconnecting to queue')
self._connect() self._connect()
self._publish(msg) self._publish(msg, headers)
def close(self): def close(self):
if self._conn and self._conn.is_open: if self._conn and self._conn.is_open:

View File

@@ -1,17 +1,18 @@
const instana = require('instana-nodejs-sensor'); 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 // init tracing
// MUST be done before loading anything else!
instana({ instana({
tracing: { tracing: {
enabled: true 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 // MongoDB
var db; var db;
var collection; var collection;
@@ -39,11 +40,14 @@ app.get('/health', (req, res) => {
// use REDIS INCR to track anonymous users // use REDIS INCR to track anonymous users
app.get('/uniqueid', (req, res) => { app.get('/uniqueid', (req, res) => {
// get number from Redis // get number from Redis
redisClient.incr('user', (err, r) => { redisClient.incr('anonymous-counter', (err, r) => {
if(!err) { if(!err) {
res.json({ res.json({
uuid: 'anonymous-' + r uuid: 'anonymous-' + r
}); });
} else {
console.log('ERROR', err);
res.status(500).send(err);
} }
}); });
}); });