npm 包 @opencensus/propagation-b3 使用教程

阅读时长 7 分钟读完

在现代的分布式系统中,如何追踪一个请求从头至尾的过程是一个极为重要的问题。在处理一个 HTTP 请求或者 RPC 调用时,通常需要在各个组件中传递一些上下文信息,例如请求头中的 Trace ID 和 Span ID。这样就能够在整个分布式系统中追踪到这个请求的状态,并且能够定位问题。

@opencensus/propagation-b3 是一个 npm 包,旨在提供一种 Trace Context 的传输格式,使得开发者能够在各个组件中传递 Trace ID 和 Span ID 等上下文信息。该包是基于 OpenTracing 规范的,符合了 OpenTelemetry 规范。本文将为您介绍如何使用 @opencensus/propagation-b3 包进行上下文信息的传递。

安装

@opencensus/propagation-b3 可以通过 npm 安装。在您的 Node.js 项目中,使用以下指令即可安装该包:

集成

Express 中间件

在 Express 应用中使用该包比较简单,只需要编写一个中间件就能实现上下文信息的传递。下面是一个简单的示例,我们假设在请求头中有键为 x-b3-traceidx-b3-spanid 的 Trace ID 和 Span ID。这时候,我们可以通过以下代码实现上下文信息的传递:

-- -------------------- ---- -------
----- ----------- - --------------------------------------

-- -- ----- ------- -----
----- ------ - ---------------------------- -- -
  ------ ---------------------
---

-- -- ------- ---
-------- ------------------------ ---- ----- -
  -- ------- ----- ------- --
  ----- ------------ - ----------------------------
  -- - ----- ------- --- ------------- -----
  ----- ------- - --- ------------------------------------------------------------------------------ -
    ------------
  -------------
  -- - ------------- -------- --- -------------
  ----------- - --------
  -------
-

在上述代码中,我们使用 @opencensus/propagation-b3extract 方法创建了一个 Trace Context 传递器实例。在 Express 中间件中的 extractTraceContext 方法中,我们通过 tracer.extract(req.headers) 方法从请求头中提取出 Trace Context 信息,并将其转化为 OpenTelemetry 上下文对象。然后,我们将该上下文对象保存到了 req.context 上下文变量中,以便后续进行使用。

使用 Express 中间件之后,我们可以在每个路由处理函数中使用 req.context 上下文对象。例如:

在上述代码中,我们首先使用了 extractTraceContext 中间件,目的是获取上下文信息并将其保存到 req.context 上下文变量中。接着,我们在路由处理函数中获取 req.context 上下文对象,并使用 ot.trace.getSpan 方法获取当前 span 对象。此时,我们可以使用 span 对象的 API 进行日志记录或下游操作,如 span.addEvent 方法添加自定义事件等。

微服务

在微服务中,我们可能需要将请求传递给其他微服务进行处理。在这种情况下,我们需要对上下文信息进行传递。下面是一个简单的示例,我们假设请求要调用微服务 foo-service 进行处理。这时候,我们可以通过以下代码实现上下文信息的传递:

-- -------------------- ---- -------
----- ----------- - --------------------------------------
----- ---- - -------------------------
----- ----------- - ------------------------------
----- --------- - ----------------------------------------- ----------------- -
  --------- -----
  ------ -------
  ------ -------
  --------- -----
  ------- ----
---

-- -- ----- ------- -----
----- ------ - ---------------------------- -- -
  ------ ---------------------
---

-------- ---------------- -
  -- -- ---- ---
  ----- ----------- - ----------------------------------
  ----- ------ - --- --------------------------------------- ------------ -
    --------------- -----------------------
  ---

  -- --------- ----- ------- --------
  ----- ------------------ - --- ----------------------------- -
    ------ ---------- --------- ----- -- -
      ----- ------- - ----------------------------------
      ----------------------------------------
      -------------- ----------
    -
  ---

  -- -------- ---- ---
  ------ -------------------
-

-------- ----- -
  ----- ------ - -----------------
  ---------------------- ----- ---- -- -
    -- ---
  ---
-

在上述代码中,我们首先使用 @grpc/proto-loader 模块加载 proto 文件。接着,我们创建了一个 Trace Context 传递器实例,并实现了一个 gRPC 拦截器。在拦截器中,我们使用 tracer.extract(metadata.getMap()) 方法从 gRPC 请求中提取 Trace Context 信息,并使用 tracer.inject(context) 方法将 Trace Context 信息注入到新的 gRPC 请求中。

总结

本文介绍了如何使用 npm 包 @opencensus/propagation-b3 对 Trace Context 进行传输。在 Express 应用中,我们可以通过一个中间件轻松地将上下文信息注入到请求中;在微服务中,我们需要使用 gRPC 拦截器将上下文信息注入到请求中。通过阅读本文,您应该可以掌握 @opencensus/propagation-b3 包的基本使用方法了。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f104f54403f2923b035c233

纠错
反馈