Может ли инструмент телеметрии открыть две экспресс-службы в одной программе узла?

Допустим, у меня есть программа NodeJS, в которой работают два отдельных экземпляра экспресс-сервера.

const express = require('express')
const app1 = express()
app1.listen(3000, () => { //... })

//...

const app2 = express()
app2.listen(3001, () => { //... })

Я смог инструментировать такую ​​программу с помощью открытой телеметрии, и мои диапазоны были успешно отправлены / экспортированы в Zipkin. Все, что мне нужно было сделать, это добавить код, подобный приведенному ниже, в начало моей программы.

  const { NodeTracerProvider } = require('@opentelemetry/node');
  const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin');

  const provider = new NodeTracerProvider({
    plugins: {
      express: {
        enabled: true,
      },
      http: {
        requestHook: (span, request) => {
          span.setAttribute("custom request hook attribute", "request");
        },
      },
    }
  });

  const options = {
    url: 'http://localhost:9411/api/v2/spans',
    serviceName: 'service-main'
  }
  const zipkinExporter = new ZipkinExporter(options);
  provider.addSpanProcessor(new SimpleSpanProcessor(zipkinExporter))

  provider.register();

и убедитесь, что плагины express и http установлены / установлены

npm install @opentelemetry/plugin-http @opentelemetry/plugin-express

Все это прекрасно работает - за исключением одного. Open Telemetry видит, что обе мои экспресс-службы работают как одно и то жеservice-main служба.

Когда я инструментировал эти службы напрямую с помощью Zipkin - я бы добавил промежуточное ПО Zipkin на каждый запущенный экспресс-сервер.

app1.use(zipkinMiddleware({tracer: tracer1}));      

app2.use(zipkinMiddleware({tracer: tracer2}));          

Каждый трассировщик мог быть создан с собственным именем службы, что позволяло каждой службе иметь свое индивидуальное имя и отображаться как отдельная служба в Zipkin.

(/main, /hello, а также /goobye все они обслуживаются другой службой экспресс-доставки в указанном выше URL)

Возможны ли подобные вещи (использование двух сервисов в одной программе) с Open Telemetry? Или мне нужно разделить эти две службы на отдельные программы, чтобы у каждой службы было индивидуальное имя? Этот вопрос связан не столько с решением конкретной проблемы, сколько с пониманием семантики открытой телеметрии.

2 ответа

Решение

Можно создать два отдельных поставщика трассировщиков. Только один из них будет глобальным поставщиком трассировщика, который API будет использовать, если вы вызовете методы API. Вы не можете использовать плагины в этой конфигурации, а это значит, что вам придется вручную инструментировать свое приложение. Если этот вариант использования важен для вас, я предлагаю вам создать проблему в репозитории github.

Да , у вас может быть несколько экспресс-запусков в одном процессе узла (так же кластеризация работает и в узле)

но вам нужно, чтобы они работали на разных портах.;

# const express = require('express')
const app1 = express()
app1.listen(3001, () => { //... })

//...

const app2 = express()
app2.listen(3002, () => { //... })
Другие вопросы по тегам