npm 包 @opentelemetry/context-base 使用教程

阅读时长 9 分钟读完

前言

在 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

纠错
反馈

纠错反馈