[{"data":1,"prerenderedAt":3509},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-hybrid-clickhouse":612,"-integrate-adapters-hybrid-clickhouse-surround":3504},[4,35,85,138,318,453,489,548,587],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"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",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"path":455,"stem":456,"children":457,"page":34},"Libraries","\u002Flibraries","6.libraries",[458,462,467,470,474,479,484],{"title":41,"path":459,"stem":460,"icon":461},"\u002Flibraries\u002Foverview","6.libraries\u002F0.overview","i-lucide-package",{"title":463,"path":464,"stem":465,"icon":466},"Emitting Events","\u002Flibraries\u002Femitting","6.libraries\u002F1.emitting","i-lucide-radio",{"title":56,"path":468,"stem":469,"icon":59},"\u002Flibraries\u002Ferrors","6.libraries\u002F2.errors",{"title":471,"path":472,"stem":473,"icon":132},"Errors Agents Can Act On","\u002Flibraries\u002Fagents","6.libraries\u002F3.agents",{"title":475,"path":476,"stem":477,"icon":478},"Exporting the Catalog","\u002Flibraries\u002Fexporting","6.libraries\u002F4.exporting","i-lucide-file-output",{"title":480,"path":481,"stem":482,"icon":483},"Migrating","\u002Flibraries\u002Fmigrating","6.libraries\u002F5.migrating","i-lucide-route",{"title":485,"path":486,"stem":487,"icon":488},"Testing","\u002Flibraries\u002Ftesting","6.libraries\u002F6.testing","i-lucide-flask-conical",{"title":490,"path":491,"stem":492,"children":493,"page":34},"Extend","\u002Fextend","7.extend",[494,498,503,508,512,517,521,525,529,533,538,543],{"title":41,"path":495,"stem":496,"icon":497},"\u002Fextend\u002Foverview","7.extend\u002F0.overview","i-lucide-blocks",{"title":499,"path":500,"stem":501,"icon":502},"Stream","\u002Fextend\u002Fstream","7.extend\u002F1.stream","i-lucide-radio-tower",{"title":504,"path":505,"stem":506,"icon":507},"Custom framework","\u002Fextend\u002Fcustom-framework","7.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":509,"path":510,"stem":511,"icon":502},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","7.extend\u002F11.diagnostics-channel",{"title":513,"path":514,"stem":515,"icon":516},"FS reader","\u002Fextend\u002Ffs-reader","7.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":518,"stem":519,"icon":520},"\u002Fextend\u002Fconsumer-recipes","7.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":522,"path":523,"stem":524,"icon":497},"Plugins","\u002Fextend\u002Fplugins","7.extend\u002F4.plugins",{"title":526,"path":527,"stem":528,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","7.extend\u002F5.custom-enrichers",{"title":530,"path":531,"stem":532,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","7.extend\u002F6.tail-sampling",{"title":534,"path":535,"stem":536,"icon":537},"Identity headers","\u002Fextend\u002Fidentity-headers","7.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":539,"path":540,"stem":541,"icon":542},"Custom drains","\u002Fextend\u002Fcustom-drains","7.extend\u002F8.custom-drains","i-lucide-share-2",{"title":544,"path":545,"stem":546,"icon":547},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","7.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":549,"stem":550,"children":551,"page":34},"\u002Freference","8.reference",[552,556,561,564,569,573,578,582],{"title":41,"path":553,"stem":554,"icon":555},"\u002Freference\u002Foverview","8.reference\u002F0.overview","i-lucide-book-marked",{"title":557,"path":558,"stem":559,"icon":560},"Configuration","\u002Freference\u002Fconfiguration","8.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":562,"stem":563,"icon":112},"\u002Freference\u002Fperformance","8.reference\u002F2.performance",{"title":565,"path":566,"stem":567,"icon":568},"Vite Plugin","\u002Freference\u002Fvite-plugin","8.reference\u002F3.vite-plugin","i-custom-vite",{"title":570,"path":571,"stem":572,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","8.reference\u002F4.best-practices",{"title":574,"path":575,"stem":576,"icon":577},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","8.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","8.reference\u002F6.agent-skills",{"title":583,"path":584,"stem":585,"icon":586},"Cost","\u002Freference\u002Fcost","8.reference\u002F7.cost","i-lucide-receipt",{"title":588,"path":589,"stem":590,"children":591,"page":34},"Compare","\u002Fcompare","9.compare",[592,596,600,604,608],{"title":593,"path":594,"stem":595,"icon":577},"evlog vs Pino","\u002Fcompare\u002Fpino","9.compare\u002F1.pino",{"title":597,"path":598,"stem":599,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","9.compare\u002F2.opentelemetry",{"title":601,"path":602,"stem":603,"icon":577},"evlog vs LogTape","\u002Fcompare\u002Flogtape","9.compare\u002F3.logtape",{"title":605,"path":606,"stem":607,"icon":577},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","9.compare\u002F4.winston",{"title":609,"path":610,"stem":611,"icon":577},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","9.compare\u002F5.consola",{"id":613,"title":614,"body":615,"description":3489,"extension":3490,"links":3491,"meta":3500,"navigation":3501,"path":197,"seo":3502,"stem":198,"__hash__":3503},"docs\u002F4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse.md","ClickHouse Adapter",{"type":616,"value":617,"toc":3468},"minimark",[618,635,647,697,701,704,747,751,754,996,1008,1011,1790,1793,1798,1895,1898,2102,2106,2109,2113,2116,2146,2186,2201,2205,2208,2280,2312,2327,2347,2351,2354,2413,2433,2440,2469,2480,2484,2497,2505,2508,2522,2526,2532,2623,2755,2820,2903,2907,2913,3060,3066,3070,3073,3262,3266,3283,3303,3315,3330,3334,3422,3435,3439,3464],[619,620,621,622,629,630,634],"p",{},"The ClickHouse adapter inserts wide events over the ",[623,624,628],"a",{"href":625,"rel":626},"https:\u002F\u002Fclickhouse.com\u002Fdocs\u002Fen\u002Finterfaces\u002Fhttp",[627],"nofollow","HTTP interface"," in ",[631,632,633],"code",{},"JSONEachRow"," format. It works with a local instance, a self-managed cluster, and ClickHouse Cloud.",[619,636,637,638,642,643,646],{},"The default schema gives you ",[639,640,641],"strong",{},"typed columns"," for the fields you filter and aggregate on, plus the complete wide event as JSON in ",[631,644,645],{},"data",", so no field is ever lost, and adding a field to your events never requires a migration.",[648,649,652,655,685],"prompt",{":actions":650,"description":651,"icon":199},"[\"copy\",\"cursor\",\"claude\"]","Add the ClickHouse drain adapter",[619,653,654],{},"Add the ClickHouse drain adapter to store evlog wide events in ClickHouse.",[656,657,658,662,665,668,671,674,682],"ol",{},[659,660,661],"li",{},"Identify which framework I'm using and follow its evlog integration pattern",[659,663,664],{},"Install evlog if not already installed",[659,666,667],{},"Create the evlog_events table using the CREATE TABLE from the adapter docs",[659,669,670],{},"Import createClickHouseDrain from 'evlog\u002Fclickhouse'",[659,672,673],{},"Wire createClickHouseDrain() into my framework's drain configuration",[659,675,676,677,681],{},"Set CLICKHOUSE_ENDPOINT (e.g. ",[623,678,679],{"href":679,"rel":680},"http:\u002F\u002Flocalhost:8123",[627],"), plus CLICKHOUSE_USER \u002F CLICKHOUSE_PASSWORD if authenticated",[659,683,684],{},"Test by triggering a request and running SELECT * FROM evlog_events ORDER BY timestamp DESC LIMIT 10",[619,686,687,688,692,693],{},"Adapter docs: ",[623,689,690],{"href":690,"rel":691},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse",[627],"\nFramework setup: ",[623,694,695],{"href":695,"rel":696},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[627],[698,699,20],"h2",{"id":700},"installation",[619,702,703],{},"The ClickHouse adapter comes bundled with evlog:",[705,706,712],"pre",{"className":707,"code":708,"filename":709,"language":710,"meta":711,"style":711},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n","src\u002Findex.ts","typescript","",[631,713,714],{"__ignoreMap":711},[715,716,719,723,727,731,734,737,740,744],"span",{"class":717,"line":718},"line",1,[715,720,722],{"class":721},"s7zQu","import",[715,724,726],{"class":725},"sMK4o"," {",[715,728,730],{"class":729},"sTEyZ"," createClickHouseDrain",[715,732,733],{"class":725}," }",[715,735,736],{"class":721}," from",[715,738,739],{"class":725}," '",[715,741,743],{"class":742},"sfazB","evlog\u002Fclickhouse",[715,745,746],{"class":725},"'\n",[698,748,750],{"id":749},"create-the-table","Create the table",[619,752,753],{},"Run this once before wiring the drain:",[705,755,760],{"className":756,"code":757,"filename":758,"language":759,"meta":711,"style":711},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CREATE TABLE IF NOT EXISTS evlog_events\n(\n  timestamp     DateTime64(3, 'UTC'),\n  level         LowCardinality(String),\n  service       LowCardinality(String),\n  environment   LowCardinality(String),\n  request_id    String,\n  trace_id      String,\n  span_id       String,\n  method        LowCardinality(String),\n  path          String,\n  status        Nullable(UInt16),\n  duration      String,\n  duration_ms   Nullable(UInt32),\n  error_name    String,\n  error_message String,\n  data          String\n)\nENGINE = MergeTree\nPARTITION BY toYYYYMM(timestamp)\nORDER BY (service, environment, timestamp)\nTTL toDateTime(timestamp) + INTERVAL 30 DAY;\n","schema.sql","sql",[631,761,762,784,790,817,826,835,841,847,853,859,865,874,883,889,895,901,907,916,922,934,951,970],{"__ignoreMap":711},[715,763,764,768,771,775,778,781],{"class":717,"line":718},[715,765,767],{"class":766},"sbssI","CREATE",[715,769,770],{"class":766}," TABLE",[715,772,774],{"class":773},"s2Zo4"," IF",[715,776,777],{"class":766}," NOT",[715,779,780],{"class":766}," EXISTS",[715,782,783],{"class":729}," evlog_events\n",[715,785,787],{"class":717,"line":786},2,[715,788,789],{"class":729},"(\n",[715,791,793,797,800,803,806,809,812,814],{"class":717,"line":792},3,[715,794,796],{"class":795},"spNyl","  timestamp",[715,798,799],{"class":729},"     DateTime64(",[715,801,802],{"class":766},"3",[715,804,805],{"class":729},", ",[715,807,808],{"class":725},"'",[715,810,811],{"class":742},"UTC",[715,813,808],{"class":725},[715,815,816],{"class":729},"),\n",[715,818,820,823],{"class":717,"line":819},4,[715,821,822],{"class":766},"  level",[715,824,825],{"class":729},"         LowCardinality(String),\n",[715,827,829,832],{"class":717,"line":828},5,[715,830,831],{"class":766},"  service",[715,833,834],{"class":729},"       LowCardinality(String),\n",[715,836,838],{"class":717,"line":837},6,[715,839,840],{"class":729},"  environment   LowCardinality(String),\n",[715,842,844],{"class":717,"line":843},7,[715,845,846],{"class":729},"  request_id    String,\n",[715,848,850],{"class":717,"line":849},8,[715,851,852],{"class":729},"  trace_id      String,\n",[715,854,856],{"class":717,"line":855},9,[715,857,858],{"class":729},"  span_id       String,\n",[715,860,862],{"class":717,"line":861},10,[715,863,864],{"class":729},"  method        LowCardinality(String),\n",[715,866,868,871],{"class":717,"line":867},11,[715,869,870],{"class":795},"  path",[715,872,873],{"class":729},"          String,\n",[715,875,877,880],{"class":717,"line":876},12,[715,878,879],{"class":766},"  status",[715,881,882],{"class":729},"        Nullable(UInt16),\n",[715,884,886],{"class":717,"line":885},13,[715,887,888],{"class":729},"  duration      String,\n",[715,890,892],{"class":717,"line":891},14,[715,893,894],{"class":729},"  duration_ms   Nullable(UInt32),\n",[715,896,898],{"class":717,"line":897},15,[715,899,900],{"class":729},"  error_name    String,\n",[715,902,904],{"class":717,"line":903},16,[715,905,906],{"class":729},"  error_message String,\n",[715,908,910,913],{"class":717,"line":909},17,[715,911,912],{"class":766},"  data",[715,914,915],{"class":729},"          String\n",[715,917,919],{"class":717,"line":918},18,[715,920,921],{"class":729},")\n",[715,923,925,928,931],{"class":717,"line":924},19,[715,926,927],{"class":729},"ENGINE ",[715,929,930],{"class":725},"=",[715,932,933],{"class":729}," MergeTree\n",[715,935,937,940,943,946,949],{"class":717,"line":936},20,[715,938,939],{"class":766},"PARTITION",[715,941,942],{"class":766}," BY",[715,944,945],{"class":729}," toYYYYMM(",[715,947,948],{"class":795},"timestamp",[715,950,921],{"class":729},[715,952,954,957,960,963,966,968],{"class":717,"line":953},21,[715,955,956],{"class":766},"ORDER BY",[715,958,959],{"class":729}," (",[715,961,962],{"class":766},"service",[715,964,965],{"class":729},", environment, ",[715,967,948],{"class":795},[715,969,921],{"class":729},[715,971,973,976,978,981,984,987,990,993],{"class":717,"line":972},22,[715,974,975],{"class":729},"TTL toDateTime(",[715,977,948],{"class":795},[715,979,980],{"class":729},") ",[715,982,983],{"class":725},"+",[715,985,986],{"class":729}," INTERVAL ",[715,988,989],{"class":766},"30",[715,991,992],{"class":766}," DAY",[715,994,995],{"class":729},";\n",[997,998,1000,1003,1004,1007],"callout",{"color":999,"icon":13},"info",[631,1001,1002],{},"ORDER BY (service, environment, timestamp)"," matches how you'll filter most often. Adjust the ",[631,1005,1006],{},"TTL"," to your retention policy, and drop the clause entirely to keep events forever.",[698,1009,25],{"id":1010},"quick-start",[1012,1013,1014,1120,1241,1345,1452,1557,1692],"code-group",{},[705,1015,1018],{"className":707,"code":1016,"filename":1017,"language":710,"meta":711,"style":711},"\u002F\u002F server\u002Fplugins\u002Fevlog.ts\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', createClickHouseDrain())\n})\n","Nuxt \u002F Nitro",[631,1019,1020,1026,1044,1050,1079,1113],{"__ignoreMap":711},[715,1021,1022],{"class":717,"line":718},[715,1023,1025],{"class":1024},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog.ts\n",[715,1027,1028,1030,1032,1034,1036,1038,1040,1042],{"class":717,"line":786},[715,1029,722],{"class":721},[715,1031,726],{"class":725},[715,1033,730],{"class":729},[715,1035,733],{"class":725},[715,1037,736],{"class":721},[715,1039,739],{"class":725},[715,1041,743],{"class":742},[715,1043,746],{"class":725},[715,1045,1046],{"class":717,"line":792},[715,1047,1049],{"emptyLinePlaceholder":1048},true,"\n",[715,1051,1052,1055,1058,1061,1064,1066,1070,1073,1076],{"class":717,"line":819},[715,1053,1054],{"class":721},"export",[715,1056,1057],{"class":721}," default",[715,1059,1060],{"class":773}," defineNitroPlugin",[715,1062,1063],{"class":729},"(",[715,1065,1063],{"class":725},[715,1067,1069],{"class":1068},"sHdIc","nitroApp",[715,1071,1072],{"class":725},")",[715,1074,1075],{"class":795}," =>",[715,1077,1078],{"class":725}," {\n",[715,1080,1081,1084,1087,1090,1092,1095,1098,1100,1103,1105,1108,1110],{"class":717,"line":828},[715,1082,1083],{"class":729},"  nitroApp",[715,1085,1086],{"class":725},".",[715,1088,1089],{"class":729},"hooks",[715,1091,1086],{"class":725},[715,1093,1094],{"class":773},"hook",[715,1096,1063],{"class":1097},"swJcz",[715,1099,808],{"class":725},[715,1101,1102],{"class":742},"evlog:drain",[715,1104,808],{"class":725},[715,1106,1107],{"class":725},",",[715,1109,730],{"class":773},[715,1111,1112],{"class":1097},"())\n",[715,1114,1115,1118],{"class":717,"line":837},[715,1116,1117],{"class":725},"}",[715,1119,921],{"class":729},[705,1121,1123],{"className":707,"code":1122,"filename":275,"language":710,"meta":711,"style":711},"import { Hono } from 'hono'\nimport { evlog } from 'evlog\u002Fhono'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\nconst app = new Hono()\napp.use(evlog({ drain: createClickHouseDrain() }))\n",[631,1124,1125,1145,1165,1183,1187,1205],{"__ignoreMap":711},[715,1126,1127,1129,1131,1134,1136,1138,1140,1143],{"class":717,"line":718},[715,1128,722],{"class":721},[715,1130,726],{"class":725},[715,1132,1133],{"class":729}," Hono",[715,1135,733],{"class":725},[715,1137,736],{"class":721},[715,1139,739],{"class":725},[715,1141,1142],{"class":742},"hono",[715,1144,746],{"class":725},[715,1146,1147,1149,1151,1154,1156,1158,1160,1163],{"class":717,"line":786},[715,1148,722],{"class":721},[715,1150,726],{"class":725},[715,1152,1153],{"class":729}," evlog",[715,1155,733],{"class":725},[715,1157,736],{"class":721},[715,1159,739],{"class":725},[715,1161,1162],{"class":742},"evlog\u002Fhono",[715,1164,746],{"class":725},[715,1166,1167,1169,1171,1173,1175,1177,1179,1181],{"class":717,"line":792},[715,1168,722],{"class":721},[715,1170,726],{"class":725},[715,1172,730],{"class":729},[715,1174,733],{"class":725},[715,1176,736],{"class":721},[715,1178,739],{"class":725},[715,1180,743],{"class":742},[715,1182,746],{"class":725},[715,1184,1185],{"class":717,"line":819},[715,1186,1049],{"emptyLinePlaceholder":1048},[715,1188,1189,1192,1195,1197,1200,1202],{"class":717,"line":828},[715,1190,1191],{"class":795},"const",[715,1193,1194],{"class":729}," app ",[715,1196,930],{"class":725},[715,1198,1199],{"class":725}," new",[715,1201,1133],{"class":773},[715,1203,1204],{"class":729},"()\n",[715,1206,1207,1210,1212,1215,1217,1220,1222,1225,1228,1231,1233,1236,1238],{"class":717,"line":837},[715,1208,1209],{"class":729},"app",[715,1211,1086],{"class":725},[715,1213,1214],{"class":773},"use",[715,1216,1063],{"class":729},[715,1218,1219],{"class":773},"evlog",[715,1221,1063],{"class":729},[715,1223,1224],{"class":725},"{",[715,1226,1227],{"class":1097}," drain",[715,1229,1230],{"class":725},":",[715,1232,730],{"class":773},[715,1234,1235],{"class":729},"() ",[715,1237,1117],{"class":725},[715,1239,1240],{"class":729},"))\n",[705,1242,1244],{"className":707,"code":1243,"filename":270,"language":710,"meta":711,"style":711},"import express from 'express'\nimport { evlog } from 'evlog\u002Fexpress'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\nconst app = express()\napp.use(evlog({ drain: createClickHouseDrain() }))\n",[631,1245,1246,1263,1282,1300,1304,1317],{"__ignoreMap":711},[715,1247,1248,1250,1253,1256,1258,1261],{"class":717,"line":718},[715,1249,722],{"class":721},[715,1251,1252],{"class":729}," express ",[715,1254,1255],{"class":721},"from",[715,1257,739],{"class":725},[715,1259,1260],{"class":742},"express",[715,1262,746],{"class":725},[715,1264,1265,1267,1269,1271,1273,1275,1277,1280],{"class":717,"line":786},[715,1266,722],{"class":721},[715,1268,726],{"class":725},[715,1270,1153],{"class":729},[715,1272,733],{"class":725},[715,1274,736],{"class":721},[715,1276,739],{"class":725},[715,1278,1279],{"class":742},"evlog\u002Fexpress",[715,1281,746],{"class":725},[715,1283,1284,1286,1288,1290,1292,1294,1296,1298],{"class":717,"line":792},[715,1285,722],{"class":721},[715,1287,726],{"class":725},[715,1289,730],{"class":729},[715,1291,733],{"class":725},[715,1293,736],{"class":721},[715,1295,739],{"class":725},[715,1297,743],{"class":742},[715,1299,746],{"class":725},[715,1301,1302],{"class":717,"line":819},[715,1303,1049],{"emptyLinePlaceholder":1048},[715,1305,1306,1308,1310,1312,1315],{"class":717,"line":828},[715,1307,1191],{"class":795},[715,1309,1194],{"class":729},[715,1311,930],{"class":725},[715,1313,1314],{"class":773}," express",[715,1316,1204],{"class":729},[715,1318,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343],{"class":717,"line":837},[715,1320,1209],{"class":729},[715,1322,1086],{"class":725},[715,1324,1214],{"class":773},[715,1326,1063],{"class":729},[715,1328,1219],{"class":773},[715,1330,1063],{"class":729},[715,1332,1224],{"class":725},[715,1334,1227],{"class":1097},[715,1336,1230],{"class":725},[715,1338,730],{"class":773},[715,1340,1235],{"class":729},[715,1342,1117],{"class":725},[715,1344,1240],{"class":729},[705,1346,1348],{"className":707,"code":1347,"filename":280,"language":710,"meta":711,"style":711},"import Fastify from 'fastify'\nimport { evlog } from 'evlog\u002Ffastify'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\nconst app = Fastify()\nawait app.register(evlog, { drain: createClickHouseDrain() })\n",[631,1349,1350,1366,1385,1403,1407,1420],{"__ignoreMap":711},[715,1351,1352,1354,1357,1359,1361,1364],{"class":717,"line":718},[715,1353,722],{"class":721},[715,1355,1356],{"class":729}," Fastify ",[715,1358,1255],{"class":721},[715,1360,739],{"class":725},[715,1362,1363],{"class":742},"fastify",[715,1365,746],{"class":725},[715,1367,1368,1370,1372,1374,1376,1378,1380,1383],{"class":717,"line":786},[715,1369,722],{"class":721},[715,1371,726],{"class":725},[715,1373,1153],{"class":729},[715,1375,733],{"class":725},[715,1377,736],{"class":721},[715,1379,739],{"class":725},[715,1381,1382],{"class":742},"evlog\u002Ffastify",[715,1384,746],{"class":725},[715,1386,1387,1389,1391,1393,1395,1397,1399,1401],{"class":717,"line":792},[715,1388,722],{"class":721},[715,1390,726],{"class":725},[715,1392,730],{"class":729},[715,1394,733],{"class":725},[715,1396,736],{"class":721},[715,1398,739],{"class":725},[715,1400,743],{"class":742},[715,1402,746],{"class":725},[715,1404,1405],{"class":717,"line":819},[715,1406,1049],{"emptyLinePlaceholder":1048},[715,1408,1409,1411,1413,1415,1418],{"class":717,"line":828},[715,1410,1191],{"class":795},[715,1412,1194],{"class":729},[715,1414,930],{"class":725},[715,1416,1417],{"class":773}," Fastify",[715,1419,1204],{"class":729},[715,1421,1422,1425,1428,1430,1433,1436,1438,1440,1442,1444,1446,1448,1450],{"class":717,"line":837},[715,1423,1424],{"class":721},"await",[715,1426,1427],{"class":729}," app",[715,1429,1086],{"class":725},[715,1431,1432],{"class":773},"register",[715,1434,1435],{"class":729},"(evlog",[715,1437,1107],{"class":725},[715,1439,726],{"class":725},[715,1441,1227],{"class":1097},[715,1443,1230],{"class":725},[715,1445,730],{"class":773},[715,1447,1235],{"class":729},[715,1449,1117],{"class":725},[715,1451,921],{"class":729},[705,1453,1455],{"className":707,"code":1454,"filename":285,"language":710,"meta":711,"style":711},"import { Elysia } from 'elysia'\nimport { evlog } from 'evlog\u002Felysia'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\nconst app = new Elysia().use(evlog({ drain: createClickHouseDrain() }))\n",[631,1456,1457,1477,1496,1514,1518],{"__ignoreMap":711},[715,1458,1459,1461,1463,1466,1468,1470,1472,1475],{"class":717,"line":718},[715,1460,722],{"class":721},[715,1462,726],{"class":725},[715,1464,1465],{"class":729}," Elysia",[715,1467,733],{"class":725},[715,1469,736],{"class":721},[715,1471,739],{"class":725},[715,1473,1474],{"class":742},"elysia",[715,1476,746],{"class":725},[715,1478,1479,1481,1483,1485,1487,1489,1491,1494],{"class":717,"line":786},[715,1480,722],{"class":721},[715,1482,726],{"class":725},[715,1484,1153],{"class":729},[715,1486,733],{"class":725},[715,1488,736],{"class":721},[715,1490,739],{"class":725},[715,1492,1493],{"class":742},"evlog\u002Felysia",[715,1495,746],{"class":725},[715,1497,1498,1500,1502,1504,1506,1508,1510,1512],{"class":717,"line":792},[715,1499,722],{"class":721},[715,1501,726],{"class":725},[715,1503,730],{"class":729},[715,1505,733],{"class":725},[715,1507,736],{"class":721},[715,1509,739],{"class":725},[715,1511,743],{"class":742},[715,1513,746],{"class":725},[715,1515,1516],{"class":717,"line":819},[715,1517,1049],{"emptyLinePlaceholder":1048},[715,1519,1520,1522,1524,1526,1528,1530,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555],{"class":717,"line":828},[715,1521,1191],{"class":795},[715,1523,1194],{"class":729},[715,1525,930],{"class":725},[715,1527,1199],{"class":725},[715,1529,1465],{"class":773},[715,1531,1532],{"class":729},"()",[715,1534,1086],{"class":725},[715,1536,1214],{"class":773},[715,1538,1063],{"class":729},[715,1540,1219],{"class":773},[715,1542,1063],{"class":729},[715,1544,1224],{"class":725},[715,1546,1227],{"class":1097},[715,1548,1230],{"class":725},[715,1550,730],{"class":773},[715,1552,1235],{"class":729},[715,1554,1117],{"class":725},[715,1556,1240],{"class":729},[705,1558,1560],{"className":707,"code":1559,"filename":265,"language":710,"meta":711,"style":711},"import { Module } from '@nestjs\u002Fcommon'\nimport { EvlogModule } from 'evlog\u002Fnestjs'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\n@Module({\n  imports: [EvlogModule.forRoot({ drain: createClickHouseDrain() })],\n})\nexport class AppModule {}\n",[631,1561,1562,1582,1602,1620,1624,1637,1672,1678],{"__ignoreMap":711},[715,1563,1564,1566,1568,1571,1573,1575,1577,1580],{"class":717,"line":718},[715,1565,722],{"class":721},[715,1567,726],{"class":725},[715,1569,1570],{"class":729}," Module",[715,1572,733],{"class":725},[715,1574,736],{"class":721},[715,1576,739],{"class":725},[715,1578,1579],{"class":742},"@nestjs\u002Fcommon",[715,1581,746],{"class":725},[715,1583,1584,1586,1588,1591,1593,1595,1597,1600],{"class":717,"line":786},[715,1585,722],{"class":721},[715,1587,726],{"class":725},[715,1589,1590],{"class":729}," EvlogModule",[715,1592,733],{"class":725},[715,1594,736],{"class":721},[715,1596,739],{"class":725},[715,1598,1599],{"class":742},"evlog\u002Fnestjs",[715,1601,746],{"class":725},[715,1603,1604,1606,1608,1610,1612,1614,1616,1618],{"class":717,"line":792},[715,1605,722],{"class":721},[715,1607,726],{"class":725},[715,1609,730],{"class":729},[715,1611,733],{"class":725},[715,1613,736],{"class":721},[715,1615,739],{"class":725},[715,1617,743],{"class":742},[715,1619,746],{"class":725},[715,1621,1622],{"class":717,"line":819},[715,1623,1049],{"emptyLinePlaceholder":1048},[715,1625,1626,1629,1632,1634],{"class":717,"line":828},[715,1627,1628],{"class":725},"@",[715,1630,1631],{"class":773},"Module",[715,1633,1063],{"class":729},[715,1635,1636],{"class":725},"{\n",[715,1638,1639,1642,1644,1647,1649,1652,1654,1656,1658,1660,1662,1664,1666,1669],{"class":717,"line":837},[715,1640,1641],{"class":1097},"  imports",[715,1643,1230],{"class":725},[715,1645,1646],{"class":729}," [EvlogModule",[715,1648,1086],{"class":725},[715,1650,1651],{"class":773},"forRoot",[715,1653,1063],{"class":729},[715,1655,1224],{"class":725},[715,1657,1227],{"class":1097},[715,1659,1230],{"class":725},[715,1661,730],{"class":773},[715,1663,1235],{"class":729},[715,1665,1117],{"class":725},[715,1667,1668],{"class":729},")]",[715,1670,1671],{"class":725},",\n",[715,1673,1674,1676],{"class":717,"line":843},[715,1675,1117],{"class":725},[715,1677,921],{"class":729},[715,1679,1680,1682,1685,1689],{"class":717,"line":849},[715,1681,1054],{"class":721},[715,1683,1684],{"class":795}," class",[715,1686,1688],{"class":1687},"sBMFI"," AppModule",[715,1690,1691],{"class":725}," {}\n",[705,1693,1695],{"className":707,"code":1694,"filename":300,"language":710,"meta":711,"style":711},"import { initLogger } from 'evlog'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\ninitLogger({\n  env: { service: 'my-app' },\n  drain: createClickHouseDrain(),\n})\n",[631,1696,1697,1716,1734,1738,1747,1771,1784],{"__ignoreMap":711},[715,1698,1699,1701,1703,1706,1708,1710,1712,1714],{"class":717,"line":718},[715,1700,722],{"class":721},[715,1702,726],{"class":725},[715,1704,1705],{"class":729}," initLogger",[715,1707,733],{"class":725},[715,1709,736],{"class":721},[715,1711,739],{"class":725},[715,1713,1219],{"class":742},[715,1715,746],{"class":725},[715,1717,1718,1720,1722,1724,1726,1728,1730,1732],{"class":717,"line":786},[715,1719,722],{"class":721},[715,1721,726],{"class":725},[715,1723,730],{"class":729},[715,1725,733],{"class":725},[715,1727,736],{"class":721},[715,1729,739],{"class":725},[715,1731,743],{"class":742},[715,1733,746],{"class":725},[715,1735,1736],{"class":717,"line":792},[715,1737,1049],{"emptyLinePlaceholder":1048},[715,1739,1740,1743,1745],{"class":717,"line":819},[715,1741,1742],{"class":773},"initLogger",[715,1744,1063],{"class":729},[715,1746,1636],{"class":725},[715,1748,1749,1752,1754,1756,1759,1761,1763,1766,1768],{"class":717,"line":828},[715,1750,1751],{"class":1097},"  env",[715,1753,1230],{"class":725},[715,1755,726],{"class":725},[715,1757,1758],{"class":1097}," service",[715,1760,1230],{"class":725},[715,1762,739],{"class":725},[715,1764,1765],{"class":742},"my-app",[715,1767,808],{"class":725},[715,1769,1770],{"class":725}," },\n",[715,1772,1773,1776,1778,1780,1782],{"class":717,"line":837},[715,1774,1775],{"class":1097},"  drain",[715,1777,1230],{"class":725},[715,1779,730],{"class":773},[715,1781,1532],{"class":729},[715,1783,1671],{"class":725},[715,1785,1786,1788],{"class":717,"line":843},[715,1787,1117],{"class":725},[715,1789,921],{"class":729},[698,1791,557],{"id":1792},"configuration",[1794,1795,1797],"h3",{"id":1796},"environment-variables","Environment variables",[1799,1800,1801,1817],"table",{},[1802,1803,1804],"thead",{},[1805,1806,1807,1811,1814],"tr",{},[1808,1809,1810],"th",{},"Variable",[1808,1812,1813],{},"Required",[1808,1815,1816],{},"Description",[1818,1819,1820,1838,1854,1866,1880],"tbody",{},[1805,1821,1822,1828,1831],{},[1823,1824,1825],"td",{},[631,1826,1827],{},"CLICKHOUSE_ENDPOINT",[1823,1829,1830],{},"Yes",[1823,1832,1833,1834,1837],{},"HTTP interface URL (",[631,1835,1836],{},"CLICKHOUSE_URL"," also accepted)",[1805,1839,1840,1845,1848],{},[1823,1841,1842],{},[631,1843,1844],{},"CLICKHOUSE_USER",[1823,1846,1847],{},"No",[1823,1849,1850,1851],{},"Username. Default ",[631,1852,1853],{},"default",[1805,1855,1856,1861,1863],{},[1823,1857,1858],{},[631,1859,1860],{},"CLICKHOUSE_PASSWORD",[1823,1862,1847],{},[1823,1864,1865],{},"Password. Omit for an unauthenticated local instance",[1805,1867,1868,1873,1875],{},[1823,1869,1870],{},[631,1871,1872],{},"CLICKHOUSE_DATABASE",[1823,1874,1847],{},[1823,1876,1877,1878],{},"Database. Default ",[631,1879,1853],{},[1805,1881,1882,1887,1889],{},[1823,1883,1884],{},[631,1885,1886],{},"CLICKHOUSE_TABLE",[1823,1888,1847],{},[1823,1890,1891,1892],{},"Table. Default ",[631,1893,1894],{},"evlog_events",[1794,1896,346],{"id":1897},"options",[1799,1899,1900,1915],{},[1802,1901,1902],{},[1805,1903,1904,1907,1910,1913],{},[1808,1905,1906],{},"Option",[1808,1908,1909],{},"Type",[1808,1911,1912],{},"Default",[1808,1914,1816],{},[1818,1916,1917,1935,1953,1970,1988,2004,2024,2043,2063,2083],{},[1805,1918,1919,1924,1929,1932],{},[1823,1920,1921],{},[631,1922,1923],{},"endpoint",[1823,1925,1926],{},[631,1927,1928],{},"string",[1823,1930,1931],{},"—",[1823,1933,1934],{},"HTTP interface URL",[1805,1936,1937,1942,1946,1950],{},[1823,1938,1939],{},[631,1940,1941],{},"database",[1823,1943,1944],{},[631,1945,1928],{},[1823,1947,1948],{},[631,1949,1853],{},[1823,1951,1952],{},"Target database",[1805,1954,1955,1959,1963,1967],{},[1823,1956,1957],{},[631,1958,1799],{},[1823,1960,1961],{},[631,1962,1928],{},[1823,1964,1965],{},[631,1966,1894],{},[1823,1968,1969],{},"Target table",[1805,1971,1972,1977,1981,1985],{},[1823,1973,1974],{},[631,1975,1976],{},"username",[1823,1978,1979],{},[631,1980,1928],{},[1823,1982,1983],{},[631,1984,1853],{},[1823,1986,1987],{},"Username",[1805,1989,1990,1995,1999,2001],{},[1823,1991,1992],{},[631,1993,1994],{},"password",[1823,1996,1997],{},[631,1998,1928],{},[1823,2000,1931],{},[1823,2002,2003],{},"Password",[1805,2005,2006,2011,2016,2021],{},[1823,2007,2008],{},[631,2009,2010],{},"asyncInsert",[1823,2012,2013],{},[631,2014,2015],{},"boolean",[1823,2017,2018],{},[631,2019,2020],{},"true",[1823,2022,2023],{},"Batch inserts server-side",[1805,2025,2026,2031,2035,2040],{},[1823,2027,2028],{},[631,2029,2030],{},"waitForAsyncInsert",[1823,2032,2033],{},[631,2034,2015],{},[1823,2036,2037],{},[631,2038,2039],{},"false",[1823,2041,2042],{},"Wait for the flush before responding",[1805,2044,2045,2050,2055,2060],{},[1823,2046,2047],{},[631,2048,2049],{},"transform",[1823,2051,2052],{},[631,2053,2054],{},"(event) => Record\u003Cstring, unknown>",[1823,2056,2057],{},[631,2058,2059],{},"toClickHouseRow",[1823,2061,2062],{},"Map an event to a row",[1805,2064,2065,2070,2075,2080],{},[1823,2066,2067],{},[631,2068,2069],{},"timeout",[1823,2071,2072],{},[631,2073,2074],{},"number",[1823,2076,2077],{},[631,2078,2079],{},"5000",[1823,2081,2082],{},"Request timeout in ms",[1805,2084,2085,2090,2094,2099],{},[1823,2086,2087],{},[631,2088,2089],{},"retries",[1823,2091,2092],{},[631,2093,2074],{},[1823,2095,2096],{},[631,2097,2098],{},"2",[1823,2100,2101],{},"Retry attempts",[698,2103,2105],{"id":2104},"deployment","Deployment",[619,2107,2108],{},"The adapter is identical either way. Only the endpoint and credentials change.",[1794,2110,2112],{"id":2111},"self-hosted","Self-hosted",[619,2114,2115],{},"A local or self-managed instance, with or without auth:",[705,2117,2120],{"className":707,"code":2118,"filename":2119,"language":710,"meta":711,"style":711},"createClickHouseDrain({ endpoint: 'http:\u002F\u002Flocalhost:8123' })\n","server\u002Fplugins\u002Fevlog.ts",[631,2121,2122],{"__ignoreMap":711},[715,2123,2124,2127,2129,2131,2134,2136,2138,2140,2142,2144],{"class":717,"line":718},[715,2125,2126],{"class":773},"createClickHouseDrain",[715,2128,1063],{"class":729},[715,2130,1224],{"class":725},[715,2132,2133],{"class":1097}," endpoint",[715,2135,1230],{"class":725},[715,2137,739],{"class":725},[715,2139,679],{"class":742},[715,2141,808],{"class":725},[715,2143,733],{"class":725},[715,2145,921],{"class":729},[705,2147,2152],{"className":2148,"code":2149,"filename":2150,"language":2151,"meta":711,"style":711},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CLICKHOUSE_ENDPOINT=http:\u002F\u002Flocalhost:8123\n# Only if your instance requires auth:\nCLICKHOUSE_USER=evlog\nCLICKHOUSE_PASSWORD=your-password\n",".env","bash",[631,2153,2154,2163,2168,2177],{"__ignoreMap":711},[715,2155,2156,2158,2160],{"class":717,"line":718},[715,2157,1827],{"class":729},[715,2159,930],{"class":725},[715,2161,2162],{"class":742},"http:\u002F\u002Flocalhost:8123\n",[715,2164,2165],{"class":717,"line":786},[715,2166,2167],{"class":1024},"# Only if your instance requires auth:\n",[715,2169,2170,2172,2174],{"class":717,"line":792},[715,2171,1844],{"class":729},[715,2173,930],{"class":725},[715,2175,2176],{"class":742},"evlog\n",[715,2178,2179,2181,2183],{"class":717,"line":819},[715,2180,1860],{"class":729},[715,2182,930],{"class":725},[715,2184,2185],{"class":742},"your-password\n",[619,2187,2188,2189,2191,2192,2194,2195,2197,2198,2200],{},"A fresh container runs as ",[631,2190,1853],{}," with no password, which is why ",[631,2193,1976],{},"\ndefaults to ",[631,2196,1853],{}," and ",[631,2199,1994],{}," is optional.",[1794,2202,2204],{"id":2203},"clickhouse-cloud","ClickHouse Cloud",[619,2206,2207],{},"Cloud services always require credentials and speak HTTPS on port 8443:",[705,2209,2211],{"className":707,"code":2210,"filename":2119,"language":710,"meta":711,"style":711},"createClickHouseDrain({\n  endpoint: 'https:\u002F\u002Fabc123.eu-west-1.aws.clickhouse.cloud:8443',\n  password: process.env.CLICKHOUSE_PASSWORD,\n  database: 'logs',\n})\n",[631,2212,2213,2221,2237,2258,2274],{"__ignoreMap":711},[715,2214,2215,2217,2219],{"class":717,"line":718},[715,2216,2126],{"class":773},[715,2218,1063],{"class":729},[715,2220,1636],{"class":725},[715,2222,2223,2226,2228,2230,2233,2235],{"class":717,"line":786},[715,2224,2225],{"class":1097},"  endpoint",[715,2227,1230],{"class":725},[715,2229,739],{"class":725},[715,2231,2232],{"class":742},"https:\u002F\u002Fabc123.eu-west-1.aws.clickhouse.cloud:8443",[715,2234,808],{"class":725},[715,2236,1671],{"class":725},[715,2238,2239,2242,2244,2247,2249,2252,2254,2256],{"class":717,"line":792},[715,2240,2241],{"class":1097},"  password",[715,2243,1230],{"class":725},[715,2245,2246],{"class":729}," process",[715,2248,1086],{"class":725},[715,2250,2251],{"class":729},"env",[715,2253,1086],{"class":725},[715,2255,1860],{"class":729},[715,2257,1671],{"class":725},[715,2259,2260,2263,2265,2267,2270,2272],{"class":717,"line":819},[715,2261,2262],{"class":1097},"  database",[715,2264,1230],{"class":725},[715,2266,739],{"class":725},[715,2268,2269],{"class":742},"logs",[715,2271,808],{"class":725},[715,2273,1671],{"class":725},[715,2275,2276,2278],{"class":717,"line":828},[715,2277,1117],{"class":725},[715,2279,921],{"class":729},[705,2281,2283],{"className":2148,"code":2282,"filename":2150,"language":2151,"meta":711,"style":711},"CLICKHOUSE_ENDPOINT=https:\u002F\u002Fabc123.eu-west-1.aws.clickhouse.cloud:8443\nCLICKHOUSE_PASSWORD=your-service-password\nCLICKHOUSE_DATABASE=logs\n",[631,2284,2285,2294,2303],{"__ignoreMap":711},[715,2286,2287,2289,2291],{"class":717,"line":718},[715,2288,1827],{"class":729},[715,2290,930],{"class":725},[715,2292,2293],{"class":742},"https:\u002F\u002Fabc123.eu-west-1.aws.clickhouse.cloud:8443\n",[715,2295,2296,2298,2300],{"class":717,"line":786},[715,2297,1860],{"class":729},[715,2299,930],{"class":725},[715,2301,2302],{"class":742},"your-service-password\n",[715,2304,2305,2307,2309],{"class":717,"line":792},[715,2306,1872],{"class":729},[715,2308,930],{"class":725},[715,2310,2311],{"class":742},"logs\n",[997,2313,2314,2315,2319,2320,2323,2324,2326],{"color":999,"icon":13},"Copy the endpoint from ",[2316,2317,2318],"em",{},"Connect → HTTPS"," in the ClickHouse Cloud console,\nincluding the ",[631,2321,2322],{},":8443"," port. Cloud services idle-suspend, so the first insert\nafter a pause can take a few seconds; raise ",[631,2325,2069],{}," if you see aborts.",[997,2328,2330,2331,2334,2335,2338,2339,2342,2343,2346],{"color":2329,"icon":388},"success","Credentials are sent as ",[631,2332,2333],{},"X-ClickHouse-User"," \u002F ",[631,2336,2337],{},"X-ClickHouse-Key"," ",[639,2340,2341],{},"headers",",\nnever as query parameters, so they never reach ",[631,2344,2345],{},"system.query_log"," or an\nintermediate proxy's access log.",[698,2348,2350],{"id":2349},"verify-it-locally","Verify it locally",[619,2352,2353],{},"Spin up ClickHouse in Docker, create the table and push a real event:",[705,2355,2358],{"className":2148,"code":2356,"filename":2357,"language":2151,"meta":711,"style":711},"docker compose -f packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml up -d\nCLICKHOUSE_ENDPOINT=http:\u002F\u002Flocalhost:8123 pnpm run test:e2e\ndocker compose -f packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml down -v\n","Terminal",[631,2359,2360,2380,2397],{"__ignoreMap":711},[715,2361,2362,2365,2368,2371,2374,2377],{"class":717,"line":718},[715,2363,2364],{"class":1687},"docker",[715,2366,2367],{"class":742}," compose",[715,2369,2370],{"class":742}," -f",[715,2372,2373],{"class":742}," packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml",[715,2375,2376],{"class":742}," up",[715,2378,2379],{"class":742}," -d\n",[715,2381,2382,2384,2386,2388,2391,2394],{"class":717,"line":786},[715,2383,1827],{"class":729},[715,2385,930],{"class":725},[715,2387,679],{"class":742},[715,2389,2390],{"class":1687}," pnpm",[715,2392,2393],{"class":742}," run",[715,2395,2396],{"class":742}," test:e2e\n",[715,2398,2399,2401,2403,2405,2407,2410],{"class":717,"line":792},[715,2400,2364],{"class":1687},[715,2402,2367],{"class":742},[715,2404,2370],{"class":742},[715,2406,2373],{"class":742},[715,2408,2409],{"class":742}," down",[715,2411,2412],{"class":742}," -v\n",[619,2414,2415,2416,2419,2420,2423,2424,2426,2427,2429,2430,2432],{},"The suite is a ",[639,2417,2418],{},"round-trip",": it inserts events, reads them back with\n",[631,2421,2422],{},"SELECT",", and asserts the typed columns and the ",[631,2425,645],{}," JSON survived. The\ncompose file creates ",[631,2428,1894],{}," from the schema above on first boot.\nWithout ",[631,2431,1827],{}," it skips itself with a visible label.",[619,2434,2435,2436,2439],{},"To ",[2316,2437,2438],{},"see"," the events rather than assert on them, seed the sandbox and open the\nprovisioned dashboard. The stack ships a Grafana with the ClickHouse\ndatasource already wired up:",[705,2441,2443],{"className":2148,"code":2442,"filename":2357,"language":2151,"meta":711,"style":711},"pnpm run sandbox:up\npnpm run sandbox:seed\n# → http:\u002F\u002Flocalhost:3001\u002Fd\u002Fevlog-wide-events\n",[631,2444,2445,2455,2464],{"__ignoreMap":711},[715,2446,2447,2450,2452],{"class":717,"line":718},[715,2448,2449],{"class":1687},"pnpm",[715,2451,2393],{"class":742},[715,2453,2454],{"class":742}," sandbox:up\n",[715,2456,2457,2459,2461],{"class":717,"line":786},[715,2458,2449],{"class":1687},[715,2460,2393],{"class":742},[715,2462,2463],{"class":742}," sandbox:seed\n",[715,2465,2466],{"class":717,"line":792},[715,2467,2468],{"class":1024},"# → http:\u002F\u002Flocalhost:3001\u002Fd\u002Fevlog-wide-events\n",[619,2470,2471,2472,2475,2476,2479],{},"ClickHouse's built-in ",[631,2473,2474],{},"\u002Fplay"," page at ",[631,2477,2478],{},"http:\u002F\u002Flocalhost:8123\u002Fplay"," also works\nfor raw SQL, but it is deliberately minimal, and the dashboard is the better\nstarting point.",[698,2481,2483],{"id":2482},"async-inserts","Async inserts",[619,2485,2486,2487,2492,2493,2496],{},"Log ingestion means many small inserts, and one MergeTree part per request would quickly degrade a table. The adapter therefore enables ",[623,2488,2491],{"href":2489,"rel":2490},"https:\u002F\u002Fclickhouse.com\u002Fdocs\u002Fen\u002Foptimize\u002Fasynchronous-inserts",[627],"asynchronous inserts"," by default, and does ",[639,2494,2495],{},"not"," wait for the flush:",[705,2498,2503],{"className":2499,"code":2501,"language":2502},[2500],"language-text","async_insert=1&wait_for_async_insert=0\n","text",[631,2504,2501],{"__ignoreMap":711},[619,2506,2507],{},"ClickHouse buffers rows server-side and writes them in batches. Draining never blocks a request on disk writes.",[619,2509,2510,2511,2514,2515,2518,2519,1086],{},"Set ",[631,2512,2513],{},"waitForAsyncInsert: true"," if you need the insert acknowledged as durable before the drain resolves, at the cost of latency. Set ",[631,2516,2517],{},"asyncInsert: false"," to insert synchronously, which only makes sense when you already batch client-side with ",[631,2520,2521],{},"evlog\u002Fpipeline",[698,2523,2525],{"id":2524},"querying","Querying",[619,2527,2528,2529,2531],{},"Typed columns are indexed by the sort key; everything else lives in ",[631,2530,645],{}," and is reachable with ClickHouse's JSON functions:",[705,2533,2535],{"className":756,"code":2534,"language":759,"meta":711,"style":711},"-- Error rate per service over the last hour\nSELECT service, countIf(level = 'error') \u002F count() AS error_rate\nFROM evlog_events\nWHERE timestamp > now() - INTERVAL 1 HOUR\nGROUP BY service;\n",[631,2536,2537,2542,2580,2587,2614],{"__ignoreMap":711},[715,2538,2539],{"class":717,"line":718},[715,2540,2541],{"class":1024},"-- Error rate per service over the last hour\n",[715,2543,2544,2546,2548,2551,2554,2557,2559,2562,2564,2566,2569,2572,2574,2577],{"class":717,"line":786},[715,2545,2422],{"class":766},[715,2547,1758],{"class":766},[715,2549,2550],{"class":729},", countIf(",[715,2552,2553],{"class":766},"level",[715,2555,2556],{"class":725}," =",[715,2558,739],{"class":725},[715,2560,2561],{"class":742},"error",[715,2563,808],{"class":725},[715,2565,980],{"class":729},[715,2567,2568],{"class":725},"\u002F",[715,2570,2571],{"class":773}," count",[715,2573,1235],{"class":729},[715,2575,2576],{"class":766},"AS",[715,2578,2579],{"class":729}," error_rate\n",[715,2581,2582,2585],{"class":717,"line":792},[715,2583,2584],{"class":766},"FROM",[715,2586,783],{"class":729},[715,2588,2589,2592,2595,2598,2601,2603,2606,2608,2611],{"class":717,"line":819},[715,2590,2591],{"class":766},"WHERE",[715,2593,2594],{"class":795}," timestamp",[715,2596,2597],{"class":725}," >",[715,2599,2600],{"class":766}," now",[715,2602,1532],{"class":725},[715,2604,2605],{"class":725}," -",[715,2607,986],{"class":729},[715,2609,2610],{"class":766},"1",[715,2612,2613],{"class":766}," HOUR\n",[715,2615,2616,2619,2621],{"class":717,"line":828},[715,2617,2618],{"class":766},"GROUP BY",[715,2620,1758],{"class":766},[715,2622,995],{"class":729},[705,2624,2626],{"className":756,"code":2625,"language":759,"meta":711,"style":711},"-- Slowest routes\nSELECT path, count() AS hits, avg(duration_ms) AS avg_ms, quantile(0.95)(duration_ms) AS p95_ms\nFROM evlog_events\nWHERE timestamp > now() - INTERVAL 1 DAY AND method = 'GET' AND duration_ms IS NOT NULL\nGROUP BY path\nORDER BY avg_ms DESC\nLIMIT 20;\n",[631,2627,2628,2633,2679,2685,2728,2735,2745],{"__ignoreMap":711},[715,2629,2630],{"class":717,"line":718},[715,2631,2632],{"class":1024},"-- Slowest routes\n",[715,2634,2635,2637,2640,2642,2645,2647,2649,2652,2655,2658,2660,2663,2666,2668,2671,2674,2676],{"class":717,"line":786},[715,2636,2422],{"class":766},[715,2638,2639],{"class":795}," path",[715,2641,805],{"class":729},[715,2643,2644],{"class":773},"count",[715,2646,1235],{"class":729},[715,2648,2576],{"class":766},[715,2650,2651],{"class":729}," hits, ",[715,2653,2654],{"class":773},"avg",[715,2656,2657],{"class":729},"(duration_ms) ",[715,2659,2576],{"class":766},[715,2661,2662],{"class":729}," avg_ms, quantile(",[715,2664,2665],{"class":766},"0",[715,2667,1086],{"class":729},[715,2669,2670],{"class":766},"95",[715,2672,2673],{"class":729},")(duration_ms) ",[715,2675,2576],{"class":766},[715,2677,2678],{"class":729}," p95_ms\n",[715,2680,2681,2683],{"class":717,"line":792},[715,2682,2584],{"class":766},[715,2684,783],{"class":729},[715,2686,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705,2708,2711,2713,2715,2718,2720,2722,2725],{"class":717,"line":819},[715,2688,2591],{"class":766},[715,2690,2594],{"class":795},[715,2692,2597],{"class":725},[715,2694,2600],{"class":766},[715,2696,1532],{"class":725},[715,2698,2605],{"class":725},[715,2700,986],{"class":729},[715,2702,2610],{"class":766},[715,2704,992],{"class":766},[715,2706,2707],{"class":766}," AND",[715,2709,2710],{"class":729}," method ",[715,2712,930],{"class":725},[715,2714,739],{"class":725},[715,2716,2717],{"class":742},"GET",[715,2719,808],{"class":725},[715,2721,2707],{"class":766},[715,2723,2724],{"class":729}," duration_ms ",[715,2726,2727],{"class":766},"IS NOT NULL\n",[715,2729,2730,2732],{"class":717,"line":828},[715,2731,2618],{"class":766},[715,2733,2734],{"class":795}," path\n",[715,2736,2737,2739,2742],{"class":717,"line":837},[715,2738,956],{"class":766},[715,2740,2741],{"class":729}," avg_ms ",[715,2743,2744],{"class":766},"DESC\n",[715,2746,2747,2750,2753],{"class":717,"line":843},[715,2748,2749],{"class":766},"LIMIT",[715,2751,2752],{"class":766}," 20",[715,2754,995],{"class":729},[705,2756,2758],{"className":756,"code":2757,"language":759,"meta":711,"style":711},"-- One request end to end\nSELECT timestamp, level, path, status, data\nFROM evlog_events\nWHERE request_id = '4a8ff3a8-...'\nORDER BY timestamp;\n",[631,2759,2760,2765,2790,2796,2812],{"__ignoreMap":711},[715,2761,2762],{"class":717,"line":718},[715,2763,2764],{"class":1024},"-- One request end to end\n",[715,2766,2767,2769,2771,2773,2775,2777,2780,2782,2785,2787],{"class":717,"line":786},[715,2768,2422],{"class":766},[715,2770,2594],{"class":795},[715,2772,805],{"class":729},[715,2774,2553],{"class":766},[715,2776,805],{"class":729},[715,2778,2779],{"class":795},"path",[715,2781,805],{"class":729},[715,2783,2784],{"class":766},"status",[715,2786,805],{"class":729},[715,2788,2789],{"class":766},"data\n",[715,2791,2792,2794],{"class":717,"line":792},[715,2793,2584],{"class":766},[715,2795,783],{"class":729},[715,2797,2798,2800,2803,2805,2807,2810],{"class":717,"line":819},[715,2799,2591],{"class":766},[715,2801,2802],{"class":729}," request_id ",[715,2804,930],{"class":725},[715,2806,739],{"class":725},[715,2808,2809],{"class":742},"4a8ff3a8-...",[715,2811,746],{"class":725},[715,2813,2814,2816,2818],{"class":717,"line":828},[715,2815,956],{"class":766},[715,2817,2594],{"class":795},[715,2819,995],{"class":729},[705,2821,2823],{"className":756,"code":2822,"language":759,"meta":711,"style":711},"-- Reach into a custom field kept only in data\nSELECT JSONExtractString(data, 'user', 'plan') AS plan, count()\nFROM evlog_events\nWHERE timestamp > now() - INTERVAL 7 DAY\nGROUP BY plan;\n",[631,2824,2825,2830,2868,2874,2896],{"__ignoreMap":711},[715,2826,2827],{"class":717,"line":718},[715,2828,2829],{"class":1024},"-- Reach into a custom field kept only in data\n",[715,2831,2832,2834,2837,2839,2841,2843,2846,2848,2850,2852,2855,2857,2859,2861,2864,2866],{"class":717,"line":786},[715,2833,2422],{"class":766},[715,2835,2836],{"class":729}," JSONExtractString(",[715,2838,645],{"class":766},[715,2840,805],{"class":729},[715,2842,808],{"class":725},[715,2844,2845],{"class":742},"user",[715,2847,808],{"class":725},[715,2849,805],{"class":729},[715,2851,808],{"class":725},[715,2853,2854],{"class":742},"plan",[715,2856,808],{"class":725},[715,2858,980],{"class":729},[715,2860,2576],{"class":766},[715,2862,2863],{"class":729}," plan, ",[715,2865,2644],{"class":773},[715,2867,1204],{"class":729},[715,2869,2870,2872],{"class":717,"line":792},[715,2871,2584],{"class":766},[715,2873,783],{"class":729},[715,2875,2876,2878,2880,2882,2884,2886,2888,2890,2893],{"class":717,"line":819},[715,2877,2591],{"class":766},[715,2879,2594],{"class":795},[715,2881,2597],{"class":725},[715,2883,2600],{"class":766},[715,2885,1532],{"class":725},[715,2887,2605],{"class":725},[715,2889,986],{"class":729},[715,2891,2892],{"class":766},"7",[715,2894,2895],{"class":766}," DAY\n",[715,2897,2898,2900],{"class":717,"line":828},[715,2899,2618],{"class":766},[715,2901,2902],{"class":729}," plan;\n",[698,2904,2906],{"id":2905},"custom-schema","Custom schema",[619,2908,2909,2910,2912],{},"Pass ",[631,2911,2049],{}," to target a table of your own shape:",[705,2914,2916],{"className":707,"code":2915,"filename":2119,"language":710,"meta":711,"style":711},"import { createClickHouseDrain } from 'evlog\u002Fclickhouse'\n\ncreateClickHouseDrain({\n  table: 'app_logs',\n  transform: event => ({\n    ts: event.timestamp,\n    lvl: event.level,\n    svc: event.service,\n    payload: JSON.stringify(event),\n  }),\n})\n",[631,2917,2918,2936,2940,2948,2964,2980,2995,3010,3025,3045,3054],{"__ignoreMap":711},[715,2919,2920,2922,2924,2926,2928,2930,2932,2934],{"class":717,"line":718},[715,2921,722],{"class":721},[715,2923,726],{"class":725},[715,2925,730],{"class":729},[715,2927,733],{"class":725},[715,2929,736],{"class":721},[715,2931,739],{"class":725},[715,2933,743],{"class":742},[715,2935,746],{"class":725},[715,2937,2938],{"class":717,"line":786},[715,2939,1049],{"emptyLinePlaceholder":1048},[715,2941,2942,2944,2946],{"class":717,"line":792},[715,2943,2126],{"class":773},[715,2945,1063],{"class":729},[715,2947,1636],{"class":725},[715,2949,2950,2953,2955,2957,2960,2962],{"class":717,"line":819},[715,2951,2952],{"class":1097},"  table",[715,2954,1230],{"class":725},[715,2956,739],{"class":725},[715,2958,2959],{"class":742},"app_logs",[715,2961,808],{"class":725},[715,2963,1671],{"class":725},[715,2965,2966,2969,2971,2974,2976,2978],{"class":717,"line":828},[715,2967,2968],{"class":773},"  transform",[715,2970,1230],{"class":725},[715,2972,2973],{"class":1068}," event",[715,2975,1075],{"class":795},[715,2977,959],{"class":729},[715,2979,1636],{"class":725},[715,2981,2982,2985,2987,2989,2991,2993],{"class":717,"line":837},[715,2983,2984],{"class":1097},"    ts",[715,2986,1230],{"class":725},[715,2988,2973],{"class":729},[715,2990,1086],{"class":725},[715,2992,948],{"class":729},[715,2994,1671],{"class":725},[715,2996,2997,3000,3002,3004,3006,3008],{"class":717,"line":843},[715,2998,2999],{"class":1097},"    lvl",[715,3001,1230],{"class":725},[715,3003,2973],{"class":729},[715,3005,1086],{"class":725},[715,3007,2553],{"class":729},[715,3009,1671],{"class":725},[715,3011,3012,3015,3017,3019,3021,3023],{"class":717,"line":849},[715,3013,3014],{"class":1097},"    svc",[715,3016,1230],{"class":725},[715,3018,2973],{"class":729},[715,3020,1086],{"class":725},[715,3022,962],{"class":729},[715,3024,1671],{"class":725},[715,3026,3027,3030,3032,3035,3037,3040,3043],{"class":717,"line":855},[715,3028,3029],{"class":1097},"    payload",[715,3031,1230],{"class":725},[715,3033,3034],{"class":729}," JSON",[715,3036,1086],{"class":725},[715,3038,3039],{"class":773},"stringify",[715,3041,3042],{"class":729},"(event)",[715,3044,1671],{"class":725},[715,3046,3047,3050,3052],{"class":717,"line":861},[715,3048,3049],{"class":725},"  }",[715,3051,1072],{"class":729},[715,3053,1671],{"class":725},[715,3055,3056,3058],{"class":717,"line":867},[715,3057,1117],{"class":725},[715,3059,921],{"class":729},[619,3061,3062,3063,3065],{},"Keys must match your column names, because ClickHouse rejects a ",[631,3064,633],{}," insert containing unknown columns.",[698,3067,3069],{"id":3068},"batching","Batching",[619,3071,3072],{},"Pair with a pipeline to insert in larger batches:",[705,3074,3076],{"className":707,"code":3075,"filename":2119,"language":710,"meta":711,"style":711},"import { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createClickHouseDrain } from 'evlog\u002Fclickhouse'\nimport type { DrainContext } from 'evlog'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 500, intervalMs: 5000 },\n})\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', pipeline(createClickHouseDrain()))\n})\n",[631,3077,3078,3097,3115,3137,3141,3165,3194,3200,3204,3224,3256],{"__ignoreMap":711},[715,3079,3080,3082,3084,3087,3089,3091,3093,3095],{"class":717,"line":718},[715,3081,722],{"class":721},[715,3083,726],{"class":725},[715,3085,3086],{"class":729}," createDrainPipeline",[715,3088,733],{"class":725},[715,3090,736],{"class":721},[715,3092,739],{"class":725},[715,3094,2521],{"class":742},[715,3096,746],{"class":725},[715,3098,3099,3101,3103,3105,3107,3109,3111,3113],{"class":717,"line":786},[715,3100,722],{"class":721},[715,3102,726],{"class":725},[715,3104,730],{"class":729},[715,3106,733],{"class":725},[715,3108,736],{"class":721},[715,3110,739],{"class":725},[715,3112,743],{"class":742},[715,3114,746],{"class":725},[715,3116,3117,3119,3122,3124,3127,3129,3131,3133,3135],{"class":717,"line":792},[715,3118,722],{"class":721},[715,3120,3121],{"class":721}," type",[715,3123,726],{"class":725},[715,3125,3126],{"class":729}," DrainContext",[715,3128,733],{"class":725},[715,3130,736],{"class":721},[715,3132,739],{"class":725},[715,3134,1219],{"class":742},[715,3136,746],{"class":725},[715,3138,3139],{"class":717,"line":819},[715,3140,1049],{"emptyLinePlaceholder":1048},[715,3142,3143,3145,3148,3150,3152,3155,3158,3161,3163],{"class":717,"line":828},[715,3144,1191],{"class":795},[715,3146,3147],{"class":729}," pipeline ",[715,3149,930],{"class":725},[715,3151,3086],{"class":773},[715,3153,3154],{"class":725},"\u003C",[715,3156,3157],{"class":1687},"DrainContext",[715,3159,3160],{"class":725},">",[715,3162,1063],{"class":729},[715,3164,1636],{"class":725},[715,3166,3167,3170,3172,3174,3177,3179,3182,3184,3187,3189,3192],{"class":717,"line":837},[715,3168,3169],{"class":1097},"  batch",[715,3171,1230],{"class":725},[715,3173,726],{"class":725},[715,3175,3176],{"class":1097}," size",[715,3178,1230],{"class":725},[715,3180,3181],{"class":766}," 500",[715,3183,1107],{"class":725},[715,3185,3186],{"class":1097}," intervalMs",[715,3188,1230],{"class":725},[715,3190,3191],{"class":766}," 5000",[715,3193,1770],{"class":725},[715,3195,3196,3198],{"class":717,"line":843},[715,3197,1117],{"class":725},[715,3199,921],{"class":729},[715,3201,3202],{"class":717,"line":849},[715,3203,1049],{"emptyLinePlaceholder":1048},[715,3205,3206,3208,3210,3212,3214,3216,3218,3220,3222],{"class":717,"line":855},[715,3207,1054],{"class":721},[715,3209,1057],{"class":721},[715,3211,1060],{"class":773},[715,3213,1063],{"class":729},[715,3215,1063],{"class":725},[715,3217,1069],{"class":1068},[715,3219,1072],{"class":725},[715,3221,1075],{"class":795},[715,3223,1078],{"class":725},[715,3225,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3249,3251,3253],{"class":717,"line":861},[715,3227,1083],{"class":729},[715,3229,1086],{"class":725},[715,3231,1089],{"class":729},[715,3233,1086],{"class":725},[715,3235,1094],{"class":773},[715,3237,1063],{"class":1097},[715,3239,808],{"class":725},[715,3241,1102],{"class":742},[715,3243,808],{"class":725},[715,3245,1107],{"class":725},[715,3247,3248],{"class":773}," pipeline",[715,3250,1063],{"class":1097},[715,3252,2126],{"class":773},[715,3254,3255],{"class":1097},"()))\n",[715,3257,3258,3260],{"class":717,"line":867},[715,3259,1117],{"class":725},[715,3261,921],{"class":729},[698,3263,3265],{"id":3264},"troubleshooting","Troubleshooting",[619,3267,3268,2338,3273,3275,3276,3278,3279,3282],{},[639,3269,3270,1086],{},[631,3271,3272],{},"Missing endpoint",[631,3274,1827],{}," is unset and no ",[631,3277,1923],{}," was passed. The drain logs ",[631,3280,3281],{},"[evlog\u002Fclickhouse] Missing endpoint"," once and then does nothing, so requests are never blocked or failed.",[619,3284,3285,3290,3291,2334,3293,3295,3296,2334,3298,3300,3301,1086],{},[639,3286,3287,1086],{},[631,3288,3289],{},"ClickHouse API error: 401"," Check ",[631,3292,1844],{},[631,3294,1860],{},". Credentials are sent as ",[631,3297,2333],{},[631,3299,2337],{}," headers, never in the query string, so they never reach ",[631,3302,2345],{},[619,3304,3305,3311,3312,3314],{},[639,3306,3307,3310],{},[631,3308,3309],{},"ClickHouse API error: 400"," mentioning unknown column."," Your table does not match the row shape. Either create the table from the DDL above, or supply a ",[631,3313,2049],{}," matching your columns.",[619,3316,3317,3322,3323,3325,3326,3329],{},[639,3318,3319,1086],{},[631,3320,3321],{},"Cannot parse input"," The table exists but a column type disagrees. ",[631,3324,2784],{}," is ",[631,3327,3328],{},"Nullable(UInt16)"," because it is absent on non-HTTP events.",[698,3331,3333],{"id":3332},"direct-api-usage","Direct API usage",[705,3335,3338],{"className":707,"code":3336,"filename":3337,"language":710,"meta":711,"style":711},"import { sendBatchToClickHouse, sendToClickHouse } from 'evlog\u002Fclickhouse'\n\nawait sendToClickHouse(event, { endpoint: 'http:\u002F\u002Flocalhost:8123' })\nawait sendBatchToClickHouse(events, { endpoint: 'http:\u002F\u002Flocalhost:8123' })\n","scripts\u002Fbackfill.ts",[631,3339,3340,3364,3368,3395],{"__ignoreMap":711},[715,3341,3342,3344,3346,3349,3351,3354,3356,3358,3360,3362],{"class":717,"line":718},[715,3343,722],{"class":721},[715,3345,726],{"class":725},[715,3347,3348],{"class":729}," sendBatchToClickHouse",[715,3350,1107],{"class":725},[715,3352,3353],{"class":729}," sendToClickHouse",[715,3355,733],{"class":725},[715,3357,736],{"class":721},[715,3359,739],{"class":725},[715,3361,743],{"class":742},[715,3363,746],{"class":725},[715,3365,3366],{"class":717,"line":786},[715,3367,1049],{"emptyLinePlaceholder":1048},[715,3369,3370,3372,3374,3377,3379,3381,3383,3385,3387,3389,3391,3393],{"class":717,"line":792},[715,3371,1424],{"class":721},[715,3373,3353],{"class":773},[715,3375,3376],{"class":729},"(event",[715,3378,1107],{"class":725},[715,3380,726],{"class":725},[715,3382,2133],{"class":1097},[715,3384,1230],{"class":725},[715,3386,739],{"class":725},[715,3388,679],{"class":742},[715,3390,808],{"class":725},[715,3392,733],{"class":725},[715,3394,921],{"class":729},[715,3396,3397,3399,3401,3404,3406,3408,3410,3412,3414,3416,3418,3420],{"class":717,"line":819},[715,3398,1424],{"class":721},[715,3400,3348],{"class":773},[715,3402,3403],{"class":729},"(events",[715,3405,1107],{"class":725},[715,3407,726],{"class":725},[715,3409,2133],{"class":1097},[715,3411,1230],{"class":725},[715,3413,739],{"class":725},[715,3415,679],{"class":742},[715,3417,808],{"class":725},[715,3419,733],{"class":725},[715,3421,921],{"class":729},[619,3423,3424,805,3427,3430,3431,3434],{},[631,3425,3426],{},"toClickHouseRow()",[631,3428,3429],{},"toJSONEachRow()",", and ",[631,3432,3433],{},"resolveClickHouseUrl()"," are also exported.",[698,3436,3438],{"id":3437},"next-steps","Next steps",[3440,3441,3442,3447,3452,3458],"ul",{},[659,3443,3444,3446],{},[623,3445,66],{"href":67},": control volume before it reaches ClickHouse",[659,3448,3449,3451],{},[623,3450,440],{"href":441},": add derived fields to every event",[659,3453,3454,3457],{},[623,3455,3456],{"href":545},"Pipeline",": batching, retries, and fan-out",[659,3459,3460,3463],{},[623,3461,3462],{"href":153},"Adapters Overview",": all available destinations",[3465,3466,3467],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":711,"searchDepth":786,"depth":786,"links":3469},[3470,3471,3472,3473,3477,3481,3482,3483,3484,3485,3486,3487,3488],{"id":700,"depth":786,"text":20},{"id":749,"depth":786,"text":750},{"id":1010,"depth":786,"text":25},{"id":1792,"depth":786,"text":557,"children":3474},[3475,3476],{"id":1796,"depth":792,"text":1797},{"id":1897,"depth":792,"text":346},{"id":2104,"depth":786,"text":2105,"children":3478},[3479,3480],{"id":2111,"depth":792,"text":2112},{"id":2203,"depth":792,"text":2204},{"id":2349,"depth":786,"text":2350},{"id":2482,"depth":786,"text":2483},{"id":2524,"depth":786,"text":2525},{"id":2905,"depth":786,"text":2906},{"id":3068,"depth":786,"text":3069},{"id":3264,"depth":786,"text":3265},{"id":3332,"depth":786,"text":3333},{"id":3437,"depth":786,"text":3438},"Insert wide events into ClickHouse over the HTTP interface — typed columns for what you aggregate, full JSON for everything else.","md",[3492,3498],{"label":3493,"icon":3494,"to":625,"target":3495,"color":3496,"variant":3497},"HTTP Interface","i-lucide-external-link","_blank","neutral","subtle",{"label":3499,"icon":3494,"to":2489,"target":3495,"color":3496,"variant":3497},"Async Inserts",{},{"title":196,"icon":199},{"title":614,"description":3489},"2tkkGzm_QM70LI_vpY_UpJWCHtZzf2R9tvxSFL45XwM",[3505,3507],{"title":191,"path":192,"stem":193,"description":3506,"icon":194,"children":-1},"Push wide events to Grafana Loki — self-hosted, multi-tenant, or Grafana Cloud — with low-cardinality labels and full JSON querying.",{"title":201,"path":202,"stem":203,"description":3508,"icon":204,"children":-1},"Send logs via OpenTelemetry Protocol (OTLP) to Grafana, Datadog, Honeycomb, and any compatible backend. Supports gRPC and HTTP transports.",1789294033454]