[{"data":1,"prerenderedAt":3014},["ShallowReactive",2],{"navigation_docs":3,"-extend-custom-enrichers":528,"-extend-custom-enrichers-surround":3009},[4,29,76,122,304,435,496],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Start","\u002Fstart","1.start",[9,13,18,23],{"title":10,"path":11,"stem":12},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction",{"title":14,"path":15,"stem":16,"icon":17},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":19,"path":20,"stem":21,"icon":22},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":24,"path":25,"stem":26,"icon":27},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Learn","\u002Flearn","2.learn",[34,38,43,48,53,58,62,67,72],{"title":35,"path":36,"stem":37},"Learn evlog","\u002Flearn\u002Foverview","2.learn\u002F0.overview",{"title":39,"path":40,"stem":41,"icon":42},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":44,"path":45,"stem":46,"icon":47},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":49,"path":50,"stem":51,"icon":52},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":54,"path":55,"stem":56,"icon":57},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":59,"path":60,"stem":61},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling",{"title":63,"path":64,"stem":65,"icon":66},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":73,"path":74,"stem":75},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs",{"title":77,"path":78,"stem":79,"children":80,"page":28},"CLI","\u002Fcli","3.cli",[81,85,90,95,99,103,108,113,118],{"title":82,"path":83,"stem":84},"evlog CLI","\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":86,"path":87,"stem":88,"icon":89},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":91,"path":92,"stem":93,"icon":94},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":96,"path":97,"stem":98},"Map rules","\u002Fcli\u002Frules","3.cli\u002F3.rules",{"title":100,"path":101,"stem":102},"Map scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121},"evlog agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents",{"title":123,"path":124,"stem":125,"children":126,"page":28},"Integrate","\u002Fintegrate","4.integrate",[127,132,216],{"title":128,"path":129,"stem":130,"icon":131},"Overview","\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":28},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,141,171,196],{"title":128,"path":138,"stem":139,"icon":140},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview","i-lucide-list",{"title":142,"path":143,"stem":144,"children":145,"page":28},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[146,151,156,161,166],{"title":147,"path":148,"stem":149,"icon":150},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":152,"path":153,"stem":154,"icon":155},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":157,"path":158,"stem":159,"icon":160},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":162,"path":163,"stem":164,"icon":165},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":167,"path":168,"stem":169,"icon":170},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":172,"path":173,"stem":174,"children":175,"page":28},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[176,181,186,191],{"title":177,"path":178,"stem":179,"icon":180},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":182,"path":183,"stem":184,"icon":185},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":187,"path":188,"stem":189,"icon":190},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":192,"path":193,"stem":194,"icon":195},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":197,"path":198,"stem":199,"children":200,"page":28},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[201,206,211],{"title":202,"path":203,"stem":204,"icon":205},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":207,"path":208,"stem":209,"icon":210},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":212,"path":213,"stem":214,"icon":215},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":217,"path":218,"stem":219,"children":220,"page":28},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[221,225,230,235,240,245,250,255,260,265,270,275,280,285,289,294,299],{"title":128,"path":222,"stem":223,"icon":224},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":226,"path":227,"stem":228,"icon":229},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":231,"path":232,"stem":233,"icon":234},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":236,"path":237,"stem":238,"icon":239},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":241,"path":242,"stem":243,"icon":244},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":246,"path":247,"stem":248,"icon":249},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":251,"path":252,"stem":253,"icon":254},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":256,"path":257,"stem":258,"icon":259},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":261,"path":262,"stem":263,"icon":264},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":266,"path":267,"stem":268,"icon":269},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":271,"path":272,"stem":273,"icon":274},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":276,"path":277,"stem":278,"icon":279},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":281,"path":282,"stem":283,"icon":284},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":286,"path":287,"stem":288,"icon":71},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":290,"path":291,"stem":292,"icon":293},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":295,"path":296,"stem":297,"icon":298},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":300,"path":301,"stem":302,"icon":303},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":305,"path":306,"stem":307,"children":308,"page":28},"Use Cases","\u002Fuse-cases","5.use-cases",[309,312,317,346,374,407,427,431],{"title":305,"path":310,"stem":311},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":313,"path":314,"stem":315,"icon":316},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":318,"icon":319,"path":320,"stem":321,"children":322,"page":28},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[323,326,331,336,341],{"title":128,"path":324,"stem":325,"icon":140},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":327,"path":328,"stem":329,"icon":330},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":332,"path":333,"stem":334,"icon":335},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":337,"path":338,"stem":339,"icon":340},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":342,"path":343,"stem":344,"icon":345},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":28},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[352,355,360,365,369],{"title":128,"path":353,"stem":354,"icon":140},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":361,"path":362,"stem":363,"icon":364},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":366,"path":367,"stem":368,"icon":316},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":370,"path":371,"stem":372,"icon":373},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":28},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[380,383,388,393,398,402],{"title":128,"path":381,"stem":382,"icon":140},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":384,"path":385,"stem":386,"icon":387},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":389,"path":390,"stem":391,"icon":392},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":394,"path":395,"stem":396,"icon":397},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":399,"path":400,"stem":401,"icon":376},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":403,"path":404,"stem":405,"icon":406},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes","i-lucide-book-open",{"title":342,"icon":373,"path":408,"stem":409,"children":410,"page":28},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[411,414,419,423],{"title":128,"path":412,"stem":413,"icon":140},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":415,"path":416,"stem":417,"icon":418},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":420,"path":421,"stem":422},"Telemetry Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest",{"title":424,"path":425,"stem":426,"icon":406},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":428,"path":429,"stem":430},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers",{"title":432,"path":433,"stem":434},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve",{"title":436,"path":437,"stem":438,"children":439,"page":28},"Extend","\u002Fextend","6.extend",[440,444,449,454,458,463,467,471,476,481,486,491],{"title":128,"path":441,"stem":442,"icon":443},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":445,"path":446,"stem":447,"icon":448},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":450,"path":451,"stem":452,"icon":453},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":455,"path":456,"stem":457,"icon":448},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":459,"path":460,"stem":461,"icon":462},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":403,"path":464,"stem":465,"icon":466},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":468,"path":469,"stem":470},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":472,"path":473,"stem":474,"icon":475},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers","i-lucide-sparkles",{"title":477,"path":478,"stem":479,"icon":480},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling","i-lucide-filter",{"title":482,"path":483,"stem":484,"icon":485},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":487,"path":488,"stem":489,"icon":490},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":492,"path":493,"stem":494,"icon":495},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":424,"path":497,"stem":498,"children":499,"page":28},"\u002Freference","7.reference",[500,504,507,512,516,520,524],{"title":501,"path":502,"stem":503},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration",{"title":370,"path":505,"stem":506,"icon":373},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":508,"path":509,"stem":510,"icon":511},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":513,"path":514,"stem":515,"icon":376},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":517,"path":518,"stem":519},"evlog vs pino, winston, consola","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers",{"title":521,"path":522,"stem":523,"icon":475},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":525,"path":526,"stem":527},"Log cost","\u002Freference\u002Fcost","7.reference\u002F7.cost",{"id":529,"title":530,"body":531,"description":2998,"extension":2999,"links":3000,"meta":3005,"navigation":3006,"path":473,"seo":3007,"stem":474,"__hash__":3008},"docs\u002F6.extend\u002F5.custom-enrichers.md","Custom Enrichers",{"type":532,"value":533,"toc":2985},"minimark",[534,537,546,562,666,671,674,1346,1350,1358,1523,1542,1548,1554,1849,1854,1885,1888,2343,2347,2360,2549,2553,2559,2564,2711,2715,2948,2952,2959,2963,2981],[535,536],"enricher-chain",{},[538,539,540,541,545],"p",{},"An ",[542,543,544],"strong",{},"enricher"," runs on every emitted event before it reaches drains. It's the right tool when you want a field on every event without touching every call site: geo, user agent, trace context, deploy id, tenant id, feature flags, performance tier.",[538,547,548,549,553,554,557,558,561],{},"Use ",[550,551,552],"code",{},"defineEnricher"," from ",[550,555,556],{},"evlog\u002Ftoolkit"," and provide a single ",[550,559,560],{},"compute()"," function returning the value you want to merge into the event, and the toolkit handles error isolation, undefined skipping, and the merge step. Every built-in enricher is built on this same factory.",[563,564,567,570,652],"prompt",{":actions":565,"description":566,"icon":330},"[\"copy\",\"cursor\",\"claude\"]","Write a custom evlog enricher",[538,568,569],{},"Write a custom evlog enricher that adds derived context to every wide event.",[571,572,573,581,590,614,621,626,637,645],"ul",{},[574,575,548,576,553,578,580],"li",{},[550,577,552],{},[550,579,556],{}," — never write the merge \u002F error \u002F undefined logic by hand",[574,582,583,584,587,588],{},"Pass ",[550,585,586],{},"{ name, field, compute }"," to ",[550,589,552],{},[574,591,592,595,596,599,600,599,603,599,606,609,610,613],{},[550,593,594],{},"compute(ctx)"," reads from ",[550,597,598],{},"ctx.headers"," \u002F ",[550,601,602],{},"ctx.request",[550,604,605],{},"ctx.response",[550,607,608],{},"ctx.event"," and returns the value to merge (or ",[550,611,612],{},"undefined"," to skip)",[574,615,616,617,620],{},"Keep ",[550,618,619],{},"compute"," pure and fast: no awaitable I\u002FO on the hot path; cache anything expensive at module scope",[574,622,623,625],{},[550,624,552],{}," already handles: error isolation (errors logged, never thrown), single-field merge, overwrite option",[574,627,628,629,632,633,636],{},"Wire the enricher into my framework via the ",[550,630,631],{},"enrich"," option (middleware) or ",[550,634,635],{},"initLogger.enrichers"," (standalone)",[574,638,639,640,553,643],{},"For multiple enrichers, use ",[550,641,642],{},"composeEnrichers([...])",[550,644,556],{},[574,646,647,648,651],{},"For multi-hook features (enrich + drain side-effect, etc.), use ",[550,649,650],{},"definePlugin"," instead",[538,653,654,655,661,662],{},"Docs: ",[656,657,658],"a",{"href":658,"rel":659},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fcustom-enrichers",[660],"nofollow","\nBuilt-in: ",[656,663,664],{"href":664,"rel":665},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Fenrichers",[660],[667,668,670],"h2",{"id":669},"basic-example","Basic example",[538,672,673],{},"Add deployment metadata to every event. The enricher is the same function everywhere. Only the wiring step differs per framework.",[675,676,677,851,1028,1196],"code-group",{},[678,679,685],"pre",{"className":680,"code":681,"filename":682,"language":683,"meta":684,"style":684},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F server\u002Fplugins\u002Fevlog-enrich.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    ctx.event.deploymentId = process.env.DEPLOYMENT_ID\n    ctx.event.deployedBy = process.env.DEPLOYED_BY\n  })\n})\n","Nuxt \u002F Nitro","typescript","",[550,686,687,696,731,775,807,834,843],{"__ignoreMap":684},[688,689,692],"span",{"class":690,"line":691},"line",1,[688,693,695],{"class":694},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-enrich.ts\n",[688,697,699,703,706,710,714,717,721,724,728],{"class":690,"line":698},2,[688,700,702],{"class":701},"s7zQu","export",[688,704,705],{"class":701}," default",[688,707,709],{"class":708},"s2Zo4"," defineNitroPlugin",[688,711,713],{"class":712},"sTEyZ","(",[688,715,713],{"class":716},"sMK4o",[688,718,720],{"class":719},"sHdIc","nitroApp",[688,722,723],{"class":716},")",[688,725,727],{"class":726},"spNyl"," =>",[688,729,730],{"class":716}," {\n",[688,732,734,737,740,743,745,748,751,754,758,760,763,766,769,771,773],{"class":690,"line":733},3,[688,735,736],{"class":712},"  nitroApp",[688,738,739],{"class":716},".",[688,741,742],{"class":712},"hooks",[688,744,739],{"class":716},[688,746,747],{"class":708},"hook",[688,749,713],{"class":750},"swJcz",[688,752,753],{"class":716},"'",[688,755,757],{"class":756},"sfazB","evlog:enrich",[688,759,753],{"class":716},[688,761,762],{"class":716},",",[688,764,765],{"class":716}," (",[688,767,768],{"class":719},"ctx",[688,770,723],{"class":716},[688,772,727],{"class":726},[688,774,730],{"class":716},[688,776,778,781,783,786,788,791,794,797,799,802,804],{"class":690,"line":777},4,[688,779,780],{"class":712},"    ctx",[688,782,739],{"class":716},[688,784,785],{"class":712},"event",[688,787,739],{"class":716},[688,789,790],{"class":712},"deploymentId",[688,792,793],{"class":716}," =",[688,795,796],{"class":712}," process",[688,798,739],{"class":716},[688,800,801],{"class":712},"env",[688,803,739],{"class":716},[688,805,806],{"class":712},"DEPLOYMENT_ID\n",[688,808,810,812,814,816,818,821,823,825,827,829,831],{"class":690,"line":809},5,[688,811,780],{"class":712},[688,813,739],{"class":716},[688,815,785],{"class":712},[688,817,739],{"class":716},[688,819,820],{"class":712},"deployedBy",[688,822,793],{"class":716},[688,824,796],{"class":712},[688,826,739],{"class":716},[688,828,801],{"class":712},[688,830,739],{"class":716},[688,832,833],{"class":712},"DEPLOYED_BY\n",[688,835,837,840],{"class":690,"line":836},6,[688,838,839],{"class":716},"  }",[688,841,842],{"class":750},")\n",[688,844,846,849],{"class":690,"line":845},7,[688,847,848],{"class":716},"}",[688,850,842],{"class":712},[678,852,854],{"className":680,"code":853,"filename":231,"language":683,"meta":684,"style":684},"\u002F\u002F lib\u002Fevlog.ts\nimport { createEvlog } from 'evlog\u002Fnext'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  enrich: (ctx) => {\n    ctx.event.deploymentId = process.env.DEPLOYMENT_ID\n    ctx.event.deployedBy = process.env.DEPLOYED_BY\n  },\n})\n",[550,855,856,861,887,893,931,949,966,990,1015,1021],{"__ignoreMap":684},[688,857,858],{"class":690,"line":691},[688,859,860],{"class":694},"\u002F\u002F lib\u002Fevlog.ts\n",[688,862,863,866,869,872,875,878,881,884],{"class":690,"line":698},[688,864,865],{"class":701},"import",[688,867,868],{"class":716}," {",[688,870,871],{"class":712}," createEvlog",[688,873,874],{"class":716}," }",[688,876,877],{"class":701}," from",[688,879,880],{"class":716}," '",[688,882,883],{"class":756},"evlog\u002Fnext",[688,885,886],{"class":716},"'\n",[688,888,889],{"class":690,"line":733},[688,890,892],{"emptyLinePlaceholder":891},true,"\n",[688,894,895,897,900,902,905,907,910,912,915,917,920,922,924,926,928],{"class":690,"line":777},[688,896,702],{"class":701},[688,898,899],{"class":726}," const",[688,901,868],{"class":716},[688,903,904],{"class":712}," withEvlog",[688,906,762],{"class":716},[688,908,909],{"class":712}," useLogger",[688,911,762],{"class":716},[688,913,914],{"class":712}," log",[688,916,762],{"class":716},[688,918,919],{"class":712}," createError ",[688,921,848],{"class":716},[688,923,793],{"class":716},[688,925,871],{"class":708},[688,927,713],{"class":712},[688,929,930],{"class":716},"{\n",[688,932,933,936,939,941,944,946],{"class":690,"line":809},[688,934,935],{"class":750},"  service",[688,937,938],{"class":716},":",[688,940,880],{"class":716},[688,942,943],{"class":756},"my-app",[688,945,753],{"class":716},[688,947,948],{"class":716},",\n",[688,950,951,954,956,958,960,962,964],{"class":690,"line":836},[688,952,953],{"class":708},"  enrich",[688,955,938],{"class":716},[688,957,765],{"class":716},[688,959,768],{"class":719},[688,961,723],{"class":716},[688,963,727],{"class":726},[688,965,730],{"class":716},[688,967,968,970,972,974,976,978,980,982,984,986,988],{"class":690,"line":845},[688,969,780],{"class":712},[688,971,739],{"class":716},[688,973,785],{"class":712},[688,975,739],{"class":716},[688,977,790],{"class":712},[688,979,793],{"class":716},[688,981,796],{"class":712},[688,983,739],{"class":716},[688,985,801],{"class":712},[688,987,739],{"class":716},[688,989,806],{"class":712},[688,991,993,995,997,999,1001,1003,1005,1007,1009,1011,1013],{"class":690,"line":992},8,[688,994,780],{"class":712},[688,996,739],{"class":716},[688,998,785],{"class":712},[688,1000,739],{"class":716},[688,1002,820],{"class":712},[688,1004,793],{"class":716},[688,1006,796],{"class":712},[688,1008,739],{"class":716},[688,1010,801],{"class":712},[688,1012,739],{"class":716},[688,1014,833],{"class":712},[688,1016,1018],{"class":690,"line":1017},9,[688,1019,1020],{"class":716},"  },\n",[688,1022,1024,1026],{"class":690,"line":1023},10,[688,1025,848],{"class":716},[688,1027,842],{"class":712},[678,1029,1032],{"className":680,"code":1030,"filename":1031,"language":683,"meta":684,"style":684},"import type { EnrichContext } from 'evlog'\n\nconst deployment = (ctx: EnrichContext) => {\n  ctx.event.deploymentId = process.env.DEPLOYMENT_ID\n  ctx.event.deployedBy = process.env.DEPLOYED_BY\n}\n\napp.use(evlog({ enrichers: [deployment] })) \u002F\u002F Hono \u002F Express \u002F Elysia\n\u002F\u002F await app.register(evlog, { enrichers: [deployment] }) \u002F\u002F Fastify\n\u002F\u002F EvlogModule.forRoot({ enrichers: [deployment] }) \u002F\u002F NestJS\n","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS",[550,1033,1034,1057,1061,1087,1112,1136,1141,1145,1180,1188],{"__ignoreMap":684},[688,1035,1036,1038,1041,1043,1046,1048,1050,1052,1055],{"class":690,"line":691},[688,1037,865],{"class":701},[688,1039,1040],{"class":701}," type",[688,1042,868],{"class":716},[688,1044,1045],{"class":712}," EnrichContext",[688,1047,874],{"class":716},[688,1049,877],{"class":701},[688,1051,880],{"class":716},[688,1053,1054],{"class":756},"evlog",[688,1056,886],{"class":716},[688,1058,1059],{"class":690,"line":698},[688,1060,892],{"emptyLinePlaceholder":891},[688,1062,1063,1066,1069,1072,1074,1076,1078,1081,1083,1085],{"class":690,"line":733},[688,1064,1065],{"class":726},"const",[688,1067,1068],{"class":712}," deployment ",[688,1070,1071],{"class":716},"=",[688,1073,765],{"class":716},[688,1075,768],{"class":719},[688,1077,938],{"class":716},[688,1079,1045],{"class":1080},"sBMFI",[688,1082,723],{"class":716},[688,1084,727],{"class":726},[688,1086,730],{"class":716},[688,1088,1089,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110],{"class":690,"line":777},[688,1090,1091],{"class":712},"  ctx",[688,1093,739],{"class":716},[688,1095,785],{"class":712},[688,1097,739],{"class":716},[688,1099,790],{"class":712},[688,1101,793],{"class":716},[688,1103,796],{"class":712},[688,1105,739],{"class":716},[688,1107,801],{"class":712},[688,1109,739],{"class":716},[688,1111,806],{"class":712},[688,1113,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1134],{"class":690,"line":809},[688,1115,1091],{"class":712},[688,1117,739],{"class":716},[688,1119,785],{"class":712},[688,1121,739],{"class":716},[688,1123,820],{"class":712},[688,1125,793],{"class":716},[688,1127,796],{"class":712},[688,1129,739],{"class":716},[688,1131,801],{"class":712},[688,1133,739],{"class":716},[688,1135,833],{"class":712},[688,1137,1138],{"class":690,"line":836},[688,1139,1140],{"class":716},"}\n",[688,1142,1143],{"class":690,"line":845},[688,1144,892],{"emptyLinePlaceholder":891},[688,1146,1147,1150,1152,1155,1157,1159,1161,1164,1167,1169,1172,1174,1177],{"class":690,"line":992},[688,1148,1149],{"class":712},"app",[688,1151,739],{"class":716},[688,1153,1154],{"class":708},"use",[688,1156,713],{"class":712},[688,1158,1054],{"class":708},[688,1160,713],{"class":712},[688,1162,1163],{"class":716},"{",[688,1165,1166],{"class":750}," enrichers",[688,1168,938],{"class":716},[688,1170,1171],{"class":712}," [deployment] ",[688,1173,848],{"class":716},[688,1175,1176],{"class":712},")) ",[688,1178,1179],{"class":694},"\u002F\u002F Hono \u002F Express \u002F Elysia\n",[688,1181,1182,1185],{"class":690,"line":1017},[688,1183,1184],{"class":694},"\u002F\u002F await app.register(evlog, { enrichers: [deployment] })",[688,1186,1187],{"class":694}," \u002F\u002F Fastify\n",[688,1189,1190,1193],{"class":690,"line":1023},[688,1191,1192],{"class":694},"\u002F\u002F EvlogModule.forRoot({ enrichers: [deployment] })",[688,1194,1195],{"class":694}," \u002F\u002F NestJS\n",[678,1197,1199],{"className":680,"code":1198,"filename":286,"language":683,"meta":684,"style":684},"\u002F\u002F index.ts\nimport type { EnrichContext } from 'evlog'\nimport { initLogger } from 'evlog'\n\nconst deployment = (ctx: EnrichContext) => {\n  ctx.event.deploymentId = process.env.DEPLOYMENT_ID\n  ctx.event.deployedBy = process.env.DEPLOYED_BY\n}\n\ninitLogger({ enrichers: [deployment] })\n",[550,1200,1201,1206,1226,1245,1249,1271,1295,1319,1323,1327],{"__ignoreMap":684},[688,1202,1203],{"class":690,"line":691},[688,1204,1205],{"class":694},"\u002F\u002F index.ts\n",[688,1207,1208,1210,1212,1214,1216,1218,1220,1222,1224],{"class":690,"line":698},[688,1209,865],{"class":701},[688,1211,1040],{"class":701},[688,1213,868],{"class":716},[688,1215,1045],{"class":712},[688,1217,874],{"class":716},[688,1219,877],{"class":701},[688,1221,880],{"class":716},[688,1223,1054],{"class":756},[688,1225,886],{"class":716},[688,1227,1228,1230,1232,1235,1237,1239,1241,1243],{"class":690,"line":733},[688,1229,865],{"class":701},[688,1231,868],{"class":716},[688,1233,1234],{"class":712}," initLogger",[688,1236,874],{"class":716},[688,1238,877],{"class":701},[688,1240,880],{"class":716},[688,1242,1054],{"class":756},[688,1244,886],{"class":716},[688,1246,1247],{"class":690,"line":777},[688,1248,892],{"emptyLinePlaceholder":891},[688,1250,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269],{"class":690,"line":809},[688,1252,1065],{"class":726},[688,1254,1068],{"class":712},[688,1256,1071],{"class":716},[688,1258,765],{"class":716},[688,1260,768],{"class":719},[688,1262,938],{"class":716},[688,1264,1045],{"class":1080},[688,1266,723],{"class":716},[688,1268,727],{"class":726},[688,1270,730],{"class":716},[688,1272,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293],{"class":690,"line":836},[688,1274,1091],{"class":712},[688,1276,739],{"class":716},[688,1278,785],{"class":712},[688,1280,739],{"class":716},[688,1282,790],{"class":712},[688,1284,793],{"class":716},[688,1286,796],{"class":712},[688,1288,739],{"class":716},[688,1290,801],{"class":712},[688,1292,739],{"class":716},[688,1294,806],{"class":712},[688,1296,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317],{"class":690,"line":845},[688,1298,1091],{"class":712},[688,1300,739],{"class":716},[688,1302,785],{"class":712},[688,1304,739],{"class":716},[688,1306,820],{"class":712},[688,1308,793],{"class":716},[688,1310,796],{"class":712},[688,1312,739],{"class":716},[688,1314,801],{"class":712},[688,1316,739],{"class":716},[688,1318,833],{"class":712},[688,1320,1321],{"class":690,"line":992},[688,1322,1140],{"class":716},[688,1324,1325],{"class":690,"line":1017},[688,1326,892],{"emptyLinePlaceholder":891},[688,1328,1329,1332,1334,1336,1338,1340,1342,1344],{"class":690,"line":1023},[688,1330,1331],{"class":708},"initLogger",[688,1333,713],{"class":712},[688,1335,1163],{"class":716},[688,1337,1166],{"class":750},[688,1339,938],{"class":716},[688,1341,1171],{"class":712},[688,1343,848],{"class":716},[688,1345,842],{"class":712},[667,1347,1349],{"id":1348},"enrichcontext","EnrichContext",[538,1351,1352,1353,1355,1356,938],{},"The ",[550,1354,757],{}," hook receives an ",[550,1357,1349],{},[678,1359,1362],{"className":680,"code":1360,"filename":1361,"language":683,"meta":684,"style":684},"interface EnrichContext {\n  \u002F** The emitted wide event (mutable) *\u002F\n  event: WideEvent\n  \u002F** Request metadata *\u002F\n  request?: {\n    method?: string\n    path?: string\n    requestId?: string\n  }\n  \u002F** Safe HTTP request headers (sensitive headers filtered out) *\u002F\n  headers?: Record\u003Cstring, string>\n  \u002F** Response metadata *\u002F\n  response?: {\n    status?: number\n    headers?: Record\u003Cstring, string>\n  }\n}\n","enrich-context.ts",[550,1363,1364,1373,1378,1388,1393,1403,1413,1422,1431,1436,1441,1466,1472,1482,1493,1513,1518],{"__ignoreMap":684},[688,1365,1366,1369,1371],{"class":690,"line":691},[688,1367,1368],{"class":726},"interface",[688,1370,1045],{"class":1080},[688,1372,730],{"class":716},[688,1374,1375],{"class":690,"line":698},[688,1376,1377],{"class":694},"  \u002F** The emitted wide event (mutable) *\u002F\n",[688,1379,1380,1383,1385],{"class":690,"line":733},[688,1381,1382],{"class":750},"  event",[688,1384,938],{"class":716},[688,1386,1387],{"class":1080}," WideEvent\n",[688,1389,1390],{"class":690,"line":777},[688,1391,1392],{"class":694},"  \u002F** Request metadata *\u002F\n",[688,1394,1395,1398,1401],{"class":690,"line":809},[688,1396,1397],{"class":750},"  request",[688,1399,1400],{"class":716},"?:",[688,1402,730],{"class":716},[688,1404,1405,1408,1410],{"class":690,"line":836},[688,1406,1407],{"class":750},"    method",[688,1409,1400],{"class":716},[688,1411,1412],{"class":1080}," string\n",[688,1414,1415,1418,1420],{"class":690,"line":845},[688,1416,1417],{"class":750},"    path",[688,1419,1400],{"class":716},[688,1421,1412],{"class":1080},[688,1423,1424,1427,1429],{"class":690,"line":992},[688,1425,1426],{"class":750},"    requestId",[688,1428,1400],{"class":716},[688,1430,1412],{"class":1080},[688,1432,1433],{"class":690,"line":1017},[688,1434,1435],{"class":716},"  }\n",[688,1437,1438],{"class":690,"line":1023},[688,1439,1440],{"class":694},"  \u002F** Safe HTTP request headers (sensitive headers filtered out) *\u002F\n",[688,1442,1444,1447,1449,1452,1455,1458,1460,1463],{"class":690,"line":1443},11,[688,1445,1446],{"class":750},"  headers",[688,1448,1400],{"class":716},[688,1450,1451],{"class":1080}," Record",[688,1453,1454],{"class":716},"\u003C",[688,1456,1457],{"class":1080},"string",[688,1459,762],{"class":716},[688,1461,1462],{"class":1080}," string",[688,1464,1465],{"class":716},">\n",[688,1467,1469],{"class":690,"line":1468},12,[688,1470,1471],{"class":694},"  \u002F** Response metadata *\u002F\n",[688,1473,1475,1478,1480],{"class":690,"line":1474},13,[688,1476,1477],{"class":750},"  response",[688,1479,1400],{"class":716},[688,1481,730],{"class":716},[688,1483,1485,1488,1490],{"class":690,"line":1484},14,[688,1486,1487],{"class":750},"    status",[688,1489,1400],{"class":716},[688,1491,1492],{"class":1080}," number\n",[688,1494,1496,1499,1501,1503,1505,1507,1509,1511],{"class":690,"line":1495},15,[688,1497,1498],{"class":750},"    headers",[688,1500,1400],{"class":716},[688,1502,1451],{"class":1080},[688,1504,1454],{"class":716},[688,1506,1457],{"class":1080},[688,1508,762],{"class":716},[688,1510,1462],{"class":1080},[688,1512,1465],{"class":716},[688,1514,1516],{"class":690,"line":1515},16,[688,1517,1435],{"class":716},[688,1519,1521],{"class":690,"line":1520},17,[688,1522,1140],{"class":716},[1524,1525,1527,1530,1531,1534,1535,1534,1538,1541],"callout",{"color":1526,"icon":376},"success",[542,1528,1529],{},"Security:"," Sensitive headers (",[550,1532,1533],{},"authorization",", ",[550,1536,1537],{},"cookie",[550,1539,1540],{},"x-api-key",", etc.) are automatically filtered and never passed to enrichers.",[667,1543,1545,1546],{"id":1544},"recommended-pattern-defineenricher","Recommended pattern — ",[550,1547,552],{},[538,1549,1550,1551,1553],{},"Every built-in enricher uses this same factory. Provide ",[550,1552,560],{}," and you're done:",[678,1555,1558],{"className":680,"code":1556,"filename":1557,"language":683,"meta":684,"style":684},"import { defineEnricher, getHeader, type EnricherOptions } from 'evlog\u002Ftoolkit'\n\ninterface TenantInfo {\n  id: string\n  org?: string\n}\n\nexport function createTenantEnricher(options: EnricherOptions & { headerName?: string } = {}) {\n  const headerName = options.headerName ?? 'x-tenant-id'\n\n  return defineEnricher\u003CTenantInfo>({\n    name: 'tenant',\n    field: 'tenant',\n    compute: ({ headers }) => {\n      const id = getHeader(headers, headerName)\n      if (!id) return undefined\n      return { id }\n    },\n  }, options)\n}\n","server\u002Futils\u002Fenrichers.ts",[550,1559,1560,1591,1595,1604,1613,1622,1626,1630,1670,1697,1701,1720,1736,1751,1771,1794,1816,1828,1834,1844],{"__ignoreMap":684},[688,1561,1562,1564,1566,1569,1571,1574,1576,1578,1581,1583,1585,1587,1589],{"class":690,"line":691},[688,1563,865],{"class":701},[688,1565,868],{"class":716},[688,1567,1568],{"class":712}," defineEnricher",[688,1570,762],{"class":716},[688,1572,1573],{"class":712}," getHeader",[688,1575,762],{"class":716},[688,1577,1040],{"class":701},[688,1579,1580],{"class":712}," EnricherOptions",[688,1582,874],{"class":716},[688,1584,877],{"class":701},[688,1586,880],{"class":716},[688,1588,556],{"class":756},[688,1590,886],{"class":716},[688,1592,1593],{"class":690,"line":698},[688,1594,892],{"emptyLinePlaceholder":891},[688,1596,1597,1599,1602],{"class":690,"line":733},[688,1598,1368],{"class":726},[688,1600,1601],{"class":1080}," TenantInfo",[688,1603,730],{"class":716},[688,1605,1606,1609,1611],{"class":690,"line":777},[688,1607,1608],{"class":750},"  id",[688,1610,938],{"class":716},[688,1612,1412],{"class":1080},[688,1614,1615,1618,1620],{"class":690,"line":809},[688,1616,1617],{"class":750},"  org",[688,1619,1400],{"class":716},[688,1621,1412],{"class":1080},[688,1623,1624],{"class":690,"line":836},[688,1625,1140],{"class":716},[688,1627,1628],{"class":690,"line":845},[688,1629,892],{"emptyLinePlaceholder":891},[688,1631,1632,1634,1637,1640,1642,1645,1647,1649,1652,1654,1657,1659,1661,1663,1665,1668],{"class":690,"line":992},[688,1633,702],{"class":701},[688,1635,1636],{"class":726}," function",[688,1638,1639],{"class":708}," createTenantEnricher",[688,1641,713],{"class":716},[688,1643,1644],{"class":719},"options",[688,1646,938],{"class":716},[688,1648,1580],{"class":1080},[688,1650,1651],{"class":716}," &",[688,1653,868],{"class":716},[688,1655,1656],{"class":750}," headerName",[688,1658,1400],{"class":716},[688,1660,1462],{"class":1080},[688,1662,874],{"class":716},[688,1664,793],{"class":716},[688,1666,1667],{"class":716}," {})",[688,1669,730],{"class":716},[688,1671,1672,1675,1677,1679,1682,1684,1687,1690,1692,1695],{"class":690,"line":1017},[688,1673,1674],{"class":726},"  const",[688,1676,1656],{"class":712},[688,1678,793],{"class":716},[688,1680,1681],{"class":712}," options",[688,1683,739],{"class":716},[688,1685,1686],{"class":712},"headerName",[688,1688,1689],{"class":716}," ??",[688,1691,880],{"class":716},[688,1693,1694],{"class":756},"x-tenant-id",[688,1696,886],{"class":716},[688,1698,1699],{"class":690,"line":1023},[688,1700,892],{"emptyLinePlaceholder":891},[688,1702,1703,1706,1708,1710,1713,1716,1718],{"class":690,"line":1443},[688,1704,1705],{"class":701},"  return",[688,1707,1568],{"class":708},[688,1709,1454],{"class":716},[688,1711,1712],{"class":1080},"TenantInfo",[688,1714,1715],{"class":716},">",[688,1717,713],{"class":750},[688,1719,930],{"class":716},[688,1721,1722,1725,1727,1729,1732,1734],{"class":690,"line":1468},[688,1723,1724],{"class":750},"    name",[688,1726,938],{"class":716},[688,1728,880],{"class":716},[688,1730,1731],{"class":756},"tenant",[688,1733,753],{"class":716},[688,1735,948],{"class":716},[688,1737,1738,1741,1743,1745,1747,1749],{"class":690,"line":1474},[688,1739,1740],{"class":750},"    field",[688,1742,938],{"class":716},[688,1744,880],{"class":716},[688,1746,1731],{"class":756},[688,1748,753],{"class":716},[688,1750,948],{"class":716},[688,1752,1753,1756,1758,1761,1764,1767,1769],{"class":690,"line":1484},[688,1754,1755],{"class":708},"    compute",[688,1757,938],{"class":716},[688,1759,1760],{"class":716}," ({",[688,1762,1763],{"class":719}," headers",[688,1765,1766],{"class":716}," })",[688,1768,727],{"class":726},[688,1770,730],{"class":716},[688,1772,1773,1776,1779,1781,1783,1785,1788,1790,1792],{"class":690,"line":1495},[688,1774,1775],{"class":726},"      const",[688,1777,1778],{"class":712}," id",[688,1780,793],{"class":716},[688,1782,1573],{"class":708},[688,1784,713],{"class":750},[688,1786,1787],{"class":712},"headers",[688,1789,762],{"class":716},[688,1791,1656],{"class":712},[688,1793,842],{"class":750},[688,1795,1796,1799,1801,1804,1807,1810,1813],{"class":690,"line":1515},[688,1797,1798],{"class":701},"      if",[688,1800,765],{"class":750},[688,1802,1803],{"class":716},"!",[688,1805,1806],{"class":712},"id",[688,1808,1809],{"class":750},") ",[688,1811,1812],{"class":701},"return",[688,1814,1815],{"class":716}," undefined\n",[688,1817,1818,1821,1823,1825],{"class":690,"line":1520},[688,1819,1820],{"class":701},"      return",[688,1822,868],{"class":716},[688,1824,1778],{"class":712},[688,1826,1827],{"class":716}," }\n",[688,1829,1831],{"class":690,"line":1830},18,[688,1832,1833],{"class":716},"    },\n",[688,1835,1837,1840,1842],{"class":690,"line":1836},19,[688,1838,1839],{"class":716},"  },",[688,1841,1681],{"class":712},[688,1843,842],{"class":750},[688,1845,1847],{"class":690,"line":1846},20,[688,1848,1140],{"class":716},[538,1850,1851,1853],{},[550,1852,552],{}," automatically:",[571,1855,1856,1864,1878],{},[574,1857,1858,1859,1861,1862],{},"skips when ",[550,1860,560],{}," returns ",[550,1863,612],{},[574,1865,1866,1867,1870,1871,1874,1875,723],{},"merges the result into ",[550,1868,1869],{},"ctx.event[field]"," via ",[550,1872,1873],{},"mergeEventField"," (respecting ",[550,1876,1877],{},"options.overwrite",[574,1879,1880,1881,1884],{},"catches errors and logs them as ",[550,1882,1883],{},"[evlog\u002F\u003Cname>]"," instead of breaking the pipeline",[538,1886,1887],{},"Wire it like any other enricher:",[675,1889,1890,2004,2149,2250],{},[678,1891,1893],{"className":680,"code":1892,"filename":682,"language":683,"meta":684,"style":684},"\u002F\u002F server\u002Fplugins\u002Fevlog-enrich.ts\nimport { createTenantEnricher } from '~\u002Fserver\u002Futils\u002Fenrichers'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const enrichTenant = createTenantEnricher({ headerName: 'x-org-id' })\n  nitroApp.hooks.hook('evlog:enrich', enrichTenant)\n})\n",[550,1894,1895,1899,1918,1922,1942,1972,1998],{"__ignoreMap":684},[688,1896,1897],{"class":690,"line":691},[688,1898,695],{"class":694},[688,1900,1901,1903,1905,1907,1909,1911,1913,1916],{"class":690,"line":698},[688,1902,865],{"class":701},[688,1904,868],{"class":716},[688,1906,1639],{"class":712},[688,1908,874],{"class":716},[688,1910,877],{"class":701},[688,1912,880],{"class":716},[688,1914,1915],{"class":756},"~\u002Fserver\u002Futils\u002Fenrichers",[688,1917,886],{"class":716},[688,1919,1920],{"class":690,"line":733},[688,1921,892],{"emptyLinePlaceholder":891},[688,1923,1924,1926,1928,1930,1932,1934,1936,1938,1940],{"class":690,"line":777},[688,1925,702],{"class":701},[688,1927,705],{"class":701},[688,1929,709],{"class":708},[688,1931,713],{"class":712},[688,1933,713],{"class":716},[688,1935,720],{"class":719},[688,1937,723],{"class":716},[688,1939,727],{"class":726},[688,1941,730],{"class":716},[688,1943,1944,1946,1949,1951,1953,1955,1957,1959,1961,1963,1966,1968,1970],{"class":690,"line":809},[688,1945,1674],{"class":726},[688,1947,1948],{"class":712}," enrichTenant",[688,1950,793],{"class":716},[688,1952,1639],{"class":708},[688,1954,713],{"class":750},[688,1956,1163],{"class":716},[688,1958,1656],{"class":750},[688,1960,938],{"class":716},[688,1962,880],{"class":716},[688,1964,1965],{"class":756},"x-org-id",[688,1967,753],{"class":716},[688,1969,874],{"class":716},[688,1971,842],{"class":750},[688,1973,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996],{"class":690,"line":836},[688,1975,736],{"class":712},[688,1977,739],{"class":716},[688,1979,742],{"class":712},[688,1981,739],{"class":716},[688,1983,747],{"class":708},[688,1985,713],{"class":750},[688,1987,753],{"class":716},[688,1989,757],{"class":756},[688,1991,753],{"class":716},[688,1993,762],{"class":716},[688,1995,1948],{"class":712},[688,1997,842],{"class":750},[688,1999,2000,2002],{"class":690,"line":845},[688,2001,848],{"class":716},[688,2003,842],{"class":712},[678,2005,2007],{"className":680,"code":2006,"filename":231,"language":683,"meta":684,"style":684},"\u002F\u002F lib\u002Fevlog.ts\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createTenantEnricher } from '.\u002Fenrichers'\n\nconst enrichTenant = createTenantEnricher({ headerName: 'x-org-id' })\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  enrich: enrichTenant,\n})\n",[550,2008,2009,2013,2031,2050,2054,2083,2087,2119,2133,2143],{"__ignoreMap":684},[688,2010,2011],{"class":690,"line":691},[688,2012,860],{"class":694},[688,2014,2015,2017,2019,2021,2023,2025,2027,2029],{"class":690,"line":698},[688,2016,865],{"class":701},[688,2018,868],{"class":716},[688,2020,871],{"class":712},[688,2022,874],{"class":716},[688,2024,877],{"class":701},[688,2026,880],{"class":716},[688,2028,883],{"class":756},[688,2030,886],{"class":716},[688,2032,2033,2035,2037,2039,2041,2043,2045,2048],{"class":690,"line":733},[688,2034,865],{"class":701},[688,2036,868],{"class":716},[688,2038,1639],{"class":712},[688,2040,874],{"class":716},[688,2042,877],{"class":701},[688,2044,880],{"class":716},[688,2046,2047],{"class":756},".\u002Fenrichers",[688,2049,886],{"class":716},[688,2051,2052],{"class":690,"line":777},[688,2053,892],{"emptyLinePlaceholder":891},[688,2055,2056,2058,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081],{"class":690,"line":809},[688,2057,1065],{"class":726},[688,2059,2060],{"class":712}," enrichTenant ",[688,2062,1071],{"class":716},[688,2064,1639],{"class":708},[688,2066,713],{"class":712},[688,2068,1163],{"class":716},[688,2070,1656],{"class":750},[688,2072,938],{"class":716},[688,2074,880],{"class":716},[688,2076,1965],{"class":756},[688,2078,753],{"class":716},[688,2080,874],{"class":716},[688,2082,842],{"class":712},[688,2084,2085],{"class":690,"line":836},[688,2086,892],{"emptyLinePlaceholder":891},[688,2088,2089,2091,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117],{"class":690,"line":845},[688,2090,702],{"class":701},[688,2092,899],{"class":726},[688,2094,868],{"class":716},[688,2096,904],{"class":712},[688,2098,762],{"class":716},[688,2100,909],{"class":712},[688,2102,762],{"class":716},[688,2104,914],{"class":712},[688,2106,762],{"class":716},[688,2108,919],{"class":712},[688,2110,848],{"class":716},[688,2112,793],{"class":716},[688,2114,871],{"class":708},[688,2116,713],{"class":712},[688,2118,930],{"class":716},[688,2120,2121,2123,2125,2127,2129,2131],{"class":690,"line":992},[688,2122,935],{"class":750},[688,2124,938],{"class":716},[688,2126,880],{"class":716},[688,2128,943],{"class":756},[688,2130,753],{"class":716},[688,2132,948],{"class":716},[688,2134,2135,2137,2139,2141],{"class":690,"line":1017},[688,2136,953],{"class":750},[688,2138,938],{"class":716},[688,2140,1948],{"class":712},[688,2142,948],{"class":716},[688,2144,2145,2147],{"class":690,"line":1023},[688,2146,848],{"class":716},[688,2148,842],{"class":712},[678,2150,2152],{"className":680,"code":2151,"filename":1031,"language":683,"meta":684,"style":684},"import { createTenantEnricher } from '.\u002Fenrichers'\n\nconst enrichTenant = createTenantEnricher({ headerName: 'x-org-id' })\n\napp.use(evlog({ enrichers: [enrichTenant] }))\n\u002F\u002F await app.register(evlog, { enrichers: [enrichTenant] }) \u002F\u002F Fastify\n\u002F\u002F EvlogModule.forRoot({ enrichers: [enrichTenant] }) \u002F\u002F NestJS\n",[550,2153,2154,2172,2176,2204,2208,2236,2243],{"__ignoreMap":684},[688,2155,2156,2158,2160,2162,2164,2166,2168,2170],{"class":690,"line":691},[688,2157,865],{"class":701},[688,2159,868],{"class":716},[688,2161,1639],{"class":712},[688,2163,874],{"class":716},[688,2165,877],{"class":701},[688,2167,880],{"class":716},[688,2169,2047],{"class":756},[688,2171,886],{"class":716},[688,2173,2174],{"class":690,"line":698},[688,2175,892],{"emptyLinePlaceholder":891},[688,2177,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202],{"class":690,"line":733},[688,2179,1065],{"class":726},[688,2181,2060],{"class":712},[688,2183,1071],{"class":716},[688,2185,1639],{"class":708},[688,2187,713],{"class":712},[688,2189,1163],{"class":716},[688,2191,1656],{"class":750},[688,2193,938],{"class":716},[688,2195,880],{"class":716},[688,2197,1965],{"class":756},[688,2199,753],{"class":716},[688,2201,874],{"class":716},[688,2203,842],{"class":712},[688,2205,2206],{"class":690,"line":777},[688,2207,892],{"emptyLinePlaceholder":891},[688,2209,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2231,2233],{"class":690,"line":809},[688,2211,1149],{"class":712},[688,2213,739],{"class":716},[688,2215,1154],{"class":708},[688,2217,713],{"class":712},[688,2219,1054],{"class":708},[688,2221,713],{"class":712},[688,2223,1163],{"class":716},[688,2225,1166],{"class":750},[688,2227,938],{"class":716},[688,2229,2230],{"class":712}," [enrichTenant] ",[688,2232,848],{"class":716},[688,2234,2235],{"class":712},"))\n",[688,2237,2238,2241],{"class":690,"line":836},[688,2239,2240],{"class":694},"\u002F\u002F await app.register(evlog, { enrichers: [enrichTenant] })",[688,2242,1187],{"class":694},[688,2244,2245,2248],{"class":690,"line":845},[688,2246,2247],{"class":694},"\u002F\u002F EvlogModule.forRoot({ enrichers: [enrichTenant] })",[688,2249,1195],{"class":694},[678,2251,2253],{"className":680,"code":2252,"filename":286,"language":683,"meta":684,"style":684},"import { initLogger } from 'evlog'\nimport { createTenantEnricher } from '.\u002Fenrichers'\n\ninitLogger({\n  enrichers: [createTenantEnricher({ headerName: 'x-org-id' })],\n})\n",[550,2254,2255,2273,2291,2295,2303,2337],{"__ignoreMap":684},[688,2256,2257,2259,2261,2263,2265,2267,2269,2271],{"class":690,"line":691},[688,2258,865],{"class":701},[688,2260,868],{"class":716},[688,2262,1234],{"class":712},[688,2264,874],{"class":716},[688,2266,877],{"class":701},[688,2268,880],{"class":716},[688,2270,1054],{"class":756},[688,2272,886],{"class":716},[688,2274,2275,2277,2279,2281,2283,2285,2287,2289],{"class":690,"line":698},[688,2276,865],{"class":701},[688,2278,868],{"class":716},[688,2280,1639],{"class":712},[688,2282,874],{"class":716},[688,2284,877],{"class":701},[688,2286,880],{"class":716},[688,2288,2047],{"class":756},[688,2290,886],{"class":716},[688,2292,2293],{"class":690,"line":733},[688,2294,892],{"emptyLinePlaceholder":891},[688,2296,2297,2299,2301],{"class":690,"line":777},[688,2298,1331],{"class":708},[688,2300,713],{"class":712},[688,2302,930],{"class":716},[688,2304,2305,2308,2310,2313,2316,2318,2320,2322,2324,2326,2328,2330,2332,2335],{"class":690,"line":809},[688,2306,2307],{"class":750},"  enrichers",[688,2309,938],{"class":716},[688,2311,2312],{"class":712}," [",[688,2314,2315],{"class":708},"createTenantEnricher",[688,2317,713],{"class":712},[688,2319,1163],{"class":716},[688,2321,1656],{"class":750},[688,2323,938],{"class":716},[688,2325,880],{"class":716},[688,2327,1965],{"class":756},[688,2329,753],{"class":716},[688,2331,874],{"class":716},[688,2333,2334],{"class":712},")]",[688,2336,948],{"class":716},[688,2338,2339,2341],{"class":690,"line":836},[688,2340,848],{"class":716},[688,2342,842],{"class":712},[667,2344,2346],{"id":2345},"combining-with-built-in-enrichers","Combining with built-in enrichers",[538,2348,2349,2350,2353,2354,553,2357,2359],{},"Custom and built-in enrichers compose freely, since they're all just ",[550,2351,2352],{},"(ctx: EnrichContext) => void"," functions. Use ",[550,2355,2356],{},"composeEnrichers",[550,2358,556],{}," to combine them into a single callable:",[678,2361,2364],{"className":680,"code":2362,"filename":2363,"language":683,"meta":684,"style":684},"import { composeEnrichers, defineEnricher } from 'evlog\u002Ftoolkit'\nimport { createDefaultEnrichers } from 'evlog\u002Fenrichers'\n\nconst region = defineEnricher({\n  name: 'region',\n  field: 'region',\n  compute: () => process.env.FLY_REGION ?? process.env.AWS_REGION,\n})\n\nexport const enrich = composeEnrichers([\n  createDefaultEnrichers(), \u002F\u002F userAgent + geo + requestSize + traceContext\n  region,\n])\n","enrichers.ts",[550,2365,2366,2389,2409,2413,2428,2444,2459,2498,2504,2508,2524,2537,2544],{"__ignoreMap":684},[688,2367,2368,2370,2372,2375,2377,2379,2381,2383,2385,2387],{"class":690,"line":691},[688,2369,865],{"class":701},[688,2371,868],{"class":716},[688,2373,2374],{"class":712}," composeEnrichers",[688,2376,762],{"class":716},[688,2378,1568],{"class":712},[688,2380,874],{"class":716},[688,2382,877],{"class":701},[688,2384,880],{"class":716},[688,2386,556],{"class":756},[688,2388,886],{"class":716},[688,2390,2391,2393,2395,2398,2400,2402,2404,2407],{"class":690,"line":698},[688,2392,865],{"class":701},[688,2394,868],{"class":716},[688,2396,2397],{"class":712}," createDefaultEnrichers",[688,2399,874],{"class":716},[688,2401,877],{"class":701},[688,2403,880],{"class":716},[688,2405,2406],{"class":756},"evlog\u002Fenrichers",[688,2408,886],{"class":716},[688,2410,2411],{"class":690,"line":733},[688,2412,892],{"emptyLinePlaceholder":891},[688,2414,2415,2417,2420,2422,2424,2426],{"class":690,"line":777},[688,2416,1065],{"class":726},[688,2418,2419],{"class":712}," region ",[688,2421,1071],{"class":716},[688,2423,1568],{"class":708},[688,2425,713],{"class":712},[688,2427,930],{"class":716},[688,2429,2430,2433,2435,2437,2440,2442],{"class":690,"line":809},[688,2431,2432],{"class":750},"  name",[688,2434,938],{"class":716},[688,2436,880],{"class":716},[688,2438,2439],{"class":756},"region",[688,2441,753],{"class":716},[688,2443,948],{"class":716},[688,2445,2446,2449,2451,2453,2455,2457],{"class":690,"line":836},[688,2447,2448],{"class":750},"  field",[688,2450,938],{"class":716},[688,2452,880],{"class":716},[688,2454,2439],{"class":756},[688,2456,753],{"class":716},[688,2458,948],{"class":716},[688,2460,2461,2464,2466,2469,2471,2473,2475,2477,2479,2482,2485,2487,2489,2491,2493,2496],{"class":690,"line":845},[688,2462,2463],{"class":708},"  compute",[688,2465,938],{"class":716},[688,2467,2468],{"class":716}," ()",[688,2470,727],{"class":726},[688,2472,796],{"class":712},[688,2474,739],{"class":716},[688,2476,801],{"class":712},[688,2478,739],{"class":716},[688,2480,2481],{"class":712},"FLY_REGION ",[688,2483,2484],{"class":716},"??",[688,2486,796],{"class":712},[688,2488,739],{"class":716},[688,2490,801],{"class":712},[688,2492,739],{"class":716},[688,2494,2495],{"class":712},"AWS_REGION",[688,2497,948],{"class":716},[688,2499,2500,2502],{"class":690,"line":992},[688,2501,848],{"class":716},[688,2503,842],{"class":712},[688,2505,2506],{"class":690,"line":1017},[688,2507,892],{"emptyLinePlaceholder":891},[688,2509,2510,2512,2514,2517,2519,2521],{"class":690,"line":1023},[688,2511,702],{"class":701},[688,2513,899],{"class":726},[688,2515,2516],{"class":712}," enrich ",[688,2518,1071],{"class":716},[688,2520,2374],{"class":708},[688,2522,2523],{"class":712},"([\n",[688,2525,2526,2529,2532,2534],{"class":690,"line":1443},[688,2527,2528],{"class":708},"  createDefaultEnrichers",[688,2530,2531],{"class":712},"()",[688,2533,762],{"class":716},[688,2535,2536],{"class":694}," \u002F\u002F userAgent + geo + requestSize + traceContext\n",[688,2538,2539,2542],{"class":690,"line":1468},[688,2540,2541],{"class":712},"  region",[688,2543,948],{"class":716},[688,2545,2546],{"class":690,"line":1474},[688,2547,2548],{"class":712},"])\n",[667,2550,2552],{"id":2551},"more-examples","More examples",[538,2554,2555,2556,2558],{},"Each example below is a plain ",[550,2557,552],{}," call, wired the same way as the basic example, regardless of framework.",[2560,2561,2563],"h3",{"id":2562},"feature-flags","Feature flags",[678,2565,2568],{"className":680,"code":2566,"filename":2567,"language":683,"meta":684,"style":684},"import { defineEnricher } from 'evlog\u002Ftoolkit'\n\nexport const featureFlags = defineEnricher({\n  name: 'feature-flags',\n  field: 'featureFlags',\n  compute: () => ({\n    newCheckout: isEnabled('new-checkout'),\n    betaApi: isEnabled('beta-api'),\n  }),\n})\n","enricher-feature-flags.ts",[550,2569,2570,2588,2592,2609,2623,2638,2652,2675,2697,2705],{"__ignoreMap":684},[688,2571,2572,2574,2576,2578,2580,2582,2584,2586],{"class":690,"line":691},[688,2573,865],{"class":701},[688,2575,868],{"class":716},[688,2577,1568],{"class":712},[688,2579,874],{"class":716},[688,2581,877],{"class":701},[688,2583,880],{"class":716},[688,2585,556],{"class":756},[688,2587,886],{"class":716},[688,2589,2590],{"class":690,"line":698},[688,2591,892],{"emptyLinePlaceholder":891},[688,2593,2594,2596,2598,2601,2603,2605,2607],{"class":690,"line":733},[688,2595,702],{"class":701},[688,2597,899],{"class":726},[688,2599,2600],{"class":712}," featureFlags ",[688,2602,1071],{"class":716},[688,2604,1568],{"class":708},[688,2606,713],{"class":712},[688,2608,930],{"class":716},[688,2610,2611,2613,2615,2617,2619,2621],{"class":690,"line":777},[688,2612,2432],{"class":750},[688,2614,938],{"class":716},[688,2616,880],{"class":716},[688,2618,2562],{"class":756},[688,2620,753],{"class":716},[688,2622,948],{"class":716},[688,2624,2625,2627,2629,2631,2634,2636],{"class":690,"line":809},[688,2626,2448],{"class":750},[688,2628,938],{"class":716},[688,2630,880],{"class":716},[688,2632,2633],{"class":756},"featureFlags",[688,2635,753],{"class":716},[688,2637,948],{"class":716},[688,2639,2640,2642,2644,2646,2648,2650],{"class":690,"line":836},[688,2641,2463],{"class":708},[688,2643,938],{"class":716},[688,2645,2468],{"class":716},[688,2647,727],{"class":726},[688,2649,765],{"class":712},[688,2651,930],{"class":716},[688,2653,2654,2657,2659,2662,2664,2666,2669,2671,2673],{"class":690,"line":845},[688,2655,2656],{"class":750},"    newCheckout",[688,2658,938],{"class":716},[688,2660,2661],{"class":708}," isEnabled",[688,2663,713],{"class":712},[688,2665,753],{"class":716},[688,2667,2668],{"class":756},"new-checkout",[688,2670,753],{"class":716},[688,2672,723],{"class":712},[688,2674,948],{"class":716},[688,2676,2677,2680,2682,2684,2686,2688,2691,2693,2695],{"class":690,"line":992},[688,2678,2679],{"class":750},"    betaApi",[688,2681,938],{"class":716},[688,2683,2661],{"class":708},[688,2685,713],{"class":712},[688,2687,753],{"class":716},[688,2689,2690],{"class":756},"beta-api",[688,2692,753],{"class":716},[688,2694,723],{"class":712},[688,2696,948],{"class":716},[688,2698,2699,2701,2703],{"class":690,"line":1017},[688,2700,839],{"class":716},[688,2702,723],{"class":712},[688,2704,948],{"class":716},[688,2706,2707,2709],{"class":690,"line":1023},[688,2708,848],{"class":716},[688,2710,842],{"class":712},[2560,2712,2714],{"id":2713},"response-time-classification","Response time classification",[678,2716,2719],{"className":680,"code":2717,"filename":2718,"language":683,"meta":684,"style":684},"import { defineEnricher } from 'evlog\u002Ftoolkit'\n\nexport const performanceTier = defineEnricher\u003Cstring>({\n  name: 'performance-tier',\n  field: 'performanceTier',\n  compute: ({ event }) => {\n    const durationMs = event.durationMs\n    if (durationMs === undefined) return undefined\n    if (durationMs \u003C 100) return 'fast'\n    if (durationMs \u003C 500) return 'normal'\n    if (durationMs \u003C 2000) return 'slow'\n    return 'critical'\n  },\n})\n","enricher-perf-tier.ts",[550,2720,2721,2739,2743,2766,2781,2796,2813,2830,2852,2878,2902,2926,2938,2942],{"__ignoreMap":684},[688,2722,2723,2725,2727,2729,2731,2733,2735,2737],{"class":690,"line":691},[688,2724,865],{"class":701},[688,2726,868],{"class":716},[688,2728,1568],{"class":712},[688,2730,874],{"class":716},[688,2732,877],{"class":701},[688,2734,880],{"class":716},[688,2736,556],{"class":756},[688,2738,886],{"class":716},[688,2740,2741],{"class":690,"line":698},[688,2742,892],{"emptyLinePlaceholder":891},[688,2744,2745,2747,2749,2752,2754,2756,2758,2760,2762,2764],{"class":690,"line":733},[688,2746,702],{"class":701},[688,2748,899],{"class":726},[688,2750,2751],{"class":712}," performanceTier ",[688,2753,1071],{"class":716},[688,2755,1568],{"class":708},[688,2757,1454],{"class":716},[688,2759,1457],{"class":1080},[688,2761,1715],{"class":716},[688,2763,713],{"class":712},[688,2765,930],{"class":716},[688,2767,2768,2770,2772,2774,2777,2779],{"class":690,"line":777},[688,2769,2432],{"class":750},[688,2771,938],{"class":716},[688,2773,880],{"class":716},[688,2775,2776],{"class":756},"performance-tier",[688,2778,753],{"class":716},[688,2780,948],{"class":716},[688,2782,2783,2785,2787,2789,2792,2794],{"class":690,"line":809},[688,2784,2448],{"class":750},[688,2786,938],{"class":716},[688,2788,880],{"class":716},[688,2790,2791],{"class":756},"performanceTier",[688,2793,753],{"class":716},[688,2795,948],{"class":716},[688,2797,2798,2800,2802,2804,2807,2809,2811],{"class":690,"line":836},[688,2799,2463],{"class":708},[688,2801,938],{"class":716},[688,2803,1760],{"class":716},[688,2805,2806],{"class":719}," event",[688,2808,1766],{"class":716},[688,2810,727],{"class":726},[688,2812,730],{"class":716},[688,2814,2815,2818,2821,2823,2825,2827],{"class":690,"line":845},[688,2816,2817],{"class":726},"    const",[688,2819,2820],{"class":712}," durationMs",[688,2822,793],{"class":716},[688,2824,2806],{"class":712},[688,2826,739],{"class":716},[688,2828,2829],{"class":712},"durationMs\n",[688,2831,2832,2835,2837,2840,2843,2846,2848,2850],{"class":690,"line":992},[688,2833,2834],{"class":701},"    if",[688,2836,765],{"class":750},[688,2838,2839],{"class":712},"durationMs",[688,2841,2842],{"class":716}," ===",[688,2844,2845],{"class":716}," undefined",[688,2847,1809],{"class":750},[688,2849,1812],{"class":701},[688,2851,1815],{"class":716},[688,2853,2854,2856,2858,2860,2863,2867,2869,2871,2873,2876],{"class":690,"line":1017},[688,2855,2834],{"class":701},[688,2857,765],{"class":750},[688,2859,2839],{"class":712},[688,2861,2862],{"class":716}," \u003C",[688,2864,2866],{"class":2865},"sbssI"," 100",[688,2868,1809],{"class":750},[688,2870,1812],{"class":701},[688,2872,880],{"class":716},[688,2874,2875],{"class":756},"fast",[688,2877,886],{"class":716},[688,2879,2880,2882,2884,2886,2888,2891,2893,2895,2897,2900],{"class":690,"line":1023},[688,2881,2834],{"class":701},[688,2883,765],{"class":750},[688,2885,2839],{"class":712},[688,2887,2862],{"class":716},[688,2889,2890],{"class":2865}," 500",[688,2892,1809],{"class":750},[688,2894,1812],{"class":701},[688,2896,880],{"class":716},[688,2898,2899],{"class":756},"normal",[688,2901,886],{"class":716},[688,2903,2904,2906,2908,2910,2912,2915,2917,2919,2921,2924],{"class":690,"line":1443},[688,2905,2834],{"class":701},[688,2907,765],{"class":750},[688,2909,2839],{"class":712},[688,2911,2862],{"class":716},[688,2913,2914],{"class":2865}," 2000",[688,2916,1809],{"class":750},[688,2918,1812],{"class":701},[688,2920,880],{"class":716},[688,2922,2923],{"class":756},"slow",[688,2925,886],{"class":716},[688,2927,2928,2931,2933,2936],{"class":690,"line":1468},[688,2929,2930],{"class":701},"    return",[688,2932,880],{"class":716},[688,2934,2935],{"class":756},"critical",[688,2937,886],{"class":716},[688,2939,2940],{"class":690,"line":1474},[688,2941,1020],{"class":716},[688,2943,2944,2946],{"class":690,"line":1484},[688,2945,848],{"class":716},[688,2947,842],{"class":712},[667,2949,2951],{"id":2950},"when-to-reach-for-a-plugin-instead","When to reach for a plugin instead",[538,2953,2954,2955,2958],{},"If your feature mixes enrichment with other hooks (e.g. enrich + tail-sample + side-effect on drain), use a ",[656,2956,2957],{"href":469},"plugin"," instead: one cohesive object covering several lifecycle points.",[667,2960,2962],{"id":2961},"next-steps","Next steps",[571,2964,2965,2971,2976],{},[574,2966,2967,2970],{},[656,2968,2969],{"href":429},"Built-in Enrichers"," — User Agent, Geo, Request Size, Trace Context",[574,2972,2973,2975],{},[656,2974,468],{"href":469}," — multi-hook extensions (drain + enrich + keep in one object)",[574,2977,2978,2980],{},[656,2979,133],{"href":138}," — send enriched events to external services",[2982,2983,2984],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":684,"searchDepth":698,"depth":698,"links":2986},[2987,2988,2989,2991,2992,2996,2997],{"id":669,"depth":698,"text":670},{"id":1348,"depth":698,"text":1349},{"id":1544,"depth":698,"text":2990},"Recommended pattern — defineEnricher",{"id":2345,"depth":698,"text":2346},{"id":2551,"depth":698,"text":2552,"children":2993},[2994,2995],{"id":2562,"depth":733,"text":2563},{"id":2713,"depth":733,"text":2714},{"id":2950,"depth":698,"text":2951},{"id":2961,"depth":698,"text":2962},"Write an enricher that adds deployment metadata, tenant ids, feature flags, or anything computed. Error isolation and merging are handled.","md",[3001,3004],{"label":2969,"icon":453,"to":429,"color":3002,"variant":3003},"neutral","subtle",{"label":468,"icon":443,"to":469,"color":3002,"variant":3003},{},{"title":472,"icon":475},{"title":530,"description":2998},"y3twrtPnPaDl9HpzSYPk4nIdybNVXppRABeeycOWPTU",[3010,3012],{"title":468,"path":469,"stem":470,"description":3011,"children":-1},"[object Object]",{"title":477,"path":478,"stem":479,"description":3013,"icon":480,"children":-1},"Decide after the fact whether to keep an event, knowing its status, duration, and errors. Keep every error, throw away healthy noise.",1786793482102]