带有 Jaeger 跟踪的 MoleculerJs:如何在一次跟踪中跟踪后续操作调用(新跨度)

MoleculerJs with Jaeger tracing: how to trace follow up action calls (new spans) in one trace

我想像 moleculer-jaeger package 中的示例一样显示我的所有痕迹:

但我得到的是这样的: 您在这张图片中看到的所有跨度都应该在主迹线(网关)内。

这是我的 moleculer.config:

tracing: {
        enabled   : true,
        stackTrace: true,
        actions   : true,
        exporter  : {
            type   : 'Jaeger',
            options: {
                // HTTP Reporter endpoint. If set, HTTP Reporter will be used.
                endpoint: 'http://jaeger:14268/api/traces',
                // UDP Sender host option.
                host    : 'api.dev.host.com',
                // UDP Sender port option.
                port    : 6832,
                // Jaeger Sampler configuration.
                sampler : {
                    // Sampler type. More info: https://www.jaegertracing.io/docs/1.14/sampling/#client-sampling-configuration
                    type   : 'Const',
                    // Sampler specific options.
                    options: {
                    }
                },
                // Additional options for `Jaeger.Tracer`
                tracerOptions: {},
                // Default tags. They will be added into all span tags.
                defaultTags  : {
                    appName: 'core',
                }
            }
        },
        tags: {
            action: {
                // Always add the response
                response: true,
            }, 
        },
},

我的 jaeger-service 只是例子之一:

const JaegerService = require('moleculer-jaeger')

module.exports = {
    mixins  : [ JaegerService ],
    settings: {
        host   : 'jaeger-server',
        port   : 6832,
        sampler: {
            type   : 'Const',
            options: {
                decision: 1
            }
        }
    }
}

我尝试了几种不同的采样配置,但没有达到我希望的效果。

这是一些代码,您可以在其中看到我执行的操作调用:

// serviceX endpoint:
resolveByName: {
    rest  : 'GET resolve/name/:name',
    params: {
        name: { type: 'string' }
    },
    handler(ctx) {
        return resolveByNameHandler(this.broker, ctx.params, 'serviceY')
    }
},


// handler code
// please do not focus on the code itself. What i wanted to show is how i call the other
// services. 
const { NotFoundError } = require(`${process.env.INIT_CWD}/util/error`)

module.exports = (broker, params, dataSource) =>  {
    const { name } = params
    const query = { name: name }
    
    const rejectRequest = (name, data) => Promise.reject(new NotFoundError(name, data))

    const getSourceData = result => broker.call(`${dataSource}.find`, { query: { id: result[0].ownerId } })
        .then(sourceData => sourceData.length === 0
            ? rejectRequest(dataSource, sourceData)
            : mergeResult(sourceData, result))

    const mergeResult = (sourceData, result) => ({ ...sourceData[0], origin: { ...result[0], source: 'serviceX' } })

    return broker.call('serviceX.find', { query: query })
        .then(result => result.length === 0 ? rejectRequest('serviceX', query): result)
        .then(result => result[0].ownerId ? getSourceData(result) : rejectRequest('noOwnerId', query))
}

我还尝试过不使用 moleculer-jaeger 包,而是使用 jaeger 一体机 docker 图像。虽然结果相同...

# from the docker-compose.yml
  jaeger-server:
    image: jaegertracing/all-in-one:latest
    ports:
      - 5775:5775/udp
      - 6831:6831/udp
      - 6832:6832/udp
      - 5778:5778
      - 16686:16686
      - 14268:14268
      - 9411:9411
    networks:
      - internal

我不想做的是在每个服务中手动设置跨度。我已经尝试过了,但它根本不起作用,所以如果这是唯一的解决方案,我会很高兴看到一个例子。

提前致谢!

*编辑: 我使用的版本:

{
    "jaeger-client": "^3.18.1",
    "moleculer": "^0.14.13",
    "moleculer-db": "^0.8.12",
    "moleculer-db-adapter-mongoose": "^0.8.9",
    "moleculer-jaeger": "^0.2.3",
    "moleculer-web": "^0.9.1",
    "mongoose": "^5.12.5",
}
  1. 这个版本已经内置了jager tracer,见documentation
  2. 为了嵌套事件,需要在动作中传递上下文,使用ctx.call调用而不是broker.call,所以它们会嵌套。
  3. 要快速获得对分子器的支持,请加入我们 discord