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