[{"data":1,"prerenderedAt":690},["ShallowReactive",2],{"fougere:post.list:{}":3,"reference:\u002Freference\u002Fpackages\u002Fobservability":6,"reference-pages":468},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":19,"extension":460,"file":461,"meta":462,"navigation":463,"path":464,"seo":465,"stem":466,"__hash__":467},"reference\u002Freference\u002Fpackages\u002Fobservability.md","@fougere\u002Fobservability",{"type":10,"value":11,"toc":455},"minimark",[12,16,20,25,100,178,193,198,202,324,328,335,451],[13,14,8],"h1",{"id":15},"fougereobservability",[17,18,19],"p",{},"Optional observability for Fougere: one span per operation, W3C Trace Context across any transport.",[21,22,24],"h2",{"id":23},"use-it","Use it",[26,27,31,57,72,86],"code-group",{"className":28,"sync":30},[29],"managers","pm",[32,33,39],"pre",{"className":34,"code":35,"filename":36,"language":37,"meta":38,"style":38},"language-bash shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","npm install @fougere\u002Fobservability\n","npm","bash","",[40,41,42],"code",{"__ignoreMap":38},[43,44,47,50,54],"span",{"class":45,"line":46},"line",1,[43,48,36],{"class":49},"sV8pK",[43,51,53],{"class":52},"sN-8n"," install",[43,55,56],{"class":52}," @fougere\u002Fobservability\n",[32,58,61],{"className":34,"code":59,"filename":60,"language":37,"meta":38,"style":38},"pnpm add @fougere\u002Fobservability\n","pnpm",[40,62,63],{"__ignoreMap":38},[43,64,65,67,70],{"class":45,"line":46},[43,66,60],{"class":49},[43,68,69],{"class":52}," add",[43,71,56],{"class":52},[32,73,76],{"className":34,"code":74,"filename":75,"language":37,"meta":38,"style":38},"bun add @fougere\u002Fobservability\n","bun",[40,77,78],{"__ignoreMap":38},[43,79,80,82,84],{"class":45,"line":46},[43,81,75],{"class":49},[43,83,69],{"class":52},[43,85,56],{"class":52},[32,87,90],{"className":34,"code":88,"filename":89,"language":37,"meta":38,"style":38},"yarn add @fougere\u002Fobservability\n","yarn",[40,91,92],{"__ignoreMap":38},[43,93,94,96,98],{"class":45,"line":46},[43,95,89],{"class":49},[43,97,69],{"class":52},[43,99,56],{"class":52},[32,101,105],{"className":102,"code":103,"language":104,"meta":38,"style":38},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F fougere.config.ts\nexport default defineFougere({\n  fronds: { '@fougere\u002Fobservability': {} },\n});\n","ts",[40,106,107,113,135,166],{"__ignoreMap":38},[43,108,109],{"class":45,"line":46},[43,110,112],{"class":111},"skXKP","\u002F\u002F fougere.config.ts\n",[43,114,116,120,123,127,131],{"class":45,"line":115},2,[43,117,119],{"class":118},"sK6XW","export",[43,121,122],{"class":118}," default",[43,124,126],{"class":125},"s4mR9"," defineFougere",[43,128,130],{"class":129},"srlTG","(",[43,132,134],{"class":133},"s15xx","{\n",[43,136,138,142,145,148,152,155,158,160,163],{"class":45,"line":137},3,[43,139,141],{"class":140},"sHtqg","  fronds",[43,143,144],{"class":133},":",[43,146,147],{"class":133}," {",[43,149,151],{"class":150},"sDDC1"," '",[43,153,8],{"class":154},"sK7Y8",[43,156,157],{"class":150},"'",[43,159,144],{"class":133},[43,161,162],{"class":133}," {}",[43,164,165],{"class":133}," },\n",[43,167,169,172,175],{"class":45,"line":168},4,[43,170,171],{"class":133},"}",[43,173,174],{"class":129},")",[43,176,177],{"class":133},";\n",[17,179,180,181,184,185,188,189,192],{},"The key names the package, and every process that reads the config calls its ",[40,182,183],{},"observability()"," export and rises with it. Options that are more than a word go where the extension is built — in a frond's ",[40,186,187],{},"extensions\u002F",", or in ",[40,190,191],{},"createApp({ extensions })",".",[17,194,195,196],{},"Entries: ",[40,197,8],{},[21,199,201],{"id":200},"what-you-import","What you import",[203,204,205,217],"table",{},[206,207,208],"thead",{},[209,210,211,215],"tr",{},[212,213,214],"th",{},"name",[212,216],{},[218,219,220,231,240,250,263,273,283,292,305,314],"tbody",{},[209,221,222,228],{},[223,224,225],"td",{},[40,226,227],{},"currentSpan",[223,229,230],{},"The step running here and now. The step running right now, if any.",[209,232,233,238],{},[223,234,235],{},[40,236,237],{},"activeCalls",[223,239],{},[209,241,242,247],{},[223,243,244],{},[40,245,246],{},"flushTelemetry",[223,248,249],{},"Send what is buffered, now.",[209,251,252,257],{},[223,253,254],{},[40,255,256],{},"registerFlush",[223,258,259,260,192],{},"Declare an exporter's flush, and answer the way to withdraw it — like ",[40,261,262],{},"onSpan",[209,264,265,270],{},[223,266,267],{},[40,268,269],{},"tracing",[223,271,272],{},"The tracer of one app, handed who takes the spans it finishes.",[209,274,275,280],{},[223,276,277],{},[40,278,279],{},"statementsUnder",[223,281,282],{},"Charges each statement to the operation it ran under, read off the async context.",[209,284,285,290],{},[223,286,287],{},[40,288,289],{},"otlp",[223,291],{},[209,293,294,299],{},[223,295,296],{},[40,297,298],{},"metrics",[223,300,301,304],{},[40,302,303],{},"app"," feeds the topology: which fronds this process found, and which run elsewhere.",[209,306,307,312],{},[223,308,309],{},[40,310,311],{},"logs",[223,313],{},[209,315,316,321],{},[223,317,318],{},[40,319,320],{},"observability",[223,322,323],{},"Observe this process — one member of the ascent.",[21,325,327],{"id":326},"types","Types",[17,329,330,331,334],{},"TypeScript types only — they do not run. Import them with ",[40,332,333],{},"import type"," to type your own code: a variable, a parameter, an option object.",[203,336,337,345],{},[206,338,339],{},[209,340,341,343],{},[212,342,214],{},[212,344],{},[218,346,347,357,367,377,386,396,406,415,424,433,442],{},[209,348,349,354],{},[223,350,351],{},[40,352,353],{},"SpanKind",[223,355,356],{},"What a span is a span of: an operation, or a statement under one.",[209,358,359,364],{},[223,360,361],{},[40,362,363],{},"Crossing",[223,365,366],{},"Which end of a hop an operation span stands at — absent when the call stayed in this process.",[209,368,369,374],{},[223,370,371],{},[40,372,373],{},"FinishedSpan",[223,375,376],{},"A step that has finished, and what it did.",[209,378,379,384],{},[223,380,381],{},[40,382,383],{},"SpanSink",[223,385],{},[209,387,388,393],{},[223,389,390],{},[40,391,392],{},"Statement",[223,394,395],{},"A statement as its producer describes it — never the values it was given.",[209,397,398,403],{},[223,399,400],{},[40,401,402],{},"Tracing",[223,404,405],{},"What an app's tracer answers for.",[209,407,408,413],{},[223,409,410],{},[40,411,412],{},"TracingOptions",[223,414],{},[209,416,417,422],{},[223,418,419],{},[40,420,421],{},"Metrics",[223,423],{},[209,425,426,431],{},[223,427,428],{},[40,429,430],{},"TopologyReport",[223,432],{},[209,434,435,440],{},[223,436,437],{},[40,438,439],{},"FrondPlacement",[223,441],{},[209,443,444,449],{},[223,445,446],{},[40,447,448],{},"Edge",[223,450],{},[452,453,454],"style",{},"html pre.shiki code .sV8pK, html code.shiki .sV8pK{--shiki-light:#E2931D;--shiki-default:#C9B6EA;--shiki-dark:#FFCB6B}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sK7Y8, html code.shiki .sK7Y8{--shiki-light:#E53935;--shiki-default:#EE9F6B;--shiki-dark:#F07178}",{"title":38,"searchDepth":115,"depth":115,"links":456},[457,458,459],{"id":23,"depth":115,"text":24},{"id":200,"depth":115,"text":201},{"id":326,"depth":115,"text":327},"md",null,{},true,"\u002Freference\u002Fpackages\u002Fobservability",{"title":8,"description":19},"reference\u002Fpackages\u002Fobservability","GhtATVBYhEm-fYfEQHUVOcqMpFgu5EkcZz4MENhJeZo",[469,474,479,484,489,494,499,504,509,514,519,524,529,534,539,544,549,554,559,564,569,574,579,584,589,594,599,604,609,614,619,624,629,634,635,640,645,650,655,660,665,670,675,680,685],{"path":470,"title":471,"description":472,"stem":473},"\u002Freference\u002Fcli","CLI","fougere new, serve, call, sync, graph — composing a workspace, hosting one frond, invoking an operation from a shell.","reference\u002F01.cli",{"path":475,"title":476,"description":477,"stem":478},"\u002Freference\u002Ferrors","Error codes","Every code an operation can refuse with, and its HTTP status.","reference\u002F02.errors",{"path":480,"title":481,"description":482,"stem":483},"\u002Freference\u002Fconfig","fougere.config.ts","Every key the app config admits, and which package answers each one.","reference\u002F03.config",{"path":485,"title":486,"description":487,"stem":488},"\u002Freference\u002Ffrond-config","frond.config.ts","Every key a frond's own config admits.","reference\u002F04.frond-config",{"path":490,"title":491,"description":492,"stem":493},"\u002Freference\u002Fsources","Source types","Every type an entry of sources: may name, and the keys it admits.","reference\u002F05.sources",{"path":495,"title":496,"description":497,"stem":498},"\u002Freference\u002Fprotocols","Protocols","What protocols: may serve, and what each admits.","reference\u002F06.protocols",{"path":500,"title":501,"description":502,"stem":503},"\u002Freference\u002Fstates","State keepers","How state: may keep a caller's values.","reference\u002F07.states",{"path":505,"title":506,"description":507,"stem":508},"\u002Freference\u002Fforms","Forms","The types a frond is written with — each one read by the scan.","reference\u002F08.forms",{"path":510,"title":511,"description":512,"stem":513},"\u002Freference\u002Fports","Ports Fougere opens","The classes you stand in front of, or extend, to change what the framework does.","reference\u002F09.ports",{"path":515,"title":516,"description":517,"stem":518},"\u002Freference\u002Finterfaces","Interfaces to extend","The empty interfaces a package augments with declare module, and who augments each.","reference\u002F10.interfaces",{"path":520,"title":521,"description":522,"stem":523},"\u002Freference\u002Fdiagnostics","Boot and check diagnostics","Every code a boot, the scan or fougere check can raise, and what it says.","reference\u002F11.diagnostics",{"path":525,"title":526,"description":527,"stem":528},"\u002Freference\u002Fpackages\u002Fadapter-duckdb","@fougere\u002Fadapter-duckdb","Read across an app's sources — one SQL query over what DuckDB can attach.","reference\u002Fpackages\u002Fadapter-duckdb",{"path":530,"title":531,"description":532,"stem":533},"\u002Freference\u002Fpackages\u002Fadapter-env","@fougere\u002Fadapter-env","The process environment as a source — MEILI_URL read as Meili's url, judged at boot.","reference\u002Fpackages\u002Fadapter-env",{"path":535,"title":536,"description":537,"stem":538},"\u002Freference\u002Fpackages\u002Fadapter-file","@fougere\u002Fadapter-file","Rows as files — one JSON or YAML file per row, in a directory per entity.","reference\u002Fpackages\u002Fadapter-file",{"path":540,"title":541,"description":542,"stem":543},"\u002Freference\u002Fpackages\u002Fadapter-graphql","@fougere\u002Fadapter-graphql","Entity → GraphQL types, inputs and CRUD, through Pothos.","reference\u002Fpackages\u002Fadapter-graphql",{"path":545,"title":546,"description":547,"stem":548},"\u002Freference\u002Fpackages\u002Fadapter-memory","@fougere\u002Fadapter-memory","Rows in a Map — the source a first run meets, and the one that ships no driver.","reference\u002Fpackages\u002Fadapter-memory",{"path":550,"title":551,"description":552,"stem":553},"\u002Freference\u002Fpackages\u002Fadapter-rest","@fougere\u002Fadapter-rest","Entity → REST routes.","reference\u002Fpackages\u002Fadapter-rest",{"path":555,"title":556,"description":557,"stem":558},"\u002Freference\u002Fpackages\u002Fadapter-sql","@fougere\u002Fadapter-sql","Entity → SQL tables through Kysely (SQLite, PostgreSQL, MySQL, SQL Server).","reference\u002Fpackages\u002Fadapter-sql",{"path":560,"title":561,"description":562,"stem":563},"\u002Freference\u002Fpackages\u002Fadmin","@fougere\u002Fadmin","A back-office derived from what the app already says it hosts — a react-admin DataProvider over the Fougere wire.","reference\u002Fpackages\u002Fadmin",{"path":565,"title":566,"description":567,"stem":568},"\u002Freference\u002Fpackages\u002Fapp","@fougere\u002Fapp","The host-independent half of a Fougere app: boot, call envelope, REST table, form contract.","reference\u002Fpackages\u002Fapp",{"path":570,"title":571,"description":572,"stem":573},"\u002Freference\u002Fpackages\u002Fauth-better","@fougere\u002Fauth-better","Fougere's auth — a translation layer onto better-auth.","reference\u002Fpackages\u002Fauth-better",{"path":575,"title":576,"description":577,"stem":578},"\u002Freference\u002Fpackages\u002Fcalls","@fougere\u002Fcalls","Optional call log for Fougere: a bounded ring of every dispatch, served as an rpc operation. Read it with `fougere devtools`.","reference\u002Fpackages\u002Fcalls",{"path":580,"title":581,"description":582,"stem":583},"\u002Freference\u002Fpackages\u002Fcli","@fougere\u002Fcli","The Fougere CLI — compose a workspace, serve a frond, call an operation.","reference\u002Fpackages\u002Fcli",{"path":585,"title":586,"description":587,"stem":588},"\u002Freference\u002Fpackages\u002Fcompiler","@fougere\u002Fcompiler","The scan: Fougere reading a project's source to produce the descriptors core boots from. Needs a filesystem and a TypeScript program.","reference\u002Fpackages\u002Fcompiler",{"path":590,"title":591,"description":592,"stem":593},"\u002Freference\u002Fpackages\u002Fcontainer","@fougere\u002Fcontainer","Fougere's DI container: resolution by type, wired from the AST scan. Zero dependencies.","reference\u002Fpackages\u002Fcontainer",{"path":595,"title":596,"description":597,"stem":598},"\u002Freference\u002Fpackages\u002Fcore","@fougere\u002Fcore","The core — scan, call contract, façades, remote stand-ins.","reference\u002Fpackages\u002Fcore",{"path":600,"title":601,"description":602,"stem":603},"\u002Freference\u002Fpackages\u002Fdecorators","@fougere\u002Fdecorators","Configuration sugar (@config) — declarative, never hidden runtime.","reference\u002Fpackages\u002Fdecorators",{"path":605,"title":606,"description":607,"stem":608},"\u002Freference\u002Fpackages\u002Fdefaults","@fougere\u002Fdefaults","The conventional boot of a Fougere app — the one place storage is wired.","reference\u002Fpackages\u002Fdefaults",{"path":610,"title":611,"description":612,"stem":613},"\u002Freference\u002Fpackages\u002Fgraph","@fougere\u002Fgraph","Fougere's graph: a labelled directed multigraph, and the four questions asked of it — order, cycles, components, reach. Zero dependencies.","reference\u002Fpackages\u002Fgraph",{"path":615,"title":616,"description":617,"stem":618},"\u002Freference\u002Fpackages\u002Fhttp","@fougere\u002Fhttp","The words every HTTP door speaks — a method, an answer, the headers a state travels in.","reference\u002Fpackages\u002Fhttp",{"path":620,"title":621,"description":622,"stem":623},"\u002Freference\u002Fpackages\u002Flog","@fougere\u002Flog","Logging for Fougere: two lines for every call, in every process, and a file destination for the lines.","reference\u002Fpackages\u002Flog",{"path":625,"title":626,"description":627,"stem":628},"\u002Freference\u002Fpackages\u002Fnext","@fougere\u002Fnext","The Next.js adapter: mounting, and the one import that is genuinely Next.","reference\u002Fpackages\u002Fnext",{"path":630,"title":631,"description":632,"stem":633},"\u002Freference\u002Fpackages\u002Fnuxt","@fougere\u002Fnuxt","The Nuxt module: Fougere's client primitives and server surface.","reference\u002Fpackages\u002Fnuxt",{"path":464,"title":8,"description":19,"stem":466},{"path":636,"title":637,"description":638,"stem":639},"\u002Freference\u002Fpackages\u002Foclif","@fougere\u002Foclif","A frond's operations, as a terminal: topics, flags and help derived from what it declares.","reference\u002Fpackages\u002Foclif",{"path":641,"title":642,"description":643,"stem":644},"\u002Freference\u002Fpackages\u002Freact","@fougere\u002Freact","Fougere's four primitives as React hooks — host-independent.","reference\u002Fpackages\u002Freact",{"path":646,"title":647,"description":648,"stem":649},"\u002Freference\u002Fpackages\u002Fregistry","@fougere\u002Fregistry","Fougere's registry: one answer per name, refused when a second one arrives, and a reload that says it replaces. Zero dependencies.","reference\u002Fpackages\u002Fregistry",{"path":651,"title":652,"description":653,"stem":654},"\u002Freference\u002Fpackages\u002Fschema","@fougere\u002Fschema","The entity and its 4 axes — shape, role, lifecycle, boundary. Subject-owned judgments, edge-safe.","reference\u002Fpackages\u002Fschema",{"path":656,"title":657,"description":658,"stem":659},"\u002Freference\u002Fpackages\u002Fstate-cookie","@fougere\u002Fstate-cookie","A caller's state kept in a cookie — what `state: { cart: { cookie: {} } }` names, signed by core, carried by every HTTP door.","reference\u002Fpackages\u002Fstate-cookie",{"path":661,"title":662,"description":663,"stem":664},"\u002Freference\u002Fpackages\u002Fstate-session","@fougere\u002Fstate-session","A caller's state kept in a session — what `state: { cart: { session: {} } }` names: one cookie holds a reference, the values a row in a source.","reference\u002Fpackages\u002Fstate-session",{"path":666,"title":667,"description":668,"stem":669},"\u002Freference\u002Fpackages\u002Fsvelte","@fougere\u002Fsvelte","Fougere's four primitives as Svelte stores — host-independent.","reference\u002Fpackages\u002Fsvelte",{"path":671,"title":672,"description":673,"stem":674},"\u002Freference\u002Fpackages\u002Ftesting","@fougere\u002Ftesting","Tests derived from the declaration — cases, stubs and a gradient of realities.","reference\u002Fpackages\u002Ftesting",{"path":676,"title":677,"description":678,"stem":679},"\u002Freference\u002Fpackages\u002Ftransport-http","@fougere\u002Ftransport-http","The call contract on the wire, in JSON-RPC 2.0 (server + client).","reference\u002Fpackages\u002Ftransport-http",{"path":681,"title":682,"description":683,"stem":684},"\u002Freference\u002Fpackages\u002Fvite","@fougere\u002Fvite","The Vite plugin: what any Vite-built host must know to run a Fougere app.","reference\u002Fpackages\u002Fvite",{"path":686,"title":687,"description":688,"stem":689},"\u002Freference\u002Fpackages\u002Fworkflow","@fougere\u002Fworkflow","A release that goes to the end: the journal is three entities, the sweep is an operation, and a shared journal is one line of remotes:.","reference\u002Fpackages\u002Fworkflow",1794396613347]