Search code examples
javascriptnode.jsexpressjaeger

Node/Express service, span generated in logs but can not see my service in Jaeger UI


I am trying to setup Jaeger tracing for my micro service that is written in Node.js using Express.js.

I have added a simple get request handler in my express app and when I hit the endpoint via curl, I can see that a span is generated in logs, but I do not see the name of my service in Jaeger UI.

// server.js

const initTracer = require('./tracing').initTracer;
const {Tags, FORMAT_HTTP_HEADERS} = require('opentracing')
const tracer = initTracer('demo-service')

app.get('/service/model/jaeger', function(req, res) {
  var requestEndpoint = req.originalUrl
  console.log('[services.server.js] GET received on:', requestEndpoint)
  const parentSpanContext = tracer.extract(FORMAT_HTTP_HEADERS, req.headers)
  const span = tracer.startSpan('http_get_' + requestEndpoint, {
    childOf : parentSpanContext,
    tags : {[Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_SERVER}
  });
  span.log({'event': `http_get_${requestEndpoint}_end`, 'value' : 'some_value_here'});
  span.finish()
  res.send('Hello Jaeger bro!')
})

// tracing.js

'use strict'

var initJaegerTracer = require('jaeger-client').initTracer

function initTracer(serviceName) {
  var config = {
    'serviceName': serviceName,
    'sampler': {
      'type': 'const',
      'param': 1
    },
    'reporter': {
      'logSpans': true,
    }
  }
  var options = {
    'logger': {
      'info': function logInfo(msg) {
        console.log('INFO ', msg)
      },
      'error': function logError(msg) {
        console.log('ERROR', msg)
      }
    }
  }

  const tracer = initJaegerTracer(config, options)

  //hook up nodejs process exit event
  process.on('exit', () => {
    console.log('flush out remaining span')
    tracer.close()
  })
  //handle ctrl+c
  process.on('SIGINT', () => {
    process.exit()
  })

  return tracer
}

exports.initTracer = initTracer

I see in logs:

2018-03-08T01:03:34.519134479Z INFO Reporting span 9b88812951bcd52f:9b88812951bcd52f:0:1


Solution

  • I finally figured this out after trying out different combinations. This is happening because Jaeger agent is not receiving any UDP packets from my application.

    You need to tell the tracer where to send UDP packets, which in this case is docker-machine ip I added:

    'agentHost': '192.168.99.100',
    'agentPort': 6832
    

    and then I was able to see my services in Jaeger UI.

    function initTracer(serviceName, options) {
      var config = {
        'serviceName': serviceName,
        'sampler': {
          'type': 'const',
          'param': 1
        },
        'reporter': {
          'logSpans': true,
          'agentHost': '192.168.99.100',
          'agentPort': 6832
        }
      }
      var options = {
        'logger': {
          'info': function logInfo(msg) {
            console.log('INFO ', msg)
          },
          'error': function logError(msg) {
            console.log('ERROR', msg)
          }
        }
      }
    
      const tracer = initJaegerTracer(config, options)
    
      //hook up nodejs process exit event
      process.on('exit', () => {
        console.log('flush out remaining span')
        tracer.close()
      })
      //handle ctrl+c
      process.on('SIGINT', () => {
        process.exit()
      })
    
      return tracer
    }
    
    exports.initTracer = initTracer