【问题标题】:Can Open Telemetry Instrument Two Express Services in the Same Node Program?可以在同一个节点程序中打开 Telemetry Instrument 两个 Express 服务吗?
【发布时间】:2020-09-23 01:31:22
【问题描述】:

假设我有一个 NodeJS 程序,该程序有 两个 单独运行的快速服务器实例。

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

//...

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

我已经能够通过open telemetry 检测这样的程序,并将我的跨度成功发送/导出到 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 中间件添加到每个正在运行的 express 服务器中

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

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

每个跟踪器都可以使用自己的服务名称进行实例化,这允许每个服务都有自己的名称并在 Zipkin 中显示为不同的服务。

/main/hello/goobye都是通过上述网址中不同的快递服务服务)

这种事情(在一个程序中检测两个服务)是否可以通过 Open Telemetry 实现?或者我是否需要将这两个服务分成单独的程序,以便让每个服务都有一个单独的名称?这个问题不是关于解决特定问题,而是更多关于理解 Open Telemetry 的语义。

【问题讨论】:

    标签: node.js open-telemetry


    【解决方案1】:

    可以创建两个单独的跟踪器提供程序。其中只有一个是全局跟踪器提供程序,如果您调用 API 方法,API 将使用它。您不能在此配置中使用插件,这意味着您必须手动检测您的应用程序。如果这是一个对您很重要的用例,我建议您在 github repo 上创建一个问题。

    【讨论】:

    • 谢谢! FWIW——这个用例对我来说不是特别重要,它只是作为与 Zipkin 的比较/对比而出现的,这个答案有助于澄清跟踪提供者与插件的作用。跨度>
    【解决方案2】:

    是的,您可以在同一个节点进程中运行多个 express(这也是集群在节点中的工作方式)

    但您需要让它们在不同的端口上运行。;

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

    【讨论】:

    • 谢谢! FWIW - 这个用例对我来说不是特别重要,它只是在我与 Zipkin 进行比较/对比时出现的,这个答案有助于澄清跟踪提供者与插件的作用。跨度>
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多