如何一起使用 OpenTelemetry 和 JavaScript:教程
作者:社区 / 用例
2023 年 5 月 30 日
导航至
这篇文章由 Siddhant Varma 撰写。 向下滚动查看作者简介。
可观测性是健康软件架构和高性能系统的重要方面。 它使开发人员和工程师能够理解并深入了解其应用程序的行为方式。 反过来,这有助于他们有效地监控它。 每位工程师或 IT 专业人员都想要一个高效可靠的系统,该系统可以为他们提供有关如何减少系统停机时间、提高效率、增强整体用户体验等的数据和见解。
但是,为了实现有效的可观测性,您需要一个基于可观测性框架的专用工具,该工具提供有关系统的日志、指标和追踪。 OpenTelemetry 是基于可观测性框架的一种流行的此类工具。 在本文中,我们将引导您了解什么是 OpenTelemetry,它的用途是什么,以及如何在 JavaScript 应用程序中使用它。
什么是 OpenTelemetry? 它的用途是什么?
OpenTelemetry 是一种流行的软件工具,用于为您的应用程序添加可观测性。 它是开源的,因此您的应用程序健康数据没有供应商锁定,让您可以完全控制这些数据。 您可以使用 OpenTelemetry 生成、收集、分析和导出遥测数据。
重要的是您要了解遥测数据包含什么。 与您的系统相关的任何信息,告诉您系统的运行、性能和使用情况,都称为遥测数据。 遥测数据通常可以帮助您了解为什么您的系统未按预期运行。 它包含三个组成部分:日志、追踪和指标。 日志是来自您的应用程序的数据,可帮助您在某些功能未按预期工作时对其进行调试。 指标包括有关您的吞吐量、内存利用率、CPU 使用率等的任何定量数据。 追踪包含有关来自系统的所有传入和传出请求的详细信息。
由于 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 应用程序
如果您现在访问 http://localhost:3000,您应该看到以下 Express 应用程序
让我们看看当我们向 http://localhost:3000 发出 curl 请求时会发生什么
在运行 Node 应用程序的终端上,您应该看到已发送到 URL 的请求
现在让我们在运行 NodeJS 应用程序时启动 OpenTelemetry。 为此,我们将对 package.json 文件进行以下更改,并使用以下内容更新您的启动脚本
"scripts": {
"start": "node -r ./tracing.js ./bin/www"
},
现在,当您运行 Node.js 应用程序时,OpenTelemetry 应该开始收集和导出应用程序的遥测数据。 再次向同一 URL 发出请求。 这次您应该在控制台/终端上看到遥测数据
您可以进一步将此数据发送到遥测数据分析工具。
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 开发人员,在前端工程方面拥有专业知识。 他曾与印度的多家初创公司合作进行扩展,并在 Ed-Tech 和医疗保健行业拥有构建产品的经验。 Siddhant 对教学充满热情,并且擅长写作。 他还向许多毕业生教授编程,帮助他们成为更好的未来开发人员。