前言
在 Web 开发中,前端工程师经常需要监控应用程序的性能和异常,而 OpenTelemetry (OTel) 是一个跨语言的开源项目,为我们提供了一种简单、可扩展和统一的方法来生成、导出和处理分布式跟踪和度量数据。@opentelemetry/context-base 是 OpenTelemetry JavaScript SDK 的一部分,它提供了一种在应用程序中传递上下文和跟踪标识的基础框架,帮助我们实现跨服务和跨进程的追踪和监控。
在本篇文章中,我们将会讲解 @opentelemetry/context-base 的使用方法,包括安装、初始化、上下文传递、跟踪标识、错误处理等,希望对大家深入理解 OpenTelemetry 以及前端监控有一定的帮助。
安装
在终端中执行以下命令安装 @opentelemetry/context-base:
--- ------- ------ ---------------------------
初始化
在使用 @opentelemetry/context-base 之前,我们需要先初始化一个全局的 TracerProvider 和一个全局的 ContextManager,这里我们可以参考官方的示例:
----- - ------------------- - - ---------------------------------- ----- - ----------- - - ---------------------------------- ----- - ------------------- - - ----------------------------------------------- ----- - ------------------ - - ------------------------------- ----- - -------- - - ------------------------------------ ----- -------- - --- --------------------- --------- --- ---------- -------- ------------ -- --- ----- ------ - --- ------------------------------------------- ----------------------------- ---------------------------------------- ----- ------------------- - --- ---------------------- ------------------------------------------------ -----------------------------
在这个示例中,我们创建了一个 BasicTracerProvider 实例,并使用 Resource 对象为我们的跟踪器标识了服务名称。接着,我们创建了一个 BasicTracer 实例,并将其添加到 Provider 中。
这里顺便介绍一个名为 SpanProcessor 的概念。SpanProcessor 是负责将 Span 输出到某个存储或者接口的模块。这里我们使用了一个名为 SimpleExportSpanProcessor 的处理器,它会将 Span 打印到控制台上。
最后,我们开启了一个 HTTP 监听器,并使用 httpInstrumentation.enable 方法来自动为每个传入的 HTTP 请求创建一个新的 Span。
上下文传递
@opentelemetry/context-base 提供了一套 API,允许我们在应用程序中传递上下文,从而实现对分布式跟踪和监控的支持。
创建上下文
我们可以使用 createContext 方法创建一个新的上下文,并将其验证通过。例如:
----- - ------- - - --------------------------------------- ----- --------- - -----------------
获取当前上下文
我们可以使用 getChildContext 方法获取当前上下文的子上下文。
----- ------------ - -------------------------- ---------
设置当前上下文
我们可以使用 with方法 将新的值与上下文相关联。
----- ---------- - --------------------------- ---- --------
传递上下文
在应用程序中,我们需要在不同的函数调用中传递上下文。我们可以使用 with方法将上下文传递到不同的函数中。
-------- ----- - -- --- --- ------- ------- ----- -------------- - ----------------- -- -- --------- ---- -------- ------ -- - --- ----- ------- ----- ---------- - ------------------------------- --------- -- ---- --- --- ------- -- --- ---- -------- ---------------- - -------- ------------ - ----- ----- - ------------------------ -
异步上下文传递
在异步场景下,我们可以使用 AsyncHooksContextManager 和 ZoneContextManager 实现自动上下文传递。
例如,我们可以通过以下方式传递上下文:
----- ------------------------ - --- ------------------------------------ ----- ---------- - ------------------------------- ----------------------------------------- ------- -- - ------------------- -- - ----------------- --- ---
在这个例子中,我们使用 AsyncHooksContextManager 来捕获传入的上下文,并使用 with 方法在异步操作(doSomethingAsync)中调用。
跟踪标识
@opentelemetry/context-base 还可以用于跟踪标识的传递。
创建 trace
创建一个新的 trace,使用 tracer.startSpan()
方法。
----- ---- - --------------------------------
你也可以选择将当前 trace 作为父 trace,例如:
----- ---------- - ------------------------------- ----- --------- - ----------------------------- ---------- ----------------------
这里,我们创建了一个名为 parentSpan的 Span,然后使用了 parentSpan.context() 作为 Child Span 的参数。这样,我们就将两个 Span 链接起来,并且 Child Span 可以通过 parentSpan 的 context 传播 TraceId 和 SpanId。
包装 trace
我们可以使用 tracer.withSpan()
方法执行一些带有 trace context 的操作。例如,如果要记录某个函数的执行时间,可以像下面这样做:
----- ----------- - -- -- - ------------------ ------------- -- ----- ------------ - ---- ----------- -- - -- ------ - --- ---- ----- ---- - --------------------------------- - ------- ---------- --- -- ---- --- ---- -- --- -------- ----- --- - --------- -- --- --- ---- ---- ---- ----------- -- ------ --- ------ -- --- -------- ------ ---- -- ----- ---------- - --------------------------------- ------------------------- ------------ -----------------
在这个代码片段中,我们使用 traceWrapper() 方法将 doSomething() 函数包装在一个 Span 中。我们将 parentSpan 作为其父 Span,并将其传递给 traceWrapper() 方法。这样,我们就得到了一个带有 trace context 的函数,并且可以使用这个 context 来记录执行时间。
错误处理
在运行时出现错误时,@opentelemetry/context-base 可以帮助我们正确地记录和传递错误消息和堆栈跟踪。
记录错误
我们可以使用 tracer.getCurrentSpan() 方法获得当前的 Span 对象,并使用该对象记录跟踪信息。例如:
----------- -- - ----- ---- - ------------------------ ---------------------------- - ------ ----- --- ---
传递错误
@opentelemetry/context-base 还提供了一些工具来传递错误,例如 context.bind
。
--- - ----- --------- - ----------------- ----- ------ - --------------------------- - ----- ------- - ----- ---- - ------------------------ ---------------- ----- --------------------------------- -------- ------------- --- -
在这个代码片段中,我们使用 context.bind() 方法在一个带有错误处理的上下文中执行函数,并记录跟踪信息。
结论
通过本文的讲解,我们了解了 @opentelemetry/context-base 的基本使用方法,包括初始化、上下文传递、跟踪标识和错误处理。现在,我们可以更方便地实现分布式跟踪和监控,并更加深刻地理解前端监控的工作原理。当然,这只是冰山一角,OpenTelemetry 还提供了更多功能强大的模块和工具,感兴趣的读者可以深入学习。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/5eedaebeb5cbfe1ea0610ec8