UNPKG

@ogcio/o11y-sdk-node

Version:

Opentelemetry standard instrumentation SDK for NodeJS based project

41 lines (40 loc) 1.6 kB
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, }); } }