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