Может ли инструмент телеметрии открыть две экспресс-службы в одной программе узла?
Допустим, у меня есть программа 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, () => { //... })