如何设置 OpenTelemetry 监控
可观测性对于理解和优化 Next.js 应用的行为和性能至关重要。
随着应用程序变得越来越复杂,识别和诊断可能出现的问题变得越来越困难。通过利用日志记录和指标等可观测性工具,开发人员可以深入了解其应用程序的行为并识别优化领域。通过可观测性,开发人员可以在问题变成重大问题之前 主动解决问题,并提供更好的用户体验。因此,强烈建议在 Next.js 应用程序中使用可观测性来提高性能、优化资源并增强用户体验。
我们建议使用 OpenTelemetry 来监控您的应用程序。 这是一种与平台无关的应用程序监控方式,允许您在不更改代码的情况下更改可观测性提供商。 阅读 OpenTelemetry 官方文档 以获取有关 OpenTelemetry 及其工作原理的更多信息。
本文档在整个文档中使用 Span、Trace 或 Exporter 等术语,所有这些都可以在 OpenTelemetry 可观测性入门 中找到。
Next.js 开箱即用地支持 OpenTelemetry 监控,这意味着我们已经对 Next.js 本身进行了监控。
开始使用
OpenTelemetry 是可扩展的,但正确设置它可能相当冗长。
这就是为什么我们准备了一个 @vercel/otel 包来帮助您快速开始。
使用 @vercel/otel
要开始使用,请安装以下包:
npm install @vercel/otel @opentelemetry/sdk-logs @opentelemetry/api-logs @opentelemetry/instrumentation
接下来,在项目的根目录中创建自定义 instrumentation.ts(或 .js)文件(如果使用 src 文件夹,则在 src 内):
- TypeScript
- JavaScript
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel({ serviceName: 'next-app' })
}
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel({ serviceName: 'next-app' })
}
查看 @vercel/otel 文档 以获取其他配置选项。
提示:
instrumentation文件应该在项目的根目录中,而不是在app或pages目录内。如果您使用src文件夹,请将文件放在src内,与pages和app并列。- 如果您使用
pageExtensions配置选项 添加后缀,您还需要更新instrumentation文件名以匹配。- 我们创建了一个基本的 with-opentelemetry 示例供您使用。
手动 OpenTelemetry 配置
@vercel/otel 包提供了许多配置选项,应该满足大多数常见用例。但如果它不适合您的需求,您可以手动配置 OpenTelemetry。
首先,您需要安装 OpenTelemetry 包:
npm install @opentelemetry/sdk-node @opentelemetry/resources @opentelemetry/semantic-conventions @opentelemetry/sdk-trace-node @opentelemetry/exporter-trace-otlp-http
现在您可以在 instrumentation.ts 中初始化 NodeSDK。
与 @vercel/otel 不同,NodeSDK 与边缘运行时不兼容,因此您需要确保仅在 process.env.NEXT_RUNTIME === 'nodejs' 时导入它们。我们建议创建一个新文件 instrumentation.node.ts,您仅在节点使用时有条件地导入:
- TypeScript
- JavaScript
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation.node.ts')
}
}
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('./instrumentation.node.js')
}
}
- TypeScript
- JavaScript
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
import { Resource } from '@opentelemetry/resources'
import { NodeSDK } from '@opentelemetry/sdk-node'
import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'
const sdk = new NodeSDK({
resource: new Resource({
[ATTR_SERVICE_NAME]: 'next-app',
}),
spanProcessor: new SimpleSpanProcessor(new OTLPTraceExporter()),
})
sdk.start()
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
import { Resource } from '@opentelemetry/resources'
import { NodeSDK } from '@opentelemetry/sdk-node'
import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'
const sdk = new NodeSDK({
resource: new Resource({
[ATTR_SERVICE_NAME]: 'next-app',
}),
spanProcessor: new SimpleSpanProcessor(new OTLPTraceExporter()),
})
sdk.start()
这样做等同于使用 @vercel/otel,但可以修改和扩展 @vercel/otel 未公开的某些功能。如果需要边缘运行时支持,您将必须使用 @vercel/otel。
测试您的监控
您需要一个 OpenTelemetry 收集器和一个兼容的后端来在本地测试 OpenTelemetry 跟踪。 我们建议使用我们的 OpenTelemetry 开发环境。
如果一切正常,您应该能够看到标记为 GET /requested/pathname 的根服务器 span。
该特定跟踪的所有其他 span 将嵌套在其下。
Next.js 跟踪的 span 比默认发出的更多。
要查看更多 span,您必须设置 NEXT_OTEL_VERBOSE=1。
部署
使用 OpenTelemetry 收集器
当您使用 OpenTelemetry 收集器部署时,您可以使用 @vercel/otel。
它将在 Vercel 和自托管时都工作。
在 Vercel 上部署
我们确保 OpenTelemetry 在 Vercel 上开箱即用。
按照 Vercel 文档 将您的项目连接到可观测性提供商。
自托管
部署到其他平台也很简单。您需要启动自己的 OpenTelemetry 收集器来接收和处理来自 Next.js 应用的遥测数据。