tracing tweaks
This commit is contained in:
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@@ -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)
|
||||||
|
@@ -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:
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user