Zipkin (Opencensus) — 2 пролета с одинаковыми именами вместо разных

Требования:
Node.js приложение
Opencensus библиотека
Zipkin Exporter и локальная служба Zipkin

app.js:

    const tracing = require('@opencensus/nodejs');
    const zipkin = require('@opencensus/exporter-zipkin');

    const ZIPKIN_ENDPOINT = process.env.ZIPKIN_ENDPOINT || "http://localhost:9411";

    const options = {
      url: `${ZIPKIN_ENDPOINT}/api/v2/spans`,
      serviceName: 'MyApplication'
    }
    const exporter = new zipkin.ZipkinTraceExporter(options);

    tracing.start({'exporter': exporter});
...

    app.use(..)
...

package.json:

 "dependencies": {
    "@opencensus/exporter-zipkin" : "0.0.19",
    "@opencensus/nodejs" : "0.0.19"
...

Сервер Zipkin запускается локально с помощью команды:

docker run -d -p 9411:9411 openzipkin/zipkin

после запуска /service1 Zipkin Ui отображает 2 диапазона для 2 разных запросов:
первый /service1 входящий запрос, настроенный в маршрутизаторах Node.js
второй /external_service_2 — это последующий вызов внешней службы

Проблема

Проблема заключается в том, что после запуска /service1:
1. Пользовательский интерфейс Zipkin отображает 2 диапазона с одинаковым именем MyApplication(см. изображение),
но ожидается 2 разных имени диапазона
введите изображение  описание здесь

2. Поскольку пользовательский интерфейс Zipkin отображает 2 диапазона с одинаковыми именами,
страница зависимостей службы содержит только одну службу (см. изображение) введите здесь описание изображения


person sergionni    schedule 22.12.2019    source источник
comment
Я добавил ответ, он был полезен?   -  person Tamas Szoke    schedule 09.02.2020
comment
@Тамас да, спасибо   -  person sergionni    schedule 09.02.2020
comment
Я рад, что смог помочь!   -  person Tamas Szoke    schedule 09.02.2020


Ответы (1)


Я проверил это с помощью официального opencensus-node. пример на гитхабе.

Проблема 1:

Пользовательский интерфейс Zipkin отображает 2 диапазона с одинаковым именем MyApplication (см. Изображение), но ожидается 2 разных имени диапазона.

Просто для ясности: MyApplication — это имя службы, которое вы задали в своем app.js, а имена диапазонов — это те, которые вы выбрали на изображении /service1, /service1, /external_service_2.

Я думаю, что это предполагаемое поведение, у вас есть один сервис (MyApplication), корневой диапазон (/service1) и дочерний диапазон (/external_service_2). Если у вас есть несколько сервисов, подключенных к одному и тому же серверу Zipkin, у вас будет несколько имен для сервисов.

Пример OpenCensus

Из документации Zipkin:

Размах

Набор аннотаций и бинарных аннотаций, соответствующих конкретному RPC. Промежутки содержат идентифицирующую информацию, такую ​​как traceId, spanId, parentId и имя RPC.

Отследить

Набор диапазонов, которые совместно используют один корневой диапазон. Трассировки строятся путем сбора всех спанов, которые имеют общий идентификатор трассировки. Затем диапазоны упорядочиваются в виде дерева на основе spanId и parentId, что обеспечивает обзор пути, который запрос проходит через систему.

Проблема 2:

Поскольку пользовательский интерфейс Zipkin отображает 2 промежутка с одинаковым именем, страница зависимостей службы содержит только одну службу (см. Изображение).

Опять же, это предполагаемое поведение, поскольку у вас есть только одна служба, и сделанный вами внешний запрос проходит через нее.

Изменить имена диапазонов:

Если вы имеете в виду имена в рамке на первом изображении, вверху отображается только корневой диапазон, который вы щелкнули на предыдущем экране. Однако вы можете написать собственные имена диапазонов после небольшого изменения кода.

Из документации по трассировке (с вашим кодом):

const options = {
  url: `${ZIPKIN_ENDPOINT}/api/v2/spans`,
  serviceName: 'MyApplication'
}
const tracer = tracing.start({samplingRate: 1}).tracer;
tracer.registerSpanEventListener(new zipkin.ZipkinTraceExporter(options));

Теперь можно использовать tracer.startRootSpan, я использовал его в экспресс-примере с запросом:

tracer.startRootSpan({name: 'main'}, rootSpan => {
  rp('http://localhost:3000/sample').then(data => {
    res.send(data);
    rootSpan.end();
  }, err => {
    console.error(`${err.message}`);
    rootSpan.end();
  });
});

Пролет должен быть закрыт.

Для получения дополнительной информации проверьте тестовый файл трассировщика.

person Tamas Szoke    schedule 31.12.2019