假设我有一个 NodeJS 程序,它运行着两个独立的快速服务器实例。
const express = require('express')
const app1 = express()
app1.listen(3000, () => { //... })
//...
const app2 = express()
app2.listen(3001, () => { //... })
我已经能够通过open telemetry对这样的程序进行检测,并将我的 span 成功发送/导出到 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 可以实现这种事情(在一个程序中检测两个服务)吗?或者我是否需要将这两个服务分成单独的程序,以便让每个服务都有一个单独的名称?这个问题不是关于解决特定问题,而是更多关于理解 Open Telemetry 的语义。