如何将 OpenTelemetry 与 JavaScript 结合使用:教程

导航至

本文由 Siddhant Varma 撰写。向下滚动查看作者简介。

可观察性是健康软件架构和高效系统的一个重要方面。它使开发人员和工程师能够理解和深入了解他们的应用程序行为。这反过来帮助他们有效监控。每个工程师或 IT 专业人士都希望拥有一个高效可靠的系统,可以为他们提供有关如何减少系统停机时间、提高效率、提升整体用户体验等方面的数据和见解。

然而,要实现有效的可观察性,你需要一个基于可观察性框架的专用工具,该工具提供有关您系统的日志、指标和跟踪信息。OpenTelemetry 就是这样一个基于可观察性框架的流行工具。在本篇文章中,我们将带您了解 OpenTelemetry 是什么,它用于什么,以及如何在 JavaScript 应用程序中使用它。

什么是 OpenTelemetry?它用于什么?

OpenTelemetry 是一种流行的软件工具,用于向您的应用程序添加可观察性。它是开源的,因此您的应用程序的健康数据没有供应商锁定,您可以完全控制这些数据。您可以使用 OpenTelemetry 生成、收集、分析和导出遥测数据。

了解遥测数据包含的内容很重要。与您的系统操作、性能和用法相关的任何信息都称为遥测数据。遥测数据通常有助于您了解为什么您的系统没有按预期运行。它包括三个组成部分:日志、跟踪和指标。日志是应用程序的数据,有助于您在出现问题时不按预期运行时进行调试。指标包括您吞吐量、内存利用率、CPU 使用率等方面的任何定量数据。跟踪包含有关系统所有传入和传出请求的详细信息。

red-box

由于 OpenTelemetry 是技术和框架无关的,因此您可以将其与任何使用任何语言、框架或技术构建的应用程序集成。

使用 OpenTelemetry 与 JavaScript

让我们看看如何在 JavaScript 项目中使用 OpenTelemetry。为此,我们将使用一个简单的 Node.js 和 Express 应用程序。

设置

为您的 Node.js 项目创建一个新目录

mkdir opentelemetry-js

然后,在这个项目中导航并使用 Express Generator 创建一个新的 Express 项目

cd opentelemetry-js && npx express-generator

接下来,在这个项目中安装所有必需的依赖项

npm i

这将为您创建一个 Express 模板应用程序。太棒了!现在请继续并从 OpenTelemetry JS 安装一些依赖项。您可以使用 Node SDK 将 OpenTelemetry 添加到您的 Node.js 应用程序中。运行以下安装命令

npm install --save @opentelemetry/api
npm install --save @opentelemetry/sdk-node
npm install --save @opentelemetry/auto-instrumentations-node

完成此操作后,将向您的项目添加添加 OpenTelemetry 到 Node.js 和 Express 应用程序所需的全部依赖项。

添加 OpenTelemetry 追踪

现在在根目录中创建一个名为 tracing.js 的文件,并包含以下代码

// tracing.js

'use strict'

const process = require('process');
const opentelemetry = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-base');
const { Resource } = require('@opentelemetry/resources');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');

// configure the SDK to export telemetry data to the console
// enable all auto-instrumentations from the meta package
const traceExporter = new ConsoleSpanExporter();
const sdk = new opentelemetry.NodeSDK({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'my-service',
  }),
  traceExporter,
  instrumentations: [getNodeAutoInstrumentations()]
});

// initialize the SDK and register with the OpenTelemetry API
// this enables the API to record telemetry
sdk.start();

// gracefully shut down the SDK on process exit
process.on('SIGTERM', () => {
  sdk.shutdown()
    .then(() => console.log('Tracing terminated'))
    .catch((error) => console.log('Error terminating tracing', error))
    .finally(() => process.exit(0));
});

在上面的代码中,我们导入了从我们安装的 OpenTelemetry 包中相关的模块。然后我们配置 Node SDK 将遥测数据导出到控制台。我们初始化 Node SDK 并启用 OpenTelemetry API 以记录遥测数据。

现在让我们使用以下命令运行 Node.js 应用程序

npm run start

这应该在 3000 端口上运行您的 Node.js 应用程序

run Node-js

如果您现在访问 https://127.0.0.1:3000,您应该会看到以下 Express 应用程序

welcome to Express

让我们看看当我们向 https://127.0.0.1:3000 发起 curl 请求时会发生什么

