[{"data":1,"prerenderedAt":2877},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-hybrid-loki":538,"-integrate-adapters-hybrid-loki-surround":2872},[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,507,512,515,520,524,529,533],{"title":36,"path":504,"stem":505,"icon":506},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":508,"path":509,"stem":510,"icon":511},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":374,"path":513,"stem":514,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":516,"path":517,"stem":518,"icon":519},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":521,"path":522,"stem":523,"icon":379},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":525,"path":526,"stem":527,"icon":528},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":530,"path":531,"stem":532,"icon":434},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":534,"path":535,"stem":536,"icon":537},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"id":539,"title":540,"body":541,"description":2855,"extension":2856,"links":2857,"meta":2868,"navigation":2869,"path":182,"seo":2870,"stem":183,"__hash__":2871},"docs\u002F4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki.md","Grafana Loki Adapter",{"type":542,"value":543,"toc":2834},"minimark",[544,555,590,640,644,647,690,693,700,1490,1493,1498,1586,1590,1593,1614,1617,1782,1786,1789,1793,1796,1826,1843,1852,1903,1926,1935,1939,1946,2017,2049,2068,2072,2146,2151,2155,2167,2170,2268,2271,2275,2280,2302,2317,2332,2347,2351,2354,2548,2551,2555,2558,2617,2627,2636,2640,2658,2672,2685,2695,2699,2702,2790,2802,2806,2830],[545,546,547,548,554],"p",{},"The Loki adapter pushes wide events to ",[549,550,181],"a",{"href":551,"rel":552},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002F",[553],"nofollow"," via its push API. It works with a self-hosted single-tenant instance, a multi-tenant deployment, and Grafana Cloud.",[545,556,557,558,562,563,567,568,571,572,575,576,567,579,567,582,585,586,589],{},"Each event is pushed as a ",[559,560,561],"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 ",[564,565,566],"code",{},"service",", ",[564,569,570],{},"environment",", and ",[564,573,574],{},"level"," by default, and leaves everything else (",[564,577,578],{},"requestId",[564,580,581],{},"path",[564,583,584],{},"user",", your custom fields) in the line, queryable with ",[564,587,588],{},"| json",".",[591,592,595,598,628],"prompt",{":actions":593,"description":594,"icon":184},"[\"copy\",\"cursor\",\"claude\"]","Add the Grafana Loki drain adapter",[545,596,597],{},"Add the Grafana Loki drain adapter to send evlog wide events to Loki.",[599,600,601,605,608,611,614,622,625],"ol",{},[602,603,604],"li",{},"Identify which framework I'm using and follow its evlog integration pattern",[602,606,607],{},"Install evlog if not already installed",[602,609,610],{},"Import createLokiDrain from 'evlog\u002Floki'",[602,612,613],{},"Wire createLokiDrain() into my framework's drain configuration",[602,615,616,617,621],{},"Set LOKI_ENDPOINT (e.g. ",[549,618,619],{"href":619,"rel":620},"http:\u002F\u002Flocalhost:3100",[553],"). For Grafana Cloud also set LOKI_USER (instance ID) and LOKI_API_KEY",[602,623,624],{},"For multi-tenant self-hosted Loki, set LOKI_TENANT_ID instead",[602,626,627],{},"Test by triggering a request and querying {service=\"my-app\"} in Grafana",[545,629,630,631,635,636],{},"Adapter docs: ",[549,632,633],{"href":633,"rel":634},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki",[553],"\nFramework setup: ",[549,637,638],{"href":638,"rel":639},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[553],[641,642,20],"h2",{"id":643},"installation",[545,645,646],{},"The Loki adapter comes bundled with evlog:",[648,649,655],"pre",{"className":650,"code":651,"filename":652,"language":653,"meta":654,"style":654},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createLokiDrain } from 'evlog\u002Floki'\n","src\u002Findex.ts","typescript","",[564,656,657],{"__ignoreMap":654},[658,659,662,666,670,674,677,680,683,687],"span",{"class":660,"line":661},"line",1,[658,663,665],{"class":664},"s7zQu","import",[658,667,669],{"class":668},"sMK4o"," {",[658,671,673],{"class":672},"sTEyZ"," createLokiDrain",[658,675,676],{"class":668}," }",[658,678,679],{"class":664}," from",[658,681,682],{"class":668}," '",[658,684,686],{"class":685},"sfazB","evlog\u002Floki",[658,688,689],{"class":668},"'\n",[641,691,25],{"id":692},"quick-start",[545,694,695,696,699],{},"Set ",[564,697,698],{},"LOKI_ENDPOINT"," and wire the drain into your framework.",[701,702,703,817,939,1043,1150,1255,1392],"code-group",{},[648,704,707],{"className":650,"code":705,"filename":706,"language":653,"meta":654,"style":654},"\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",[564,708,709,715,734,741,773,808],{"__ignoreMap":654},[658,710,711],{"class":660,"line":661},[658,712,714],{"class":713},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog.ts\n",[658,716,718,720,722,724,726,728,730,732],{"class":660,"line":717},2,[658,719,665],{"class":664},[658,721,669],{"class":668},[658,723,673],{"class":672},[658,725,676],{"class":668},[658,727,679],{"class":664},[658,729,682],{"class":668},[658,731,686],{"class":685},[658,733,689],{"class":668},[658,735,737],{"class":660,"line":736},3,[658,738,740],{"emptyLinePlaceholder":739},true,"\n",[658,742,744,747,750,754,757,759,763,766,770],{"class":660,"line":743},4,[658,745,746],{"class":664},"export",[658,748,749],{"class":664}," default",[658,751,753],{"class":752},"s2Zo4"," defineNitroPlugin",[658,755,756],{"class":672},"(",[658,758,756],{"class":668},[658,760,762],{"class":761},"sHdIc","nitroApp",[658,764,765],{"class":668},")",[658,767,769],{"class":768},"spNyl"," =>",[658,771,772],{"class":668}," {\n",[658,774,776,779,781,784,786,789,792,795,798,800,803,805],{"class":660,"line":775},5,[658,777,778],{"class":672},"  nitroApp",[658,780,589],{"class":668},[658,782,783],{"class":672},"hooks",[658,785,589],{"class":668},[658,787,788],{"class":752},"hook",[658,790,756],{"class":791},"swJcz",[658,793,794],{"class":668},"'",[658,796,797],{"class":685},"evlog:drain",[658,799,794],{"class":668},[658,801,802],{"class":668},",",[658,804,673],{"class":752},[658,806,807],{"class":791},"())\n",[658,809,811,814],{"class":660,"line":810},6,[658,812,813],{"class":668},"}",[658,815,816],{"class":672},")\n",[648,818,820],{"className":650,"code":819,"filename":265,"language":653,"meta":654,"style":654},"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",[564,821,822,842,862,880,884,903],{"__ignoreMap":654},[658,823,824,826,828,831,833,835,837,840],{"class":660,"line":661},[658,825,665],{"class":664},[658,827,669],{"class":668},[658,829,830],{"class":672}," Hono",[658,832,676],{"class":668},[658,834,679],{"class":664},[658,836,682],{"class":668},[658,838,839],{"class":685},"hono",[658,841,689],{"class":668},[658,843,844,846,848,851,853,855,857,860],{"class":660,"line":717},[658,845,665],{"class":664},[658,847,669],{"class":668},[658,849,850],{"class":672}," evlog",[658,852,676],{"class":668},[658,854,679],{"class":664},[658,856,682],{"class":668},[658,858,859],{"class":685},"evlog\u002Fhono",[658,861,689],{"class":668},[658,863,864,866,868,870,872,874,876,878],{"class":660,"line":736},[658,865,665],{"class":664},[658,867,669],{"class":668},[658,869,673],{"class":672},[658,871,676],{"class":668},[658,873,679],{"class":664},[658,875,682],{"class":668},[658,877,686],{"class":685},[658,879,689],{"class":668},[658,881,882],{"class":660,"line":743},[658,883,740],{"emptyLinePlaceholder":739},[658,885,886,889,892,895,898,900],{"class":660,"line":775},[658,887,888],{"class":768},"const",[658,890,891],{"class":672}," app ",[658,893,894],{"class":668},"=",[658,896,897],{"class":668}," new",[658,899,830],{"class":752},[658,901,902],{"class":672},"()\n",[658,904,905,908,910,913,915,918,920,923,926,929,931,934,936],{"class":660,"line":810},[658,906,907],{"class":672},"app",[658,909,589],{"class":668},[658,911,912],{"class":752},"use",[658,914,756],{"class":672},[658,916,917],{"class":752},"evlog",[658,919,756],{"class":672},[658,921,922],{"class":668},"{",[658,924,925],{"class":791}," drain",[658,927,928],{"class":668},":",[658,930,673],{"class":752},[658,932,933],{"class":672},"() ",[658,935,813],{"class":668},[658,937,938],{"class":672},"))\n",[648,940,942],{"className":650,"code":941,"filename":260,"language":653,"meta":654,"style":654},"import express from 'express'\nimport { evlog } from 'evlog\u002Fexpress'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nconst app = express()\napp.use(evlog({ drain: createLokiDrain() }))\n",[564,943,944,961,980,998,1002,1015],{"__ignoreMap":654},[658,945,946,948,951,954,956,959],{"class":660,"line":661},[658,947,665],{"class":664},[658,949,950],{"class":672}," express ",[658,952,953],{"class":664},"from",[658,955,682],{"class":668},[658,957,958],{"class":685},"express",[658,960,689],{"class":668},[658,962,963,965,967,969,971,973,975,978],{"class":660,"line":717},[658,964,665],{"class":664},[658,966,669],{"class":668},[658,968,850],{"class":672},[658,970,676],{"class":668},[658,972,679],{"class":664},[658,974,682],{"class":668},[658,976,977],{"class":685},"evlog\u002Fexpress",[658,979,689],{"class":668},[658,981,982,984,986,988,990,992,994,996],{"class":660,"line":736},[658,983,665],{"class":664},[658,985,669],{"class":668},[658,987,673],{"class":672},[658,989,676],{"class":668},[658,991,679],{"class":664},[658,993,682],{"class":668},[658,995,686],{"class":685},[658,997,689],{"class":668},[658,999,1000],{"class":660,"line":743},[658,1001,740],{"emptyLinePlaceholder":739},[658,1003,1004,1006,1008,1010,1013],{"class":660,"line":775},[658,1005,888],{"class":768},[658,1007,891],{"class":672},[658,1009,894],{"class":668},[658,1011,1012],{"class":752}," express",[658,1014,902],{"class":672},[658,1016,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039,1041],{"class":660,"line":810},[658,1018,907],{"class":672},[658,1020,589],{"class":668},[658,1022,912],{"class":752},[658,1024,756],{"class":672},[658,1026,917],{"class":752},[658,1028,756],{"class":672},[658,1030,922],{"class":668},[658,1032,925],{"class":791},[658,1034,928],{"class":668},[658,1036,673],{"class":752},[658,1038,933],{"class":672},[658,1040,813],{"class":668},[658,1042,938],{"class":672},[648,1044,1046],{"className":650,"code":1045,"filename":270,"language":653,"meta":654,"style":654},"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",[564,1047,1048,1064,1083,1101,1105,1118],{"__ignoreMap":654},[658,1049,1050,1052,1055,1057,1059,1062],{"class":660,"line":661},[658,1051,665],{"class":664},[658,1053,1054],{"class":672}," Fastify ",[658,1056,953],{"class":664},[658,1058,682],{"class":668},[658,1060,1061],{"class":685},"fastify",[658,1063,689],{"class":668},[658,1065,1066,1068,1070,1072,1074,1076,1078,1081],{"class":660,"line":717},[658,1067,665],{"class":664},[658,1069,669],{"class":668},[658,1071,850],{"class":672},[658,1073,676],{"class":668},[658,1075,679],{"class":664},[658,1077,682],{"class":668},[658,1079,1080],{"class":685},"evlog\u002Ffastify",[658,1082,689],{"class":668},[658,1084,1085,1087,1089,1091,1093,1095,1097,1099],{"class":660,"line":736},[658,1086,665],{"class":664},[658,1088,669],{"class":668},[658,1090,673],{"class":672},[658,1092,676],{"class":668},[658,1094,679],{"class":664},[658,1096,682],{"class":668},[658,1098,686],{"class":685},[658,1100,689],{"class":668},[658,1102,1103],{"class":660,"line":743},[658,1104,740],{"emptyLinePlaceholder":739},[658,1106,1107,1109,1111,1113,1116],{"class":660,"line":775},[658,1108,888],{"class":768},[658,1110,891],{"class":672},[658,1112,894],{"class":668},[658,1114,1115],{"class":752}," Fastify",[658,1117,902],{"class":672},[658,1119,1120,1123,1126,1128,1131,1134,1136,1138,1140,1142,1144,1146,1148],{"class":660,"line":810},[658,1121,1122],{"class":664},"await",[658,1124,1125],{"class":672}," app",[658,1127,589],{"class":668},[658,1129,1130],{"class":752},"register",[658,1132,1133],{"class":672},"(evlog",[658,1135,802],{"class":668},[658,1137,669],{"class":668},[658,1139,925],{"class":791},[658,1141,928],{"class":668},[658,1143,673],{"class":752},[658,1145,933],{"class":672},[658,1147,813],{"class":668},[658,1149,816],{"class":672},[648,1151,1153],{"className":650,"code":1152,"filename":275,"language":653,"meta":654,"style":654},"import { Elysia } from 'elysia'\nimport { evlog } from 'evlog\u002Felysia'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nconst app = new Elysia().use(evlog({ drain: createLokiDrain() }))\n",[564,1154,1155,1175,1194,1212,1216],{"__ignoreMap":654},[658,1156,1157,1159,1161,1164,1166,1168,1170,1173],{"class":660,"line":661},[658,1158,665],{"class":664},[658,1160,669],{"class":668},[658,1162,1163],{"class":672}," Elysia",[658,1165,676],{"class":668},[658,1167,679],{"class":664},[658,1169,682],{"class":668},[658,1171,1172],{"class":685},"elysia",[658,1174,689],{"class":668},[658,1176,1177,1179,1181,1183,1185,1187,1189,1192],{"class":660,"line":717},[658,1178,665],{"class":664},[658,1180,669],{"class":668},[658,1182,850],{"class":672},[658,1184,676],{"class":668},[658,1186,679],{"class":664},[658,1188,682],{"class":668},[658,1190,1191],{"class":685},"evlog\u002Felysia",[658,1193,689],{"class":668},[658,1195,1196,1198,1200,1202,1204,1206,1208,1210],{"class":660,"line":736},[658,1197,665],{"class":664},[658,1199,669],{"class":668},[658,1201,673],{"class":672},[658,1203,676],{"class":668},[658,1205,679],{"class":664},[658,1207,682],{"class":668},[658,1209,686],{"class":685},[658,1211,689],{"class":668},[658,1213,1214],{"class":660,"line":743},[658,1215,740],{"emptyLinePlaceholder":739},[658,1217,1218,1220,1222,1224,1226,1228,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253],{"class":660,"line":775},[658,1219,888],{"class":768},[658,1221,891],{"class":672},[658,1223,894],{"class":668},[658,1225,897],{"class":668},[658,1227,1163],{"class":752},[658,1229,1230],{"class":672},"()",[658,1232,589],{"class":668},[658,1234,912],{"class":752},[658,1236,756],{"class":672},[658,1238,917],{"class":752},[658,1240,756],{"class":672},[658,1242,922],{"class":668},[658,1244,925],{"class":791},[658,1246,928],{"class":668},[658,1248,673],{"class":752},[658,1250,933],{"class":672},[658,1252,813],{"class":668},[658,1254,938],{"class":672},[648,1256,1258],{"className":650,"code":1257,"filename":255,"language":653,"meta":654,"style":654},"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",[564,1259,1260,1280,1300,1318,1322,1335,1370,1377],{"__ignoreMap":654},[658,1261,1262,1264,1266,1269,1271,1273,1275,1278],{"class":660,"line":661},[658,1263,665],{"class":664},[658,1265,669],{"class":668},[658,1267,1268],{"class":672}," Module",[658,1270,676],{"class":668},[658,1272,679],{"class":664},[658,1274,682],{"class":668},[658,1276,1277],{"class":685},"@nestjs\u002Fcommon",[658,1279,689],{"class":668},[658,1281,1282,1284,1286,1289,1291,1293,1295,1298],{"class":660,"line":717},[658,1283,665],{"class":664},[658,1285,669],{"class":668},[658,1287,1288],{"class":672}," EvlogModule",[658,1290,676],{"class":668},[658,1292,679],{"class":664},[658,1294,682],{"class":668},[658,1296,1297],{"class":685},"evlog\u002Fnestjs",[658,1299,689],{"class":668},[658,1301,1302,1304,1306,1308,1310,1312,1314,1316],{"class":660,"line":736},[658,1303,665],{"class":664},[658,1305,669],{"class":668},[658,1307,673],{"class":672},[658,1309,676],{"class":668},[658,1311,679],{"class":664},[658,1313,682],{"class":668},[658,1315,686],{"class":685},[658,1317,689],{"class":668},[658,1319,1320],{"class":660,"line":743},[658,1321,740],{"emptyLinePlaceholder":739},[658,1323,1324,1327,1330,1332],{"class":660,"line":775},[658,1325,1326],{"class":668},"@",[658,1328,1329],{"class":752},"Module",[658,1331,756],{"class":672},[658,1333,1334],{"class":668},"{\n",[658,1336,1337,1340,1342,1345,1347,1350,1352,1354,1356,1358,1360,1362,1364,1367],{"class":660,"line":810},[658,1338,1339],{"class":791},"  imports",[658,1341,928],{"class":668},[658,1343,1344],{"class":672}," [EvlogModule",[658,1346,589],{"class":668},[658,1348,1349],{"class":752},"forRoot",[658,1351,756],{"class":672},[658,1353,922],{"class":668},[658,1355,925],{"class":791},[658,1357,928],{"class":668},[658,1359,673],{"class":752},[658,1361,933],{"class":672},[658,1363,813],{"class":668},[658,1365,1366],{"class":672},")]",[658,1368,1369],{"class":668},",\n",[658,1371,1373,1375],{"class":660,"line":1372},7,[658,1374,813],{"class":668},[658,1376,816],{"class":672},[658,1378,1380,1382,1385,1389],{"class":660,"line":1379},8,[658,1381,746],{"class":664},[658,1383,1384],{"class":768}," class",[658,1386,1388],{"class":1387},"sBMFI"," AppModule",[658,1390,1391],{"class":668}," {}\n",[648,1393,1395],{"className":650,"code":1394,"filename":290,"language":653,"meta":654,"style":654},"import { initLogger } from 'evlog'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\ninitLogger({\n  env: { service: 'my-app' },\n  drain: createLokiDrain(),\n})\n",[564,1396,1397,1416,1434,1438,1447,1471,1484],{"__ignoreMap":654},[658,1398,1399,1401,1403,1406,1408,1410,1412,1414],{"class":660,"line":661},[658,1400,665],{"class":664},[658,1402,669],{"class":668},[658,1404,1405],{"class":672}," initLogger",[658,1407,676],{"class":668},[658,1409,679],{"class":664},[658,1411,682],{"class":668},[658,1413,917],{"class":685},[658,1415,689],{"class":668},[658,1417,1418,1420,1422,1424,1426,1428,1430,1432],{"class":660,"line":717},[658,1419,665],{"class":664},[658,1421,669],{"class":668},[658,1423,673],{"class":672},[658,1425,676],{"class":668},[658,1427,679],{"class":664},[658,1429,682],{"class":668},[658,1431,686],{"class":685},[658,1433,689],{"class":668},[658,1435,1436],{"class":660,"line":736},[658,1437,740],{"emptyLinePlaceholder":739},[658,1439,1440,1443,1445],{"class":660,"line":743},[658,1441,1442],{"class":752},"initLogger",[658,1444,756],{"class":672},[658,1446,1334],{"class":668},[658,1448,1449,1452,1454,1456,1459,1461,1463,1466,1468],{"class":660,"line":775},[658,1450,1451],{"class":791},"  env",[658,1453,928],{"class":668},[658,1455,669],{"class":668},[658,1457,1458],{"class":791}," service",[658,1460,928],{"class":668},[658,1462,682],{"class":668},[658,1464,1465],{"class":685},"my-app",[658,1467,794],{"class":668},[658,1469,1470],{"class":668}," },\n",[658,1472,1473,1476,1478,1480,1482],{"class":660,"line":810},[658,1474,1475],{"class":791},"  drain",[658,1477,928],{"class":668},[658,1479,673],{"class":752},[658,1481,1230],{"class":672},[658,1483,1369],{"class":668},[658,1485,1486,1488],{"class":660,"line":1372},[658,1487,813],{"class":668},[658,1489,816],{"class":672},[641,1491,508],{"id":1492},"configuration",[1494,1495,1497],"h3",{"id":1496},"environment-variables","Environment variables",[1499,1500,1501,1517],"table",{},[1502,1503,1504],"thead",{},[1505,1506,1507,1511,1514],"tr",{},[1508,1509,1510],"th",{},"Variable",[1508,1512,1513],{},"Required",[1508,1515,1516],{},"Description",[1518,1519,1520,1537,1557,1571],"tbody",{},[1505,1521,1522,1527,1530],{},[1523,1524,1525],"td",{},[564,1526,698],{},[1523,1528,1529],{},"Yes",[1523,1531,1532,1533,1536],{},"Base URL of the Loki instance, without the push path (",[564,1534,1535],{},"LOKI_URL"," also accepted)",[1505,1538,1539,1544,1547],{},[1523,1540,1541],{},[564,1542,1543],{},"LOKI_API_KEY",[1523,1545,1546],{},"No",[1523,1548,1549,1550,1553,1554,1536],{},"API token. Sent as Basic with ",[564,1551,1552],{},"LOKI_USER",", otherwise as Bearer (",[564,1555,1556],{},"GRAFANA_API_KEY",[1505,1558,1559,1563,1565],{},[1523,1560,1561],{},[564,1562,1552],{},[1523,1564,1546],{},[1523,1566,1567,1568,1536],{},"Grafana Cloud instance ID. Switches auth to Basic (",[564,1569,1570],{},"GRAFANA_USER",[1505,1572,1573,1578,1580],{},[1523,1574,1575],{},[564,1576,1577],{},"LOKI_TENANT_ID",[1523,1579,1546],{},[1523,1581,1582,1583],{},"Tenant for multi-tenant self-hosted Loki, sent as ",[564,1584,1585],{},"X-Scope-OrgID",[1494,1587,1589],{"id":1588},"priority","Priority",[545,1591,1592],{},"Configuration is resolved highest to lowest:",[599,1594,1595,1601,1607,1612],{},[602,1596,1597,1598],{},"Overrides passed to ",[564,1599,1600],{},"createLokiDrain()",[602,1602,1603,1606],{},[564,1604,1605],{},"runtimeConfig.evlog.loki"," (Nitro)",[602,1608,1609,1606],{},[564,1610,1611],{},"runtimeConfig.loki",[602,1613,1497],{},[1494,1615,336],{"id":1616},"options",[1499,1618,1619,1634],{},[1502,1620,1621],{},[1505,1622,1623,1626,1629,1632],{},[1508,1624,1625],{},"Option",[1508,1627,1628],{},"Type",[1508,1630,1631],{},"Default",[1508,1633,1516],{},[1518,1635,1636,1657,1673,1688,1706,1726,1743,1763],{},[1505,1637,1638,1643,1648,1651],{},[1523,1639,1640],{},[564,1641,1642],{},"endpoint",[1523,1644,1645],{},[564,1646,1647],{},"string",[1523,1649,1650],{},"—",[1523,1652,1653,1654],{},"Base URL, without ",[564,1655,1656],{},"\u002Floki\u002Fapi\u002Fv1\u002Fpush",[1505,1658,1659,1664,1668,1670],{},[1523,1660,1661],{},[564,1662,1663],{},"apiKey",[1523,1665,1666],{},[564,1667,1647],{},[1523,1669,1650],{},[1523,1671,1672],{},"API token",[1505,1674,1675,1679,1683,1685],{},[1523,1676,1677],{},[564,1678,584],{},[1523,1680,1681],{},[564,1682,1647],{},[1523,1684,1650],{},[1523,1686,1687],{},"Grafana Cloud instance ID (enables Basic auth)",[1505,1689,1690,1695,1699,1701],{},[1523,1691,1692],{},[564,1693,1694],{},"tenantId",[1523,1696,1697],{},[564,1698,1647],{},[1523,1700,1650],{},[1523,1702,1703,1705],{},[564,1704,1585],{}," for multi-tenant Loki",[1505,1707,1708,1713,1718,1723],{},[1523,1709,1710],{},[564,1711,1712],{},"labelFields",[1523,1714,1715],{},[564,1716,1717],{},"string[]",[1523,1719,1720],{},[564,1721,1722],{},"['service', 'environment', 'level']",[1523,1724,1725],{},"Event fields promoted to Loki labels",[1505,1727,1728,1733,1738,1740],{},[1523,1729,1730],{},[564,1731,1732],{},"labels",[1523,1734,1735],{},[564,1736,1737],{},"Record\u003Cstring, string>",[1523,1739,1650],{},[1523,1741,1742],{},"Static labels merged into every stream",[1505,1744,1745,1750,1755,1760],{},[1523,1746,1747],{},[564,1748,1749],{},"timeout",[1523,1751,1752],{},[564,1753,1754],{},"number",[1523,1756,1757],{},[564,1758,1759],{},"5000",[1523,1761,1762],{},"Request timeout in ms",[1505,1764,1765,1770,1774,1779],{},[1523,1766,1767],{},[564,1768,1769],{},"retries",[1523,1771,1772],{},[564,1773,1754],{},[1523,1775,1776],{},[564,1777,1778],{},"2",[1523,1780,1781],{},"Retry attempts on transient failures",[641,1783,1785],{"id":1784},"deployment","Deployment",[545,1787,1788],{},"Loki runs either way, and the adapter is the same in both cases. Only\nauthentication differs.",[1494,1790,1792],{"id":1791},"self-hosted","Self-hosted",[545,1794,1795],{},"A single-tenant instance needs nothing but the endpoint:",[648,1797,1800],{"className":650,"code":1798,"filename":1799,"language":653,"meta":654,"style":654},"createLokiDrain({ endpoint: 'http:\u002F\u002Flocalhost:3100' })\n","server\u002Fplugins\u002Fevlog.ts",[564,1801,1802],{"__ignoreMap":654},[658,1803,1804,1807,1809,1811,1814,1816,1818,1820,1822,1824],{"class":660,"line":661},[658,1805,1806],{"class":752},"createLokiDrain",[658,1808,756],{"class":672},[658,1810,922],{"class":668},[658,1812,1813],{"class":791}," endpoint",[658,1815,928],{"class":668},[658,1817,682],{"class":668},[658,1819,619],{"class":685},[658,1821,794],{"class":668},[658,1823,676],{"class":668},[658,1825,816],{"class":672},[648,1827,1832],{"className":1828,"code":1829,"filename":1830,"language":1831,"meta":654,"style":654},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","LOKI_ENDPOINT=http:\u002F\u002Flocalhost:3100\n",".env","bash",[564,1833,1834],{"__ignoreMap":654},[658,1835,1836,1838,1840],{"class":660,"line":661},[658,1837,698],{"class":672},[658,1839,894],{"class":668},[658,1841,1842],{"class":685},"http:\u002F\u002Flocalhost:3100\n",[545,1844,1845,1846,1849,1850,928],{},"For a ",[559,1847,1848],{},"multi-tenant"," deployment, name the tenant, and it is sent as ",[564,1851,1585],{},[648,1853,1855],{"className":650,"code":1854,"filename":1799,"language":653,"meta":654,"style":654},"createLokiDrain({\n  endpoint: 'http:\u002F\u002Floki.internal:3100',\n  tenantId: 'team-checkout',\n})\n",[564,1856,1857,1865,1881,1897],{"__ignoreMap":654},[658,1858,1859,1861,1863],{"class":660,"line":661},[658,1860,1806],{"class":752},[658,1862,756],{"class":672},[658,1864,1334],{"class":668},[658,1866,1867,1870,1872,1874,1877,1879],{"class":660,"line":717},[658,1868,1869],{"class":791},"  endpoint",[658,1871,928],{"class":668},[658,1873,682],{"class":668},[658,1875,1876],{"class":685},"http:\u002F\u002Floki.internal:3100",[658,1878,794],{"class":668},[658,1880,1369],{"class":668},[658,1882,1883,1886,1888,1890,1893,1895],{"class":660,"line":736},[658,1884,1885],{"class":791},"  tenantId",[658,1887,928],{"class":668},[658,1889,682],{"class":668},[658,1891,1892],{"class":685},"team-checkout",[658,1894,794],{"class":668},[658,1896,1369],{"class":668},[658,1898,1899,1901],{"class":660,"line":743},[658,1900,813],{"class":668},[658,1902,816],{"class":672},[648,1904,1906],{"className":1828,"code":1905,"filename":1830,"language":1831,"meta":654,"style":654},"LOKI_ENDPOINT=http:\u002F\u002Floki.internal:3100\nLOKI_TENANT_ID=team-checkout\n",[564,1907,1908,1917],{"__ignoreMap":654},[658,1909,1910,1912,1914],{"class":660,"line":661},[658,1911,698],{"class":672},[658,1913,894],{"class":668},[658,1915,1916],{"class":685},"http:\u002F\u002Floki.internal:3100\n",[658,1918,1919,1921,1923],{"class":660,"line":717},[658,1920,1577],{"class":672},[658,1922,894],{"class":668},[658,1924,1925],{"class":685},"team-checkout\n",[545,1927,1928,1929,1931,1932,589],{},"If your instance sits behind an authenticating proxy, ",[564,1930,1663],{}," alone is sent as\n",[564,1933,1934],{},"Authorization: Bearer",[1494,1936,1938],{"id":1937},"grafana-cloud","Grafana Cloud",[545,1940,1941,1942,1945],{},"Grafana Cloud authenticates with your ",[559,1943,1944],{},"instance ID"," plus an access policy\ntoken, sent together as HTTP Basic:",[648,1947,1949],{"className":650,"code":1948,"filename":1799,"language":653,"meta":654,"style":654},"createLokiDrain({\n  endpoint: 'https:\u002F\u002Flogs-prod-eu-west-0.grafana.net',\n  user: '123456',\n  apiKey: process.env.GRAFANA_API_KEY,\n})\n",[564,1950,1951,1959,1974,1990,2011],{"__ignoreMap":654},[658,1952,1953,1955,1957],{"class":660,"line":661},[658,1954,1806],{"class":752},[658,1956,756],{"class":672},[658,1958,1334],{"class":668},[658,1960,1961,1963,1965,1967,1970,1972],{"class":660,"line":717},[658,1962,1869],{"class":791},[658,1964,928],{"class":668},[658,1966,682],{"class":668},[658,1968,1969],{"class":685},"https:\u002F\u002Flogs-prod-eu-west-0.grafana.net",[658,1971,794],{"class":668},[658,1973,1369],{"class":668},[658,1975,1976,1979,1981,1983,1986,1988],{"class":660,"line":736},[658,1977,1978],{"class":791},"  user",[658,1980,928],{"class":668},[658,1982,682],{"class":668},[658,1984,1985],{"class":685},"123456",[658,1987,794],{"class":668},[658,1989,1369],{"class":668},[658,1991,1992,1995,1997,2000,2002,2005,2007,2009],{"class":660,"line":743},[658,1993,1994],{"class":791},"  apiKey",[658,1996,928],{"class":668},[658,1998,1999],{"class":672}," process",[658,2001,589],{"class":668},[658,2003,2004],{"class":672},"env",[658,2006,589],{"class":668},[658,2008,1556],{"class":672},[658,2010,1369],{"class":668},[658,2012,2013,2015],{"class":660,"line":775},[658,2014,813],{"class":668},[658,2016,816],{"class":672},[648,2018,2020],{"className":1828,"code":2019,"filename":1830,"language":1831,"meta":654,"style":654},"LOKI_ENDPOINT=https:\u002F\u002Flogs-prod-eu-west-0.grafana.net\nLOKI_USER=123456\nLOKI_API_KEY=glc_xxx\n",[564,2021,2022,2031,2040],{"__ignoreMap":654},[658,2023,2024,2026,2028],{"class":660,"line":661},[658,2025,698],{"class":672},[658,2027,894],{"class":668},[658,2029,2030],{"class":685},"https:\u002F\u002Flogs-prod-eu-west-0.grafana.net\n",[658,2032,2033,2035,2037],{"class":660,"line":717},[658,2034,1552],{"class":672},[658,2036,894],{"class":668},[658,2038,2039],{"class":685},"123456\n",[658,2041,2042,2044,2046],{"class":660,"line":736},[658,2043,1543],{"class":672},[658,2045,894],{"class":668},[658,2047,2048],{"class":685},"glc_xxx\n",[2050,2051,2053,2055,2056,2059,2060,2064,2065,589],"callout",{"color":2052,"icon":13},"info",[564,2054,584],{}," is the ",[559,2057,2058],{},"numeric instance ID"," of the Loki datasource. Find it under\n",[2061,2062,2063],"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 ",[564,2066,2067],{},"401",[1494,2069,2071],{"id":2070},"which-auth-applies","Which auth applies",[1499,2073,2074,2093],{},[1502,2075,2076],{},[1505,2077,2078,2082,2086,2090],{},[1508,2079,2080],{},[564,2081,584],{},[1508,2083,2084],{},[564,2085,1663],{},[1508,2087,2088],{},[564,2089,1694],{},[1508,2091,2092],{},"Header sent",[1518,2094,2095,2109,2122,2135],{},[1505,2096,2097,2100,2102,2104],{},[1523,2098,2099],{},"✓",[1523,2101,2099],{},[1523,2103],{},[1523,2105,2106],{},[564,2107,2108],{},"Authorization: Basic base64(user:apiKey)",[1505,2110,2111,2113,2115,2117],{},[1523,2112],{},[1523,2114,2099],{},[1523,2116],{},[1523,2118,2119],{},[564,2120,2121],{},"Authorization: Bearer \u003CapiKey>",[1505,2123,2124,2126,2128,2130],{},[1523,2125],{},[1523,2127],{},[1523,2129,2099],{},[1523,2131,2132],{},[564,2133,2134],{},"X-Scope-OrgID: \u003CtenantId>",[1505,2136,2137,2139,2141,2143],{},[1523,2138],{},[1523,2140],{},[1523,2142],{},[1523,2144,2145],{},"none — unauthenticated instance",[545,2147,2148,2150],{},[564,2149,1694],{}," is independent and can be combined with either auth mode.",[641,2152,2154],{"id":2153},"labels-and-cardinality","Labels and cardinality",[2050,2156,2159,2160,2162,2163,2166],{"color":2157,"icon":2158},"warning","i-lucide-triangle-alert","Never promote a high-cardinality field to a label. Loki creates one stream per unique label combination, so labelling ",[564,2161,578],{}," or ",[564,2164,2165],{},"userId"," will create millions of streams and degrade or break your instance.",[545,2168,2169],{},"Add a label only for values you filter on and that have a bounded set:",[648,2171,2173],{"className":650,"code":2172,"filename":1799,"language":653,"meta":654,"style":654},"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",[564,2174,2175,2183,2188,2234,2239,2262],{"__ignoreMap":654},[658,2176,2177,2179,2181],{"class":660,"line":661},[658,2178,1806],{"class":752},[658,2180,756],{"class":672},[658,2182,1334],{"class":668},[658,2184,2185],{"class":660,"line":717},[658,2186,2187],{"class":713},"  \u002F\u002F `region` has a handful of values — safe\n",[658,2189,2190,2193,2195,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218,2220,2222,2224,2227,2229,2232],{"class":660,"line":736},[658,2191,2192],{"class":791},"  labelFields",[658,2194,928],{"class":668},[658,2196,2197],{"class":672}," [",[658,2199,794],{"class":668},[658,2201,566],{"class":685},[658,2203,794],{"class":668},[658,2205,802],{"class":668},[658,2207,682],{"class":668},[658,2209,570],{"class":685},[658,2211,794],{"class":668},[658,2213,802],{"class":668},[658,2215,682],{"class":668},[658,2217,574],{"class":685},[658,2219,794],{"class":668},[658,2221,802],{"class":668},[658,2223,682],{"class":668},[658,2225,2226],{"class":685},"region",[658,2228,794],{"class":668},[658,2230,2231],{"class":672},"]",[658,2233,1369],{"class":668},[658,2235,2236],{"class":660,"line":743},[658,2237,2238],{"class":713},"  \u002F\u002F Static labels for everything in this deployment\n",[658,2240,2241,2244,2246,2248,2251,2253,2255,2258,2260],{"class":660,"line":775},[658,2242,2243],{"class":791},"  labels",[658,2245,928],{"class":668},[658,2247,669],{"class":668},[658,2249,2250],{"class":791}," cluster",[658,2252,928],{"class":668},[658,2254,682],{"class":668},[658,2256,2257],{"class":685},"prod-eu",[658,2259,794],{"class":668},[658,2261,1470],{"class":668},[658,2263,2264,2266],{"class":660,"line":810},[658,2265,813],{"class":668},[658,2267,816],{"class":672},[545,2269,2270],{},"Everything else stays in the JSON line and is fully queryable. See below.",[641,2272,2274],{"id":2273},"querying-in-grafana","Querying in Grafana",[545,2276,2277,2278,928],{},"Filter by label, then reach into the wide event with ",[564,2279,588],{},[648,2281,2285],{"className":2282,"code":2283,"language":2284,"meta":654,"style":654},"language-logql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{service=\"checkout\", environment=\"production\"}\n  | json\n  | status >= 500\n","logql",[564,2286,2287,2292,2297],{"__ignoreMap":654},[658,2288,2289],{"class":660,"line":661},[658,2290,2291],{},"{service=\"checkout\", environment=\"production\"}\n",[658,2293,2294],{"class":660,"line":717},[658,2295,2296],{},"  | json\n",[658,2298,2299],{"class":660,"line":736},[658,2300,2301],{},"  | status >= 500\n",[648,2303,2305],{"className":2282,"code":2304,"language":2284,"meta":654,"style":654},"# Slow requests on one route\n{service=\"checkout\"} | json | path=\"\u002Fapi\u002Forders\" | durationMs > 1000\n",[564,2306,2307,2312],{"__ignoreMap":654},[658,2308,2309],{"class":660,"line":661},[658,2310,2311],{},"# Slow requests on one route\n",[658,2313,2314],{"class":660,"line":717},[658,2315,2316],{},"{service=\"checkout\"} | json | path=\"\u002Fapi\u002Forders\" | durationMs > 1000\n",[648,2318,2320],{"className":2282,"code":2319,"language":2284,"meta":654,"style":654},"# One request end to end\n{service=\"checkout\"} | json | requestId=\"4a8ff3a8-...\"\n",[564,2321,2322,2327],{"__ignoreMap":654},[658,2323,2324],{"class":660,"line":661},[658,2325,2326],{},"# One request end to end\n",[658,2328,2329],{"class":660,"line":717},[658,2330,2331],{},"{service=\"checkout\"} | json | requestId=\"4a8ff3a8-...\"\n",[648,2333,2335],{"className":2282,"code":2334,"language":2284,"meta":654,"style":654},"# Error rate per service\nsum by (service) (rate({environment=\"production\", level=\"error\"}[5m]))\n",[564,2336,2337,2342],{"__ignoreMap":654},[658,2338,2339],{"class":660,"line":661},[658,2340,2341],{},"# Error rate per service\n",[658,2343,2344],{"class":660,"line":717},[658,2345,2346],{},"sum by (service) (rate({environment=\"production\", level=\"error\"}[5m]))\n",[641,2348,2350],{"id":2349},"batching","Batching",[545,2352,2353],{},"Pair the drain with a pipeline to push in batches rather than per request:",[648,2355,2357],{"className":650,"code":2356,"filename":1799,"language":653,"meta":654,"style":654},"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",[564,2358,2359,2379,2397,2419,2423,2447,2477,2483,2487,2508,2541],{"__ignoreMap":654},[658,2360,2361,2363,2365,2368,2370,2372,2374,2377],{"class":660,"line":661},[658,2362,665],{"class":664},[658,2364,669],{"class":668},[658,2366,2367],{"class":672}," createDrainPipeline",[658,2369,676],{"class":668},[658,2371,679],{"class":664},[658,2373,682],{"class":668},[658,2375,2376],{"class":685},"evlog\u002Fpipeline",[658,2378,689],{"class":668},[658,2380,2381,2383,2385,2387,2389,2391,2393,2395],{"class":660,"line":717},[658,2382,665],{"class":664},[658,2384,669],{"class":668},[658,2386,673],{"class":672},[658,2388,676],{"class":668},[658,2390,679],{"class":664},[658,2392,682],{"class":668},[658,2394,686],{"class":685},[658,2396,689],{"class":668},[658,2398,2399,2401,2404,2406,2409,2411,2413,2415,2417],{"class":660,"line":736},[658,2400,665],{"class":664},[658,2402,2403],{"class":664}," type",[658,2405,669],{"class":668},[658,2407,2408],{"class":672}," DrainContext",[658,2410,676],{"class":668},[658,2412,679],{"class":664},[658,2414,682],{"class":668},[658,2416,917],{"class":685},[658,2418,689],{"class":668},[658,2420,2421],{"class":660,"line":743},[658,2422,740],{"emptyLinePlaceholder":739},[658,2424,2425,2427,2430,2432,2434,2437,2440,2443,2445],{"class":660,"line":775},[658,2426,888],{"class":768},[658,2428,2429],{"class":672}," pipeline ",[658,2431,894],{"class":668},[658,2433,2367],{"class":752},[658,2435,2436],{"class":668},"\u003C",[658,2438,2439],{"class":1387},"DrainContext",[658,2441,2442],{"class":668},">",[658,2444,756],{"class":672},[658,2446,1334],{"class":668},[658,2448,2449,2452,2454,2456,2459,2461,2465,2467,2470,2472,2475],{"class":660,"line":810},[658,2450,2451],{"class":791},"  batch",[658,2453,928],{"class":668},[658,2455,669],{"class":668},[658,2457,2458],{"class":791}," size",[658,2460,928],{"class":668},[658,2462,2464],{"class":2463},"sbssI"," 100",[658,2466,802],{"class":668},[658,2468,2469],{"class":791}," intervalMs",[658,2471,928],{"class":668},[658,2473,2474],{"class":2463}," 5000",[658,2476,1470],{"class":668},[658,2478,2479,2481],{"class":660,"line":1372},[658,2480,813],{"class":668},[658,2482,816],{"class":672},[658,2484,2485],{"class":660,"line":1379},[658,2486,740],{"emptyLinePlaceholder":739},[658,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506],{"class":660,"line":2489},9,[658,2491,746],{"class":664},[658,2493,749],{"class":664},[658,2495,753],{"class":752},[658,2497,756],{"class":672},[658,2499,756],{"class":668},[658,2501,762],{"class":761},[658,2503,765],{"class":668},[658,2505,769],{"class":768},[658,2507,772],{"class":668},[658,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2534,2536,2538],{"class":660,"line":2510},10,[658,2512,778],{"class":672},[658,2514,589],{"class":668},[658,2516,783],{"class":672},[658,2518,589],{"class":668},[658,2520,788],{"class":752},[658,2522,756],{"class":791},[658,2524,794],{"class":668},[658,2526,797],{"class":685},[658,2528,794],{"class":668},[658,2530,802],{"class":668},[658,2532,2533],{"class":752}," pipeline",[658,2535,756],{"class":791},[658,2537,1806],{"class":752},[658,2539,2540],{"class":791},"()))\n",[658,2542,2544,2546],{"class":660,"line":2543},11,[658,2545,813],{"class":668},[658,2547,816],{"class":672},[545,2549,2550],{},"Events sharing a label set are grouped into a single Loki stream, and entries are sorted by timestamp, because Loki rejects out-of-order pushes within a stream.",[641,2552,2554],{"id":2553},"verify-it-locally","Verify it locally",[545,2556,2557],{},"Spin up Loki in Docker and push a real event, with no cloud account needed:",[648,2559,2562],{"className":1828,"code":2560,"filename":2561,"language":1831,"meta":654,"style":654},"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",[564,2563,2564,2584,2601],{"__ignoreMap":654},[658,2565,2566,2569,2572,2575,2578,2581],{"class":660,"line":661},[658,2567,2568],{"class":1387},"docker",[658,2570,2571],{"class":685}," compose",[658,2573,2574],{"class":685}," -f",[658,2576,2577],{"class":685}," packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml",[658,2579,2580],{"class":685}," up",[658,2582,2583],{"class":685}," -d\n",[658,2585,2586,2588,2590,2592,2595,2598],{"class":660,"line":717},[658,2587,698],{"class":672},[658,2589,894],{"class":668},[658,2591,619],{"class":685},[658,2593,2594],{"class":1387}," pnpm",[658,2596,2597],{"class":685}," run",[658,2599,2600],{"class":685}," test:e2e\n",[658,2602,2603,2605,2607,2609,2611,2614],{"class":660,"line":736},[658,2604,2568],{"class":1387},[658,2606,2571],{"class":685},[658,2608,2574],{"class":685},[658,2610,2577],{"class":685},[658,2612,2613],{"class":685}," down",[658,2615,2616],{"class":685}," -v\n",[545,2618,2619,2620,2623,2624,2626],{},"The suite is a ",[559,2621,2622],{},"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 ",[564,2625,698],{}," it skips itself with a visible\nlabel rather than passing silently.",[545,2628,2629,2630,2632,2633,589],{},"To eyeball the result instead, point any Grafana at ",[564,2631,619],{},"\nand run ",[564,2634,2635],{},"{service=\"evlog-e2e\"}",[641,2637,2639],{"id":2638},"troubleshooting","Troubleshooting",[545,2641,2642,2647,2648,2650,2651,2653,2654,2657],{},[559,2643,2644,589],{},[564,2645,2646],{},"Missing endpoint"," ",[564,2649,698],{}," is unset and no ",[564,2652,1642],{}," was passed. The drain logs ",[564,2655,2656],{},"[evlog\u002Floki] Missing endpoint"," once and then does nothing, so requests are never blocked or failed.",[545,2659,2660,2665,2666,2668,2669,2671],{},[559,2661,2662,589],{},[564,2663,2664],{},"Loki API error: 401"," On Grafana Cloud, check that ",[564,2667,584],{}," is the numeric ",[559,2670,1944],{}," of the Loki datasource, not your account email.",[545,2673,2674,2680,2681,2684],{},[559,2675,2676,2679],{},[564,2677,2678],{},"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 ",[564,2682,2683],{},"unordered_writes"," in Loki or reduce the batch interval.",[545,2686,2687,2690,2691,2694],{},[559,2688,2689],{},"Nothing appears in Grafana."," Confirm the label set you are querying. Run ",[564,2692,2693],{},"{service=~\".+\"}"," first to see which streams arrived.",[641,2696,2698],{"id":2697},"direct-api-usage","Direct API usage",[545,2700,2701],{},"Bypass the drain to push events yourself:",[648,2703,2706],{"className":650,"code":2704,"filename":2705,"language":653,"meta":654,"style":654},"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",[564,2707,2708,2732,2736,2763],{"__ignoreMap":654},[658,2709,2710,2712,2714,2717,2719,2722,2724,2726,2728,2730],{"class":660,"line":661},[658,2711,665],{"class":664},[658,2713,669],{"class":668},[658,2715,2716],{"class":672}," sendBatchToLoki",[658,2718,802],{"class":668},[658,2720,2721],{"class":672}," sendToLoki",[658,2723,676],{"class":668},[658,2725,679],{"class":664},[658,2727,682],{"class":668},[658,2729,686],{"class":685},[658,2731,689],{"class":668},[658,2733,2734],{"class":660,"line":717},[658,2735,740],{"emptyLinePlaceholder":739},[658,2737,2738,2740,2742,2745,2747,2749,2751,2753,2755,2757,2759,2761],{"class":660,"line":736},[658,2739,1122],{"class":664},[658,2741,2721],{"class":752},[658,2743,2744],{"class":672},"(event",[658,2746,802],{"class":668},[658,2748,669],{"class":668},[658,2750,1813],{"class":791},[658,2752,928],{"class":668},[658,2754,682],{"class":668},[658,2756,619],{"class":685},[658,2758,794],{"class":668},[658,2760,676],{"class":668},[658,2762,816],{"class":672},[658,2764,2765,2767,2769,2772,2774,2776,2778,2780,2782,2784,2786,2788],{"class":660,"line":743},[658,2766,1122],{"class":664},[658,2768,2716],{"class":752},[658,2770,2771],{"class":672},"(events",[658,2773,802],{"class":668},[658,2775,669],{"class":668},[658,2777,1813],{"class":791},[658,2779,928],{"class":668},[658,2781,682],{"class":668},[658,2783,619],{"class":685},[658,2785,794],{"class":668},[658,2787,676],{"class":668},[658,2789,816],{"class":672},[545,2791,2792,567,2795,571,2798,2801],{},[564,2793,2794],{},"buildLokiPayload()",[564,2796,2797],{},"toLokiLabels()",[564,2799,2800],{},"resolveLokiPushUrl()"," are also exported for custom transports.",[641,2803,2805],{"id":2804},"next-steps","Next steps",[2807,2808,2809,2814,2819,2824],"ul",{},[602,2810,2811,2813],{},[549,2812,61],{"href":62},": control log volume before it reaches Loki",[602,2815,2816,2818],{},[549,2817,431],{"href":432},": add derived fields to every event",[602,2820,2821,2823],{},[549,2822,495],{"href":496},": batching, retries, and fan-out",[602,2825,2826,2829],{},[549,2827,2828],{"href":143},"Adapters Overview",": all available destinations",[2831,2832,2833],"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":654,"searchDepth":717,"depth":717,"links":2835},[2836,2837,2838,2843,2848,2849,2850,2851,2852,2853,2854],{"id":643,"depth":717,"text":20},{"id":692,"depth":717,"text":25},{"id":1492,"depth":717,"text":508,"children":2839},[2840,2841,2842],{"id":1496,"depth":736,"text":1497},{"id":1588,"depth":736,"text":1589},{"id":1616,"depth":736,"text":336},{"id":1784,"depth":717,"text":1785,"children":2844},[2845,2846,2847],{"id":1791,"depth":736,"text":1792},{"id":1937,"depth":736,"text":1938},{"id":2070,"depth":736,"text":2071},{"id":2153,"depth":717,"text":2154},{"id":2273,"depth":717,"text":2274},{"id":2349,"depth":717,"text":2350},{"id":2553,"depth":717,"text":2554},{"id":2638,"depth":717,"text":2639},{"id":2697,"depth":717,"text":2698},{"id":2804,"depth":717,"text":2805},"Push wide events to Grafana Loki — self-hosted, multi-tenant, or Grafana Cloud — with low-cardinality labels and full JSON querying.","md",[2858,2865],{"label":2859,"icon":2860,"to":2861,"target":2862,"color":2863,"variant":2864},"Loki HTTP API","i-lucide-external-link","https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002Freference\u002Floki-http-api\u002F","_blank","neutral","subtle",{"label":2866,"icon":2860,"to":2867,"target":2862,"color":2863,"variant":2864},"LogQL","https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002Fquery\u002F",{},{"title":181,"icon":184},{"title":540,"description":2855},"3ojNapfXdoP0ukimUFES-lT5m0GMw5mDjlzlQ4F9Dtc",[2873,2875],{"title":171,"path":172,"stem":173,"description":2874,"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":2876,"icon":189,"children":-1},"Insert wide events into ClickHouse over the HTTP interface — typed columns for what you aggregate, full JSON for everything else.",1786817437775]