同一个节点程序可以开启Telemetry Instrument两个Express服务吗?
Can Open Telemetry Instrument Two Express Services in the Same Node Program?
假设我有一个 NodeJS 程序,它有 两个 个独立的快速服务器实例 运行。
const express = require('express')
const app1 = express()
app1.listen(3000, () => { //... })
//...
const app2 = express()
app2.listen(3001, () => { //... })
我已经能够通过 open telemetry 检测这样的程序,并将我的跨度 sent/exported 成功地扩展到 Zipkin。我需要做的就是 is/was 将如下代码添加到程序的开头。
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 插件 were/are
npm install @opentelemetry/plugin-http @opentelemetry/plugin-express
这一切都很好——除了 一件事。 Open Telemetry 将我的两个快速服务 运行 视为相同的 service-main
服务。
当我使用 Zipkin 直接 检测这些服务时——我会将 Zipkin 中间件添加到每个 运行 express 服务器
app1.use(zipkinMiddleware({tracer: tracer1}));
app2.use(zipkinMiddleware({tracer: tracer2}));
每个跟踪器都可以用自己的服务名称实例化,这允许每个服务都有自己的名称并在 Zipkin 中显示为不同的服务。
(/main
、/hello
、/goobye
都是以上URL中不同的快递服务)
这种事情(在一个程序中检测两个服务)可以通过 Open Telemetry 实现吗?或者我是否需要将这两个服务分离到单独的程序中,以便每个服务都有一个单独的名称?这个问题不是关于解决特定问题,而是关于理解 Open Telemetry 的语义。
是的,您可以在同一个节点进程中有多个 express 运行(这也是集群在节点中的工作方式)
但您需要将它们 运行 放在不同的端口上。;
# const express = require('express')
const app1 = express()
app1.listen(3001, () => { //... })
//...
const app2 = express()
app2.listen(3002, () => { //... })
可以创建两个单独的跟踪器提供程序。其中只有一个是全局跟踪器提供程序,如果您调用 API 方法,API 将使用它。您不能在此配置中使用插件,这意味着您必须手动检测您的应用程序。如果这是一个对您很重要的用例,我建议您在 github 存储库上创建一个问题。
假设我有一个 NodeJS 程序,它有 两个 个独立的快速服务器实例 运行。
const express = require('express')
const app1 = express()
app1.listen(3000, () => { //... })
//...
const app2 = express()
app2.listen(3001, () => { //... })
我已经能够通过 open telemetry 检测这样的程序,并将我的跨度 sent/exported 成功地扩展到 Zipkin。我需要做的就是 is/was 将如下代码添加到程序的开头。
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 插件 were/are
npm install @opentelemetry/plugin-http @opentelemetry/plugin-express
这一切都很好——除了 一件事。 Open Telemetry 将我的两个快速服务 运行 视为相同的 service-main
服务。
当我使用 Zipkin 直接 检测这些服务时——我会将 Zipkin 中间件添加到每个 运行 express 服务器
app1.use(zipkinMiddleware({tracer: tracer1}));
app2.use(zipkinMiddleware({tracer: tracer2}));
每个跟踪器都可以用自己的服务名称实例化,这允许每个服务都有自己的名称并在 Zipkin 中显示为不同的服务。
/main
、/hello
、/goobye
都是以上URL中不同的快递服务)
这种事情(在一个程序中检测两个服务)可以通过 Open Telemetry 实现吗?或者我是否需要将这两个服务分离到单独的程序中,以便每个服务都有一个单独的名称?这个问题不是关于解决特定问题,而是关于理解 Open Telemetry 的语义。
是的,您可以在同一个节点进程中有多个 express 运行(这也是集群在节点中的工作方式)
但您需要将它们 运行 放在不同的端口上。;
# const express = require('express')
const app1 = express()
app1.listen(3001, () => { //... })
//...
const app2 = express()
app2.listen(3002, () => { //... })
可以创建两个单独的跟踪器提供程序。其中只有一个是全局跟踪器提供程序,如果您调用 API 方法,API 将使用它。您不能在此配置中使用插件,这意味着您必须手动检测您的应用程序。如果这是一个对您很重要的用例,我建议您在 github 存储库上创建一个问题。