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