[{"data":1,"prerenderedAt":1946},["ShallowReactive",2],{"navigation_docs_en":3,"-en-errs-integration":441,"-en-errs-integration-surround":1941},[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":369,"body":443,"description":1934,"extension":1935,"links":1936,"meta":1937,"navigation":1938,"path":370,"seo":1939,"stem":371,"__hash__":1940},"docs_en\u002Fen\u002F5.errs\u002F3.integration.md",{"type":444,"value":445,"toc":1927},"minimark",[446,470,475,484,534,560,613,1076,1102,1105,1110,1140,1167,1171,1179,1677,1815,1844,1848,1883,1887,1923],[447,448,449,452,453,456,457,460,461,463,464,469],"p",{},[450,451,357],"code",{}," builds errors; it deliberately does not know about ",[450,454,455],{},"slog",", Sentry or HTTP. This page covers the three places something else picks up an ",[450,458,459],{},"*errs.Error"," and does something with it: the standard logger, Sentry, and a hand-rolled HTTP mapper for projects that want ",[450,462,357],{}," without pulling in ",[465,466,467],"a",{"href":391},[450,468,385],{},".",[471,472,474],"h2",{"id":473},"log-output","Log output",[447,476,477,479,480,483],{},[450,478,459],{}," implements ",[450,481,482],{},"slog.LogValuer",":",[485,486,491],"pre",{"className":487,"code":488,"language":489,"meta":490,"style":490},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func (e *Error) LogValue() slog.Value\n","go","",[450,492,493],{"__ignoreMap":490},[494,495,498,502,505,509,512,516,519,523,526,529,531],"span",{"class":496,"line":497},"line",1,[494,499,501],{"class":500},"sMK4o","func",[494,503,504],{"class":500}," (",[494,506,508],{"class":507},"sHdIc","e ",[494,510,511],{"class":500},"*",[494,513,515],{"class":514},"sBMFI","Error",[494,517,518],{"class":500},")",[494,520,522],{"class":521},"s2Zo4"," LogValue",[494,524,525],{"class":500},"()",[494,527,528],{"class":514}," slog",[494,530,469],{"class":500},[494,532,533],{"class":514},"Value\n",[447,535,536,537,540,541,547,548,553,554,556,557,559],{},"Passing an error to ",[450,538,539],{},"slog.Any(\"error\", err)"," emits a structured group, not one flattened string: the internal message, the code, the public message, the ",[465,542,544],{"href":543},"\u002Fen\u002Ferrs\u002Fapi#introspection-frames-fullframes-chain",[450,545,546],{},"Chain"," (one object per wrap level) and the ",[465,549,550],{"href":543},[450,551,552],{},"Frames"," (the full call stack from the point of origin). This happens automatically, with no per-call-site formatting, anywhere an ",[450,555,459],{}," reaches a ",[450,558,455],{}," call:",[485,561,563],{"className":487,"code":562,"language":489,"meta":490,"style":490},"slog.Error(\"request failed\", slog.Any(\"error\", err))\n",[450,564,565],{"__ignoreMap":490},[494,566,567,570,572,574,577,580,584,586,589,591,593,596,598,600,603,605,607,610],{"class":496,"line":497},[494,568,455],{"class":569},"sTEyZ",[494,571,469],{"class":500},[494,573,515],{"class":521},[494,575,576],{"class":500},"(",[494,578,579],{"class":500},"\"",[494,581,583],{"class":582},"sfazB","request failed",[494,585,579],{"class":500},[494,587,588],{"class":500},",",[494,590,528],{"class":569},[494,592,469],{"class":500},[494,594,595],{"class":521},"Any",[494,597,576],{"class":500},[494,599,579],{"class":500},[494,601,602],{"class":582},"error",[494,604,579],{"class":500},[494,606,588],{"class":500},[494,608,609],{"class":569}," err",[494,611,612],{"class":500},"))\n",[485,614,618],{"className":615,"code":616,"language":617,"meta":490,"style":490},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"msg\": \"request failed\",\n  \"error\": {\n    \"msg\": \"shop: place order: orders: decrement stock: connection refused\",\n    \"code\": \"shop_api_place_order_failed\",\n    \"public\": \"Placing the order failed, please try again later.\",\n    \"chain\": [\n      { \"msg\": \"shop: place order\", \"file\": \"service.go\", \"line\": 42, \"function\": \"service.(*Service).PlaceOrder\" },\n      { \"msg\": \"orders: decrement stock\", \"file\": \"orders.go\", \"line\": 31, \"function\": \"repository.(*Orders).DecrementStock\", \"meta\": { \"product_id\": \"prod_42\" } },\n      { \"msg\": \"connection refused\" }\n    ],\n    \"stack\": [\n      { \"file\": \"orders.go\", \"line\": 31, \"function\": \"repository.(*Orders).DecrementStock\" },\n      { \"file\": \"service.go\", \"line\": 42, \"function\": \"service.(*Service).PlaceOrder\" }\n    ]\n  }\n}\n","json",[450,619,620,625,649,663,684,704,725,740,814,917,940,946,960,1009,1058,1064,1070],{"__ignoreMap":490},[494,621,622],{"class":496,"line":497},[494,623,624],{"class":500},"{\n",[494,626,628,631,635,637,639,642,644,646],{"class":496,"line":627},2,[494,629,630],{"class":500},"  \"",[494,632,634],{"class":633},"spNyl","msg",[494,636,579],{"class":500},[494,638,483],{"class":500},[494,640,641],{"class":500}," \"",[494,643,583],{"class":582},[494,645,579],{"class":500},[494,647,648],{"class":500},",\n",[494,650,652,654,656,658,660],{"class":496,"line":651},3,[494,653,630],{"class":500},[494,655,602],{"class":633},[494,657,579],{"class":500},[494,659,483],{"class":500},[494,661,662],{"class":500}," {\n",[494,664,666,669,671,673,675,677,680,682],{"class":496,"line":665},4,[494,667,668],{"class":500},"    \"",[494,670,634],{"class":514},[494,672,579],{"class":500},[494,674,483],{"class":500},[494,676,641],{"class":500},[494,678,679],{"class":582},"shop: place order: orders: decrement stock: connection refused",[494,681,579],{"class":500},[494,683,648],{"class":500},[494,685,687,689,691,693,695,697,700,702],{"class":496,"line":686},5,[494,688,668],{"class":500},[494,690,450],{"class":514},[494,692,579],{"class":500},[494,694,483],{"class":500},[494,696,641],{"class":500},[494,698,699],{"class":582},"shop_api_place_order_failed",[494,701,579],{"class":500},[494,703,648],{"class":500},[494,705,707,709,712,714,716,718,721,723],{"class":496,"line":706},6,[494,708,668],{"class":500},[494,710,711],{"class":514},"public",[494,713,579],{"class":500},[494,715,483],{"class":500},[494,717,641],{"class":500},[494,719,720],{"class":582},"Placing the order failed, please try again later.",[494,722,579],{"class":500},[494,724,648],{"class":500},[494,726,728,730,733,735,737],{"class":496,"line":727},7,[494,729,668],{"class":500},[494,731,732],{"class":514},"chain",[494,734,579],{"class":500},[494,736,483],{"class":500},[494,738,739],{"class":500}," [\n",[494,741,743,746,748,751,753,755,757,760,762,764,766,769,771,773,775,778,780,782,784,786,788,790,793,795,797,800,802,804,806,809,811],{"class":496,"line":742},8,[494,744,745],{"class":500},"      {",[494,747,641],{"class":500},[494,749,634],{"class":750},"sbssI",[494,752,579],{"class":500},[494,754,483],{"class":500},[494,756,641],{"class":500},[494,758,759],{"class":582},"shop: place order",[494,761,579],{"class":500},[494,763,588],{"class":500},[494,765,641],{"class":500},[494,767,768],{"class":750},"file",[494,770,579],{"class":500},[494,772,483],{"class":500},[494,774,641],{"class":500},[494,776,777],{"class":582},"service.go",[494,779,579],{"class":500},[494,781,588],{"class":500},[494,783,641],{"class":500},[494,785,496],{"class":750},[494,787,579],{"class":500},[494,789,483],{"class":500},[494,791,792],{"class":750}," 42",[494,794,588],{"class":500},[494,796,641],{"class":500},[494,798,799],{"class":750},"function",[494,801,579],{"class":500},[494,803,483],{"class":500},[494,805,641],{"class":500},[494,807,808],{"class":582},"service.(*Service).PlaceOrder",[494,810,579],{"class":500},[494,812,813],{"class":500}," },\n",[494,815,817,819,821,823,825,827,829,832,834,836,838,840,842,844,846,849,851,853,855,857,859,861,864,866,868,870,872,874,876,879,881,883,885,888,890,892,895,897,901,903,905,907,910,912,915],{"class":496,"line":816},9,[494,818,745],{"class":500},[494,820,641],{"class":500},[494,822,634],{"class":750},[494,824,579],{"class":500},[494,826,483],{"class":500},[494,828,641],{"class":500},[494,830,831],{"class":582},"orders: decrement stock",[494,833,579],{"class":500},[494,835,588],{"class":500},[494,837,641],{"class":500},[494,839,768],{"class":750},[494,841,579],{"class":500},[494,843,483],{"class":500},[494,845,641],{"class":500},[494,847,848],{"class":582},"orders.go",[494,850,579],{"class":500},[494,852,588],{"class":500},[494,854,641],{"class":500},[494,856,496],{"class":750},[494,858,579],{"class":500},[494,860,483],{"class":500},[494,862,863],{"class":750}," 31",[494,865,588],{"class":500},[494,867,641],{"class":500},[494,869,799],{"class":750},[494,871,579],{"class":500},[494,873,483],{"class":500},[494,875,641],{"class":500},[494,877,878],{"class":582},"repository.(*Orders).DecrementStock",[494,880,579],{"class":500},[494,882,588],{"class":500},[494,884,641],{"class":500},[494,886,887],{"class":750},"meta",[494,889,579],{"class":500},[494,891,483],{"class":500},[494,893,894],{"class":500}," {",[494,896,641],{"class":500},[494,898,900],{"class":899},"swJcz","product_id",[494,902,579],{"class":500},[494,904,483],{"class":500},[494,906,641],{"class":500},[494,908,909],{"class":582},"prod_42",[494,911,579],{"class":500},[494,913,914],{"class":500}," }",[494,916,813],{"class":500},[494,918,920,922,924,926,928,930,932,935,937],{"class":496,"line":919},10,[494,921,745],{"class":500},[494,923,641],{"class":500},[494,925,634],{"class":750},[494,927,579],{"class":500},[494,929,483],{"class":500},[494,931,641],{"class":500},[494,933,934],{"class":582},"connection refused",[494,936,579],{"class":500},[494,938,939],{"class":500}," }\n",[494,941,943],{"class":496,"line":942},11,[494,944,945],{"class":500},"    ],\n",[494,947,949,951,954,956,958],{"class":496,"line":948},12,[494,950,668],{"class":500},[494,952,953],{"class":514},"stack",[494,955,579],{"class":500},[494,957,483],{"class":500},[494,959,739],{"class":500},[494,961,963,965,967,969,971,973,975,977,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007],{"class":496,"line":962},13,[494,964,745],{"class":500},[494,966,641],{"class":500},[494,968,768],{"class":750},[494,970,579],{"class":500},[494,972,483],{"class":500},[494,974,641],{"class":500},[494,976,848],{"class":582},[494,978,579],{"class":500},[494,980,588],{"class":500},[494,982,641],{"class":500},[494,984,496],{"class":750},[494,986,579],{"class":500},[494,988,483],{"class":500},[494,990,863],{"class":750},[494,992,588],{"class":500},[494,994,641],{"class":500},[494,996,799],{"class":750},[494,998,579],{"class":500},[494,1000,483],{"class":500},[494,1002,641],{"class":500},[494,1004,878],{"class":582},[494,1006,579],{"class":500},[494,1008,813],{"class":500},[494,1010,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052,1054,1056],{"class":496,"line":1011},14,[494,1013,745],{"class":500},[494,1015,641],{"class":500},[494,1017,768],{"class":750},[494,1019,579],{"class":500},[494,1021,483],{"class":500},[494,1023,641],{"class":500},[494,1025,777],{"class":582},[494,1027,579],{"class":500},[494,1029,588],{"class":500},[494,1031,641],{"class":500},[494,1033,496],{"class":750},[494,1035,579],{"class":500},[494,1037,483],{"class":500},[494,1039,792],{"class":750},[494,1041,588],{"class":500},[494,1043,641],{"class":500},[494,1045,799],{"class":750},[494,1047,579],{"class":500},[494,1049,483],{"class":500},[494,1051,641],{"class":500},[494,1053,808],{"class":582},[494,1055,579],{"class":500},[494,1057,939],{"class":500},[494,1059,1061],{"class":496,"line":1060},15,[494,1062,1063],{"class":500},"    ]\n",[494,1065,1067],{"class":496,"line":1066},16,[494,1068,1069],{"class":500},"  }\n",[494,1071,1073],{"class":496,"line":1072},17,[494,1074,1075],{"class":500},"}\n",[447,1077,1078,1079,1082,1083,1085,1086,1088,1089,1091,1092,1095,1096,1098,1099,1101],{},"One pitfall to avoid: ",[450,1080,1081],{},"LogValue"," only fires when ",[450,1084,455],{}," actually receives an ",[450,1087,602],{},"-typed value carrying an ",[450,1090,459],{},". If you call ",[450,1093,1094],{},"err.Error()"," first and log the resulting string, you get exactly that: a flat string, no structure. Always pass the error itself (",[450,1097,539],{},"), never its rendered message. The ",[465,1100,183],{"href":184}," page covers the rest of the logging setup, the console\u002FJSON handlers and how this structured group looks in each.",[471,1103,193],{"id":1104},"sentry",[447,1106,1107,1109],{},[450,1108,459],{}," exposes the one method sentry-go looks for via reflection when building an exception's stack frames:",[485,1111,1113],{"className":487,"code":1112,"language":489,"meta":490,"style":490},"func (e *Error) StackTrace() []uintptr\n",[450,1114,1115],{"__ignoreMap":490},[494,1116,1117,1119,1121,1123,1125,1127,1129,1132,1134,1137],{"class":496,"line":497},[494,1118,501],{"class":500},[494,1120,504],{"class":500},[494,1122,508],{"class":507},[494,1124,511],{"class":500},[494,1126,515],{"class":514},[494,1128,518],{"class":500},[494,1130,1131],{"class":521}," StackTrace",[494,1133,525],{"class":500},[494,1135,1136],{"class":500}," []",[494,1138,1139],{"class":633},"uintptr\n",[447,1141,1142,1143,1145,1146,1151,1152,1155,1156,1159,1160,1166],{},"Any Sentry integration that accepts a plain ",[450,1144,602],{}," and checks for this method (as ",[465,1147,1148],{"href":194},[450,1149,1150],{},"telemetry\u002Fsentryx"," does) gets an accurate stack with no extra wiring: no manual ",[450,1153,1154],{},"sentry.NewStacktrace()"," call, no frame-skipping arithmetic. The error's ",[450,1157,1158],{},"Code"," (when set, typically via ",[465,1161,1163],{"href":1162},"\u002Fen\u002Ferrs\u002Fapi#errsdefine-named-failure-modes",[450,1164,1165],{},"errs.Define",") doubles as a stable Sentry fingerprint: retitling the exception with the code before it's sent means one failure mode groups into one Sentry issue regardless of how the message text is worded at each wrap site, or how many different call sites produce it.",[471,1168,1170],{"id":1169},"a-minimal-nethttp-mapper-without-the-kit-or-httperr","A minimal net\u002Fhttp mapper without the kit or httperr",[447,1172,1173,1175,1176,1178],{},[450,1174,385],{}," exists because that mapping, done properly (content negotiation, RFC 9457 shape, validation errors, dev-mode gating), is more than a few lines. But if you only want ",[450,1177,357],{},"'s stack\u002Fcode\u002Fpublic-message model and don't want the extra dependency, the minimal version is genuinely small:",[485,1180,1183],{"className":487,"code":1181,"filename":1182,"language":489,"meta":490,"style":490},"package errmap\n\nimport (\n    \"encoding\u002Fjson\"\n    \"errors\"\n    \"log\u002Fslog\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fgp-system\u002Ferrs\"\n)\n\nfunc Write(w http.ResponseWriter, r *http.Request, err error) {\n    status := errs.StatusOf(err)\n    if status == 0 {\n        status = http.StatusInternalServerError\n    }\n\n    detail := errs.PublicOf(err)\n    if status >= 500 {\n        slog.ErrorContext(r.Context(), \"request failed\", slog.Any(\"error\", err))\n        if detail == \"\" {\n            detail = \"Internal server error.\"\n        }\n    }\n\n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    w.WriteHeader(status)\n    _ = json.NewEncoder(w).Encode(map[string]any{\n        \"status\": status,\n        \"detail\": detail,\n        \"code\":   errs.CodeOf(err),\n    })\n}\n","errmap\u002Ferrmap.go",[450,1184,1185,1193,1199,1208,1218,1227,1236,1245,1249,1258,1263,1267,1314,1337,1353,1368,1373,1377,1398,1413,1465,1481,1496,1502,1507,1512,1549,1566,1606,1623,1640,1666,1672],{"__ignoreMap":490},[494,1186,1187,1190],{"class":496,"line":497},[494,1188,1189],{"class":500},"package",[494,1191,1192],{"class":514}," errmap\n",[494,1194,1195],{"class":496,"line":627},[494,1196,1198],{"emptyLinePlaceholder":1197},true,"\n",[494,1200,1201,1205],{"class":496,"line":651},[494,1202,1204],{"class":1203},"s7zQu","import",[494,1206,1207],{"class":500}," (\n",[494,1209,1210,1212,1215],{"class":496,"line":665},[494,1211,668],{"class":500},[494,1213,1214],{"class":514},"encoding\u002Fjson",[494,1216,1217],{"class":500},"\"\n",[494,1219,1220,1222,1225],{"class":496,"line":686},[494,1221,668],{"class":500},[494,1223,1224],{"class":514},"errors",[494,1226,1217],{"class":500},[494,1228,1229,1231,1234],{"class":496,"line":706},[494,1230,668],{"class":500},[494,1232,1233],{"class":514},"log\u002Fslog",[494,1235,1217],{"class":500},[494,1237,1238,1240,1243],{"class":496,"line":727},[494,1239,668],{"class":500},[494,1241,1242],{"class":514},"net\u002Fhttp",[494,1244,1217],{"class":500},[494,1246,1247],{"class":496,"line":742},[494,1248,1198],{"emptyLinePlaceholder":1197},[494,1250,1251,1253,1256],{"class":496,"line":816},[494,1252,668],{"class":500},[494,1254,1255],{"class":514},"github.com\u002Fgp-system\u002Ferrs",[494,1257,1217],{"class":500},[494,1259,1260],{"class":496,"line":919},[494,1261,1262],{"class":500},")\n",[494,1264,1265],{"class":496,"line":942},[494,1266,1198],{"emptyLinePlaceholder":1197},[494,1268,1269,1271,1274,1276,1279,1282,1284,1287,1289,1292,1295,1298,1300,1303,1305,1307,1310,1312],{"class":496,"line":948},[494,1270,501],{"class":500},[494,1272,1273],{"class":521}," Write",[494,1275,576],{"class":500},[494,1277,1278],{"class":507},"w",[494,1280,1281],{"class":514}," http",[494,1283,469],{"class":500},[494,1285,1286],{"class":514},"ResponseWriter",[494,1288,588],{"class":500},[494,1290,1291],{"class":507}," r",[494,1293,1294],{"class":500}," *",[494,1296,1297],{"class":514},"http",[494,1299,469],{"class":500},[494,1301,1302],{"class":514},"Request",[494,1304,588],{"class":500},[494,1306,609],{"class":507},[494,1308,1309],{"class":633}," error",[494,1311,518],{"class":500},[494,1313,662],{"class":500},[494,1315,1316,1319,1322,1325,1327,1330,1332,1335],{"class":496,"line":962},[494,1317,1318],{"class":569},"    status ",[494,1320,1321],{"class":500},":=",[494,1323,1324],{"class":569}," errs",[494,1326,469],{"class":500},[494,1328,1329],{"class":521},"StatusOf",[494,1331,576],{"class":500},[494,1333,1334],{"class":569},"err",[494,1336,1262],{"class":500},[494,1338,1339,1342,1345,1348,1351],{"class":496,"line":1011},[494,1340,1341],{"class":1203},"    if",[494,1343,1344],{"class":569}," status ",[494,1346,1347],{"class":500},"==",[494,1349,1350],{"class":750}," 0",[494,1352,662],{"class":500},[494,1354,1355,1358,1361,1363,1365],{"class":496,"line":1060},[494,1356,1357],{"class":569},"        status ",[494,1359,1360],{"class":500},"=",[494,1362,1281],{"class":569},[494,1364,469],{"class":500},[494,1366,1367],{"class":569},"StatusInternalServerError\n",[494,1369,1370],{"class":496,"line":1066},[494,1371,1372],{"class":500},"    }\n",[494,1374,1375],{"class":496,"line":1072},[494,1376,1198],{"emptyLinePlaceholder":1197},[494,1378,1380,1383,1385,1387,1389,1392,1394,1396],{"class":496,"line":1379},18,[494,1381,1382],{"class":569},"    detail ",[494,1384,1321],{"class":500},[494,1386,1324],{"class":569},[494,1388,469],{"class":500},[494,1390,1391],{"class":521},"PublicOf",[494,1393,576],{"class":500},[494,1395,1334],{"class":569},[494,1397,1262],{"class":500},[494,1399,1401,1403,1405,1408,1411],{"class":496,"line":1400},19,[494,1402,1341],{"class":1203},[494,1404,1344],{"class":569},[494,1406,1407],{"class":500},">=",[494,1409,1410],{"class":750}," 500",[494,1412,662],{"class":500},[494,1414,1416,1419,1421,1424,1426,1429,1431,1434,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463],{"class":496,"line":1415},20,[494,1417,1418],{"class":569},"        slog",[494,1420,469],{"class":500},[494,1422,1423],{"class":521},"ErrorContext",[494,1425,576],{"class":500},[494,1427,1428],{"class":569},"r",[494,1430,469],{"class":500},[494,1432,1433],{"class":521},"Context",[494,1435,1436],{"class":500},"(),",[494,1438,641],{"class":500},[494,1440,583],{"class":582},[494,1442,579],{"class":500},[494,1444,588],{"class":500},[494,1446,528],{"class":569},[494,1448,469],{"class":500},[494,1450,595],{"class":521},[494,1452,576],{"class":500},[494,1454,579],{"class":500},[494,1456,602],{"class":582},[494,1458,579],{"class":500},[494,1460,588],{"class":500},[494,1462,609],{"class":569},[494,1464,612],{"class":500},[494,1466,1468,1471,1474,1476,1479],{"class":496,"line":1467},21,[494,1469,1470],{"class":1203},"        if",[494,1472,1473],{"class":569}," detail ",[494,1475,1347],{"class":500},[494,1477,1478],{"class":500}," \"\"",[494,1480,662],{"class":500},[494,1482,1484,1487,1489,1491,1494],{"class":496,"line":1483},22,[494,1485,1486],{"class":569},"            detail ",[494,1488,1360],{"class":500},[494,1490,641],{"class":500},[494,1492,1493],{"class":582},"Internal server error.",[494,1495,1217],{"class":500},[494,1497,1499],{"class":496,"line":1498},23,[494,1500,1501],{"class":500},"        }\n",[494,1503,1505],{"class":496,"line":1504},24,[494,1506,1372],{"class":500},[494,1508,1510],{"class":496,"line":1509},25,[494,1511,1198],{"emptyLinePlaceholder":1197},[494,1513,1515,1518,1520,1523,1526,1529,1531,1533,1536,1538,1540,1542,1545,1547],{"class":496,"line":1514},26,[494,1516,1517],{"class":569},"    w",[494,1519,469],{"class":500},[494,1521,1522],{"class":521},"Header",[494,1524,1525],{"class":500},"().",[494,1527,1528],{"class":521},"Set",[494,1530,576],{"class":500},[494,1532,579],{"class":500},[494,1534,1535],{"class":582},"Content-Type",[494,1537,579],{"class":500},[494,1539,588],{"class":500},[494,1541,641],{"class":500},[494,1543,1544],{"class":582},"application\u002Fjson",[494,1546,579],{"class":500},[494,1548,1262],{"class":500},[494,1550,1552,1554,1556,1559,1561,1564],{"class":496,"line":1551},27,[494,1553,1517],{"class":569},[494,1555,469],{"class":500},[494,1557,1558],{"class":521},"WriteHeader",[494,1560,576],{"class":500},[494,1562,1563],{"class":569},"status",[494,1565,1262],{"class":500},[494,1567,1569,1572,1574,1577,1579,1582,1584,1586,1589,1592,1595,1598,1601,1604],{"class":496,"line":1568},28,[494,1570,1571],{"class":569},"    _ ",[494,1573,1360],{"class":500},[494,1575,1576],{"class":569}," json",[494,1578,469],{"class":500},[494,1580,1581],{"class":521},"NewEncoder",[494,1583,576],{"class":500},[494,1585,1278],{"class":569},[494,1587,1588],{"class":500},").",[494,1590,1591],{"class":521},"Encode",[494,1593,1594],{"class":500},"(map[",[494,1596,1597],{"class":633},"string",[494,1599,1600],{"class":500},"]",[494,1602,1603],{"class":514},"any",[494,1605,624],{"class":500},[494,1607,1609,1612,1614,1616,1618,1621],{"class":496,"line":1608},29,[494,1610,1611],{"class":500},"        \"",[494,1613,1563],{"class":582},[494,1615,579],{"class":500},[494,1617,483],{"class":500},[494,1619,1620],{"class":569}," status",[494,1622,648],{"class":500},[494,1624,1626,1628,1631,1633,1635,1638],{"class":496,"line":1625},30,[494,1627,1611],{"class":500},[494,1629,1630],{"class":582},"detail",[494,1632,579],{"class":500},[494,1634,483],{"class":500},[494,1636,1637],{"class":569}," detail",[494,1639,648],{"class":500},[494,1641,1643,1645,1647,1649,1651,1654,1656,1659,1661,1663],{"class":496,"line":1642},31,[494,1644,1611],{"class":500},[494,1646,450],{"class":582},[494,1648,579],{"class":500},[494,1650,483],{"class":500},[494,1652,1653],{"class":569},"   errs",[494,1655,469],{"class":500},[494,1657,1658],{"class":521},"CodeOf",[494,1660,576],{"class":500},[494,1662,1334],{"class":569},[494,1664,1665],{"class":500},"),\n",[494,1667,1669],{"class":496,"line":1668},32,[494,1670,1671],{"class":500},"    })\n",[494,1673,1675],{"class":496,"line":1674},33,[494,1676,1075],{"class":500},[485,1678,1681],{"className":487,"code":1679,"filename":1680,"language":489,"meta":490,"style":490},"func placeOrder(w http.ResponseWriter, r *http.Request) {\n    if err := svc.PlaceOrder(r.Context(), input); err != nil {\n        errmap.Write(w, r, err)\n        return\n    }\n    w.WriteHeader(http.StatusCreated)\n}\n","main.go",[450,1682,1683,1716,1759,1783,1788,1792,1811],{"__ignoreMap":490},[494,1684,1685,1687,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714],{"class":496,"line":497},[494,1686,501],{"class":500},[494,1688,1689],{"class":521}," placeOrder",[494,1691,576],{"class":500},[494,1693,1278],{"class":507},[494,1695,1281],{"class":514},[494,1697,469],{"class":500},[494,1699,1286],{"class":514},[494,1701,588],{"class":500},[494,1703,1291],{"class":507},[494,1705,1294],{"class":500},[494,1707,1297],{"class":514},[494,1709,469],{"class":500},[494,1711,1302],{"class":514},[494,1713,518],{"class":500},[494,1715,662],{"class":500},[494,1717,1718,1720,1723,1725,1728,1730,1733,1735,1737,1739,1741,1743,1746,1749,1751,1754,1757],{"class":496,"line":627},[494,1719,1341],{"class":1203},[494,1721,1722],{"class":569}," err ",[494,1724,1321],{"class":500},[494,1726,1727],{"class":569}," svc",[494,1729,469],{"class":500},[494,1731,1732],{"class":521},"PlaceOrder",[494,1734,576],{"class":500},[494,1736,1428],{"class":569},[494,1738,469],{"class":500},[494,1740,1433],{"class":521},[494,1742,1436],{"class":500},[494,1744,1745],{"class":569}," input",[494,1747,1748],{"class":500},");",[494,1750,1722],{"class":569},[494,1752,1753],{"class":500},"!=",[494,1755,1756],{"class":500}," nil",[494,1758,662],{"class":500},[494,1760,1761,1764,1766,1769,1771,1773,1775,1777,1779,1781],{"class":496,"line":651},[494,1762,1763],{"class":569},"        errmap",[494,1765,469],{"class":500},[494,1767,1768],{"class":521},"Write",[494,1770,576],{"class":500},[494,1772,1278],{"class":569},[494,1774,588],{"class":500},[494,1776,1291],{"class":569},[494,1778,588],{"class":500},[494,1780,609],{"class":569},[494,1782,1262],{"class":500},[494,1784,1785],{"class":496,"line":665},[494,1786,1787],{"class":1203},"        return\n",[494,1789,1790],{"class":496,"line":686},[494,1791,1372],{"class":500},[494,1793,1794,1796,1798,1800,1802,1804,1806,1809],{"class":496,"line":706},[494,1795,1517],{"class":569},[494,1797,469],{"class":500},[494,1799,1558],{"class":521},[494,1801,576],{"class":500},[494,1803,1297],{"class":569},[494,1805,469],{"class":500},[494,1807,1808],{"class":569},"StatusCreated",[494,1810,1262],{"class":500},[494,1812,1813],{"class":496,"line":727},[494,1814,1075],{"class":500},[447,1816,1817,1818,1820,1821,1823,1824,1827,1828,1830,1831,1835,1836,1827,1839,1827,1841,1843],{},"This is deliberately not RFC 9457, has no validation-error shape and no dev-mode detail gating: it exists to show that ",[450,1819,357],{}," imposes no framework on you, not as a recommended alternative to ",[450,1822,385],{}," in a real project. The moment you want the RFC 9457 shape, per-field validation errors or the ",[450,1825,1826],{},"Stack","\u002F",[450,1829,546],{}," dev-mode extension members, reach for ",[465,1832,1833],{"href":391},[450,1834,385],{},": the exact same ",[450,1837,1838],{},"errs.StatusOf",[450,1840,1391],{},[450,1842,1658],{}," calls back this hand-rolled version, just with more of the surrounding machinery already built.",[471,1845,1847],{"id":1846},"with-the-kit","With the kit",[447,1849,1850,1851,1856,1857,1862,1863,1827,1865,1868,1869,1871,1872,1874,1875,1874,1877,1879,1880,1882],{},"A generated gpsystem project never calls the accessors above directly: ",[465,1852,1853],{"href":395},[450,1854,1855],{},"httperr.WriteError"," does, wired into the generated server's error hooks via ",[465,1858,1859],{"href":258},[450,1860,1861],{},"server",". You write ",[450,1864,1165],{},[450,1866,1867],{},"errs.Wrap"," in your services and repositories exactly as shown here and on the ",[465,1870,365],{"href":366}," page; from there, ",[450,1873,357],{}," → ",[450,1876,385],{},[450,1878,455],{},"\u002FSentry is the wiring ",[465,1881,224],{"href":225}," walks end to end.",[471,1884,1886],{"id":1885},"related-pages","Related pages",[1888,1889,1890,1897,1906,1914],"ul",{},[1891,1892,1893,1896],"li",{},[465,1894,1895],{"href":366},"errs: API",": the full constructor\u002Fattribute\u002Faccessor reference.",[1891,1898,1899,1902,1903,1905],{},[465,1900,1901],{"href":391},"httperr: Overview"," and ",[465,1904,394],{"href":395},": the RFC 9457 renderer built on top of this.",[1891,1907,1908,1910,1911,1913],{},[465,1909,183],{"href":184},": the console\u002FJSON handlers ",[450,1912,1081],{}," output feeds.",[1891,1915,1916,1918,1919,1922],{},[465,1917,193],{"href":194},": the full Sentry integration, ",[450,1920,1921],{},"StackTrace()"," and code-based fingerprinting.",[1924,1925,1926],"style",{},"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 .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 .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}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}",{"title":490,"searchDepth":627,"depth":627,"links":1928},[1929,1930,1931,1932,1933],{"id":473,"depth":627,"text":474},{"id":1104,"depth":627,"text":193},{"id":1169,"depth":627,"text":1170},{"id":1846,"depth":627,"text":1847},{"id":1885,"depth":627,"text":1886},"Wiring errs into logging, Sentry and plain net\u002Fhttp handlers.","md",null,{},{"icon":227},{"title":369,"description":1934},"GDa1LnDsigYMwq2mcUDZWVzXLgZa8CIfIDlW4QWYUJQ",[1942,1944],{"title":365,"path":366,"stem":367,"description":1943,"children":-1},"[object Object]",{"title":52,"path":378,"stem":379,"description":1945,"icon":231,"children":-1},"Typed environment configuration loading with struct tags.",1785445903920]