簡體   English   中英

帶有 Jaeger 跟蹤的 MoleculerJs:如何在一個跟蹤中跟蹤后續操作調用(新跨度)

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

我想顯示我所有的痕跡,就像來自分子 jaeger package的例子一樣: 我想擁有什么

但我得到的是這樣的: 我現在的配置得到了什么 您在這張圖片中看到的所有跨度都應該在主跟蹤(網關)內。

這是我的分子.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))
}

我還嘗試過的是不使用分子積家 package,而是使用積家一體機 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 跟蹤器,請參閱文檔
  2. 為了嵌套事件,有必要在動作內部傳輸上下文,使用ctx.call調用而不是broker.call ,因此它們將被嵌套。
  3. 要快速獲得對分子的支持,請加入discord

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM