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