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