[{"data":1,"prerenderedAt":1630},["ShallowReactive",2],{"navigation_docs_en":3,"-en-telemetry-opentelemetry":441,"-en-telemetry-opentelemetry-surround":1625},[4,45,60,81,112,129,146,173,197,213,242,279,356,372,384,403,429],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fen\u002Fqueue","en\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Overview","\u002Fen\u002Fqueue\u002Foverview","en\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Tasks","\u002Fen\u002Fqueue\u002Ftasks","en\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fen\u002Fevents","en\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Events","\u002Fen\u002Fevents\u002Foverview","en\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fen\u002Fevents\u002Foutbox","en\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Scheduling","\u002Fen\u002Fevents\u002Fscheduler","en\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fen\u002Fauth","en\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Authentication","\u002Fen\u002Fauth\u002Foverview","en\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fen\u002Fauth\u002Frbac","en\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policies","\u002Fen\u002Fauth\u002Fpolicy","en\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Using auth standalone","\u002Fen\u002Fauth\u002Fstandalone","en\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login with goth, standalone","\u002Fen\u002Fauth\u002Fsocial-standalone","en\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fen\u002Fmail","en\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fen\u002Fmail\u002Foverview","en\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fen\u002Fmail\u002Fsmtp","en\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fen\u002Fmail\u002Fmjml","en\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fen\u002Fnotify","en\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fen\u002Fnotify\u002Foverview","en\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database channel","\u002Fen\u002Fnotify\u002Fdatabase","en\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast channel","\u002Fen\u002Fnotify\u002Fbroadcast","en\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fen\u002Fstorage","en\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fen\u002Fstorage\u002Foverview","en\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fen\u002Fstorage\u002Fdisk-api","en\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memory and local disk","\u002Fen\u002Fstorage\u002Flocal","en\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fen\u002Fstorage\u002Fs3","en\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Testing","\u002Fen\u002Fstorage\u002Ftesting","en\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fen\u002Ftelemetry","en\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fen\u002Ftelemetry\u002Foverview","en\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logging","\u002Fen\u002Ftelemetry\u002Flogging","en\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fen\u002Ftelemetry\u002Fopentelemetry","en\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fen\u002Ftelemetry\u002Fsentry","en\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"Kit","i-lucide-box","\u002Fen\u002Fkit","en\u002F3.kit",[248,251,256,261,266,270,275],{"title":52,"path":249,"stem":250,"icon":244},"\u002Fen\u002Fkit\u002Foverview","en\u002F3.kit\u002F1.overview",{"title":252,"path":253,"stem":254,"icon":255},"Application lifecycle","\u002Fen\u002Fkit\u002Fapp","en\u002F3.kit\u002F2.app","i-lucide-power",{"title":257,"path":258,"stem":259,"icon":260},"Server","\u002Fen\u002Fkit\u002Fserver","en\u002F3.kit\u002F3.server","i-lucide-server",{"title":262,"path":263,"stem":264,"icon":265},"Worker","\u002Fen\u002Fkit\u002Fworker","en\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":267,"path":268,"stem":269,"icon":70},"Realtime","\u002Fen\u002Fkit\u002Frealtime","en\u002F3.kit\u002F5.realtime",{"title":271,"path":272,"stem":273,"icon":274},"Migrations","\u002Fen\u002Fkit\u002Fmigrations","en\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":276,"path":277,"stem":278,"icon":111},"Social login","\u002Fen\u002Fkit\u002Fsocial-login","en\u002F3.kit\u002F7.social-login",{"title":280,"icon":281,"path":282,"stem":283,"children":284,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F4.cli",[285,288,293,298,303,308,313,318,323,328,333,337,342,347,351],{"title":52,"path":286,"stem":287,"icon":281},"\u002Fen\u002Fcli\u002Foverview","en\u002F4.cli\u002F1.overview",{"title":289,"path":290,"stem":291,"icon":292},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":294,"path":295,"stem":296,"icon":297},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":299,"path":300,"stem":301,"icon":302},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":304,"path":305,"stem":306,"icon":307},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":309,"path":310,"stem":311,"icon":312},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":314,"path":315,"stem":316,"icon":317},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":319,"path":320,"stem":321,"icon":322},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":324,"path":325,"stem":326,"icon":327},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":329,"path":330,"stem":331,"icon":332},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":334,"path":335,"stem":336,"icon":244},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F4.cli\u002F5.add-core",{"title":338,"path":339,"stem":340,"icon":341},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":343,"path":344,"stem":345,"icon":346},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":348,"path":349,"stem":350,"icon":265},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F4.cli\u002F8.worker-generators",{"title":352,"path":353,"stem":354,"icon":355},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":357,"icon":227,"path":358,"stem":359,"children":360,"page":44},"errs","\u002Fen\u002Ferrs","en\u002F5.errs",[361,364,368],{"title":52,"path":362,"stem":363,"icon":227},"\u002Fen\u002Ferrs\u002Foverview","en\u002F5.errs\u002F1.overview",{"title":365,"path":366,"stem":367},"API","\u002Fen\u002Ferrs\u002Fapi","en\u002F5.errs\u002F2.api",{"title":369,"path":370,"stem":371,"icon":227},"Integration","\u002Fen\u002Ferrs\u002Fintegration","en\u002F5.errs\u002F3.integration",{"title":373,"icon":231,"path":374,"stem":375,"children":376,"page":44},"envconf","\u002Fen\u002Fenvconf","en\u002F6.envconf",[377,380],{"title":52,"path":378,"stem":379,"icon":231},"\u002Fen\u002Fenvconf\u002Foverview","en\u002F6.envconf\u002F1.overview",{"title":381,"path":382,"stem":383},"Recipes","\u002Fen\u002Fenvconf\u002Frecipes","en\u002F6.envconf\u002F2.recipes",{"title":385,"icon":386,"path":387,"stem":388,"children":389,"page":44},"httperr","i-lucide-globe","\u002Fen\u002Fhttperr","en\u002F7.httperr",[390,393,398],{"title":52,"path":391,"stem":392,"icon":386},"\u002Fen\u002Fhttperr\u002Foverview","en\u002F7.httperr\u002F1.overview",{"title":394,"path":395,"stem":396,"icon":397},"Error responses","\u002Fen\u002Fhttperr\u002Ferror-responses","en\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":399,"path":400,"stem":401,"icon":402},"Validation","\u002Fen\u002Fhttperr\u002Fvalidation","en\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":404,"icon":405,"path":406,"stem":407,"children":408,"page":44},"dbx","i-lucide-database","\u002Fen\u002Fdbx","en\u002F8.dbx",[409,412,416,420,425],{"title":52,"path":410,"stem":411,"icon":405},"\u002Fen\u002Fdbx\u002Foverview","en\u002F8.dbx\u002F1.overview",{"title":413,"path":414,"stem":415,"icon":106},"pgx","\u002Fen\u002Fdbx\u002Fpg","en\u002F8.dbx\u002F2.pg",{"title":417,"path":418,"stem":419,"icon":47},"bun","\u002Fen\u002Fdbx\u002Fbunx","en\u002F8.dbx\u002F3.bunx",{"title":421,"path":422,"stem":423,"icon":424},"Transactions","\u002Fen\u002Fdbx\u002Ftransactions","en\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":426,"path":427,"stem":428,"icon":317},"Seeders","\u002Fen\u002Fdbx\u002Fseed","en\u002F8.dbx\u002F5.seed",{"title":430,"icon":55,"path":431,"stem":432,"children":433,"page":44},"paginate","\u002Fen\u002Fpaginate","en\u002F9.paginate",[434,437],{"title":52,"path":435,"stem":436,"icon":55},"\u002Fen\u002Fpaginate\u002Foverview","en\u002F9.paginate\u002F1.overview",{"title":438,"path":439,"stem":440,"icon":19},"Cursor pagination","\u002Fen\u002Fpaginate\u002Fcursor","en\u002F9.paginate\u002F2.cursor",{"id":442,"title":188,"body":443,"description":1618,"extension":1619,"links":1620,"meta":1621,"navigation":1622,"path":189,"seo":1623,"stem":190,"__hash__":1624},"docs_en\u002Fen\u002F16.telemetry\u002F3.opentelemetry.md",{"type":444,"value":445,"toc":1608},"minimark",[446,454,459,670,673,721,739,754,758,834,845,936,957,961,964,1089,1096,1100,1111,1119,1145,1149,1152,1232,1242,1246,1253,1517,1534,1549,1553,1567,1571,1575,1595,1604],[447,448,449,450,453],"p",{},"OpenTelemetry is the kit's observability backbone: every span, metric and exported log record travels through it, and even ",[451,452,193],"a",{"href":194}," is just an extra exporter on top. In the Go ecosystem, distributed tracing is standard, vendor-neutral infrastructure: the kit switches it on without you having to learn the OTel SDK.",[455,456,458],"h2",{"id":457},"otelx-the-bootstrap","otelx: the bootstrap",[460,461,466],"pre",{"className":462,"code":463,"language":464,"meta":465,"style":465},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Ftelemetry\u002Fotelx\"\n\nfunc Setup(ctx context.Context, cfg Config, opts ...Option) (*Handle, error)\n\nfunc (h *Handle) SlogHandler() slog.Handler              \u002F\u002F OTLP log bridge (nil in dev mode)\nfunc (h *Handle) Shutdown(ctx context.Context) error     \u002F\u002F flush + stop the providers\n\nfunc WithSpanExporter(exp sdktrace.SpanExporter) Option  \u002F\u002F extra span sink beside the primary OTLP one\n","go","",[467,468,469,489,496,560,565,601,636,641],"code",{"__ignoreMap":465},[470,471,474,478,482,486],"span",{"class":472,"line":473},"line",1,[470,475,477],{"class":476},"s7zQu","import",[470,479,481],{"class":480},"sMK4o"," \"",[470,483,485],{"class":484},"sBMFI","github.com\u002Fgp-system\u002Ftelemetry\u002Fotelx",[470,487,488],{"class":480},"\"\n",[470,490,492],{"class":472,"line":491},2,[470,493,495],{"emptyLinePlaceholder":494},true,"\n",[470,497,499,502,506,509,513,516,519,522,525,528,531,533,536,539,542,545,548,551,553,557],{"class":472,"line":498},3,[470,500,501],{"class":480},"func",[470,503,505],{"class":504},"s2Zo4"," Setup",[470,507,508],{"class":480},"(",[470,510,512],{"class":511},"sHdIc","ctx",[470,514,515],{"class":484}," context",[470,517,518],{"class":480},".",[470,520,521],{"class":484},"Context",[470,523,524],{"class":480},",",[470,526,527],{"class":511}," cfg",[470,529,530],{"class":484}," Config",[470,532,524],{"class":480},[470,534,535],{"class":511}," opts",[470,537,538],{"class":480}," ...",[470,540,541],{"class":484},"Option",[470,543,544],{"class":480},")",[470,546,547],{"class":480}," (*",[470,549,550],{"class":484},"Handle",[470,552,524],{"class":480},[470,554,556],{"class":555},"spNyl"," error",[470,558,559],{"class":480},")\n",[470,561,563],{"class":472,"line":562},4,[470,564,495],{"emptyLinePlaceholder":494},[470,566,568,570,573,576,579,581,583,586,589,592,594,597],{"class":472,"line":567},5,[470,569,501],{"class":480},[470,571,572],{"class":480}," (",[470,574,575],{"class":511},"h ",[470,577,578],{"class":480},"*",[470,580,550],{"class":484},[470,582,544],{"class":480},[470,584,585],{"class":504}," SlogHandler",[470,587,588],{"class":480},"()",[470,590,591],{"class":484}," slog",[470,593,518],{"class":480},[470,595,596],{"class":484},"Handler",[470,598,600],{"class":599},"sHwdD","              \u002F\u002F OTLP log bridge (nil in dev mode)\n",[470,602,604,606,608,610,612,614,616,619,621,623,625,627,629,631,633],{"class":472,"line":603},6,[470,605,501],{"class":480},[470,607,572],{"class":480},[470,609,575],{"class":511},[470,611,578],{"class":480},[470,613,550],{"class":484},[470,615,544],{"class":480},[470,617,618],{"class":504}," Shutdown",[470,620,508],{"class":480},[470,622,512],{"class":511},[470,624,515],{"class":484},[470,626,518],{"class":480},[470,628,521],{"class":484},[470,630,544],{"class":480},[470,632,556],{"class":555},[470,634,635],{"class":599},"     \u002F\u002F flush + stop the providers\n",[470,637,639],{"class":472,"line":638},7,[470,640,495],{"emptyLinePlaceholder":494},[470,642,644,646,649,651,654,657,659,662,664,667],{"class":472,"line":643},8,[470,645,501],{"class":480},[470,647,648],{"class":504}," WithSpanExporter",[470,650,508],{"class":480},[470,652,653],{"class":511},"exp",[470,655,656],{"class":484}," sdktrace",[470,658,518],{"class":480},[470,660,661],{"class":484},"SpanExporter",[470,663,544],{"class":480},[470,665,666],{"class":484}," Option",[470,668,669],{"class":599},"  \u002F\u002F extra span sink beside the primary OTLP one\n",[447,671,672],{},"One call wires:",[674,675,676,692,715],"ul",{},[677,678,679,683,684,687,688,691],"li",{},[680,681,682],"strong",{},"Resource",": ",[467,685,686],{},"service.name"," \u002F ",[467,689,690],{},"service.version"," plus host detectors, on every signal.",[677,693,694,697,698,701,702,705,706,710,711,714],{},[680,695,696],{},"Tracer, meter and logger providers"," with OTLP exporters; ",[467,699,700],{},"Handle.SlogHandler()"," is the official ",[467,703,704],{},"otelslog"," bridge, which ",[451,707,708],{"href":180},[467,709,174],{}," weaves into the log fanout, so every ",[467,712,713],{},"slog.InfoContext(ctx, ...)"," exports with trace\u002Fspan IDs.",[677,716,717,720],{},[680,718,719],{},"Propagation",": W3C TraceContext + Baggage, so upstream callers' traces continue automatically and yours propagate onward.",[447,722,723,724,727,728,731,732,734,735,738],{},"You rarely call it directly: the chassis runs it through ",[467,725,726],{},"telemetry.Setup",". ",[467,729,730],{},"WithSpanExporter"," too exists primarily for the ",[467,733,174],{}," package: that is how Sentry receives the same spans through a second batcher (a ",[467,736,737],{},"nil"," exporter is silently dropped, so it can be passed unconditionally).",[447,740,741,742,745,746,749,750,753],{},"Application code ",[680,743,744],{},"never imports an OTel SDK package",": the OTel logs SDK is still pre-1.0, and its version churn stays inside the kit's ",[467,747,748],{},"otelx"," package, not in your projects. What you do import is the stable ",[467,751,752],{},"go.opentelemetry.io\u002Fotel"," API (see custom spans below).",[455,755,757],{"id":756},"configuration-two-kit-switches-everything-else-standard","Configuration: two kit switches, everything else standard",[460,759,761],{"className":462,"code":760,"language":464,"meta":465,"style":465},"type Config struct {\n    ServiceName    string `env:\"OTEL_SERVICE_NAME\"`                    \u002F\u002F required outside dev mode\n    ServiceVersion string `env:\"OTEL_SERVICE_VERSION\" envDefault:\"dev\"`\n    Dev            bool   `env:\"OTEL_DEV_MODE\" envDefault:\"false\"`\n}\n",[467,762,763,776,798,813,829],{"__ignoreMap":465},[470,764,765,768,770,773],{"class":472,"line":473},[470,766,767],{"class":480},"type",[470,769,530],{"class":484},[470,771,772],{"class":480}," struct",[470,774,775],{"class":480}," {\n",[470,777,778,782,785,788,792,795],{"class":472,"line":491},[470,779,781],{"class":780},"sTEyZ","    ServiceName    ",[470,783,784],{"class":555},"string",[470,786,787],{"class":480}," `",[470,789,791],{"class":790},"sfazB","env:\"OTEL_SERVICE_NAME\"",[470,793,794],{"class":480},"`",[470,796,797],{"class":599},"                    \u002F\u002F required outside dev mode\n",[470,799,800,803,805,807,810],{"class":472,"line":498},[470,801,802],{"class":780},"    ServiceVersion ",[470,804,784],{"class":555},[470,806,787],{"class":480},[470,808,809],{"class":790},"env:\"OTEL_SERVICE_VERSION\" envDefault:\"dev\"",[470,811,812],{"class":480},"`\n",[470,814,815,818,821,824,827],{"class":472,"line":562},[470,816,817],{"class":780},"    Dev            ",[470,819,820],{"class":555},"bool",[470,822,823],{"class":480},"   `",[470,825,826],{"class":790},"env:\"OTEL_DEV_MODE\" envDefault:\"false\"",[470,828,812],{"class":480},[470,830,831],{"class":472,"line":567},[470,832,833],{"class":480},"}\n",[447,835,836,837,840,841,844],{},"Exporter endpoints are ",[680,838,839],{},"deliberately not"," kit configuration. Exporters are selected by ",[467,842,843],{},"contrib\u002Fexporters\u002Fautoexport"," from the standard OTel variables, so you configure your deployment like any other OTel-instrumented app: your platform team's OTel knowledge and every vendor's documentation apply unchanged:",[460,846,850],{"className":847,"code":848,"language":849,"meta":465,"style":465},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","OTEL_SERVICE_NAME=shop\nOTEL_EXPORTER_OTLP_ENDPOINT=http:\u002F\u002Fcollector:4317\n# per-signal overrides (default everywhere: otlp):\nOTEL_TRACES_EXPORTER=otlp\nOTEL_METRICS_EXPORTER=otlp     # or: prometheus → scrape endpoint instead of OTLP push\nOTEL_LOGS_EXPORTER=otlp\n# sampling is OTel-standard too:\nOTEL_TRACES_SAMPLER=parentbased_traceidratio\nOTEL_TRACES_SAMPLER_ARG=0.1\n","sh",[467,851,852,863,873,878,888,901,910,915,925],{"__ignoreMap":465},[470,853,854,857,860],{"class":472,"line":473},[470,855,856],{"class":780},"OTEL_SERVICE_NAME",[470,858,859],{"class":480},"=",[470,861,862],{"class":790},"shop\n",[470,864,865,868,870],{"class":472,"line":491},[470,866,867],{"class":780},"OTEL_EXPORTER_OTLP_ENDPOINT",[470,869,859],{"class":480},[470,871,872],{"class":790},"http:\u002F\u002Fcollector:4317\n",[470,874,875],{"class":472,"line":498},[470,876,877],{"class":599},"# per-signal overrides (default everywhere: otlp):\n",[470,879,880,883,885],{"class":472,"line":562},[470,881,882],{"class":780},"OTEL_TRACES_EXPORTER",[470,884,859],{"class":480},[470,886,887],{"class":790},"otlp\n",[470,889,890,893,895,898],{"class":472,"line":567},[470,891,892],{"class":780},"OTEL_METRICS_EXPORTER",[470,894,859],{"class":480},[470,896,897],{"class":790},"otlp",[470,899,900],{"class":599},"     # or: prometheus → scrape endpoint instead of OTLP push\n",[470,902,903,906,908],{"class":472,"line":603},[470,904,905],{"class":780},"OTEL_LOGS_EXPORTER",[470,907,859],{"class":480},[470,909,887],{"class":790},[470,911,912],{"class":472,"line":638},[470,913,914],{"class":599},"# sampling is OTel-standard too:\n",[470,916,917,920,922],{"class":472,"line":643},[470,918,919],{"class":780},"OTEL_TRACES_SAMPLER",[470,921,859],{"class":480},[470,923,924],{"class":790},"parentbased_traceidratio\n",[470,926,928,931,933],{"class":472,"line":927},9,[470,929,930],{"class":780},"OTEL_TRACES_SAMPLER_ARG",[470,932,859],{"class":480},[470,934,935],{"class":790},"0.1\n",[447,937,938,939,572,942,945,946,949,950,952,953,956],{},"In ",[680,940,941],{},"dev mode",[467,943,944],{},"OTEL_DEV_MODE=true",") no exporters are created at all: traces and metrics are no-ops, there is no OTLP log bridge, and logs go to the ",[451,947,948],{"href":184},"console handler",". No collector, no anything. One exception: when ",[467,951,730],{}," supplies an extra sink (in practice: ",[467,954,955],{},"SENTRY_DSN"," set in dev mode), a dev-only tracer provider is still built and spans go straight there, collector-free.",[455,958,960],{"id":959},"what-the-kit-instruments-on-its-own","What the kit instruments on its own",[447,962,963],{},"This is the \"detailed metrics\" story: you don't write span code, every layer of the kit arrives instrumented.",[965,966,967,983],"table",{},[968,969,970],"thead",{},[971,972,973,977,980],"tr",{},[974,975,976],"th",{},"Layer",[974,978,979],{},"Instrumentation",[974,981,982],{},"What you get",[984,985,986,1008,1023,1037,1063,1076],"tbody",{},[971,987,988,992,998],{},[989,990,991],"td",{},"HTTP (chi)",[989,993,994,997],{},[467,995,996],{},"otelhttp.NewHandler"," around the router",[989,999,1000,1003,1004,1007],{},[467,1001,1002],{},"http.server"," server spans + ",[467,1005,1006],{},"http.server.request.duration"," and friends, with standard semantic conventions",[971,1009,1010,1013,1020],{},[989,1011,1012],{},"PostgreSQL (pgx)",[989,1014,1015,1016,1019],{},"the ",[467,1017,1018],{},"otelpgx"," tracer on the pool",[989,1021,1022],{},"a span per query, with the SQL (trimmed span name) and timing",[971,1024,1025,1028,1034],{},[989,1026,1027],{},"PostgreSQL (bun)",[989,1029,1015,1030,1033],{},[467,1031,1032],{},"bunotel"," query hook",[989,1035,1036],{},"the same in bun projects, with formatted queries",[971,1038,1039,1042,1056],{},[989,1040,1041],{},"Queue (asynq)",[989,1043,1044,1045,1048,1049,1052,1053],{},"a producer span in ",[467,1046,1047],{},"Enqueue",", a consumer span in the worker; the ",[467,1050,1051],{},"Envelope"," carries ",[467,1054,1055],{},"traceparent",[989,1057,1058,1059,1062],{},"the trace ",[680,1060,1061],{},"crosses Valkey",": the listener's span sits inside the originating HTTP request's trace",[971,1064,1065,1067,1073],{},[989,1066,164],{},[989,1068,1015,1069,1072],{},[467,1070,1071],{},"otelaws"," middleware on the AWS SDK",[989,1074,1075],{},"a span per storage call",[971,1077,1078,1081,1086],{},[989,1079,1080],{},"Logs",[989,1082,1015,1083,1085],{},[467,1084,704],{}," bridge",[989,1087,1088],{},"every ctx-logged record exports with trace\u002Fspan IDs",[447,1090,1091,1092,1095],{},"Metrics are collected by the autoexport-built MeterProvider: OTLP push to the collector by default, or a Prometheus scrape endpoint with ",[467,1093,1094],{},"OTEL_METRICS_EXPORTER=prometheus",". For a Grafana dashboard, the HTTP layer's metrics (request duration histogram, active requests) are there immediately, without you writing a single line of measuring code.",[455,1097,1099],{"id":1098},"follow-the-order-a-single-trace","Follow the order: a single trace",[447,1101,1102,1103,1106,1107,1110],{},"The ",[451,1104,1105],{"href":41},"shop","'s ",[467,1108,1109],{},"POST \u002Fapi\u002Fv1\u002Fshop\u002Forders"," request looks like this in a trace viewer (Jaeger, Grafana Tempo, Sentry, any of them):",[460,1112,1117],{"className":1113,"code":1115,"language":1116,"meta":465},[1114],"language-text","POST \u002Fapi\u002Fv1\u002Fshop\u002Forders                        ← HTTP server span (chi middleware)\n├── INSERT INTO orders ...                      ← otelpgx, inside the transaction\n├── UPDATE inventory SET ...                    ← otelpgx\n├── INSERT INTO outbox ...                      ← otelpgx (the event commits with the transaction)\n└── task event:orderPlaced                      ← consumer span in the worker: the trace crossed the outbox and Valkey\n    └── enqueue listener:orderPlaced:sendOrderConfirmation   ← fan-out producer span\n        └── task listener:orderPlaced:sendOrderConfirmation  ← the listener runs here\n            └── (the listener's spans: DB, S3, SMTP, whatever its code does)\n","text",[467,1118,1115],{"__ignoreMap":465},[447,1120,1121,1122,1126,1127,1129,1130,1133,1134,1137,1138,1141,1142,1144],{},"The key is the queue ",[451,1123,1124],{"href":68},[467,1125,1051],{},": the dispatcher injects a W3C ",[467,1128,1055],{}," into it from the request context, the envelope survives the ",[451,1131,1132],{"href":73},"outbox table"," and Valkey, and the worker's consumer span unpacks and continues the trace. (The outbox relay's own producer span belongs to the relay's polling loop, not to this trace: the baton is the envelope itself.) From the HTTP request to the confirmation e-mail, ",[680,1135,1136],{},"a single trace ID",", exactly what the ",[451,1139,1140],{"href":41},"sample app","'s \"follow the order\" table promises. If anything fails along the way, the ",[451,1143,193],{"href":194}," event links to this trace.",[455,1146,1148],{"id":1147},"viewing-traces-locally","Viewing traces locally",[447,1150,1151],{},"In dev mode, tracing is a no-op by default, but there are two cheap paths when you want to see what the kit produces:",[1153,1154,1156,1161,1169,1173,1188,1229],"steps",{"level":1155},"4",[1157,1158,1160],"h4",{"id":1159},"the-fastest-dev-mode-sentry","The fastest: dev mode + Sentry",[447,1162,1163,1164,1166,1167,518],{},"Set a dev Sentry project's DSN alongside ",[467,1165,944],{},": the kit then builds a Sentry-only tracer provider, and spans land in Sentry's trace view without a collector. Details: ",[451,1168,193],{"href":194},[1157,1170,1172],{"id":1171},"the-full-picture-a-local-collector","The full picture: a local collector",[447,1174,1175,1176,1179,1180,1183,1184,1187],{},"The generated ",[467,1177,1178],{},"compose.yml"," has the ",[467,1181,1182],{},"otel-collector"," service commented out. Enable it, drop in the referenced ",[467,1185,1186],{},"deploy\u002Fotel-collector.yaml"," config (a minimal OTLP receiver + an exporter for your favorite backend, Jaeger, Tempo, anything), then:",[460,1189,1191],{"className":847,"code":1190,"language":849,"meta":465,"style":465},"OTEL_DEV_MODE=false OTEL_SERVICE_NAME=shop \\\nOTEL_EXPORTER_OTLP_ENDPOINT=http:\u002F\u002Flocalhost:4317 \\\ngo run .\u002Fcmd\u002Fshop\n",[467,1192,1193,1213,1218],{"__ignoreMap":465},[470,1194,1195,1198,1200,1203,1206,1208,1210],{"class":472,"line":473},[470,1196,1197],{"class":780},"OTEL_DEV_MODE",[470,1199,859],{"class":480},[470,1201,1202],{"class":790},"false",[470,1204,1205],{"class":780}," OTEL_SERVICE_NAME",[470,1207,859],{"class":480},[470,1209,1105],{"class":790},[470,1211,1212],{"class":484}," \\\n",[470,1214,1215],{"class":472,"line":491},[470,1216,1217],{"class":780},"OTEL_EXPORTER_OTLP_ENDPOINT=http:\u002F\u002Flocalhost:4317 \\\n",[470,1219,1220,1223,1226],{"class":472,"line":498},[470,1221,1222],{"class":780},"go ",[470,1224,1225],{"class":790},"run",[470,1227,1228],{"class":790}," .\u002Fcmd\u002Fshop\n",[447,1230,1231],{},"From there the service exports exactly as in production: logs included, over OTLP.",[447,1233,1234,1235,1237,1238,1241],{},"Start the worker binary with the same variables (and its own ",[467,1236,856],{},", e.g. ",[467,1239,1240],{},"shop-worker","), or you will only see the HTTP half of the \"follow the order\" trace.",[455,1243,1245],{"id":1244},"custom-spans-and-metrics","Custom spans and metrics",[447,1247,1248,1249,1252],{},"The kit's principle applies here too: ",[451,1250,1251],{"href":221},"centralize, don't abstract",". There is no kit wrapper around the tracing API: where a business-meaningful measuring point is needed, you call the stable OTel API directly:",[460,1254,1256],{"className":462,"code":1255,"language":464,"meta":465,"style":465},"import (\n    \"go.opentelemetry.io\u002Fotel\"\n    \"go.opentelemetry.io\u002Fotel\u002Fattribute\"\n)\n\nvar tracer = otel.Tracer(\"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\")\nvar meter = otel.Meter(\"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\")\n\nfunc (s *OrderService) PlaceOrder(ctx context.Context, in PlaceOrder) error {\n    ctx, span := tracer.Start(ctx, \"shop.place_order\")\n    defer span.End()\n    span.SetAttributes(attribute.Int(\"order.items\", len(in.Items)))\n\n    \u002F\u002F ... the span is automatically a child of the HTTP server span,\n    \u002F\u002F because you carry the same ctx onward\n}\n",[467,1257,1258,1265,1274,1283,1287,1291,1321,1347,1351,1393,1430,1447,1495,1500,1506,1512],{"__ignoreMap":465},[470,1259,1260,1262],{"class":472,"line":473},[470,1261,477],{"class":476},[470,1263,1264],{"class":480}," (\n",[470,1266,1267,1270,1272],{"class":472,"line":491},[470,1268,1269],{"class":480},"    \"",[470,1271,752],{"class":484},[470,1273,488],{"class":480},[470,1275,1276,1278,1281],{"class":472,"line":498},[470,1277,1269],{"class":480},[470,1279,1280],{"class":484},"go.opentelemetry.io\u002Fotel\u002Fattribute",[470,1282,488],{"class":480},[470,1284,1285],{"class":472,"line":562},[470,1286,559],{"class":480},[470,1288,1289],{"class":472,"line":567},[470,1290,495],{"emptyLinePlaceholder":494},[470,1292,1293,1296,1299,1301,1304,1306,1309,1311,1314,1317,1319],{"class":472,"line":603},[470,1294,1295],{"class":480},"var",[470,1297,1298],{"class":780}," tracer ",[470,1300,859],{"class":480},[470,1302,1303],{"class":780}," otel",[470,1305,518],{"class":480},[470,1307,1308],{"class":504},"Tracer",[470,1310,508],{"class":480},[470,1312,1313],{"class":480},"\"",[470,1315,1316],{"class":790},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop",[470,1318,1313],{"class":480},[470,1320,559],{"class":480},[470,1322,1323,1325,1328,1330,1332,1334,1337,1339,1341,1343,1345],{"class":472,"line":638},[470,1324,1295],{"class":480},[470,1326,1327],{"class":780}," meter ",[470,1329,859],{"class":480},[470,1331,1303],{"class":780},[470,1333,518],{"class":480},[470,1335,1336],{"class":504},"Meter",[470,1338,508],{"class":480},[470,1340,1313],{"class":480},[470,1342,1316],{"class":790},[470,1344,1313],{"class":480},[470,1346,559],{"class":480},[470,1348,1349],{"class":472,"line":643},[470,1350,495],{"emptyLinePlaceholder":494},[470,1352,1353,1355,1357,1360,1362,1365,1367,1370,1372,1374,1376,1378,1380,1382,1385,1387,1389,1391],{"class":472,"line":927},[470,1354,501],{"class":480},[470,1356,572],{"class":480},[470,1358,1359],{"class":511},"s ",[470,1361,578],{"class":480},[470,1363,1364],{"class":484},"OrderService",[470,1366,544],{"class":480},[470,1368,1369],{"class":504}," PlaceOrder",[470,1371,508],{"class":480},[470,1373,512],{"class":511},[470,1375,515],{"class":484},[470,1377,518],{"class":480},[470,1379,521],{"class":484},[470,1381,524],{"class":480},[470,1383,1384],{"class":511}," in",[470,1386,1369],{"class":484},[470,1388,544],{"class":480},[470,1390,556],{"class":555},[470,1392,775],{"class":480},[470,1394,1396,1399,1401,1404,1407,1410,1412,1415,1417,1419,1421,1423,1426,1428],{"class":472,"line":1395},10,[470,1397,1398],{"class":780},"    ctx",[470,1400,524],{"class":480},[470,1402,1403],{"class":780}," span ",[470,1405,1406],{"class":480},":=",[470,1408,1409],{"class":780}," tracer",[470,1411,518],{"class":480},[470,1413,1414],{"class":504},"Start",[470,1416,508],{"class":480},[470,1418,512],{"class":780},[470,1420,524],{"class":480},[470,1422,481],{"class":480},[470,1424,1425],{"class":790},"shop.place_order",[470,1427,1313],{"class":480},[470,1429,559],{"class":480},[470,1431,1433,1436,1439,1441,1444],{"class":472,"line":1432},11,[470,1434,1435],{"class":476},"    defer",[470,1437,1438],{"class":780}," span",[470,1440,518],{"class":480},[470,1442,1443],{"class":504},"End",[470,1445,1446],{"class":480},"()\n",[470,1448,1450,1453,1455,1458,1460,1463,1465,1468,1470,1472,1475,1477,1479,1482,1484,1487,1489,1492],{"class":472,"line":1449},12,[470,1451,1452],{"class":780},"    span",[470,1454,518],{"class":480},[470,1456,1457],{"class":504},"SetAttributes",[470,1459,508],{"class":480},[470,1461,1462],{"class":780},"attribute",[470,1464,518],{"class":480},[470,1466,1467],{"class":504},"Int",[470,1469,508],{"class":480},[470,1471,1313],{"class":480},[470,1473,1474],{"class":790},"order.items",[470,1476,1313],{"class":480},[470,1478,524],{"class":480},[470,1480,1481],{"class":504}," len",[470,1483,508],{"class":480},[470,1485,1486],{"class":780},"in",[470,1488,518],{"class":480},[470,1490,1491],{"class":780},"Items",[470,1493,1494],{"class":480},")))\n",[470,1496,1498],{"class":472,"line":1497},13,[470,1499,495],{"emptyLinePlaceholder":494},[470,1501,1503],{"class":472,"line":1502},14,[470,1504,1505],{"class":599},"    \u002F\u002F ... the span is automatically a child of the HTTP server span,\n",[470,1507,1509],{"class":472,"line":1508},15,[470,1510,1511],{"class":599},"    \u002F\u002F because you carry the same ctx onward\n",[470,1513,1515],{"class":472,"line":1514},16,[470,1516,833],{"class":480},[447,1518,1519,687,1522,1525,1526,1529,1530,1533],{},[467,1520,1521],{},"otel.Tracer",[467,1523,1524],{},"otel.Meter"," work off the global providers that ",[467,1527,1528],{},"Setup"," installed. In dev mode the same code is a no-op, no conditionals needed. For counters and histograms it is ",[467,1531,1532],{},"meter.Int64Counter(...)"," and friends, the same way. The upstream OTel documentation applies verbatim.",[1535,1536,1537,1538,1540,1541,1544,1545,1548],"warning",{},"Always pass your span's context (",[467,1539,512],{},") downward: to repository calls, to ",[467,1542,1543],{},"slog.*Context",", to the dispatcher. Parent-child relationships travel exclusively in the context; a call started with ",[467,1546,1547],{},"context.Background()"," breaks out of the trace.",[455,1550,1552],{"id":1551},"shutdown","Shutdown",[447,1554,1555,1558,1559,1562,1563,1566],{},[467,1556,1557],{},"Handle.Shutdown"," stops the providers in reverse order (logs first, since they may reference spans, traces last), and the chassis calls it at the ",[451,1560,1561],{"href":253},"very end of the lifecycle",", after all your closers. After a ",[467,1564,1565],{},"SIGTERM",", spans opened during shutdown still reach the collector.",[1568,1569,1570],"note",{},"An unreachable collector endpoint does not take the service down: the exporters retry in the background and eventually drop their batches; serving requests is unaffected. Telemetry is best-effort, never the price of availability.",[455,1572,1574],{"id":1573},"patterns-used","Patterns used",[674,1576,1577,1589],{},[677,1578,1579,1582,1583,1585,1586,518],{},[680,1580,1581],{},"Isolation layer"," around the pre-1.0 OTel log SDK (",[467,1584,550],{},"; application code never imports an OTel SDK package); see ",[451,1587,238],{"href":1588},"\u002Fen\u002Fconcepts\u002Fdesign-patterns#functional-options",[677,1590,1591,1594],{},[680,1592,1593],{},"LIFO shutdown via a closer chain",": logs stop first, traces last.",[447,1596,1597,1598,518],{},"OpenTelemetry's Go-specific documentation: ",[451,1599,1603],{"href":1600,"rel":1601},"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Flanguages\u002Fgo\u002Fgetting-started\u002F",[1602],"nofollow","opentelemetry.io\u002Fdocs\u002Flanguages\u002Fgo",[1605,1606,1607],"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 .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 .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 .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 .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}",{"title":465,"searchDepth":491,"depth":491,"links":1609},[1610,1611,1612,1613,1614,1615,1616,1617],{"id":457,"depth":491,"text":458},{"id":756,"depth":491,"text":757},{"id":959,"depth":491,"text":960},{"id":1098,"depth":491,"text":1099},{"id":1147,"depth":491,"text":1148},{"id":1244,"depth":491,"text":1245},{"id":1551,"depth":491,"text":1552},{"id":1573,"depth":491,"text":1574},"Traces, metrics and logs in one call, HTTP, database, queue and S3 instrumentation, configured via standard OTEL_* variables.","md",null,{},{"icon":191},{"title":188,"description":1618},"xRrlmYyQEYXwbDtm0vtQUAL01j7qzk3Z90SH4IQ0EAI",[1626,1628],{"title":183,"path":184,"stem":185,"description":1627,"icon":186,"children":-1},"Standard log\u002Fslog, composed, and a Monolog-format dev console with PHP-style stack traces.",{"title":193,"path":194,"stem":195,"description":1629,"icon":196,"children":-1},"Env-gated error reporting on top of OTel: with errs-code issue grouping and full trace linking.",1785445891136]