Next.js - 使用 OpenTelemetry
什么是 OpenTelemetry?
OpenTelemetry 是一个开源框架,用于收集和分析应用程序的遥测数据。它通过提供一组 API 和 SDK 来实现 instrumentation 和收集遥测数据。OpenTelemetry 是一个标准化的工具,支持多种语言、框架和后端。
为什么使用它?
- 当应用程序变得更加复杂时,识别和诊断可能出现的问题将变得困难。OpenTelemetry 提供 observability 工具来跟踪并洞察应用程序的行为。
- Next.js 开箱即用支持 OpenTelemetry instrumentation,这意味着 Next.js 本身已经进行了 OpenTelemetry instrumentation。
在 Next.js 中设置 OpenTelemetry
直接在 Next.js 中设置 OpenTelemetry 相当困难。因此,Next.js 提供了一个包 '@vercel/otel' 来简化设置过程。请查看以下步骤。
步骤 1:安装包
要在 Next.js 应用程序目录中安装该包,请运行以下命令。
npm install @vercel/otel @opentelemetry/sdk-logs @opentelemetry/api-logs @opentelemetry/instrumentation
步骤 2:设置 Instrumentation 文件
下一步是在项目根目录中创建一个自定义的 instrumentation.ts(或 .js)文件。此文件将包含用于 instrumentation 应用程序的代码。请查看下面的代码。
// /instrumentation.ts
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel({ serviceName: 'next-app' })
}
步骤 3:测试 Instrumentation
要测试 instrumentation,您需要一个带有兼容后端的 OpenTelemetry collector。您可以使用 Node.js 的 OpenTelemetry Collector,它是一个轻量级、开源且生产就绪的 collector。我们在这个仓库的应用程序中使用 docker-compose 运行了 collector。它生成了以下指标。
为 Instrumentation 创建 Spans
在 OpenTelemetry 中,span 是应用程序中可以被追踪的工作单元或操作。换句话说,它是一个计时操作,可用于跟踪应用程序的性能。可以使用 OpenTelemetry API 创建 spans。请考虑以下代码片段。
trace.getTracer('nextjs-example')
.startActiveSpan('fetchGithubStars', async (span) => {
try {
return await getValue()
} finally {
span.end()
}
})
- 这将创建一个名为 'fetchGithubStars' 的 span。
- span 将在函数开始时启动,并在操作完成或失败时结束
- 这将测量获取 GitHub stars 所需的时间