social components
inlay.at
atproto
components
sdui
1import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
2import { resourceFromAttributes } from "@opentelemetry/resources";
3import type { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-node";
4import {
5 NodeTracerProvider,
6 SimpleSpanProcessor,
7} from "@opentelemetry/sdk-trace-node";
8import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
9
10class FilteringSpanProcessor extends SimpleSpanProcessor {
11 constructor(exporter: SpanExporter) {
12 super(exporter);
13 }
14 onEnd(span: ReadableSpan) {
15 const events = span.events || [];
16 const isInlayMissing = events.some(
17 (e) =>
18 e.name === "exception" &&
19 String(e.attributes?.["exception.message"] ?? "").startsWith(
20 "INLAY_MISSING:"
21 )
22 );
23 if (isInlayMissing) return;
24 super.onEnd(span);
25 }
26}
27
28export function register() {
29 if (process.env.AXIOM_TOKEN) {
30 const provider = new NodeTracerProvider({
31 resource: resourceFromAttributes({
32 [ATTR_SERVICE_NAME]: "inlay",
33 }),
34 spanProcessors: [
35 new FilteringSpanProcessor(
36 new OTLPTraceExporter({
37 url: "https://api.axiom.co/v1/traces",
38 headers: {
39 Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,
40 "X-Axiom-Dataset": process.env.AXIOM_DATASET!,
41 },
42 })
43 ),
44 ],
45 });
46
47 provider.register();
48 console.log("[otel] trace provider registered, exporting to Axiom");
49 } else {
50 console.log("[otel] AXIOM_TOKEN not set, skipping");
51 }
52
53 if (process.env.NEXT_RUNTIME === "nodejs") {
54 let lastHeapMB = 0;
55
56 setInterval(() => {
57 const mem = process.memoryUsage();
58 const heapMB = Math.round(mem.heapUsed / 1024 / 1024);
59 const rssMB = Math.round(mem.rss / 1024 / 1024);
60 const delta = heapMB - lastHeapMB;
61 const arrow =
62 delta > 5 ? ` ⚠ +${delta}MB` : delta < -5 ? ` ↓ ${delta}MB` : "";
63 console.log(
64 `[memory] heap=${heapMB}MB rss=${rssMB}MB uptime=${Math.round(process.uptime())}s${arrow}`
65 );
66 lastHeapMB = heapMB;
67 }, 10_000).unref();
68
69 console.log("[memory] tracking started");
70 }
71}