我正在使用 vercel otel 发送 opentelemetry 跟踪并在 Azure 应用程序见解上监视它们。该项目是 NextJS 14 项目。我启用了检测钩子,因此 NextJS 默认发送跨度,而无需我创建它们。我可以在 Azure 上看到痕迹,一切正常。
我现在想要的是将自定义属性注入到发送的跨度中,以便更好地跟踪。我仍然想使用 NextJS 发送的默认跨度,但在导出之前我也想附加这些属性。 这是我的 Instrumentation.ts 文件。
import type { SpanExporter } from "@opentelemetry/sdk-trace-base";
import { registerOTel } from "@vercel/otel";
export async function register() {
let traceExporter: SpanExporter | undefined;
if (process.env.NEXT_RUNTIME === "nodejs") {
const { AzureMonitorTraceExporter } = await import(
"@azure/monitor-opentelemetry-exporter"
);
traceExporter = new AzureMonitorTraceExporter({
connectionString: process.env.APP_INSIGHTS_CONNECTION_STRING,
});
}
registerOTel({
serviceName: process.env.NODE_ENV,
traceExporter,
});
}
想通了。在导出之前需要一个跨度处理器来操作它。 Vercel otel在文档中没有提及,但我们可以添加一个处理器来注册OTEL。这是修改后的代码。
import type {
SpanExporter,
SpanProcessor,
Span,
ReadableSpan,
} from "@opentelemetry/sdk-trace-base";
import { registerOTel } from "@vercel/otel";
export async function register() {
let traceExporter: SpanExporter | undefined;
if (process.env.NEXT_RUNTIME === "nodejs") {
const { AzureMonitorTraceExporter } = await import(
"@azure/monitor-opentelemetry-exporter"
);
traceExporter = new AzureMonitorTraceExporter({
connectionString: process.env.APP_INSIGHTS_CONNECTION_STRING,
});
}
class SpanEnrichingProcessor implements SpanProcessor {
forceFlush(): Promise<void> {
return Promise.resolve();
}
shutdown(): Promise<void> {
return Promise.resolve();
}
onStart(_span: Span): void {}
onEnd(span: ReadableSpan) {
// Add custom dimensions to the span.
span.attributes["CustomDimension1"] = "value1";
span.attributes["CustomDimension2"] = "value2";
}
}
let processor = new SpanEnrichingProcessor();
registerOTel({
serviceName: process.env.NODE_ENV,
traceExporter,
spanProcessors: [processor],
});
}