在现代的分布式系统中,如何追踪一个请求从头至尾的过程是一个极为重要的问题。在处理一个 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 项目中,使用以下指令即可安装该包:
npm install @opencensus/propagation-b3
集成
Express 中间件
在 Express 应用中使用该包比较简单,只需要编写一个中间件就能实现上下文信息的传递。下面是一个简单的示例,我们假设在请求头中有键为 x-b3-traceid
和 x-b3-spanid
的 Trace ID 和 Span ID。这时候,我们可以通过以下代码实现上下文信息的传递:
-- -------------------- ---- ------- ----- ----------- - -------------------------------------- -- -- ----- ------- ----- ----- ------ - ---------------------------- -- - ------ --------------------- --- -- -- ------- --- -------- ------------------------ ---- ----- - -- ------- ----- ------- -- ----- ------------ - ---------------------------- -- - ----- ------- --- ------------- ----- ----- ------- - --- ------------------------------------------------------------------------------ - ------------ ------------- -- - ------------- -------- --- ------------- ----------- - -------- ------- -
在上述代码中,我们使用 @opencensus/propagation-b3
的 extract
方法创建了一个 Trace Context 传递器实例。在 Express 中间件中的 extractTraceContext
方法中,我们通过 tracer.extract(req.headers)
方法从请求头中提取出 Trace Context 信息,并将其转化为 OpenTelemetry 上下文对象。然后,我们将该上下文对象保存到了 req.context
上下文变量中,以便后续进行使用。
使用 Express 中间件之后,我们可以在每个路由处理函数中使用 req.context
上下文对象。例如:
app.get('/', extractTraceContext, (req, res) => { const span = ot.trace.getSpan(req.context); span.addEvent('server-get-root'); res.send('Hello, World!'); });
在上述代码中,我们首先使用了 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