@ogcio/o11y-sdk-node
Version:
Opentelemetry standard instrumentation SDK for NodeJS based project
41 lines (40 loc) • 1.6 kB
JavaScript
import { SpanStatusCode } from "@opentelemetry/api";
import { OnEndingHookSpanProcessor } from "./on-ending-hook-span-processor.js";
export class NextJsSpanProcessor extends OnEndingHookSpanProcessor {
onEnding(span) {
// ref. https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/quickstart/nextjs/#instrument-the-nextjs-backend
if (span.name.startsWith("GET /_next/static")) {
span.updateName("GET /_next/static");
}
else if (span.name.startsWith("GET /_next/data")) {
span.updateName("GET /_next/data");
}
if (span.status.code !== SpanStatusCode.ERROR)
return;
const events = span.events;
let cleaned = 0;
let exceptions = 0;
for (let i = events.length - 1; i >= 0; i--) {
// Required only for NexJS v14
if (events[i].name == "exception") {
exceptions++;
if (typeof events[i].attributes?.["exception.message"] === "string" &&
events[i].attributes?.["exception.message"] === "NEXT_REDIRECT") {
events.splice(i, 1);
cleaned++;
}
}
}
const status = {
...span.status,
code: cleaned === exceptions ? SpanStatusCode.UNSET : span.status.code,
};
if (cleaned) {
span.setAttribute("o11y.sdk.nextjs.lifecycle.redirect.cleaned", true);
}
span.setStatus(status);
Object.assign(span, {
events,
});
}
}