【问题标题】:Node/Express service, span generated in logs but can not see my service in Jaeger UINode/Express 服务,在日志中生成跨度,但在 Jaeger UI 中看不到我的服务
【发布时间】:2026-02-14 23:15:01
【问题描述】:

我正在尝试为使用 Express.js 以 Node.js 编写的微服务设置 Jaeger 跟踪。

我在我的 express 应用程序中添加了一个简单的 get 请求处理程序,当我通过 curl 访问端点时,我可以看到日志中生成了一个 span,但我在 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

我在日志中看到:

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

【问题讨论】:

    标签: javascript node.js express jaeger


    【解决方案1】:

    在尝试了不同的组合后,我终于明白了这一点。发生这种情况是因为 Jaeger 代理没有从我的应用程序接收任何 UDP 数据包。

    您需要告诉跟踪器将 UDP 数据包发送到哪里,在这种情况下是 docker-machine ip 我补充说:

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

    然后我可以在 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
    

    【讨论】: