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