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