brass-runtime 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +673 -136
  3. package/dist/agent/cli/main.cjs +40 -35
  4. package/dist/agent/cli/main.js +9 -4
  5. package/dist/agent/cli/main.mjs +9 -4
  6. package/dist/agent/index.cjs +8 -4
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +7 -3
  9. package/dist/agent/index.mjs +7 -3
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/chunk-3AYM6WPJ.js +1629 -0
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3RG5ZIWI.js +10 -0
  15. package/dist/chunk-3Y2RIUMM.js +300 -0
  16. package/dist/{chunk-VEZNF5GZ.cjs → chunk-4ROBZFL6.cjs} +130 -126
  17. package/dist/{chunk-3QMOKAS5.js → chunk-52OB2ROS.js} +9 -5
  18. package/dist/chunk-52PPNNI4.cjs +416 -0
  19. package/dist/chunk-5EC274J5.cjs +2874 -0
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/chunk-5VRJNBLZ.mjs +2874 -0
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-74ZTY6CP.js +2871 -0
  25. package/dist/chunk-76YMRMH2.cjs +777 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-4NHES7VK.mjs → chunk-7JIJOVCT.js} +27 -13
  28. package/dist/chunk-A2OM6NEH.mjs +194 -0
  29. package/dist/chunk-AGR5B2BC.cjs +683 -0
  30. package/dist/chunk-AVNQLJ5V.js +777 -0
  31. package/dist/chunk-B33ICAKP.js +313 -0
  32. package/dist/{chunk-ELOOF35R.mjs → chunk-B5JD23U7.mjs} +1 -1
  33. package/dist/chunk-BABBZK4Y.js +2024 -0
  34. package/dist/chunk-C3MDXTRZ.js +354 -0
  35. package/dist/chunk-CIZFIMK5.js +2193 -0
  36. package/dist/chunk-CZIVE6NT.cjs +354 -0
  37. package/dist/chunk-DNFJLJMW.mjs +354 -0
  38. package/dist/chunk-DNFO2EIZ.mjs +777 -0
  39. package/dist/chunk-EJ6BPYVR.mjs +416 -0
  40. package/dist/chunk-ENKODRU3.cjs +2193 -0
  41. package/dist/chunk-EOC4UHBS.mjs +229 -0
  42. package/dist/{chunk-BMH5AV44.js → chunk-FH2X7BVP.js} +756 -440
  43. package/dist/{chunk-PPUXIH5R.js → chunk-FHQGHPMO.mjs} +27 -13
  44. package/dist/{chunk-TGIFUAK4.cjs → chunk-GLE2WY7Z.cjs} +951 -635
  45. package/dist/{chunk-BDF4AMWX.mjs → chunk-GYM3LLGS.mjs} +756 -440
  46. package/dist/chunk-HLWLMW2F.mjs +2024 -0
  47. package/dist/chunk-JF5WGYJJ.cjs +194 -0
  48. package/dist/chunk-KH4SYAOS.mjs +1629 -0
  49. package/dist/chunk-KN32XNTH.mjs +313 -0
  50. package/dist/chunk-KQLYONSE.cjs +2871 -0
  51. package/dist/{chunk-STVLQ3XD.cjs → chunk-KZJQ723N.cjs} +92 -78
  52. package/dist/chunk-L2SYFEBS.js +194 -0
  53. package/dist/chunk-L6VB5N7Q.cjs +104 -0
  54. package/dist/{chunk-K6M7MDZ4.mjs → chunk-MBEJI5HF.mjs} +9 -5
  55. package/dist/chunk-MIIYDLGM.js +2874 -0
  56. package/dist/chunk-MOO4L7F4.mjs +104 -0
  57. package/dist/chunk-MT3OWDPC.mjs +2193 -0
  58. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  59. package/dist/chunk-OBGZSXTJ.cjs +10 -0
  60. package/dist/chunk-PD4EJTQC.cjs +229 -0
  61. package/dist/chunk-PWC3RBQE.mjs +300 -0
  62. package/dist/chunk-Q2I37RP3.cjs +1629 -0
  63. package/dist/chunk-RKGKFN2A.js +416 -0
  64. package/dist/{chunk-R3R2FVLG.cjs → chunk-SA6HUJVI.cjs} +5 -5
  65. package/dist/chunk-TRM4JUZQ.js +104 -0
  66. package/dist/chunk-UB4B6OFY.js +370 -0
  67. package/dist/{chunk-TO7IKXYT.js → chunk-UCUBNWM2.js} +1 -1
  68. package/dist/chunk-VN44DYYT.cjs +2024 -0
  69. package/dist/chunk-Y6FXYEAI.mjs +10 -0
  70. package/dist/client-CZHU674n.d.ts +820 -0
  71. package/dist/core/index.cjs +198 -4
  72. package/dist/core/index.d.ts +311 -212
  73. package/dist/core/index.js +237 -43
  74. package/dist/core/index.mjs +237 -43
  75. package/dist/{effect-CMOQKX8y.d.ts → effect-DIUHZ9IN.d.ts} +195 -1
  76. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  77. package/dist/effectRunner-L4S7IPT3.js +8 -0
  78. package/dist/effectRunner-NNGG75QA.mjs +8 -0
  79. package/dist/http/index.cjs +1227 -2971
  80. package/dist/http/index.d.ts +826 -280
  81. package/dist/http/index.js +1089 -2833
  82. package/dist/http/index.mjs +1089 -2833
  83. package/dist/http/testing.cjs +161 -0
  84. package/dist/http/testing.d.ts +43 -0
  85. package/dist/http/testing.js +161 -0
  86. package/dist/http/testing.mjs +161 -0
  87. package/dist/index.cjs +486 -250
  88. package/dist/index.d.ts +87 -95
  89. package/dist/index.js +391 -155
  90. package/dist/index.mjs +391 -155
  91. package/dist/observability/index.cjs +162 -0
  92. package/dist/observability/index.d.ts +152 -0
  93. package/dist/observability/index.js +162 -0
  94. package/dist/observability/index.mjs +162 -0
  95. package/dist/perf/cli.cjs +401 -0
  96. package/dist/perf/cli.d.ts +1 -0
  97. package/dist/perf/cli.js +401 -0
  98. package/dist/perf/cli.mjs +401 -0
  99. package/dist/perf/index.cjs +141 -0
  100. package/dist/perf/index.d.ts +483 -0
  101. package/dist/perf/index.js +141 -0
  102. package/dist/perf/index.mjs +141 -0
  103. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  104. package/dist/schema/index.cjs +29 -0
  105. package/dist/schema/index.d.ts +179 -0
  106. package/dist/schema/index.js +29 -0
  107. package/dist/schema/index.mjs +29 -0
  108. package/dist/server-GJPg8ZSG.d.ts +675 -0
  109. package/dist/{stream-FQm9h4Mg.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  110. package/dist/tracer-Hwt1cl7h.d.ts +189 -0
  111. package/dist/tracing-DqbTKGcf.d.ts +148 -0
  112. package/docs/ARCHITECTURE.md +292 -0
  113. package/docs/README.md +63 -0
  114. package/docs/adr/0001-ai-context-pack.md +32 -0
  115. package/docs/agent-apply-mode.md +104 -0
  116. package/docs/agent-approvals.md +110 -0
  117. package/docs/agent-batch.md +185 -0
  118. package/docs/agent-boundaries.md +112 -0
  119. package/docs/agent-chat-sessions.md +160 -0
  120. package/docs/agent-ci.md +17 -0
  121. package/docs/agent-cli.md +405 -0
  122. package/docs/agent-config.md +480 -0
  123. package/docs/agent-context-discovery.md +159 -0
  124. package/docs/agent-copilot-like-dx.md +126 -0
  125. package/docs/agent-declarative-optimized-planning.md +138 -0
  126. package/docs/agent-dx.md +224 -0
  127. package/docs/agent-env-files.md +126 -0
  128. package/docs/agent-follow-up-context.md +43 -0
  129. package/docs/agent-global-usage.md +180 -0
  130. package/docs/agent-init.md +109 -0
  131. package/docs/agent-install-and-configure.md +516 -0
  132. package/docs/agent-language-workspace-ux.md +99 -0
  133. package/docs/agent-llm-adapters.md +123 -0
  134. package/docs/agent-local-install.md +190 -0
  135. package/docs/agent-local-tests.md +51 -0
  136. package/docs/agent-observability.md +155 -0
  137. package/docs/agent-patch-quality-loop.md +162 -0
  138. package/docs/agent-presets.md +22 -0
  139. package/docs/agent-project-commands.md +237 -0
  140. package/docs/agent-project-intelligence.md +156 -0
  141. package/docs/agent-redaction.md +18 -0
  142. package/docs/agent-release-readiness.md +76 -0
  143. package/docs/agent-rollback-safety.md +162 -0
  144. package/docs/agent-rollback.md +23 -0
  145. package/docs/agent-run-artifacts.md +16 -0
  146. package/docs/agent-vscode-auto-discovery.md +137 -0
  147. package/docs/agent-vscode-batch-runner.md +100 -0
  148. package/docs/agent-vscode-chat-layout.md +90 -0
  149. package/docs/agent-vscode-clean-install.md +147 -0
  150. package/docs/agent-vscode-code-actions.md +70 -0
  151. package/docs/agent-vscode-diff-preview.md +45 -0
  152. package/docs/agent-vscode-inline-assist.md +56 -0
  153. package/docs/agent-vscode-install.md +186 -0
  154. package/docs/agent-vscode-model-setup.md +97 -0
  155. package/docs/agent-vscode-patch-preview.md +92 -0
  156. package/docs/agent-vscode-problems.md +79 -0
  157. package/docs/agent-vscode-project-dashboard.md +106 -0
  158. package/docs/agent-vscode-run-history.md +92 -0
  159. package/docs/agent-vscode-ux.md +73 -0
  160. package/docs/ai/INVARIANTS.md +84 -0
  161. package/docs/ai/PROJECT_MAP.md +338 -0
  162. package/docs/ai/PUBLIC_API.md +336 -0
  163. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  164. package/docs/api-polish.md +37 -0
  165. package/docs/cancellation.md +162 -0
  166. package/docs/coverage.md +46 -0
  167. package/docs/getting-started.md +159 -0
  168. package/docs/guides/README.md +40 -0
  169. package/docs/guides/circuit-breaker.md +89 -0
  170. package/docs/guides/error-handling.md +91 -0
  171. package/docs/guides/getting-started.md +107 -0
  172. package/docs/guides/layers.md +189 -0
  173. package/docs/guides/metrics.md +101 -0
  174. package/docs/guides/resource-management.md +141 -0
  175. package/docs/guides/retry.md +215 -0
  176. package/docs/guides/semaphore.md +66 -0
  177. package/docs/guides/streams.md +117 -0
  178. package/docs/guides/supervisors.md +98 -0
  179. package/docs/guides/testing.md +162 -0
  180. package/docs/guides/tracing.md +71 -0
  181. package/docs/http-recipes.md +399 -0
  182. package/docs/http.md +749 -0
  183. package/docs/modules.md +285 -0
  184. package/docs/observability-collector-smoke.md +31 -0
  185. package/docs/observability-framework-examples.md +98 -0
  186. package/docs/observability.md +542 -0
  187. package/docs/otel-collector-smoke.yaml +27 -0
  188. package/docs/performance-profiler.md +199 -0
  189. package/docs/production-readiness.md +73 -0
  190. package/docs/recipes/README.md +12 -0
  191. package/docs/recipes/http-server.md +45 -0
  192. package/docs/recipes/layers.md +44 -0
  193. package/docs/recipes/performance.md +47 -0
  194. package/docs/recipes/runtime.md +41 -0
  195. package/docs/recipes/testing.md +41 -0
  196. package/docs/release.md +53 -0
  197. package/docs/wasm-bounded-queues.md +44 -0
  198. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  199. package/docs/wasm-fiber-engine.md +117 -0
  200. package/docs/wasm-scheduler-state-machine.md +122 -0
  201. package/docs/wasm-stream-chunks.md +54 -0
  202. package/package.json +48 -2
  203. package/dist/chunk-AR22SXML.js +0 -1043
  204. package/dist/chunk-BDYEENHT.js +0 -224
  205. package/dist/chunk-JFPU5GQI.mjs +0 -1043
  206. package/dist/chunk-MS34J5LY.cjs +0 -224
  207. package/dist/chunk-UMAZLXAB.mjs +0 -224
  208. package/dist/chunk-XPZNXSVN.cjs +0 -1043
  209. package/dist/tracing-DNT9jEbr.d.ts +0 -106
@@ -0,0 +1,285 @@
1
+ # 📦 Modules — brass-runtime
2
+
3
+ This document describes the current and planned modules in **brass-runtime**, how they relate to each other, and how users are expected to navigate them.
4
+
5
+ The structure intentionally mirrors the mental model of **ZIO**:
6
+ - a small, principled **core**
7
+ - optional, layered **modules**
8
+ - everything expressed in terms of typed effects and structured concurrency
9
+
10
+ ---
11
+
12
+ ## Core modules (foundation)
13
+
14
+ These modules form the **runtime kernel**. Everything else builds on top of them.
15
+
16
+ ### `runtime`
17
+ **Status:** ✅ stable
18
+
19
+ Responsible for executing effects.
20
+
21
+ Contents:
22
+ - `Scheduler` — cooperative, deterministic task scheduler
23
+ - task queue, microtask flushing
24
+ - fairness and explicit async boundaries
25
+
26
+ You almost never interact with this directly as a user.
27
+
28
+ ---
29
+
30
+ ### `asyncEffect` / `types`
31
+ **Status:** ✅ stable
32
+
33
+ The heart of the system.
34
+
35
+ Key types:
36
+ - `Effect<R, E, A>`
37
+ - `Async<R, E, A>`
38
+ - `Exit<E, A>`
39
+
40
+ Capabilities:
41
+ - sync + async algebra (no Promises in semantics)
42
+ - `map`, `flatMap`, `fold`, etc.
43
+ - explicit async registration via callbacks
44
+
45
+ This is the **semantic core** of brass.
46
+
47
+ ---
48
+
49
+ ### `fiber`
50
+ **Status:** ✅ stable
51
+
52
+ Lightweight fibers with structured lifecycle.
53
+
54
+ Features:
55
+ - `Fiber<E, A>` abstraction
56
+ - cooperative interruption
57
+ - `join`, `interrupt`
58
+ - LIFO finalizers
59
+
60
+ Fibers are always run under a `Scope`.
61
+
62
+ ---
63
+
64
+ ### `scope`
65
+ **Status:** ✅ stable
66
+
67
+ Structured concurrency and resource safety.
68
+
69
+ Features:
70
+ - parent / child scopes
71
+ - deterministic cleanup
72
+ - `addFinalizer`, `close`
73
+ - used by fibers, streams, HTTP, resources
74
+
75
+ Scopes ensure:
76
+ > no leaks, no zombies, no forgotten cleanup
77
+
78
+ ---
79
+
80
+ ### `resource`
81
+ **Status:** ✅ stable
82
+
83
+ Resource-safe acquisition.
84
+
85
+ API:
86
+ - `acquireRelease`
87
+ - `fromResource`
88
+
89
+ Ties resource lifetimes to scopes.
90
+
91
+ ---
92
+
93
+ ## Concurrency combinators
94
+
95
+ ### `concurrency`
96
+ **Status:** ✅ stable
97
+
98
+ High-level structured concurrency.
99
+
100
+ Includes:
101
+ - `race`
102
+ - `zipPar`
103
+ - `collectAllPar`
104
+ - `fork`
105
+
106
+ Semantics:
107
+ - loser fibers are interrupted
108
+ - errors propagate deterministically
109
+ - scopes are respected
110
+
111
+ ---
112
+
113
+ ## Stream modules (ZStream-like)
114
+
115
+ ### `stream`
116
+ **Status:** 🚧 active
117
+
118
+ Pull-based, resource-safe streams.
119
+
120
+ Key ideas:
121
+ - `Pull<R, E, A>`
122
+ - `ZStream<R, E, A>`
123
+ - explicit backpressure
124
+ - scope-aware
125
+
126
+ Includes:
127
+ - constructors (`fromArray`, `fromPull`, `empty`)
128
+ - transformations (`map`, `filter`)
129
+ - execution (`runCollect`, `collectStream`)
130
+
131
+ ---
132
+
133
+ ### `buffer`
134
+ **Status:** 🚧 active
135
+
136
+ Stream buffering with backpressure.
137
+
138
+ Features:
139
+ - bounded buffers
140
+ - backpressure vs dropping modes
141
+ - deterministic cleanup
142
+
143
+ This is the foundation for:
144
+ - pipelines
145
+ - async boundaries in streams
146
+ - future hubs
147
+
148
+ ---
149
+
150
+ ### Planned stream modules
151
+ **Status:** ⏳ planned
152
+
153
+ - `pipeline` — ZPipeline-style transformations
154
+ - `sink` — consumers / reducers
155
+ - `hub` — broadcast / pub-sub streams
156
+ - `channel` — low-level streaming algebra
157
+
158
+ ---
159
+
160
+ ## HTTP module
161
+
162
+ ### `http`
163
+ **Status:** ✅ usable / evolving
164
+
165
+ ZIO-HTTP–inspired client built on brass runtime.
166
+
167
+ Layers:
168
+ - **wire layer**: `HttpClient = Request => Async<_, HttpError, HttpWireResponse>`
169
+ - **middleware**: request/response transforms
170
+ - **DX layer**: ergonomic helpers (`getJson`, `postJson`, etc.)
171
+
172
+ Key concepts:
173
+ - fully lazy
174
+ - cancelable via fibers
175
+ - no Promises in core semantics
176
+ - middleware-style composition (`withMeta`, logging, retries, auth)
177
+
178
+ Submodules:
179
+ - `client.ts` — low-level HTTP execution
180
+ - `httpClient.ts` — DX + helpers
181
+ - `withMeta` — response enrichment middleware
182
+
183
+ Example usage:
184
+ ```ts
185
+ const http = httpClientBuilder({ baseUrl }).withMeta();
186
+
187
+ const post = await toPromise(http.getJson<Post>("/posts/1"), {});
188
+ ```
189
+
190
+ ---
191
+
192
+ ## Interop modules
193
+
194
+ ### `promise`
195
+ **Status:** ✅ stable
196
+
197
+ Interop with Promise-based APIs.
198
+
199
+ Includes:
200
+ - `toPromise` — await effects externally
201
+ - `fromPromiseAbortable`
202
+ - `tryPromiseAbortable`
203
+
204
+ Important:
205
+ > Promises are **interop only**, never a runtime primitive.
206
+
207
+ ---
208
+
209
+ ## Examples module
210
+
211
+ ### `examples`
212
+ **Status:** ✅ maintained
213
+
214
+ Executable documentation.
215
+
216
+ Covers:
217
+ - fibers & interruption
218
+ - scopes & finalizers
219
+ - abortable promises
220
+ - streams + buffering
221
+ - HTTP usage
222
+
223
+ If you’re new:
224
+ 👉 start here.
225
+
226
+ ---
227
+
228
+ ## How to navigate the project
229
+
230
+ ### If you want to…
231
+
232
+ **Understand the runtime**
233
+ - `asyncEffect`
234
+ - `scheduler`
235
+ - `fiber`
236
+ - `scope`
237
+
238
+ **Use effects**
239
+ - `map`, `flatMap`, `fold`
240
+ - `toPromise` (interop only)
241
+
242
+ **Do concurrency**
243
+ - `race`
244
+ - `zipPar`
245
+ - `fork`
246
+
247
+ **Work with streams**
248
+ - `stream`
249
+ - `buffer`
250
+
251
+ **Call HTTP**
252
+ - `http/client`
253
+ - `http/httpClient`
254
+ - middleware like `withMeta`
255
+
256
+ ---
257
+
258
+ ## Design philosophy
259
+
260
+ - Explicit > implicit
261
+ - Structured > ad-hoc
262
+ - Lazy by default
263
+ - Cancellation is cooperative and visible
264
+ - No hidden async semantics
265
+
266
+ brass is not trying to be “easy first” — it’s trying to be **correct first**.
267
+
268
+ ---
269
+
270
+ ## Future directions
271
+
272
+ - Public API stabilization
273
+ - Docs site (mdbook / Docusaurus)
274
+ - ZIO-style module layering (`Layer`-like)
275
+ - Metrics & tracing middleware
276
+ - Typed errors across HTTP + streams
277
+
278
+ ---
279
+
280
+ If you want:
281
+ - a **diagram** of module dependencies
282
+ - a **shorter npm-facing version**
283
+ - or a **ZIO comparison table**
284
+
285
+ say the word.
@@ -0,0 +1,31 @@
1
+ # Observability collector smoke
2
+
3
+ This smoke test sends one metric payload, one trace payload, and one log payload
4
+ to a real OpenTelemetry Collector over OTLP/HTTP.
5
+
6
+ Start the collector:
7
+
8
+ ```bash
9
+ docker compose -f docker-compose.observability.yml up
10
+ ```
11
+
12
+ In another shell:
13
+
14
+ ```bash
15
+ npm run build:ts
16
+ npm run smoke:observability:collector
17
+ ```
18
+
19
+ The collector config is `docs/otel-collector-smoke.yaml` and uses the debug
20
+ exporter, so accepted telemetry is printed in the collector logs.
21
+
22
+ Useful environment variables:
23
+
24
+ ```bash
25
+ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
26
+ OTEL_SERVICE_NAME=brass-observability-smoke
27
+ BRASS_OBSERVABILITY_EXPORT_TIMEOUT_MS=5000
28
+ ```
29
+
30
+ The smoke intentionally uses the public built package from `dist` so it checks
31
+ the same CJS/ESM package surface that users consume after a build.
@@ -0,0 +1,98 @@
1
+ # Observability framework examples
2
+
3
+ These examples show how to seed Brass runtime traces from inbound HTTP headers,
4
+ create a request span, emit structured logs, expose Prometheus metrics, and
5
+ flush OTLP metrics/traces.
6
+
7
+ They use optional framework dependencies so the runtime package does not force
8
+ Express, Fastify, or Nest into normal installs.
9
+
10
+ ## Express
11
+
12
+ ```bash
13
+ npm install --save-dev express
14
+ npm run example:observability:express
15
+ ```
16
+
17
+ Try it:
18
+
19
+ ```bash
20
+ curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
21
+ http://localhost:3000/users/42
22
+
23
+ curl http://localhost:3000/metrics
24
+ ```
25
+
26
+ Source: `src/examples/observabilityExpress.ts`.
27
+
28
+ ## Fastify
29
+
30
+ ```bash
31
+ npm install --save-dev fastify
32
+ npm run example:observability:fastify
33
+ ```
34
+
35
+ Try it:
36
+
37
+ ```bash
38
+ curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
39
+ http://localhost:3001/users/42
40
+
41
+ curl http://localhost:3001/metrics
42
+ ```
43
+
44
+ Source: `src/examples/observabilityFastify.ts`.
45
+
46
+ ## Nest
47
+
48
+ ```bash
49
+ npm install --save-dev @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata rxjs
50
+ npm run example:observability:nest
51
+ ```
52
+
53
+ Try it:
54
+
55
+ ```bash
56
+ curl -H 'traceparent: 00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01' \
57
+ http://localhost:3002/users/42
58
+
59
+ curl http://localhost:3002/metrics
60
+ ```
61
+
62
+ Source: `src/examples/observabilityNest.ts`.
63
+
64
+ ## What the examples demonstrate
65
+
66
+ - `makeObservabilityFromEnv(process.env)` for deployment-style setup.
67
+ - Framework-specific request adapters:
68
+ - `makeExpressRequestObservabilityContext`
69
+ - `makeFastifyRequestObservabilityContext`
70
+ - W3C `traceparent` extraction from inbound headers.
71
+ - `ctx.withRequestSpan(...)` around request work.
72
+ - `logEffect(...)` with redaction of sensitive fields like `authorization`.
73
+ - `/metrics` endpoint using the Prometheus exporter.
74
+ - OTLP export through a fake local `fetch` that prints payload sizes.
75
+
76
+ ## Benchmark
77
+
78
+ Run only the observability overhead benchmark:
79
+
80
+ ```bash
81
+ npm run benchmark:observability
82
+ npm run benchmark:observability:budget
83
+ ```
84
+
85
+ Or include it in the full benchmark suite:
86
+
87
+ ```bash
88
+ npm run benchmark
89
+ ```
90
+
91
+ The benchmark source is `src/benchmarks/observability-overhead.bench.ts` and
92
+ measures:
93
+
94
+ - baseline `asyncSucceed`
95
+ - `withSpan` start/end overhead
96
+ - `logEffect` structured sink overhead
97
+ - composed span + event + log overhead
98
+ - OTLP trace flush for 25 spans