[{"data":1,"prerenderedAt":2987},["ShallowReactive",2],{"navigation_docs":3,"-adapters-custom":219,"-adapters-custom-surround":2982},[4,30,105,139,188,205],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Frameworks","/frameworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100],{"title":36,"path":37,"stem":38,"icon":39},"Overview","/frameworks/overview","2.frameworks/00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","/frameworks/nuxt","2.frameworks/01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","/frameworks/nextjs","2.frameworks/02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","/frameworks/sveltekit","2.frameworks/03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","/frameworks/nitro","2.frameworks/04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","/frameworks/tanstack-start","2.frameworks/05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","/frameworks/nestjs","2.frameworks/06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","/frameworks/express","2.frameworks/07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","/frameworks/hono","2.frameworks/08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","/frameworks/fastify","2.frameworks/09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","/frameworks/elysia","2.frameworks/10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"Cloudflare Workers","/frameworks/cloudflare-workers","2.frameworks/11.cloudflare-workers","i-simple-icons-cloudflare",{"title":96,"path":97,"stem":98,"icon":99},"Standalone","/frameworks/standalone","2.frameworks/12.standalone","i-simple-icons-typescript",{"title":101,"path":102,"stem":103,"icon":104},"Astro","/frameworks/astro","2.frameworks/13.astro","i-simple-icons-astro",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Core Concepts","/core-concepts","3.core-concepts",[110,115,120,125,129,134],{"title":111,"path":112,"stem":113,"icon":114},"Wide Events","/core-concepts/wide-events","3.core-concepts/1.wide-events","i-lucide-layers",{"title":116,"path":117,"stem":118,"icon":119},"Structured Errors","/core-concepts/structured-errors","3.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":121,"path":122,"stem":123,"icon":124},"Best Practices","/core-concepts/best-practices","3.core-concepts/3.best-practices","i-lucide-shield-check",{"title":126,"path":127,"stem":128,"icon":99},"Typed Fields","/core-concepts/typed-fields","3.core-concepts/4.typed-fields",{"title":130,"path":131,"stem":132,"icon":133},"Sampling","/core-concepts/sampling","3.core-concepts/5.sampling","i-lucide-filter",{"title":135,"path":136,"stem":137,"icon":138},"Client Logging","/core-concepts/client-logging","3.core-concepts/6.client-logging","i-lucide-monitor",{"title":140,"path":141,"stem":142,"children":143,"page":29},"Adapters","/adapters","4.adapters",[144,148,153,158,163,168,173,178,183],{"title":36,"path":145,"stem":146,"icon":147},"/adapters/overview","4.adapters/1.overview","i-custom-plug",{"title":149,"path":150,"stem":151,"icon":152},"Axiom","/adapters/axiom","4.adapters/2.axiom","i-custom-axiom",{"title":154,"path":155,"stem":156,"icon":157},"OTLP","/adapters/otlp","4.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":159,"path":160,"stem":161,"icon":162},"PostHog","/adapters/posthog","4.adapters/4.posthog","i-simple-icons-posthog",{"title":164,"path":165,"stem":166,"icon":167},"Sentry","/adapters/sentry","4.adapters/5.sentry","i-simple-icons-sentry",{"title":169,"path":170,"stem":171,"icon":172},"Better Stack","/adapters/better-stack","4.adapters/6.better-stack","i-simple-icons-betterstack",{"title":174,"path":175,"stem":176,"icon":177},"Custom Adapters","/adapters/custom","4.adapters/7.custom","i-lucide-code",{"title":179,"path":180,"stem":181,"icon":182},"Pipeline","/adapters/pipeline","4.adapters/8.pipeline","i-lucide-workflow",{"title":184,"path":185,"stem":186,"icon":187},"Browser","/adapters/browser","4.adapters/9.browser","i-lucide-globe",{"title":189,"path":190,"stem":191,"children":192,"page":29},"Enrichers","/enrichers","5.enrichers",[193,196,201],{"title":36,"path":194,"stem":195,"icon":28},"/enrichers/overview","5.enrichers/1.overview",{"title":197,"path":198,"stem":199,"icon":200},"Built-in","/enrichers/built-in","5.enrichers/2.built-in","i-lucide-puzzle",{"title":202,"path":203,"stem":204,"icon":177},"Custom","/enrichers/custom","5.enrichers/3.custom",{"title":206,"path":207,"stem":208,"children":209,"page":29},"NuxtHub","/nuxthub","6.nuxthub",[210,214],{"title":36,"path":211,"stem":212,"icon":213},"/nuxthub/overview","6.nuxthub/1.overview","i-lucide-database",{"title":215,"path":216,"stem":217,"icon":218},"Retention","/nuxthub/retention","6.nuxthub/2.retention","i-lucide-clock",{"id":220,"title":174,"body":221,"description":2971,"extension":2972,"links":2973,"meta":2978,"navigation":2979,"path":175,"seo":2980,"stem":176,"__hash__":2981},"docs/4.adapters/7.custom.md",{"type":222,"value":223,"toc":2960},"minimark",[224,233,238,244,454,457,693,697,980,984,987,1590,1593,1640,1644,1647,1840,1844,1847,1991,1995,1998,2343,2347,2355,2575,2584,2588,2621,2926,2930,2956],[225,226,227,228,232],"p",{},"You can create custom adapters to send logs to any service or destination. An adapter is simply a function that receives a ",[229,230,231],"code",{},"DrainContext"," and sends the data somewhere.",[234,235,237],"h2",{"id":236},"basic-structure","Basic Structure",[225,239,240,241,243],{},"A drain is a function that receives a ",[229,242,231],{}," and sends data somewhere:",[245,246,252],"pre",{"className":247,"code":248,"filename":249,"language":250,"meta":251,"style":251},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DrainContext } from 'evlog'\n\nconst drain = async (ctx: DrainContext) => {\n  await fetch('https://your-service.com/logs', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(ctx.event),\n  })\n}\n","lib/my-drain.ts","typescript","",[229,253,254,290,297,335,362,380,409,439,448],{"__ignoreMap":251},[255,256,259,263,266,270,274,277,280,283,287],"span",{"class":257,"line":258},"line",1,[255,260,262],{"class":261},"s7zQu","import",[255,264,265],{"class":261}," type",[255,267,269],{"class":268},"sMK4o"," {",[255,271,273],{"class":272},"sTEyZ"," DrainContext",[255,275,276],{"class":268}," }",[255,278,279],{"class":261}," from",[255,281,282],{"class":268}," '",[255,284,286],{"class":285},"sfazB","evlog",[255,288,289],{"class":268},"'\n",[255,291,293],{"class":257,"line":292},2,[255,294,296],{"emptyLinePlaceholder":295},true,"\n",[255,298,300,304,307,310,313,316,320,323,326,329,332],{"class":257,"line":299},3,[255,301,303],{"class":302},"spNyl","const",[255,305,306],{"class":272}," drain ",[255,308,309],{"class":268},"=",[255,311,312],{"class":302}," async",[255,314,315],{"class":268}," (",[255,317,319],{"class":318},"sHdIc","ctx",[255,321,322],{"class":268},":",[255,324,273],{"class":325},"sBMFI",[255,327,328],{"class":268},")",[255,330,331],{"class":302}," =>",[255,333,334],{"class":268}," {\n",[255,336,338,341,345,349,352,355,357,360],{"class":257,"line":337},4,[255,339,340],{"class":261},"  await",[255,342,344],{"class":343},"s2Zo4"," fetch",[255,346,348],{"class":347},"swJcz","(",[255,350,351],{"class":268},"'",[255,353,354],{"class":285},"https://your-service.com/logs",[255,356,351],{"class":268},[255,358,359],{"class":268},",",[255,361,334],{"class":268},[255,363,365,368,370,372,375,377],{"class":257,"line":364},5,[255,366,367],{"class":347},"    method",[255,369,322],{"class":268},[255,371,282],{"class":268},[255,373,374],{"class":285},"POST",[255,376,351],{"class":268},[255,378,379],{"class":268},",\n",[255,381,383,386,388,390,392,395,397,399,401,404,406],{"class":257,"line":382},6,[255,384,385],{"class":347},"    headers",[255,387,322],{"class":268},[255,389,269],{"class":268},[255,391,282],{"class":268},[255,393,394],{"class":347},"Content-Type",[255,396,351],{"class":268},[255,398,322],{"class":268},[255,400,282],{"class":268},[255,402,403],{"class":285},"application/json",[255,405,351],{"class":268},[255,407,408],{"class":268}," },\n",[255,410,412,415,417,420,423,426,428,430,432,435,437],{"class":257,"line":411},7,[255,413,414],{"class":347},"    body",[255,416,322],{"class":268},[255,418,419],{"class":272}," JSON",[255,421,422],{"class":268},".",[255,424,425],{"class":343},"stringify",[255,427,348],{"class":347},[255,429,319],{"class":272},[255,431,422],{"class":268},[255,433,434],{"class":272},"event",[255,436,328],{"class":347},[255,438,379],{"class":268},[255,440,442,445],{"class":257,"line":441},8,[255,443,444],{"class":268},"  }",[255,446,447],{"class":347},")\n",[255,449,451],{"class":257,"line":450},9,[255,452,453],{"class":268},"}\n",[225,455,456],{},"Then wire it to your framework:",[458,459,460,534,565,591,622,648,673],"code-group",{},[245,461,464],{"className":247,"code":462,"filename":463,"language":250,"meta":251,"style":251},"// server/plugins/evlog-drain.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', drain)\n})\n","Nuxt / Nitro",[229,465,466,472,496,527],{"__ignoreMap":251},[255,467,468],{"class":257,"line":258},[255,469,471],{"class":470},"sHwdD","// server/plugins/evlog-drain.ts\n",[255,473,474,477,480,483,485,487,490,492,494],{"class":257,"line":292},[255,475,476],{"class":261},"export",[255,478,479],{"class":261}," default",[255,481,482],{"class":343}," defineNitroPlugin",[255,484,348],{"class":272},[255,486,348],{"class":268},[255,488,489],{"class":318},"nitroApp",[255,491,328],{"class":268},[255,493,331],{"class":302},[255,495,334],{"class":268},[255,497,498,501,503,506,508,511,513,515,518,520,522,525],{"class":257,"line":299},[255,499,500],{"class":272},"  nitroApp",[255,502,422],{"class":268},[255,504,505],{"class":272},"hooks",[255,507,422],{"class":268},[255,509,510],{"class":343},"hook",[255,512,348],{"class":347},[255,514,351],{"class":268},[255,516,517],{"class":285},"evlog:drain",[255,519,351],{"class":268},[255,521,359],{"class":268},[255,523,524],{"class":272}," drain",[255,526,447],{"class":347},[255,528,529,532],{"class":257,"line":337},[255,530,531],{"class":268},"}",[255,533,447],{"class":272},[245,535,537],{"className":247,"code":536,"filename":76,"language":250,"meta":251,"style":251},"app.use(evlog({ drain }))\n",[229,538,539],{"__ignoreMap":251},[255,540,541,544,546,549,551,553,555,558,560,562],{"class":257,"line":258},[255,542,543],{"class":272},"app",[255,545,422],{"class":268},[255,547,548],{"class":343},"use",[255,550,348],{"class":272},[255,552,286],{"class":343},[255,554,348],{"class":272},[255,556,557],{"class":268},"{",[255,559,306],{"class":272},[255,561,531],{"class":268},[255,563,564],{"class":272},"))\n",[245,566,567],{"className":247,"code":536,"filename":71,"language":250,"meta":251,"style":251},[229,568,569],{"__ignoreMap":251},[255,570,571,573,575,577,579,581,583,585,587,589],{"class":257,"line":258},[255,572,543],{"class":272},[255,574,422],{"class":268},[255,576,548],{"class":343},[255,578,348],{"class":272},[255,580,286],{"class":343},[255,582,348],{"class":272},[255,584,557],{"class":268},[255,586,306],{"class":272},[255,588,531],{"class":268},[255,590,564],{"class":272},[245,592,594],{"className":247,"code":593,"filename":81,"language":250,"meta":251,"style":251},"await app.register(evlog, { drain })\n",[229,595,596],{"__ignoreMap":251},[255,597,598,601,604,606,609,612,614,616,618,620],{"class":257,"line":258},[255,599,600],{"class":261},"await",[255,602,603],{"class":272}," app",[255,605,422],{"class":268},[255,607,608],{"class":343},"register",[255,610,611],{"class":272},"(evlog",[255,613,359],{"class":268},[255,615,269],{"class":268},[255,617,306],{"class":272},[255,619,531],{"class":268},[255,621,447],{"class":272},[245,623,624],{"className":247,"code":536,"filename":86,"language":250,"meta":251,"style":251},[229,625,626],{"__ignoreMap":251},[255,627,628,630,632,634,636,638,640,642,644,646],{"class":257,"line":258},[255,629,543],{"class":272},[255,631,422],{"class":268},[255,633,548],{"class":343},[255,635,348],{"class":272},[255,637,286],{"class":343},[255,639,348],{"class":272},[255,641,557],{"class":268},[255,643,306],{"class":272},[255,645,531],{"class":268},[255,647,564],{"class":272},[245,649,651],{"className":247,"code":650,"filename":66,"language":250,"meta":251,"style":251},"EvlogModule.forRoot({ drain })\n",[229,652,653],{"__ignoreMap":251},[255,654,655,658,660,663,665,667,669,671],{"class":257,"line":258},[255,656,657],{"class":272},"EvlogModule",[255,659,422],{"class":268},[255,661,662],{"class":343},"forRoot",[255,664,348],{"class":272},[255,666,557],{"class":268},[255,668,306],{"class":272},[255,670,531],{"class":268},[255,672,447],{"class":272},[245,674,676],{"className":247,"code":675,"filename":96,"language":250,"meta":251,"style":251},"initLogger({ drain })\n",[229,677,678],{"__ignoreMap":251},[255,679,680,683,685,687,689,691],{"class":257,"line":258},[255,681,682],{"class":343},"initLogger",[255,684,348],{"class":272},[255,686,557],{"class":268},[255,688,306],{"class":272},[255,690,531],{"class":268},[255,692,447],{"class":272},[234,694,696],{"id":695},"draincontext-reference","DrainContext Reference",[245,698,701],{"className":247,"code":699,"filename":700,"language":250,"meta":251,"style":251},"interface DrainContext {\n  /** The complete wide event with all accumulated context */\n  event: WideEvent\n\n  /** Request metadata */\n  request?: {\n    method: string\n    path: string\n    requestId: string\n  }\n\n  /** Safe HTTP headers (sensitive headers filtered) */\n  headers?: Record\u003Cstring, string>\n}\n\ninterface WideEvent {\n  timestamp: string\n  level: 'debug' | 'info' | 'warn' | 'error'\n  service: string\n  environment?: string\n  version?: string\n  region?: string\n  commitHash?: string\n  requestId?: string\n  // ... plus all fields added via log.set()\n  [key: string]: unknown\n}\n","types.ts",[229,702,703,712,717,727,731,736,746,755,764,773,779,784,790,815,820,825,835,845,888,898,908,918,928,938,948,954,975],{"__ignoreMap":251},[255,704,705,708,710],{"class":257,"line":258},[255,706,707],{"class":302},"interface",[255,709,273],{"class":325},[255,711,334],{"class":268},[255,713,714],{"class":257,"line":292},[255,715,716],{"class":470},"  /** The complete wide event with all accumulated context */\n",[255,718,719,722,724],{"class":257,"line":299},[255,720,721],{"class":347},"  event",[255,723,322],{"class":268},[255,725,726],{"class":325}," WideEvent\n",[255,728,729],{"class":257,"line":337},[255,730,296],{"emptyLinePlaceholder":295},[255,732,733],{"class":257,"line":364},[255,734,735],{"class":470},"  /** Request metadata */\n",[255,737,738,741,744],{"class":257,"line":382},[255,739,740],{"class":347},"  request",[255,742,743],{"class":268},"?:",[255,745,334],{"class":268},[255,747,748,750,752],{"class":257,"line":411},[255,749,367],{"class":347},[255,751,322],{"class":268},[255,753,754],{"class":325}," string\n",[255,756,757,760,762],{"class":257,"line":441},[255,758,759],{"class":347},"    path",[255,761,322],{"class":268},[255,763,754],{"class":325},[255,765,766,769,771],{"class":257,"line":450},[255,767,768],{"class":347},"    requestId",[255,770,322],{"class":268},[255,772,754],{"class":325},[255,774,776],{"class":257,"line":775},10,[255,777,778],{"class":268},"  }\n",[255,780,782],{"class":257,"line":781},11,[255,783,296],{"emptyLinePlaceholder":295},[255,785,787],{"class":257,"line":786},12,[255,788,789],{"class":470},"  /** Safe HTTP headers (sensitive headers filtered) */\n",[255,791,793,796,798,801,804,807,809,812],{"class":257,"line":792},13,[255,794,795],{"class":347},"  headers",[255,797,743],{"class":268},[255,799,800],{"class":325}," Record",[255,802,803],{"class":268},"\u003C",[255,805,806],{"class":325},"string",[255,808,359],{"class":268},[255,810,811],{"class":325}," string",[255,813,814],{"class":268},">\n",[255,816,818],{"class":257,"line":817},14,[255,819,453],{"class":268},[255,821,823],{"class":257,"line":822},15,[255,824,296],{"emptyLinePlaceholder":295},[255,826,828,830,833],{"class":257,"line":827},16,[255,829,707],{"class":302},[255,831,832],{"class":325}," WideEvent",[255,834,334],{"class":268},[255,836,838,841,843],{"class":257,"line":837},17,[255,839,840],{"class":347},"  timestamp",[255,842,322],{"class":268},[255,844,754],{"class":325},[255,846,848,851,853,855,858,860,863,865,868,870,872,874,877,879,881,883,886],{"class":257,"line":847},18,[255,849,850],{"class":347},"  level",[255,852,322],{"class":268},[255,854,282],{"class":268},[255,856,857],{"class":285},"debug",[255,859,351],{"class":268},[255,861,862],{"class":268}," |",[255,864,282],{"class":268},[255,866,867],{"class":285},"info",[255,869,351],{"class":268},[255,871,862],{"class":268},[255,873,282],{"class":268},[255,875,876],{"class":285},"warn",[255,878,351],{"class":268},[255,880,862],{"class":268},[255,882,282],{"class":268},[255,884,885],{"class":285},"error",[255,887,289],{"class":268},[255,889,891,894,896],{"class":257,"line":890},19,[255,892,893],{"class":347},"  service",[255,895,322],{"class":268},[255,897,754],{"class":325},[255,899,901,904,906],{"class":257,"line":900},20,[255,902,903],{"class":347},"  environment",[255,905,743],{"class":268},[255,907,754],{"class":325},[255,909,911,914,916],{"class":257,"line":910},21,[255,912,913],{"class":347},"  version",[255,915,743],{"class":268},[255,917,754],{"class":325},[255,919,921,924,926],{"class":257,"line":920},22,[255,922,923],{"class":347},"  region",[255,925,743],{"class":268},[255,927,754],{"class":325},[255,929,931,934,936],{"class":257,"line":930},23,[255,932,933],{"class":347},"  commitHash",[255,935,743],{"class":268},[255,937,754],{"class":325},[255,939,941,944,946],{"class":257,"line":940},24,[255,942,943],{"class":347},"  requestId",[255,945,743],{"class":268},[255,947,754],{"class":325},[255,949,951],{"class":257,"line":950},25,[255,952,953],{"class":470},"  // ... plus all fields added via log.set()\n",[255,955,957,960,963,965,967,970,972],{"class":257,"line":956},26,[255,958,959],{"class":272},"  [",[255,961,962],{"class":318},"key",[255,964,322],{"class":268},[255,966,811],{"class":325},[255,968,969],{"class":272},"]",[255,971,322],{"class":268},[255,973,974],{"class":325}," unknown\n",[255,976,978],{"class":257,"line":977},27,[255,979,453],{"class":268},[234,981,983],{"id":982},"factory-pattern","Factory Pattern",[225,985,986],{},"For reusable adapters, use the factory pattern:",[245,988,991],{"className":247,"code":989,"filename":990,"language":250,"meta":251,"style":251},"import type { DrainContext } from 'evlog'\n\nexport interface MyAdapterConfig {\n  apiKey: string\n  endpoint?: string\n  timeout?: number\n}\n\nexport function createMyAdapter(config: MyAdapterConfig) {\n  const endpoint = config.endpoint ?? 'https://api.myservice.com/ingest'\n  const timeout = config.timeout ?? 5000\n\n  return async (ctx: DrainContext) => {\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n    try {\n      const response = await fetch(endpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-API-Key': config.apiKey,\n        },\n        body: JSON.stringify(ctx.event),\n        signal: controller.signal,\n      })\n\n      if (!response.ok) {\n        console.error(`[my-adapter] Failed: ${response.status}`)\n      }\n    } catch (error) {\n      if (error instanceof Error && error.name === 'AbortError') {\n        console.error('[my-adapter] Request timed out')\n      } else {\n        console.error('[my-adapter] Error:', error)\n      }\n    } finally {\n      clearTimeout(timeoutId)\n    }\n  }\n}\n","lib/my-adapter.ts",[229,992,993,1013,1017,1029,1038,1047,1057,1061,1065,1088,1117,1139,1143,1164,1183,1217,1221,1228,1251,1266,1275,1294,1314,1319,1344,1360,1367,1371,1396,1429,1435,1452,1492,1512,1522,1546,1551,1561,1574,1580,1585],{"__ignoreMap":251},[255,994,995,997,999,1001,1003,1005,1007,1009,1011],{"class":257,"line":258},[255,996,262],{"class":261},[255,998,265],{"class":261},[255,1000,269],{"class":268},[255,1002,273],{"class":272},[255,1004,276],{"class":268},[255,1006,279],{"class":261},[255,1008,282],{"class":268},[255,1010,286],{"class":285},[255,1012,289],{"class":268},[255,1014,1015],{"class":257,"line":292},[255,1016,296],{"emptyLinePlaceholder":295},[255,1018,1019,1021,1024,1027],{"class":257,"line":299},[255,1020,476],{"class":261},[255,1022,1023],{"class":302}," interface",[255,1025,1026],{"class":325}," MyAdapterConfig",[255,1028,334],{"class":268},[255,1030,1031,1034,1036],{"class":257,"line":337},[255,1032,1033],{"class":347},"  apiKey",[255,1035,322],{"class":268},[255,1037,754],{"class":325},[255,1039,1040,1043,1045],{"class":257,"line":364},[255,1041,1042],{"class":347},"  endpoint",[255,1044,743],{"class":268},[255,1046,754],{"class":325},[255,1048,1049,1052,1054],{"class":257,"line":382},[255,1050,1051],{"class":347},"  timeout",[255,1053,743],{"class":268},[255,1055,1056],{"class":325}," number\n",[255,1058,1059],{"class":257,"line":411},[255,1060,453],{"class":268},[255,1062,1063],{"class":257,"line":441},[255,1064,296],{"emptyLinePlaceholder":295},[255,1066,1067,1069,1072,1075,1077,1080,1082,1084,1086],{"class":257,"line":450},[255,1068,476],{"class":261},[255,1070,1071],{"class":302}," function",[255,1073,1074],{"class":343}," createMyAdapter",[255,1076,348],{"class":268},[255,1078,1079],{"class":318},"config",[255,1081,322],{"class":268},[255,1083,1026],{"class":325},[255,1085,328],{"class":268},[255,1087,334],{"class":268},[255,1089,1090,1093,1096,1099,1102,1104,1107,1110,1112,1115],{"class":257,"line":775},[255,1091,1092],{"class":302},"  const",[255,1094,1095],{"class":272}," endpoint",[255,1097,1098],{"class":268}," =",[255,1100,1101],{"class":272}," config",[255,1103,422],{"class":268},[255,1105,1106],{"class":272},"endpoint",[255,1108,1109],{"class":268}," ??",[255,1111,282],{"class":268},[255,1113,1114],{"class":285},"https://api.myservice.com/ingest",[255,1116,289],{"class":268},[255,1118,1119,1121,1124,1126,1128,1130,1133,1135],{"class":257,"line":781},[255,1120,1092],{"class":302},[255,1122,1123],{"class":272}," timeout",[255,1125,1098],{"class":268},[255,1127,1101],{"class":272},[255,1129,422],{"class":268},[255,1131,1132],{"class":272},"timeout",[255,1134,1109],{"class":268},[255,1136,1138],{"class":1137},"sbssI"," 5000\n",[255,1140,1141],{"class":257,"line":786},[255,1142,296],{"emptyLinePlaceholder":295},[255,1144,1145,1148,1150,1152,1154,1156,1158,1160,1162],{"class":257,"line":792},[255,1146,1147],{"class":261},"  return",[255,1149,312],{"class":302},[255,1151,315],{"class":268},[255,1153,319],{"class":318},[255,1155,322],{"class":268},[255,1157,273],{"class":325},[255,1159,328],{"class":268},[255,1161,331],{"class":302},[255,1163,334],{"class":268},[255,1165,1166,1169,1172,1174,1177,1180],{"class":257,"line":817},[255,1167,1168],{"class":302},"    const",[255,1170,1171],{"class":272}," controller",[255,1173,1098],{"class":268},[255,1175,1176],{"class":268}," new",[255,1178,1179],{"class":343}," AbortController",[255,1181,1182],{"class":347},"()\n",[255,1184,1185,1187,1190,1192,1195,1197,1200,1202,1204,1206,1209,1211,1213,1215],{"class":257,"line":822},[255,1186,1168],{"class":302},[255,1188,1189],{"class":272}," timeoutId",[255,1191,1098],{"class":268},[255,1193,1194],{"class":343}," setTimeout",[255,1196,348],{"class":347},[255,1198,1199],{"class":268},"()",[255,1201,331],{"class":302},[255,1203,1171],{"class":272},[255,1205,422],{"class":268},[255,1207,1208],{"class":343},"abort",[255,1210,1199],{"class":347},[255,1212,359],{"class":268},[255,1214,1123],{"class":272},[255,1216,447],{"class":347},[255,1218,1219],{"class":257,"line":827},[255,1220,296],{"emptyLinePlaceholder":295},[255,1222,1223,1226],{"class":257,"line":837},[255,1224,1225],{"class":261},"    try",[255,1227,334],{"class":268},[255,1229,1230,1233,1236,1238,1241,1243,1245,1247,1249],{"class":257,"line":847},[255,1231,1232],{"class":302},"      const",[255,1234,1235],{"class":272}," response",[255,1237,1098],{"class":268},[255,1239,1240],{"class":261}," await",[255,1242,344],{"class":343},[255,1244,348],{"class":347},[255,1246,1106],{"class":272},[255,1248,359],{"class":268},[255,1250,334],{"class":268},[255,1252,1253,1256,1258,1260,1262,1264],{"class":257,"line":890},[255,1254,1255],{"class":347},"        method",[255,1257,322],{"class":268},[255,1259,282],{"class":268},[255,1261,374],{"class":285},[255,1263,351],{"class":268},[255,1265,379],{"class":268},[255,1267,1268,1271,1273],{"class":257,"line":900},[255,1269,1270],{"class":347},"        headers",[255,1272,322],{"class":268},[255,1274,334],{"class":268},[255,1276,1277,1280,1282,1284,1286,1288,1290,1292],{"class":257,"line":910},[255,1278,1279],{"class":268},"          '",[255,1281,394],{"class":347},[255,1283,351],{"class":268},[255,1285,322],{"class":268},[255,1287,282],{"class":268},[255,1289,403],{"class":285},[255,1291,351],{"class":268},[255,1293,379],{"class":268},[255,1295,1296,1298,1301,1303,1305,1307,1309,1312],{"class":257,"line":920},[255,1297,1279],{"class":268},[255,1299,1300],{"class":347},"X-API-Key",[255,1302,351],{"class":268},[255,1304,322],{"class":268},[255,1306,1101],{"class":272},[255,1308,422],{"class":268},[255,1310,1311],{"class":272},"apiKey",[255,1313,379],{"class":268},[255,1315,1316],{"class":257,"line":930},[255,1317,1318],{"class":268},"        },\n",[255,1320,1321,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342],{"class":257,"line":940},[255,1322,1323],{"class":347},"        body",[255,1325,322],{"class":268},[255,1327,419],{"class":272},[255,1329,422],{"class":268},[255,1331,425],{"class":343},[255,1333,348],{"class":347},[255,1335,319],{"class":272},[255,1337,422],{"class":268},[255,1339,434],{"class":272},[255,1341,328],{"class":347},[255,1343,379],{"class":268},[255,1345,1346,1349,1351,1353,1355,1358],{"class":257,"line":950},[255,1347,1348],{"class":347},"        signal",[255,1350,322],{"class":268},[255,1352,1171],{"class":272},[255,1354,422],{"class":268},[255,1356,1357],{"class":272},"signal",[255,1359,379],{"class":268},[255,1361,1362,1365],{"class":257,"line":956},[255,1363,1364],{"class":268},"      }",[255,1366,447],{"class":347},[255,1368,1369],{"class":257,"line":977},[255,1370,296],{"emptyLinePlaceholder":295},[255,1372,1374,1377,1379,1382,1385,1387,1390,1393],{"class":257,"line":1373},28,[255,1375,1376],{"class":261},"      if",[255,1378,315],{"class":347},[255,1380,1381],{"class":268},"!",[255,1383,1384],{"class":272},"response",[255,1386,422],{"class":268},[255,1388,1389],{"class":272},"ok",[255,1391,1392],{"class":347},") ",[255,1394,1395],{"class":268},"{\n",[255,1397,1399,1402,1404,1406,1408,1411,1414,1417,1419,1421,1424,1427],{"class":257,"line":1398},29,[255,1400,1401],{"class":272},"        console",[255,1403,422],{"class":268},[255,1405,885],{"class":343},[255,1407,348],{"class":347},[255,1409,1410],{"class":268},"`",[255,1412,1413],{"class":285},"[my-adapter] Failed: ",[255,1415,1416],{"class":268},"${",[255,1418,1384],{"class":272},[255,1420,422],{"class":268},[255,1422,1423],{"class":272},"status",[255,1425,1426],{"class":268},"}`",[255,1428,447],{"class":347},[255,1430,1432],{"class":257,"line":1431},30,[255,1433,1434],{"class":268},"      }\n",[255,1436,1438,1441,1444,1446,1448,1450],{"class":257,"line":1437},31,[255,1439,1440],{"class":268},"    }",[255,1442,1443],{"class":261}," catch",[255,1445,315],{"class":347},[255,1447,885],{"class":272},[255,1449,1392],{"class":347},[255,1451,1395],{"class":268},[255,1453,1455,1457,1459,1461,1464,1467,1470,1473,1475,1478,1481,1483,1486,1488,1490],{"class":257,"line":1454},32,[255,1456,1376],{"class":261},[255,1458,315],{"class":347},[255,1460,885],{"class":272},[255,1462,1463],{"class":268}," instanceof",[255,1465,1466],{"class":325}," Error",[255,1468,1469],{"class":268}," &&",[255,1471,1472],{"class":272}," error",[255,1474,422],{"class":268},[255,1476,1477],{"class":272},"name",[255,1479,1480],{"class":268}," ===",[255,1482,282],{"class":268},[255,1484,1485],{"class":285},"AbortError",[255,1487,351],{"class":268},[255,1489,1392],{"class":347},[255,1491,1395],{"class":268},[255,1493,1495,1497,1499,1501,1503,1505,1508,1510],{"class":257,"line":1494},33,[255,1496,1401],{"class":272},[255,1498,422],{"class":268},[255,1500,885],{"class":343},[255,1502,348],{"class":347},[255,1504,351],{"class":268},[255,1506,1507],{"class":285},"[my-adapter] Request timed out",[255,1509,351],{"class":268},[255,1511,447],{"class":347},[255,1513,1515,1517,1520],{"class":257,"line":1514},34,[255,1516,1364],{"class":268},[255,1518,1519],{"class":261}," else",[255,1521,334],{"class":268},[255,1523,1525,1527,1529,1531,1533,1535,1538,1540,1542,1544],{"class":257,"line":1524},35,[255,1526,1401],{"class":272},[255,1528,422],{"class":268},[255,1530,885],{"class":343},[255,1532,348],{"class":347},[255,1534,351],{"class":268},[255,1536,1537],{"class":285},"[my-adapter] Error:",[255,1539,351],{"class":268},[255,1541,359],{"class":268},[255,1543,1472],{"class":272},[255,1545,447],{"class":347},[255,1547,1549],{"class":257,"line":1548},36,[255,1550,1434],{"class":268},[255,1552,1554,1556,1559],{"class":257,"line":1553},37,[255,1555,1440],{"class":268},[255,1557,1558],{"class":261}," finally",[255,1560,334],{"class":268},[255,1562,1564,1567,1569,1572],{"class":257,"line":1563},38,[255,1565,1566],{"class":343},"      clearTimeout",[255,1568,348],{"class":347},[255,1570,1571],{"class":272},"timeoutId",[255,1573,447],{"class":347},[255,1575,1577],{"class":257,"line":1576},39,[255,1578,1579],{"class":268},"    }\n",[255,1581,1583],{"class":257,"line":1582},40,[255,1584,778],{"class":268},[255,1586,1588],{"class":257,"line":1587},41,[255,1589,453],{"class":268},[225,1591,1592],{},"Then pass the adapter to your framework like any other drain:",[245,1594,1596],{"className":247,"code":1595,"language":250,"meta":251,"style":251},"const drain = createMyAdapter({\n  apiKey: process.env.MY_SERVICE_API_KEY!,\n})\n",[229,1597,1598,1612,1634],{"__ignoreMap":251},[255,1599,1600,1602,1604,1606,1608,1610],{"class":257,"line":258},[255,1601,303],{"class":302},[255,1603,306],{"class":272},[255,1605,309],{"class":268},[255,1607,1074],{"class":343},[255,1609,348],{"class":272},[255,1611,1395],{"class":268},[255,1613,1614,1616,1618,1621,1623,1626,1628,1631],{"class":257,"line":292},[255,1615,1033],{"class":347},[255,1617,322],{"class":268},[255,1619,1620],{"class":272}," process",[255,1622,422],{"class":268},[255,1624,1625],{"class":272},"env",[255,1627,422],{"class":268},[255,1629,1630],{"class":272},"MY_SERVICE_API_KEY",[255,1632,1633],{"class":268},"!,\n",[255,1635,1636,1638],{"class":257,"line":299},[255,1637,531],{"class":268},[255,1639,447],{"class":272},[234,1641,1643],{"id":1642},"reading-configuration","Reading Configuration",[225,1645,1646],{},"The recommended pattern is: overrides > environment variables. If you also need Nuxt/Nitro runtimeConfig support, add it as a fallback:",[245,1648,1650],{"className":247,"code":1649,"filename":990,"language":250,"meta":251,"style":251},"export function createMyAdapter(overrides?: Partial\u003CMyAdapterConfig>) {\n  return async (ctx: DrainContext) => {\n    const config = {\n      apiKey: overrides?.apiKey ?? process.env.MY_SERVICE_API_KEY,\n      endpoint: overrides?.endpoint ?? process.env.MY_SERVICE_ENDPOINT,\n    }\n\n    if (!config.apiKey) {\n      console.error('[my-adapter] Missing API key')\n      return\n    }\n\n    // Send the event...\n  }\n}\n",[229,1651,1652,1680,1700,1710,1739,1767,1771,1775,1794,1814,1819,1823,1827,1832,1836],{"__ignoreMap":251},[255,1653,1654,1656,1658,1660,1662,1665,1667,1670,1672,1675,1678],{"class":257,"line":258},[255,1655,476],{"class":261},[255,1657,1071],{"class":302},[255,1659,1074],{"class":343},[255,1661,348],{"class":268},[255,1663,1664],{"class":318},"overrides",[255,1666,743],{"class":268},[255,1668,1669],{"class":325}," Partial",[255,1671,803],{"class":268},[255,1673,1674],{"class":325},"MyAdapterConfig",[255,1676,1677],{"class":268},">)",[255,1679,334],{"class":268},[255,1681,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":257,"line":292},[255,1683,1147],{"class":261},[255,1685,312],{"class":302},[255,1687,315],{"class":268},[255,1689,319],{"class":318},[255,1691,322],{"class":268},[255,1693,273],{"class":325},[255,1695,328],{"class":268},[255,1697,331],{"class":302},[255,1699,334],{"class":268},[255,1701,1702,1704,1706,1708],{"class":257,"line":299},[255,1703,1168],{"class":302},[255,1705,1101],{"class":272},[255,1707,1098],{"class":268},[255,1709,334],{"class":268},[255,1711,1712,1715,1717,1720,1723,1725,1727,1729,1731,1733,1735,1737],{"class":257,"line":337},[255,1713,1714],{"class":347},"      apiKey",[255,1716,322],{"class":268},[255,1718,1719],{"class":272}," overrides",[255,1721,1722],{"class":268},"?.",[255,1724,1311],{"class":272},[255,1726,1109],{"class":268},[255,1728,1620],{"class":272},[255,1730,422],{"class":268},[255,1732,1625],{"class":272},[255,1734,422],{"class":268},[255,1736,1630],{"class":272},[255,1738,379],{"class":268},[255,1740,1741,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1765],{"class":257,"line":364},[255,1742,1743],{"class":347},"      endpoint",[255,1745,322],{"class":268},[255,1747,1719],{"class":272},[255,1749,1722],{"class":268},[255,1751,1106],{"class":272},[255,1753,1109],{"class":268},[255,1755,1620],{"class":272},[255,1757,422],{"class":268},[255,1759,1625],{"class":272},[255,1761,422],{"class":268},[255,1763,1764],{"class":272},"MY_SERVICE_ENDPOINT",[255,1766,379],{"class":268},[255,1768,1769],{"class":257,"line":382},[255,1770,1579],{"class":268},[255,1772,1773],{"class":257,"line":411},[255,1774,296],{"emptyLinePlaceholder":295},[255,1776,1777,1780,1782,1784,1786,1788,1790,1792],{"class":257,"line":441},[255,1778,1779],{"class":261},"    if",[255,1781,315],{"class":347},[255,1783,1381],{"class":268},[255,1785,1079],{"class":272},[255,1787,422],{"class":268},[255,1789,1311],{"class":272},[255,1791,1392],{"class":347},[255,1793,1395],{"class":268},[255,1795,1796,1799,1801,1803,1805,1807,1810,1812],{"class":257,"line":450},[255,1797,1798],{"class":272},"      console",[255,1800,422],{"class":268},[255,1802,885],{"class":343},[255,1804,348],{"class":347},[255,1806,351],{"class":268},[255,1808,1809],{"class":285},"[my-adapter] Missing API key",[255,1811,351],{"class":268},[255,1813,447],{"class":347},[255,1815,1816],{"class":257,"line":775},[255,1817,1818],{"class":261},"      return\n",[255,1820,1821],{"class":257,"line":781},[255,1822,1579],{"class":268},[255,1824,1825],{"class":257,"line":786},[255,1826,296],{"emptyLinePlaceholder":295},[255,1828,1829],{"class":257,"line":792},[255,1830,1831],{"class":470},"    // Send the event...\n",[255,1833,1834],{"class":257,"line":817},[255,1835,778],{"class":268},[255,1837,1838],{"class":257,"line":822},[255,1839,453],{"class":268},[234,1841,1843],{"id":1842},"filtering-events","Filtering Events",[225,1845,1846],{},"Filter which events to send inside the drain function:",[245,1848,1850],{"className":247,"code":1849,"filename":249,"language":250,"meta":251,"style":251},"const drain = async (ctx: DrainContext) => {\n  if (ctx.event.level !== 'error') return\n  if (ctx.request?.path === '/health') return\n  if (ctx.event._sampled === false) return\n\n  await sendToMyService(ctx.event)\n}\n",[229,1851,1852,1876,1908,1939,1966,1970,1987],{"__ignoreMap":251},[255,1853,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874],{"class":257,"line":258},[255,1855,303],{"class":302},[255,1857,306],{"class":272},[255,1859,309],{"class":268},[255,1861,312],{"class":302},[255,1863,315],{"class":268},[255,1865,319],{"class":318},[255,1867,322],{"class":268},[255,1869,273],{"class":325},[255,1871,328],{"class":268},[255,1873,331],{"class":302},[255,1875,334],{"class":268},[255,1877,1878,1881,1883,1885,1887,1889,1891,1894,1897,1899,1901,1903,1905],{"class":257,"line":292},[255,1879,1880],{"class":261},"  if",[255,1882,315],{"class":347},[255,1884,319],{"class":272},[255,1886,422],{"class":268},[255,1888,434],{"class":272},[255,1890,422],{"class":268},[255,1892,1893],{"class":272},"level",[255,1895,1896],{"class":268}," !==",[255,1898,282],{"class":268},[255,1900,885],{"class":285},[255,1902,351],{"class":268},[255,1904,1392],{"class":347},[255,1906,1907],{"class":261},"return\n",[255,1909,1910,1912,1914,1916,1918,1921,1923,1926,1928,1930,1933,1935,1937],{"class":257,"line":299},[255,1911,1880],{"class":261},[255,1913,315],{"class":347},[255,1915,319],{"class":272},[255,1917,422],{"class":268},[255,1919,1920],{"class":272},"request",[255,1922,1722],{"class":268},[255,1924,1925],{"class":272},"path",[255,1927,1480],{"class":268},[255,1929,282],{"class":268},[255,1931,1932],{"class":285},"/health",[255,1934,351],{"class":268},[255,1936,1392],{"class":347},[255,1938,1907],{"class":261},[255,1940,1941,1943,1945,1947,1949,1951,1953,1956,1958,1962,1964],{"class":257,"line":337},[255,1942,1880],{"class":261},[255,1944,315],{"class":347},[255,1946,319],{"class":272},[255,1948,422],{"class":268},[255,1950,434],{"class":272},[255,1952,422],{"class":268},[255,1954,1955],{"class":272},"_sampled",[255,1957,1480],{"class":268},[255,1959,1961],{"class":1960},"sfNiH"," false",[255,1963,1392],{"class":347},[255,1965,1907],{"class":261},[255,1967,1968],{"class":257,"line":364},[255,1969,296],{"emptyLinePlaceholder":295},[255,1971,1972,1974,1977,1979,1981,1983,1985],{"class":257,"line":382},[255,1973,340],{"class":261},[255,1975,1976],{"class":343}," sendToMyService",[255,1978,348],{"class":347},[255,1980,319],{"class":272},[255,1982,422],{"class":268},[255,1984,434],{"class":272},[255,1986,447],{"class":347},[255,1988,1989],{"class":257,"line":411},[255,1990,453],{"class":268},[234,1992,1994],{"id":1993},"transforming-events","Transforming Events",[225,1996,1997],{},"Transform events before sending:",[245,1999,2001],{"className":247,"code":2000,"filename":249,"language":250,"meta":251,"style":251},"const drain = async (ctx: DrainContext) => {\n  const payload = {\n    ts: new Date(ctx.event.timestamp).getTime(),\n    severity: ctx.event.level.toUpperCase(),\n    message: JSON.stringify(ctx.event),\n    labels: {\n      service: ctx.event.service,\n      env: ctx.event.environment,\n    },\n    attributes: {\n      method: ctx.event.method,\n      path: ctx.event.path,\n      status: ctx.event.status,\n      duration: ctx.event.duration,\n    },\n  }\n\n  await fetch('https://logs.example.com/v1/push', {\n    method: 'POST',\n    body: JSON.stringify(payload),\n  })\n}\n",[229,2002,2003,2027,2038,2074,2101,2126,2135,2155,2175,2180,2189,2209,2228,2247,2267,2271,2275,2279,2298,2312,2333,2339],{"__ignoreMap":251},[255,2004,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025],{"class":257,"line":258},[255,2006,303],{"class":302},[255,2008,306],{"class":272},[255,2010,309],{"class":268},[255,2012,312],{"class":302},[255,2014,315],{"class":268},[255,2016,319],{"class":318},[255,2018,322],{"class":268},[255,2020,273],{"class":325},[255,2022,328],{"class":268},[255,2024,331],{"class":302},[255,2026,334],{"class":268},[255,2028,2029,2031,2034,2036],{"class":257,"line":292},[255,2030,1092],{"class":302},[255,2032,2033],{"class":272}," payload",[255,2035,1098],{"class":268},[255,2037,334],{"class":268},[255,2039,2040,2043,2045,2047,2050,2052,2054,2056,2058,2060,2063,2065,2067,2070,2072],{"class":257,"line":299},[255,2041,2042],{"class":347},"    ts",[255,2044,322],{"class":268},[255,2046,1176],{"class":268},[255,2048,2049],{"class":343}," Date",[255,2051,348],{"class":347},[255,2053,319],{"class":272},[255,2055,422],{"class":268},[255,2057,434],{"class":272},[255,2059,422],{"class":268},[255,2061,2062],{"class":272},"timestamp",[255,2064,328],{"class":347},[255,2066,422],{"class":268},[255,2068,2069],{"class":343},"getTime",[255,2071,1199],{"class":347},[255,2073,379],{"class":268},[255,2075,2076,2079,2081,2084,2086,2088,2090,2092,2094,2097,2099],{"class":257,"line":337},[255,2077,2078],{"class":347},"    severity",[255,2080,322],{"class":268},[255,2082,2083],{"class":272}," ctx",[255,2085,422],{"class":268},[255,2087,434],{"class":272},[255,2089,422],{"class":268},[255,2091,1893],{"class":272},[255,2093,422],{"class":268},[255,2095,2096],{"class":343},"toUpperCase",[255,2098,1199],{"class":347},[255,2100,379],{"class":268},[255,2102,2103,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124],{"class":257,"line":364},[255,2104,2105],{"class":347},"    message",[255,2107,322],{"class":268},[255,2109,419],{"class":272},[255,2111,422],{"class":268},[255,2113,425],{"class":343},[255,2115,348],{"class":347},[255,2117,319],{"class":272},[255,2119,422],{"class":268},[255,2121,434],{"class":272},[255,2123,328],{"class":347},[255,2125,379],{"class":268},[255,2127,2128,2131,2133],{"class":257,"line":382},[255,2129,2130],{"class":347},"    labels",[255,2132,322],{"class":268},[255,2134,334],{"class":268},[255,2136,2137,2140,2142,2144,2146,2148,2150,2153],{"class":257,"line":411},[255,2138,2139],{"class":347},"      service",[255,2141,322],{"class":268},[255,2143,2083],{"class":272},[255,2145,422],{"class":268},[255,2147,434],{"class":272},[255,2149,422],{"class":268},[255,2151,2152],{"class":272},"service",[255,2154,379],{"class":268},[255,2156,2157,2160,2162,2164,2166,2168,2170,2173],{"class":257,"line":441},[255,2158,2159],{"class":347},"      env",[255,2161,322],{"class":268},[255,2163,2083],{"class":272},[255,2165,422],{"class":268},[255,2167,434],{"class":272},[255,2169,422],{"class":268},[255,2171,2172],{"class":272},"environment",[255,2174,379],{"class":268},[255,2176,2177],{"class":257,"line":450},[255,2178,2179],{"class":268},"    },\n",[255,2181,2182,2185,2187],{"class":257,"line":775},[255,2183,2184],{"class":347},"    attributes",[255,2186,322],{"class":268},[255,2188,334],{"class":268},[255,2190,2191,2194,2196,2198,2200,2202,2204,2207],{"class":257,"line":781},[255,2192,2193],{"class":347},"      method",[255,2195,322],{"class":268},[255,2197,2083],{"class":272},[255,2199,422],{"class":268},[255,2201,434],{"class":272},[255,2203,422],{"class":268},[255,2205,2206],{"class":272},"method",[255,2208,379],{"class":268},[255,2210,2211,2214,2216,2218,2220,2222,2224,2226],{"class":257,"line":786},[255,2212,2213],{"class":347},"      path",[255,2215,322],{"class":268},[255,2217,2083],{"class":272},[255,2219,422],{"class":268},[255,2221,434],{"class":272},[255,2223,422],{"class":268},[255,2225,1925],{"class":272},[255,2227,379],{"class":268},[255,2229,2230,2233,2235,2237,2239,2241,2243,2245],{"class":257,"line":792},[255,2231,2232],{"class":347},"      status",[255,2234,322],{"class":268},[255,2236,2083],{"class":272},[255,2238,422],{"class":268},[255,2240,434],{"class":272},[255,2242,422],{"class":268},[255,2244,1423],{"class":272},[255,2246,379],{"class":268},[255,2248,2249,2252,2254,2256,2258,2260,2262,2265],{"class":257,"line":817},[255,2250,2251],{"class":347},"      duration",[255,2253,322],{"class":268},[255,2255,2083],{"class":272},[255,2257,422],{"class":268},[255,2259,434],{"class":272},[255,2261,422],{"class":268},[255,2263,2264],{"class":272},"duration",[255,2266,379],{"class":268},[255,2268,2269],{"class":257,"line":822},[255,2270,2179],{"class":268},[255,2272,2273],{"class":257,"line":827},[255,2274,778],{"class":268},[255,2276,2277],{"class":257,"line":837},[255,2278,296],{"emptyLinePlaceholder":295},[255,2280,2281,2283,2285,2287,2289,2292,2294,2296],{"class":257,"line":847},[255,2282,340],{"class":261},[255,2284,344],{"class":343},[255,2286,348],{"class":347},[255,2288,351],{"class":268},[255,2290,2291],{"class":285},"https://logs.example.com/v1/push",[255,2293,351],{"class":268},[255,2295,359],{"class":268},[255,2297,334],{"class":268},[255,2299,2300,2302,2304,2306,2308,2310],{"class":257,"line":890},[255,2301,367],{"class":347},[255,2303,322],{"class":268},[255,2305,282],{"class":268},[255,2307,374],{"class":285},[255,2309,351],{"class":268},[255,2311,379],{"class":268},[255,2313,2314,2316,2318,2320,2322,2324,2326,2329,2331],{"class":257,"line":900},[255,2315,414],{"class":347},[255,2317,322],{"class":268},[255,2319,419],{"class":272},[255,2321,422],{"class":268},[255,2323,425],{"class":343},[255,2325,348],{"class":347},[255,2327,2328],{"class":272},"payload",[255,2330,328],{"class":347},[255,2332,379],{"class":268},[255,2334,2335,2337],{"class":257,"line":910},[255,2336,444],{"class":268},[255,2338,447],{"class":347},[255,2340,2341],{"class":257,"line":920},[255,2342,453],{"class":268},[234,2344,2346],{"id":2345},"batching","Batching",[225,2348,2349,2350,2354],{},"For high-throughput scenarios, use the ",[2351,2352,2353],"a",{"href":180},"Drain Pipeline"," to batch events, retry on failure, and handle buffer overflow automatically:",[245,2356,2358],{"className":247,"code":2357,"filename":249,"language":250,"meta":251,"style":251},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog/pipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 5000 },\n})\n\nconst drain = pipeline(async (batch) => {\n  await fetch('https://api.example.com/logs/batch', {\n    method: 'POST',\n    body: JSON.stringify(batch.map(ctx => ctx.event)),\n  })\n})\n",[229,2359,2360,2380,2400,2404,2426,2455,2461,2465,2492,2511,2525,2563,2569],{"__ignoreMap":251},[255,2361,2362,2364,2366,2368,2370,2372,2374,2376,2378],{"class":257,"line":258},[255,2363,262],{"class":261},[255,2365,265],{"class":261},[255,2367,269],{"class":268},[255,2369,273],{"class":272},[255,2371,276],{"class":268},[255,2373,279],{"class":261},[255,2375,282],{"class":268},[255,2377,286],{"class":285},[255,2379,289],{"class":268},[255,2381,2382,2384,2386,2389,2391,2393,2395,2398],{"class":257,"line":292},[255,2383,262],{"class":261},[255,2385,269],{"class":268},[255,2387,2388],{"class":272}," createDrainPipeline",[255,2390,276],{"class":268},[255,2392,279],{"class":261},[255,2394,282],{"class":268},[255,2396,2397],{"class":285},"evlog/pipeline",[255,2399,289],{"class":268},[255,2401,2402],{"class":257,"line":299},[255,2403,296],{"emptyLinePlaceholder":295},[255,2405,2406,2408,2411,2413,2415,2417,2419,2422,2424],{"class":257,"line":337},[255,2407,303],{"class":302},[255,2409,2410],{"class":272}," pipeline ",[255,2412,309],{"class":268},[255,2414,2388],{"class":343},[255,2416,803],{"class":268},[255,2418,231],{"class":325},[255,2420,2421],{"class":268},">",[255,2423,348],{"class":272},[255,2425,1395],{"class":268},[255,2427,2428,2431,2433,2435,2438,2440,2443,2445,2448,2450,2453],{"class":257,"line":364},[255,2429,2430],{"class":347},"  batch",[255,2432,322],{"class":268},[255,2434,269],{"class":268},[255,2436,2437],{"class":347}," size",[255,2439,322],{"class":268},[255,2441,2442],{"class":1137}," 100",[255,2444,359],{"class":268},[255,2446,2447],{"class":347}," intervalMs",[255,2449,322],{"class":268},[255,2451,2452],{"class":1137}," 5000",[255,2454,408],{"class":268},[255,2456,2457,2459],{"class":257,"line":382},[255,2458,531],{"class":268},[255,2460,447],{"class":272},[255,2462,2463],{"class":257,"line":411},[255,2464,296],{"emptyLinePlaceholder":295},[255,2466,2467,2469,2471,2473,2476,2478,2481,2483,2486,2488,2490],{"class":257,"line":441},[255,2468,303],{"class":302},[255,2470,306],{"class":272},[255,2472,309],{"class":268},[255,2474,2475],{"class":343}," pipeline",[255,2477,348],{"class":272},[255,2479,2480],{"class":302},"async",[255,2482,315],{"class":268},[255,2484,2485],{"class":318},"batch",[255,2487,328],{"class":268},[255,2489,331],{"class":302},[255,2491,334],{"class":268},[255,2493,2494,2496,2498,2500,2502,2505,2507,2509],{"class":257,"line":450},[255,2495,340],{"class":261},[255,2497,344],{"class":343},[255,2499,348],{"class":347},[255,2501,351],{"class":268},[255,2503,2504],{"class":285},"https://api.example.com/logs/batch",[255,2506,351],{"class":268},[255,2508,359],{"class":268},[255,2510,334],{"class":268},[255,2512,2513,2515,2517,2519,2521,2523],{"class":257,"line":775},[255,2514,367],{"class":347},[255,2516,322],{"class":268},[255,2518,282],{"class":268},[255,2520,374],{"class":285},[255,2522,351],{"class":268},[255,2524,379],{"class":268},[255,2526,2527,2529,2531,2533,2535,2537,2539,2541,2543,2546,2548,2550,2552,2554,2556,2558,2561],{"class":257,"line":781},[255,2528,414],{"class":347},[255,2530,322],{"class":268},[255,2532,419],{"class":272},[255,2534,422],{"class":268},[255,2536,425],{"class":343},[255,2538,348],{"class":347},[255,2540,2485],{"class":272},[255,2542,422],{"class":268},[255,2544,2545],{"class":343},"map",[255,2547,348],{"class":347},[255,2549,319],{"class":318},[255,2551,331],{"class":302},[255,2553,2083],{"class":272},[255,2555,422],{"class":268},[255,2557,434],{"class":272},[255,2559,2560],{"class":347},"))",[255,2562,379],{"class":268},[255,2564,2565,2567],{"class":257,"line":786},[255,2566,444],{"class":268},[255,2568,447],{"class":347},[255,2570,2571,2573],{"class":257,"line":792},[255,2572,531],{"class":268},[255,2574,447],{"class":272},[2576,2577,2579,2580,2583],"callout",{"color":867,"icon":2578},"i-lucide-arrow-right","See the ",[2351,2581,2582],{"href":180},"Pipeline documentation"," for the full options reference, retry strategies, and buffer overflow handling.",[234,2585,2587],{"id":2586},"error-handling-best-practices","Error Handling Best Practices",[2589,2590,2591,2599,2609,2615],"ol",{},[2592,2593,2594,2598],"li",{},[2595,2596,2597],"strong",{},"Never throw errors"," - The drain should not crash your app",[2592,2600,2601,2604,2605,2608],{},[2595,2602,2603],{},"Log failures silently"," - Use ",[229,2606,2607],{},"console.error"," for debugging",[2592,2610,2611,2614],{},[2595,2612,2613],{},"Use timeouts"," - Prevent hanging requests",[2592,2616,2617,2620],{},[2595,2618,2619],{},"Graceful degradation"," - Skip sending if config is missing",[245,2622,2625],{"className":247,"code":2623,"filename":2624,"language":250,"meta":251,"style":251},"export function createRobustAdapter(config: Config) {\n  return async (ctx: DrainContext) => {\n    // Validate config\n    if (!config.apiKey) {\n      console.error('[adapter] Missing API key, skipping')\n      return\n    }\n\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), 5000)\n\n    try {\n      await fetch(config.endpoint, {\n        method: 'POST',\n        body: JSON.stringify(ctx.event),\n        signal: controller.signal,\n      })\n    } catch (error) {\n      // Log but don't throw\n      console.error('[adapter] Failed to send:', error)\n    } finally {\n      clearTimeout(timeoutId)\n    }\n  }\n}\n","lib/robust-adapter.ts",[229,2626,2627,2649,2669,2674,2692,2711,2715,2719,2723,2737,2767,2771,2777,2796,2810,2834,2848,2854,2868,2873,2896,2904,2914,2918,2922],{"__ignoreMap":251},[255,2628,2629,2631,2633,2636,2638,2640,2642,2645,2647],{"class":257,"line":258},[255,2630,476],{"class":261},[255,2632,1071],{"class":302},[255,2634,2635],{"class":343}," createRobustAdapter",[255,2637,348],{"class":268},[255,2639,1079],{"class":318},[255,2641,322],{"class":268},[255,2643,2644],{"class":325}," Config",[255,2646,328],{"class":268},[255,2648,334],{"class":268},[255,2650,2651,2653,2655,2657,2659,2661,2663,2665,2667],{"class":257,"line":292},[255,2652,1147],{"class":261},[255,2654,312],{"class":302},[255,2656,315],{"class":268},[255,2658,319],{"class":318},[255,2660,322],{"class":268},[255,2662,273],{"class":325},[255,2664,328],{"class":268},[255,2666,331],{"class":302},[255,2668,334],{"class":268},[255,2670,2671],{"class":257,"line":299},[255,2672,2673],{"class":470},"    // Validate config\n",[255,2675,2676,2678,2680,2682,2684,2686,2688,2690],{"class":257,"line":337},[255,2677,1779],{"class":261},[255,2679,315],{"class":347},[255,2681,1381],{"class":268},[255,2683,1079],{"class":272},[255,2685,422],{"class":268},[255,2687,1311],{"class":272},[255,2689,1392],{"class":347},[255,2691,1395],{"class":268},[255,2693,2694,2696,2698,2700,2702,2704,2707,2709],{"class":257,"line":364},[255,2695,1798],{"class":272},[255,2697,422],{"class":268},[255,2699,885],{"class":343},[255,2701,348],{"class":347},[255,2703,351],{"class":268},[255,2705,2706],{"class":285},"[adapter] Missing API key, skipping",[255,2708,351],{"class":268},[255,2710,447],{"class":347},[255,2712,2713],{"class":257,"line":382},[255,2714,1818],{"class":261},[255,2716,2717],{"class":257,"line":411},[255,2718,1579],{"class":268},[255,2720,2721],{"class":257,"line":441},[255,2722,296],{"emptyLinePlaceholder":295},[255,2724,2725,2727,2729,2731,2733,2735],{"class":257,"line":450},[255,2726,1168],{"class":302},[255,2728,1171],{"class":272},[255,2730,1098],{"class":268},[255,2732,1176],{"class":268},[255,2734,1179],{"class":343},[255,2736,1182],{"class":347},[255,2738,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765],{"class":257,"line":775},[255,2740,1168],{"class":302},[255,2742,1189],{"class":272},[255,2744,1098],{"class":268},[255,2746,1194],{"class":343},[255,2748,348],{"class":347},[255,2750,1199],{"class":268},[255,2752,331],{"class":302},[255,2754,1171],{"class":272},[255,2756,422],{"class":268},[255,2758,1208],{"class":343},[255,2760,1199],{"class":347},[255,2762,359],{"class":268},[255,2764,2452],{"class":1137},[255,2766,447],{"class":347},[255,2768,2769],{"class":257,"line":781},[255,2770,296],{"emptyLinePlaceholder":295},[255,2772,2773,2775],{"class":257,"line":786},[255,2774,1225],{"class":261},[255,2776,334],{"class":268},[255,2778,2779,2782,2784,2786,2788,2790,2792,2794],{"class":257,"line":792},[255,2780,2781],{"class":261},"      await",[255,2783,344],{"class":343},[255,2785,348],{"class":347},[255,2787,1079],{"class":272},[255,2789,422],{"class":268},[255,2791,1106],{"class":272},[255,2793,359],{"class":268},[255,2795,334],{"class":268},[255,2797,2798,2800,2802,2804,2806,2808],{"class":257,"line":817},[255,2799,1255],{"class":347},[255,2801,322],{"class":268},[255,2803,282],{"class":268},[255,2805,374],{"class":285},[255,2807,351],{"class":268},[255,2809,379],{"class":268},[255,2811,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832],{"class":257,"line":822},[255,2813,1323],{"class":347},[255,2815,322],{"class":268},[255,2817,419],{"class":272},[255,2819,422],{"class":268},[255,2821,425],{"class":343},[255,2823,348],{"class":347},[255,2825,319],{"class":272},[255,2827,422],{"class":268},[255,2829,434],{"class":272},[255,2831,328],{"class":347},[255,2833,379],{"class":268},[255,2835,2836,2838,2840,2842,2844,2846],{"class":257,"line":827},[255,2837,1348],{"class":347},[255,2839,322],{"class":268},[255,2841,1171],{"class":272},[255,2843,422],{"class":268},[255,2845,1357],{"class":272},[255,2847,379],{"class":268},[255,2849,2850,2852],{"class":257,"line":837},[255,2851,1364],{"class":268},[255,2853,447],{"class":347},[255,2855,2856,2858,2860,2862,2864,2866],{"class":257,"line":847},[255,2857,1440],{"class":268},[255,2859,1443],{"class":261},[255,2861,315],{"class":347},[255,2863,885],{"class":272},[255,2865,1392],{"class":347},[255,2867,1395],{"class":268},[255,2869,2870],{"class":257,"line":890},[255,2871,2872],{"class":470},"      // Log but don't throw\n",[255,2874,2875,2877,2879,2881,2883,2885,2888,2890,2892,2894],{"class":257,"line":900},[255,2876,1798],{"class":272},[255,2878,422],{"class":268},[255,2880,885],{"class":343},[255,2882,348],{"class":347},[255,2884,351],{"class":268},[255,2886,2887],{"class":285},"[adapter] Failed to send:",[255,2889,351],{"class":268},[255,2891,359],{"class":268},[255,2893,1472],{"class":272},[255,2895,447],{"class":347},[255,2897,2898,2900,2902],{"class":257,"line":910},[255,2899,1440],{"class":268},[255,2901,1558],{"class":261},[255,2903,334],{"class":268},[255,2905,2906,2908,2910,2912],{"class":257,"line":920},[255,2907,1566],{"class":343},[255,2909,348],{"class":347},[255,2911,1571],{"class":272},[255,2913,447],{"class":347},[255,2915,2916],{"class":257,"line":930},[255,2917,1579],{"class":268},[255,2919,2920],{"class":257,"line":940},[255,2921,778],{"class":268},[255,2923,2924],{"class":257,"line":950},[255,2925,453],{"class":268},[234,2927,2929],{"id":2928},"next-steps","Next Steps",[2931,2932,2933,2939,2945,2951],"ul",{},[2592,2934,2935,2938],{},[2351,2936,2937],{"href":150},"Axiom Adapter"," - See a production-ready adapter implementation",[2592,2940,2941,2944],{},[2351,2942,2943],{"href":155},"OTLP Adapter"," - OpenTelemetry Protocol adapter",[2592,2946,2947,2950],{},[2351,2948,2949],{"href":160},"PostHog Adapter"," - PostHog product analytics adapter",[2592,2952,2953,2955],{},[2351,2954,121],{"href":122}," - Security and production tips",[2957,2958,2959],"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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":251,"searchDepth":292,"depth":292,"links":2961},[2962,2963,2964,2965,2966,2967,2968,2969,2970],{"id":236,"depth":292,"text":237},{"id":695,"depth":292,"text":696},{"id":982,"depth":292,"text":983},{"id":1642,"depth":292,"text":1643},{"id":1842,"depth":292,"text":1843},{"id":1993,"depth":292,"text":1994},{"id":2345,"depth":292,"text":2346},{"id":2586,"depth":292,"text":2587},{"id":2928,"depth":292,"text":2929},"Build your own adapter to send logs to any destination. Factory patterns, batching, filtering, and error handling best practices.","md",[2974,2977],{"label":2937,"icon":152,"to":150,"color":2975,"variant":2976},"neutral","subtle",{"label":121,"icon":124,"to":122,"color":2975,"variant":2976},{},{"icon":177},{"title":174,"description":2971},"_9e_t5d4Sbj1WleQff9req0eQloJI8yoHr-eUH-jGHk",[2983,2985],{"title":169,"path":170,"stem":171,"description":2984,"icon":172,"children":-1},"Send wide events to Better Stack (formerly Logtail) for log management, alerting, and dashboards. Zero-config setup with environment variables.",{"title":179,"path":180,"stem":181,"description":2986,"icon":182,"children":-1},"Batch events, retry on failure, and protect against buffer overflow with the shared drain pipeline. Supports fan-out to multiple adapters.",1773097848856]