curl request

在运行您的 Node 应用程序的终端中,您应该会看到一个发送到该 URL 的请求

request sent

现在让我们在运行我们的 NodeJS 应用程序时启动 OpenTelemetry。为此,我们将对 package.json 文件进行以下更改,并更新您的启动脚本,如下所示

"scripts": {
"start": "node -r ./tracing.js ./bin/www"
},

现在当您运行 Node.js 应用程序时,OpenTelemetry 应该开始收集和导出应用程序的遥测数据。再次向同一 URL 发送请求。这次您应该在控制台/终端上看到遥测数据

telemetry data

您可以将这些数据进一步发送到遥测数据分析工具。

OpenTelemetry SDK 和 OpenTelemetry API 之间的区别是什么?

当您使用 OpenTelemetry 时,涉及两个主要组件:OpenTelemetry SDK 和 OpenTelemetry API。两者都提供相关的库和接口,帮助您将 OpenTelemetry 添加到您的应用程序并收集遥测数据。

OpenTelemetry API

OpenTelemetry API 提供了一组接口和方法,您可以使用它们生成遥测数据。它提供了一种标准方式来定义和收集从您使用特定框架编写的代码中生成的指标、日志和跟踪。此外,它还提供了一系列属性和元数据。当您将这些元数据添加到遥测数据中时,您可以通过上下文信息从中获得更多意义。请注意,OpenTelemetry API 是一组通用的接口集合,不依赖于任何技术、编程语言或框架。

OpenTelemetry SDK

OpenTelemetry SDK 是一组实现 OpenTelemetry API 的库和工具。它提供了一些用于生成和处理遥测数据的附加功能。SDK 包含针对流行库和框架的默认仪表板,例如 HTTP 客户端和服务器,以及自定义仪表板的支持。它还提供批处理、采样和导出到不同后端等功能。您在上面的 JavaScript 应用程序中使用了 Node.js SDK。OpenTelemetry SDK 将特定于您在应用程序中使用的特定技术或框架。

OpenTelemetry 是推模型还是拉模型?

您已经深入了解 OpenTelemetry 是什么以及如何使用它。现在我们将介绍其底层的工作原理。

推模型

基本来说,有两种模型用于收集和处理遥测数据。第一种是推送模型,遥测数据由您的应用程序或服务生成。然后,这些遥测数据被发送到遥测后端进行进一步处理。遥测后端可以帮助您分析数据并理解其含义。

拉取模型

第二种模型是拉取模型,遥测数据从各种来源(如OpenTelemetry SDK)接收或拉取,然后发送到遥测数据监控平台或日志服务。在发送到目的地之前,这些数据也可以进行过滤、转换或聚合。

OpenTelemetry支持推送和拉取两种模型。SDK提供了导出器,允许遥测数据被发送到各种后端,包括日志聚合系统、跟踪系统和指标系统。遥测数据可以立即发送,也可以批量发送并定期发送。

当您需要实时遥测数据时,推送模型是最佳选择。当您需要从各种地方获取遥测数据,然后进行汇总以供处理和分析时,可以选择拉取模型。OpenTelemetry对这两种模型的支持提供了灵活性,使组织能够选择最适合其需求的遥测数据收集和导出策略。

OpenTelemetry是否已准备好投入生产?

OpenTelemetry可能还较新,但已经开始受到早期采用。它是灵活的、开源的,组织可以轻松地将其定制到其软件架构和用例中。作为技术无关的产品,它支持广泛的软件和应用程序。所有类型的技术的开发者都可以使用它来收集、分析和导出遥测数据。

一个由大量开发者和贡献者组成的社区正在积极开发它,他们得到了云原生计算基金会(CNCF)的支持。该基金会还提供了解释、学习和在OpenTelemetry之上开发的支持和资源。它拥有出色的文档,您可以在生产环境中安全地使用它。

但请注意在生产环境中如何配置OpenTelemetry。务必严格测试和验证遥测数据。您还需要确保数据被正确收集、处理并导出到相关的遥测后端进行进一步处理。

关于作者

本文由Siddhant Varma撰写。Siddhant是一位全栈JavaScript开发者,擅长前端工程。他在印度帮助多个初创企业进行扩展,并在教育科技和医疗保健行业构建产品方面拥有经验。Siddhant对教学充满热情,擅长写作。他还教授了许多毕业生编程,帮助他们成为更优秀的未来开发者。