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