MoleculerJs 与 Jaeger 跟踪:如何在一个跟踪中跟踪后续动作调用新跨度

问题描述

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

What i would like to have

但我得到的是这样的:

What i get with my current config

在这图片中看到的所有跨度都应该在主跟踪(网关)内。

这是我的molecularr.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))
}

我还尝试过不使用分子-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 跟踪器,请参阅 documentation
  2. 为了嵌套事件,需要在动作内部传递上下文,使用 ctx.call 调用而不是 broker.call,因此它们将被嵌套。
  3. 要快速获得对分子的支持,请加入我们的 discord