@smthrs/observability 1.0.0-rc.6 → 1.0.0-rc.8

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.
package/README.md CHANGED
@@ -18,7 +18,9 @@ Send an Effect program's logs, metrics, and traces to an OpenTelemetry collector
18
18
 
19
19
  ## Install
20
20
 
21
- Not on npm yet; see [Installation](https://github.com/smithersai/smithers/blob/main/packages/smithers/flows/flow/docs/installation.md#use-the-libraries).
21
+ ```bash
22
+ npm install @smthrs/observability@next effect
23
+ ```
22
24
 
23
25
  Node.js 26.4.0 or later. Effect services are identified by module identity, so install one `effect` release, in the range `^4.0.4`.
24
26
 
@@ -1 +1 @@
1
- {"version":3,"file":"JournalLogger.d.ts","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAA;AAE5D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAKhD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAKvC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;;;;;;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,gCAOhD;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;EAGxB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;EAGvB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;EAG7B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;IAAkE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAGzB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAuSnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAsE/D,CAAA"}
1
+ {"version":3,"file":"JournalLogger.d.ts","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAA;AAE5D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAKhD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAKvC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;;;;;;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,gCAOhD;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;EAGxB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;EAGvB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;EAG7B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;IAAkE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAGzB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAkTnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAsE/D,CAAA"}
@@ -173,6 +173,15 @@ const boundedText = (value, budget) => {
173
173
  return `${prefix.text}${truncatedMarker}`;
174
174
  };
175
175
  const standardErrorKeys = ["name", "message", "stack", "cause"];
176
+ const errorField = (value, key) => {
177
+ let current = value;
178
+ for (let depth = 0; current !== null && depth <= maximumSnapshotDepth; depth++) {
179
+ const descriptor = Object.getOwnPropertyDescriptor(current, key);
180
+ if (descriptor !== void 0) return "value" in descriptor ? descriptor.value : unrenderableMarker;
181
+ current = Object.getPrototypeOf(current);
182
+ }
183
+ return current === null ? void 0 : truncatedMarker;
184
+ };
176
185
  const snapshotValue = (value, budget, ancestors, depth = 0) => {
177
186
  if (budget.bytes <= 0) return truncatedMarker;
178
187
  if (depth > maximumSnapshotDepth) return Redaction.depthMarker;
@@ -212,7 +221,7 @@ const snapshotValue = (value, budget, ancestors, depth = 0) => {
212
221
  for (const key of standardErrorKeys.slice(0, budget.members)) {
213
222
  budget.members--;
214
223
  try {
215
- record2[key] = snapshotValue(value[key], budget, ancestors, depth + 1);
224
+ record2[key] = snapshotValue(errorField(value, key), budget, ancestors, depth + 1);
216
225
  } catch {
217
226
  record2[key] = unrenderableMarker;
218
227
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/JournalLogger.ts"],
4
- "sourcesContent": ["/**\n * Non-blocking forwarding of bounded operational logs to the durable journal.\n *\n * @since 0.1.0\n */\n\nimport * as Journal from \"@smthrs/journal/Journal\"\nimport * as JournalEvent from \"@smthrs/journal/JournalEvent\"\nimport * as Redaction from \"@smthrs/journal/Redaction\"\nimport * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport type * as LogLevel from \"effect/LogLevel\"\nimport * as EffectMetric from \"effect/Metric\"\nimport * as Option from \"effect/Option\"\nimport * as Queue from \"effect/Queue\"\nimport * as References from \"effect/References\"\nimport * as Schema from \"effect/Schema\"\nimport * as Tracer from \"effect/Tracer\"\nimport { schemaIssuePath } from \"./internal/schemaIssuePath.ts\"\nimport { droppedLogRecords } from \"./Metric.ts\"\n\n/**\n * Largest queue accepted by the forwarding logger.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumCapacity = 65_536\n\n/**\n * Largest detached log payload admitted to the asynchronous queue.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotBytes = 1024 * 1024\n\n/**\n * Largest number of container members copied into one detached log payload.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotMembers = 4_096\n\n/**\n * Deepest container path copied into one detached log payload.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotDepth = 64\n\n/**\n * What a hostile or unreadable logged value becomes.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const unrenderableMarker = \"[Unrenderable]\"\n\n/**\n * What a value beyond a logger resource ceiling becomes.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const truncatedMarker = \"[Truncated]\"\n\n/**\n * Options for the journal forwarding logger.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options {\n /** The run every forwarded record is attributed to. */\n readonly runId: JournalEvent.RunId\n /** Queue depth, 1 through {@link maximumCapacity}. Defaults to 256. */\n readonly capacity?: number | undefined\n /**\n * Pins `References.MinimumLogLevel` for the whole application. Omitted, the\n * layer leaves that reference alone and Effect's own `Info` default applies.\n */\n readonly minimumLogLevel?: LogLevel.LogLevel | undefined\n /**\n * Keeps the ambient loggers alongside the forwarder. Defaults to `false`,\n * which replaces the ambient logger set.\n */\n readonly mergeWithExisting?: boolean | undefined\n}\n\n/**\n * A stable logger configuration refusal.\n *\n * @category errors\n * @since 1.0.0-rc.0\n */\nexport class InvalidJournalLoggerOptions extends Schema.TaggedError<InvalidJournalLoggerOptions>()(\n \"@smthrs/observability/InvalidJournalLoggerOptions\",\n {\n code: Schema.Literal(\"invalid_journal_logger_options\"),\n path: Schema.String,\n message: Schema.String\n }\n) {}\n\n/**\n * One typed failure retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryFail = Schema.Struct({\n _tag: Schema.Literal(\"Fail\"),\n error: Schema.Unknown\n})\n\n/**\n * One unexpected defect retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryDie = Schema.Struct({\n _tag: Schema.Literal(\"Die\"),\n defect: Schema.Unknown\n})\n\n/**\n * One interruption retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryInterrupt = Schema.Struct({\n _tag: Schema.Literal(\"Interrupt\"),\n fiberId: Schema.NullOr(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)))\n})\n\n/**\n * One reason in a persisted telemetry cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryCauseReason = Schema.Union([TelemetryFail, TelemetryDie, TelemetryInterrupt])\n\n/**\n * One reason in a persisted telemetry cause.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryCauseReason = typeof TelemetryCauseReason.Type\n\n/**\n * A versioned structural Effect cause.\n *\n * Effect 4 stores composed failures as an ordered reason list. The projection\n * preserves that order and each fail, defect, or interrupt discriminator.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryCause = Schema.Struct({\n version: Schema.Literal(1),\n reasons: Schema.Array(TelemetryCauseReason)\n})\n\n/**\n * A versioned structural Effect cause.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryCause = typeof TelemetryCause.Type\n\n/**\n * Runtime schema for the operational log payload written to the journal.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryLog = Schema.Struct({\n version: Schema.Literal(1),\n level: Schema.Literals([\"All\", \"Fatal\", \"Error\", \"Warn\", \"Info\", \"Debug\", \"Trace\", \"None\"]),\n message: Schema.Unknown,\n annotations: Schema.Record(Schema.String, Schema.Unknown),\n cause: TelemetryCause,\n fiberId: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n traceId: Schema.optionalKey(Schema.String),\n spanId: Schema.optionalKey(Schema.String),\n timestamp: Schema.String\n})\n\n/**\n * Versioned operational log payload written to the journal.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryLog = typeof TelemetryLog.Type\n\nconst sourceId = \"flows/observability/logger\" as JournalEvent.SourceId\nconst encoder = new TextEncoder()\n\nconst OptionsSchema = Schema.Struct({\n runId: JournalEvent.RunId,\n capacity: Schema.optional(\n Schema.Int.check(\n Schema.isGreaterThanOrEqualTo(1),\n Schema.isLessThanOrEqualTo(maximumCapacity)\n )\n ),\n minimumLogLevel: Schema.optional(\n Schema.Literals([\"All\", \"Fatal\", \"Error\", \"Warn\", \"Info\", \"Debug\", \"Trace\", \"None\"])\n ),\n mergeWithExisting: Schema.optional(Schema.Boolean)\n})\n\nconst validateOptions = (options: Options) =>\n Schema.decodeUnknownEffect(OptionsSchema)(options).pipe(\n Effect.mapError((cause) => {\n const path = schemaIssuePath(cause, \"options\")\n return new InvalidJournalLoggerOptions({\n code: \"invalid_journal_logger_options\",\n path,\n message: `journal logger ${path} is invalid`\n })\n })\n )\n\ninterface SnapshotBudget {\n bytes: number\n members: number\n}\n\nconst reserve = (budget: SnapshotBudget, bytes: number): boolean => {\n if (bytes > budget.bytes) return false\n budget.bytes -= bytes\n return true\n}\n\nconst textBytes = (value: string): number => encoder.encode(JSON.stringify(value)).byteLength\n\nconst quoteBytes = 2\nconst shortEscapes = new Set([0x08, 0x09, 0x0a, 0x0c, 0x0d])\n\n/** Bytes one non-surrogate code unit occupies inside a JSON string body. */\nconst unitBytes = (code: number): number => {\n if (code === 0x22 || code === 0x5c) return 2\n if (code < 0x20) return shortEscapes.has(code) ? 2 : 6\n if (code < 0x80) return 1\n if (code < 0x800) return 2\n return 3\n}\n\nconst isLowSurrogate = (code: number): boolean => code >= 0xdc00 && code <= 0xdfff\n\n/**\n * The longest prefix whose JSON string body fits `limit` bytes, measured in one\n * forward pass. A surrogate pair is admitted or refused whole, so the retained\n * text is well formed whenever the input is.\n */\nconst boundedPrefix = (value: string, limit: number): { readonly text: string; readonly bytes: number } => {\n let bytes = 0\n let index = 0\n while (index < value.length) {\n const code = value.charCodeAt(index)\n let width = 1\n let cost: number\n if (code >= 0xd800 && code <= 0xdbff && isLowSurrogate(value.charCodeAt(index + 1))) {\n width = 2\n cost = 4\n } else if (code >= 0xd800 && code <= 0xdfff) {\n cost = 6\n } else {\n cost = unitBytes(code)\n }\n if (bytes + cost > limit) break\n bytes += cost\n index += width\n }\n return { text: value.slice(0, index), bytes }\n}\n\nconst boundedText = (value: string, budget: SnapshotBudget): string => {\n if (value.length <= maximumSnapshotBytes && reserve(budget, textBytes(value))) return value\n const markerBytes = textBytes(truncatedMarker)\n const prefix = boundedPrefix(value, Math.max(0, budget.bytes - markerBytes - quoteBytes))\n budget.bytes = Math.max(0, budget.bytes - (prefix.bytes + quoteBytes) - markerBytes)\n return `${prefix.text}${truncatedMarker}`\n}\n\n/**\n * Error fields read through the prototype chain, in the order the snapshot\n * projects them before any own data property the error added.\n */\nconst standardErrorKeys = [\"name\", \"message\", \"stack\", \"cause\"] as const\n\nconst snapshotValue = (\n value: unknown,\n budget: SnapshotBudget,\n ancestors: WeakSet<object>,\n depth = 0\n): unknown => {\n if (budget.bytes <= 0) return truncatedMarker\n if (depth > maximumSnapshotDepth) return Redaction.depthMarker\n if (typeof value === \"string\") return boundedText(value, budget)\n if (typeof value === \"number\") {\n const projected = Number.isFinite(value) ? value : String(value)\n reserve(budget, String(projected).length)\n return projected\n }\n if (typeof value === \"boolean\" || value === null) {\n reserve(budget, value === null ? 4 : value ? 4 : 5)\n return value\n }\n if (typeof value === \"bigint\") return boundedText(`${value}n`, budget)\n if (value === undefined) return boundedText(\"[Undefined]\", budget)\n if (typeof value === \"function\") return boundedText(Redaction.functionMarker, budget)\n if (typeof value === \"symbol\") return boundedText(Redaction.symbolMarker, budget)\n try {\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n return boundedText(Redaction.binaryMarker, budget)\n }\n } catch {\n return boundedText(unrenderableMarker, budget)\n }\n if (ancestors.has(value)) return boundedText(\"[Circular]\", budget)\n ancestors.add(value)\n try {\n if (value instanceof Date) {\n try {\n return boundedText(value.toISOString(), budget)\n } catch {\n return boundedText(unrenderableMarker, budget)\n }\n }\n if (value instanceof Error) {\n const record: Record<string, unknown> = Object.create(null)\n for (const key of standardErrorKeys.slice(0, budget.members)) {\n budget.members--\n try {\n record[key] = snapshotValue(value[key], budget, ancestors, depth + 1)\n } catch {\n record[key] = unrenderableMarker\n }\n }\n // Tagged failures (`_tag`, domain fields) and system errors (`code`,\n // `path`, `syscall`) keep their diagnostics as own data properties, so\n // the walk that projects plain records runs over the remaining keys.\n let names: ReadonlyArray<string>\n try {\n names = Object.getOwnPropertyNames(value).filter((key) =>\n !(standardErrorKeys as ReadonlyArray<string>).includes(key)\n )\n } catch {\n return record\n }\n let projected = 0\n let collided = false\n for (; projected < names.length && budget.members > 0; projected++) {\n budget.members--\n const key = names[projected]!\n const boundedKey = boundedText(key, budget)\n if (Object.hasOwn(record, boundedKey)) {\n collided = true\n continue\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n record[boundedKey] = descriptor !== undefined && \"value\" in descriptor\n ? snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n : unrenderableMarker\n }\n if (collided || projected < names.length) record[truncatedMarker] = truncatedMarker\n return record\n }\n if (Array.isArray(value)) {\n const output: Array<unknown> = []\n const length = value.length\n for (let index = 0; index < length && budget.members > 0; index++) {\n budget.members--\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index))\n output.push(\n descriptor === undefined || !(\"value\" in descriptor)\n ? unrenderableMarker\n : snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n )\n }\n if (output.length < length) output.push(truncatedMarker)\n return output\n }\n const record: Record<string, unknown> = Object.create(null)\n const names = Object.getOwnPropertyNames(value)\n for (let index = 0; index < names.length && budget.members > 0; index++) {\n budget.members--\n const key = names[index]!\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n const boundedKey = boundedText(key, budget)\n // A key truncated to fit the budget can read exactly like one already\n // copied. The first member keeps its slot; the later one is dropped and\n // the record is marked truncated below rather than silently overwritten.\n if (Object.hasOwn(record, boundedKey)) continue\n record[boundedKey] = descriptor !== undefined && \"value\" in descriptor\n ? snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n : unrenderableMarker\n }\n if (Object.keys(record).length < names.length) record[truncatedMarker] = truncatedMarker\n return record\n } catch {\n return boundedText(unrenderableMarker, budget)\n } finally {\n ancestors.delete(value)\n }\n}\n\nconst snapshotCause = (cause: Cause.Cause<unknown>, budget: SnapshotBudget): TelemetryCause => ({\n version: 1,\n reasons: cause.reasons.slice(0, maximumSnapshotMembers).map((reason): TelemetryCauseReason => {\n switch (reason._tag) {\n case \"Fail\":\n return { _tag: \"Fail\", error: snapshotValue(reason.error, budget, new WeakSet()) }\n case \"Die\":\n return { _tag: \"Die\", defect: snapshotValue(reason.defect, budget, new WeakSet()) }\n case \"Interrupt\":\n return { _tag: \"Interrupt\", fiberId: reason.fiberId ?? null }\n }\n })\n})\n\nconst isTelemetryLog = Schema.is(TelemetryLog)\n\n/**\n * Annotations are a container in the durable schema, so a snapshot that spent\n * the budget names the loss inside a record instead of replacing the record\n * with a scalar the schema refuses.\n */\nconst snapshotAnnotations = (value: unknown, budget: SnapshotBudget): Readonly<Record<string, unknown>> => {\n const snapshot = snapshotValue(value, budget, new WeakSet())\n return typeof snapshot === \"object\" && snapshot !== null && !Array.isArray(snapshot)\n ? snapshot as Readonly<Record<string, unknown>>\n : { [truncatedMarker]: truncatedMarker }\n}\n\nconst snapshotLog = (options: Logger.Options<unknown>): TelemetryLog => {\n const budget: SnapshotBudget = {\n bytes: maximumSnapshotBytes,\n members: maximumSnapshotMembers\n }\n try {\n const span = Option.getOrUndefined(Context.getOption(options.fiber.context, Tracer.ParentSpan))\n const candidate: TelemetryLog = {\n version: 1,\n level: options.logLevel,\n message: snapshotValue(options.message, budget, new WeakSet()),\n annotations: snapshotAnnotations(options.fiber.getRef(References.CurrentLogAnnotations), budget),\n cause: snapshotCause(options.cause, budget),\n fiberId: options.fiber.id,\n ...(span === undefined ? {} : { traceId: span.traceId, spanId: span.spanId }),\n timestamp: options.date.toISOString()\n }\n const redacted = Redaction.redact(candidate, { onTooDeep: \"name\" }) as TelemetryLog\n // The durable row is only useful if the exported schema decodes it, so an\n // oversized or schema-invalid projection degrades to the total record\n // rather than to a payload every consumer throws on.\n return encoder.encode(JSON.stringify(redacted)).byteLength <= maximumSnapshotBytes && isTelemetryLog(redacted)\n ? redacted\n : { ...candidate, message: truncatedMarker, annotations: {}, cause: { version: 1, reasons: [] } }\n } catch {\n return {\n version: 1,\n level: options.logLevel,\n message: unrenderableMarker,\n annotations: {},\n cause: { version: 1, reasons: [] },\n fiberId: options.fiber.id,\n timestamp: options.date.toISOString()\n }\n }\n}\n\nconst makeLog = (options: Logger.Options<unknown>, runId: JournalEvent.RunId): JournalEvent.Input =>\n new JournalEvent.Input({\n runId,\n sourceId,\n // The journal owns the durable per-run/source allocation. A local counter\n // starts over when a layer is rebuilt and makes distinct records collide.\n eventType: \"telemetry.log\",\n payload: snapshotLog(options),\n meta: {\n version: 1,\n source: \"/observability\"\n }\n })\n\n/**\n * Installs a bounded, drop-on-overflow logger forwarder for one explicit run.\n *\n * Configuration is decoded before a worker starts. The callback reads the\n * queue's remaining room first, snapshots and redacts a bounded DTO\n * synchronously only when a slot is free, then performs only non-blocking\n * queue admission. A record a saturated queue cannot take is counted and\n * discarded without being snapshotted. Queue overflow, journal `Dropped` receipts, delivery failures,\n * and journal defects each advance `Metric.droppedLogRecords`. The two failure\n * paths also warn through the ambient loggers with a fixed code and run id,\n * and the worker keeps draining. `Accepted` and `Duplicate` do not advance the\n * counter. Admission receipts cannot identify later drop-oldest evictions of\n * these records or report asynchronous persistence failures or shutdown losses.\n * Closing the scope interrupts the worker and may drop records still queued\n * behind an in-flight write without advancing the counter.\n *\n * The layer replaces the ambient logger set unless `mergeWithExisting` is\n * `true`, and provides `MinimumLogLevel` only when `minimumLogLevel` is given,\n * so an application that set that reference elsewhere keeps it.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerJournalForwarding = (\n options: Options\n): Layer.Layer<never, InvalidJournalLoggerOptions, Journal.Journal> =>\n Layer.unwrap(\n Effect.map(validateOptions(options), (configured) =>\n Layer.merge(\n Layer.effect(\n Logger.CurrentLoggers,\n Effect.gen(function*() {\n const journal = yield* Journal.Journal\n const queue = yield* Queue.bounded<JournalEvent.Input>(configured.capacity ?? 256)\n const dropped = EffectMetric.update(droppedLogRecords, 1)\n // This worker is forked before the logger it feeds is installed, so\n // its ambient logger set cannot contain that logger and a warning\n // here cannot enqueue itself. Delivery stays lossy; the loss is\n // reported and counted instead of vanishing. Warning annotations\n // use fixed codes so ambient sinks never receive raw failures.\n const forward = Effect.fn(\"JournalLogger.forward\")((input: JournalEvent.Input) =>\n journal.emitLossy(input).pipe(\n Effect.tap((receipt) => receipt._tag === \"Dropped\" ? dropped : Effect.void),\n Effect.catch(() =>\n dropped.pipe(\n Effect.andThen(\n Effect.annotateLogs(Effect.logWarning(\"A telemetry log record could not be forwarded\"), {\n runId: configured.runId,\n code: \"journal_forwarding_failed\"\n })\n )\n )\n )\n )\n )\n yield* Effect.forever(\n Queue.take(queue).pipe(\n Effect.flatMap(forward),\n // A defect from a journal implementation would otherwise end\n // this fiber for the rest of the run, silently, while the layer\n // still looks installed. Interruption stays fatal.\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.failCause(cause)\n : dropped.pipe(\n Effect.andThen(\n Effect.annotateLogs(\n Effect.logWarning(\"The telemetry forwarding worker recovered from a defect\"),\n { runId: configured.runId, code: \"journal_forwarding_defect\" }\n )\n )\n )\n )\n )\n ).pipe(Effect.forkScoped)\n\n const logger = Logger.make<unknown, void>((logOptions) => {\n // Snapshotting and redacting the record is the expensive half of\n // admission, and saturation is exactly when that work is thrown\n // away, so a queue with no room refuses before the record is\n // built. Nothing else runs between this read and the offer, so\n // the check cannot refuse a record the queue would have taken,\n // and the offer still reports a queue that closed underneath it.\n const accepted = !Queue.isFullUnsafe(queue)\n && Queue.offerUnsafe(queue, makeLog(logOptions, configured.runId))\n if (!accepted) droppedLogRecords.updateUnsafe(1, logOptions.fiber.context)\n })\n const current = yield* Effect.withFiber((fiber) => Effect.sync(() => fiber.getRef(Logger.CurrentLoggers)))\n return new Set(configured.mergeWithExisting === true ? current : []).add(logger)\n })\n ),\n configured.minimumLogLevel === undefined\n ? Layer.empty\n : Layer.succeed(References.MinimumLogLevel, configured.minimumLogLevel)\n ))\n )\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Non-blocking forwarding of bounded operational logs to the durable journal.\n *\n * @since 0.1.0\n */\n\nimport * as Journal from \"@smthrs/journal/Journal\"\nimport * as JournalEvent from \"@smthrs/journal/JournalEvent\"\nimport * as Redaction from \"@smthrs/journal/Redaction\"\nimport * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport type * as LogLevel from \"effect/LogLevel\"\nimport * as EffectMetric from \"effect/Metric\"\nimport * as Option from \"effect/Option\"\nimport * as Queue from \"effect/Queue\"\nimport * as References from \"effect/References\"\nimport * as Schema from \"effect/Schema\"\nimport * as Tracer from \"effect/Tracer\"\nimport { schemaIssuePath } from \"./internal/schemaIssuePath.ts\"\nimport { droppedLogRecords } from \"./Metric.ts\"\n\n/**\n * Largest queue accepted by the forwarding logger.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumCapacity = 65_536\n\n/**\n * Largest detached log payload admitted to the asynchronous queue.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotBytes = 1024 * 1024\n\n/**\n * Largest number of container members copied into one detached log payload.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotMembers = 4_096\n\n/**\n * Deepest container path copied into one detached log payload.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotDepth = 64\n\n/**\n * What a hostile or unreadable logged value becomes.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const unrenderableMarker = \"[Unrenderable]\"\n\n/**\n * What a value beyond a logger resource ceiling becomes.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const truncatedMarker = \"[Truncated]\"\n\n/**\n * Options for the journal forwarding logger.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options {\n /** The run every forwarded record is attributed to. */\n readonly runId: JournalEvent.RunId\n /** Queue depth, 1 through {@link maximumCapacity}. Defaults to 256. */\n readonly capacity?: number | undefined\n /**\n * Pins `References.MinimumLogLevel` for the whole application. Omitted, the\n * layer leaves that reference alone and Effect's own `Info` default applies.\n */\n readonly minimumLogLevel?: LogLevel.LogLevel | undefined\n /**\n * Keeps the ambient loggers alongside the forwarder. Defaults to `false`,\n * which replaces the ambient logger set.\n */\n readonly mergeWithExisting?: boolean | undefined\n}\n\n/**\n * A stable logger configuration refusal.\n *\n * @category errors\n * @since 1.0.0-rc.0\n */\nexport class InvalidJournalLoggerOptions extends Schema.TaggedError<InvalidJournalLoggerOptions>()(\n \"@smthrs/observability/InvalidJournalLoggerOptions\",\n {\n code: Schema.Literal(\"invalid_journal_logger_options\"),\n path: Schema.String,\n message: Schema.String\n }\n) {}\n\n/**\n * One typed failure retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryFail = Schema.Struct({\n _tag: Schema.Literal(\"Fail\"),\n error: Schema.Unknown\n})\n\n/**\n * One unexpected defect retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryDie = Schema.Struct({\n _tag: Schema.Literal(\"Die\"),\n defect: Schema.Unknown\n})\n\n/**\n * One interruption retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryInterrupt = Schema.Struct({\n _tag: Schema.Literal(\"Interrupt\"),\n fiberId: Schema.NullOr(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)))\n})\n\n/**\n * One reason in a persisted telemetry cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryCauseReason = Schema.Union([TelemetryFail, TelemetryDie, TelemetryInterrupt])\n\n/**\n * One reason in a persisted telemetry cause.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryCauseReason = typeof TelemetryCauseReason.Type\n\n/**\n * A versioned structural Effect cause.\n *\n * Effect 4 stores composed failures as an ordered reason list. The projection\n * preserves that order and each fail, defect, or interrupt discriminator.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryCause = Schema.Struct({\n version: Schema.Literal(1),\n reasons: Schema.Array(TelemetryCauseReason)\n})\n\n/**\n * A versioned structural Effect cause.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryCause = typeof TelemetryCause.Type\n\n/**\n * Runtime schema for the operational log payload written to the journal.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryLog = Schema.Struct({\n version: Schema.Literal(1),\n level: Schema.Literals([\"All\", \"Fatal\", \"Error\", \"Warn\", \"Info\", \"Debug\", \"Trace\", \"None\"]),\n message: Schema.Unknown,\n annotations: Schema.Record(Schema.String, Schema.Unknown),\n cause: TelemetryCause,\n fiberId: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n traceId: Schema.optionalKey(Schema.String),\n spanId: Schema.optionalKey(Schema.String),\n timestamp: Schema.String\n})\n\n/**\n * Versioned operational log payload written to the journal.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryLog = typeof TelemetryLog.Type\n\nconst sourceId = \"flows/observability/logger\" as JournalEvent.SourceId\nconst encoder = new TextEncoder()\n\nconst OptionsSchema = Schema.Struct({\n runId: JournalEvent.RunId,\n capacity: Schema.optional(\n Schema.Int.check(\n Schema.isGreaterThanOrEqualTo(1),\n Schema.isLessThanOrEqualTo(maximumCapacity)\n )\n ),\n minimumLogLevel: Schema.optional(\n Schema.Literals([\"All\", \"Fatal\", \"Error\", \"Warn\", \"Info\", \"Debug\", \"Trace\", \"None\"])\n ),\n mergeWithExisting: Schema.optional(Schema.Boolean)\n})\n\nconst validateOptions = (options: Options) =>\n Schema.decodeUnknownEffect(OptionsSchema)(options).pipe(\n Effect.mapError((cause) => {\n const path = schemaIssuePath(cause, \"options\")\n return new InvalidJournalLoggerOptions({\n code: \"invalid_journal_logger_options\",\n path,\n message: `journal logger ${path} is invalid`\n })\n })\n )\n\ninterface SnapshotBudget {\n bytes: number\n members: number\n}\n\nconst reserve = (budget: SnapshotBudget, bytes: number): boolean => {\n if (bytes > budget.bytes) return false\n budget.bytes -= bytes\n return true\n}\n\nconst textBytes = (value: string): number => encoder.encode(JSON.stringify(value)).byteLength\n\nconst quoteBytes = 2\nconst shortEscapes = new Set([0x08, 0x09, 0x0a, 0x0c, 0x0d])\n\n/** Bytes one non-surrogate code unit occupies inside a JSON string body. */\nconst unitBytes = (code: number): number => {\n if (code === 0x22 || code === 0x5c) return 2\n if (code < 0x20) return shortEscapes.has(code) ? 2 : 6\n if (code < 0x80) return 1\n if (code < 0x800) return 2\n return 3\n}\n\nconst isLowSurrogate = (code: number): boolean => code >= 0xdc00 && code <= 0xdfff\n\n/**\n * The longest prefix whose JSON string body fits `limit` bytes, measured in one\n * forward pass. A surrogate pair is admitted or refused whole, so the retained\n * text is well formed whenever the input is.\n */\nconst boundedPrefix = (value: string, limit: number): { readonly text: string; readonly bytes: number } => {\n let bytes = 0\n let index = 0\n while (index < value.length) {\n const code = value.charCodeAt(index)\n let width = 1\n let cost: number\n if (code >= 0xd800 && code <= 0xdbff && isLowSurrogate(value.charCodeAt(index + 1))) {\n width = 2\n cost = 4\n } else if (code >= 0xd800 && code <= 0xdfff) {\n cost = 6\n } else {\n cost = unitBytes(code)\n }\n if (bytes + cost > limit) break\n bytes += cost\n index += width\n }\n return { text: value.slice(0, index), bytes }\n}\n\nconst boundedText = (value: string, budget: SnapshotBudget): string => {\n if (value.length <= maximumSnapshotBytes && reserve(budget, textBytes(value))) return value\n const markerBytes = textBytes(truncatedMarker)\n const prefix = boundedPrefix(value, Math.max(0, budget.bytes - markerBytes - quoteBytes))\n budget.bytes = Math.max(0, budget.bytes - (prefix.bytes + quoteBytes) - markerBytes)\n return `${prefix.text}${truncatedMarker}`\n}\n\n/**\n * Error fields read through the prototype chain, in the order the snapshot\n * projects them before any own data property the error added.\n */\nconst standardErrorKeys = [\"name\", \"message\", \"stack\", \"cause\"] as const\n\n/** Reads inherited data fields without invoking accessors or walking forever. */\nconst errorField = (value: object, key: string): unknown => {\n let current: object | null = value\n for (let depth = 0; current !== null && depth <= maximumSnapshotDepth; depth++) {\n const descriptor = Object.getOwnPropertyDescriptor(current, key)\n if (descriptor !== undefined) return \"value\" in descriptor ? descriptor.value : unrenderableMarker\n current = Object.getPrototypeOf(current)\n }\n return current === null ? undefined : truncatedMarker\n}\n\nconst snapshotValue = (\n value: unknown,\n budget: SnapshotBudget,\n ancestors: WeakSet<object>,\n depth = 0\n): unknown => {\n if (budget.bytes <= 0) return truncatedMarker\n if (depth > maximumSnapshotDepth) return Redaction.depthMarker\n if (typeof value === \"string\") return boundedText(value, budget)\n if (typeof value === \"number\") {\n const projected = Number.isFinite(value) ? value : String(value)\n reserve(budget, String(projected).length)\n return projected\n }\n if (typeof value === \"boolean\" || value === null) {\n reserve(budget, value === null ? 4 : value ? 4 : 5)\n return value\n }\n if (typeof value === \"bigint\") return boundedText(`${value}n`, budget)\n if (value === undefined) return boundedText(\"[Undefined]\", budget)\n if (typeof value === \"function\") return boundedText(Redaction.functionMarker, budget)\n if (typeof value === \"symbol\") return boundedText(Redaction.symbolMarker, budget)\n try {\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n return boundedText(Redaction.binaryMarker, budget)\n }\n } catch {\n return boundedText(unrenderableMarker, budget)\n }\n if (ancestors.has(value)) return boundedText(\"[Circular]\", budget)\n ancestors.add(value)\n try {\n if (value instanceof Date) {\n try {\n return boundedText(value.toISOString(), budget)\n } catch {\n return boundedText(unrenderableMarker, budget)\n }\n }\n if (value instanceof Error) {\n const record: Record<string, unknown> = Object.create(null)\n for (const key of standardErrorKeys.slice(0, budget.members)) {\n budget.members--\n try {\n record[key] = snapshotValue(errorField(value, key), budget, ancestors, depth + 1)\n } catch {\n record[key] = unrenderableMarker\n }\n }\n // Tagged failures (`_tag`, domain fields) and system errors (`code`,\n // `path`, `syscall`) keep their diagnostics as own data properties, so\n // the walk that projects plain records runs over the remaining keys.\n let names: ReadonlyArray<string>\n try {\n names = Object.getOwnPropertyNames(value).filter((key) =>\n !(standardErrorKeys as ReadonlyArray<string>).includes(key)\n )\n } catch {\n return record\n }\n let projected = 0\n let collided = false\n for (; projected < names.length && budget.members > 0; projected++) {\n budget.members--\n const key = names[projected]!\n const boundedKey = boundedText(key, budget)\n if (Object.hasOwn(record, boundedKey)) {\n collided = true\n continue\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n record[boundedKey] = descriptor !== undefined && \"value\" in descriptor\n ? snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n : unrenderableMarker\n }\n if (collided || projected < names.length) record[truncatedMarker] = truncatedMarker\n return record\n }\n if (Array.isArray(value)) {\n const output: Array<unknown> = []\n const length = value.length\n for (let index = 0; index < length && budget.members > 0; index++) {\n budget.members--\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index))\n output.push(\n descriptor === undefined || !(\"value\" in descriptor)\n ? unrenderableMarker\n : snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n )\n }\n if (output.length < length) output.push(truncatedMarker)\n return output\n }\n const record: Record<string, unknown> = Object.create(null)\n const names = Object.getOwnPropertyNames(value)\n for (let index = 0; index < names.length && budget.members > 0; index++) {\n budget.members--\n const key = names[index]!\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n const boundedKey = boundedText(key, budget)\n // A key truncated to fit the budget can read exactly like one already\n // copied. The first member keeps its slot; the later one is dropped and\n // the record is marked truncated below rather than silently overwritten.\n if (Object.hasOwn(record, boundedKey)) continue\n record[boundedKey] = descriptor !== undefined && \"value\" in descriptor\n ? snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n : unrenderableMarker\n }\n if (Object.keys(record).length < names.length) record[truncatedMarker] = truncatedMarker\n return record\n } catch {\n return boundedText(unrenderableMarker, budget)\n } finally {\n ancestors.delete(value)\n }\n}\n\nconst snapshotCause = (cause: Cause.Cause<unknown>, budget: SnapshotBudget): TelemetryCause => ({\n version: 1,\n reasons: cause.reasons.slice(0, maximumSnapshotMembers).map((reason): TelemetryCauseReason => {\n switch (reason._tag) {\n case \"Fail\":\n return { _tag: \"Fail\", error: snapshotValue(reason.error, budget, new WeakSet()) }\n case \"Die\":\n return { _tag: \"Die\", defect: snapshotValue(reason.defect, budget, new WeakSet()) }\n case \"Interrupt\":\n return { _tag: \"Interrupt\", fiberId: reason.fiberId ?? null }\n }\n })\n})\n\nconst isTelemetryLog = Schema.is(TelemetryLog)\n\n/**\n * Annotations are a container in the durable schema, so a snapshot that spent\n * the budget names the loss inside a record instead of replacing the record\n * with a scalar the schema refuses.\n */\nconst snapshotAnnotations = (value: unknown, budget: SnapshotBudget): Readonly<Record<string, unknown>> => {\n const snapshot = snapshotValue(value, budget, new WeakSet())\n return typeof snapshot === \"object\" && snapshot !== null && !Array.isArray(snapshot)\n ? snapshot as Readonly<Record<string, unknown>>\n : { [truncatedMarker]: truncatedMarker }\n}\n\nconst snapshotLog = (options: Logger.Options<unknown>): TelemetryLog => {\n const budget: SnapshotBudget = {\n bytes: maximumSnapshotBytes,\n members: maximumSnapshotMembers\n }\n try {\n const span = Option.getOrUndefined(Context.getOption(options.fiber.context, Tracer.ParentSpan))\n const candidate: TelemetryLog = {\n version: 1,\n level: options.logLevel,\n message: snapshotValue(options.message, budget, new WeakSet()),\n annotations: snapshotAnnotations(options.fiber.getRef(References.CurrentLogAnnotations), budget),\n cause: snapshotCause(options.cause, budget),\n fiberId: options.fiber.id,\n ...(span === undefined ? {} : { traceId: span.traceId, spanId: span.spanId }),\n timestamp: options.date.toISOString()\n }\n const redacted = Redaction.redact(candidate, { onTooDeep: \"name\" }) as TelemetryLog\n // The durable row is only useful if the exported schema decodes it, so an\n // oversized or schema-invalid projection degrades to the total record\n // rather than to a payload every consumer throws on.\n return encoder.encode(JSON.stringify(redacted)).byteLength <= maximumSnapshotBytes && isTelemetryLog(redacted)\n ? redacted\n : { ...candidate, message: truncatedMarker, annotations: {}, cause: { version: 1, reasons: [] } }\n } catch {\n return {\n version: 1,\n level: options.logLevel,\n message: unrenderableMarker,\n annotations: {},\n cause: { version: 1, reasons: [] },\n fiberId: options.fiber.id,\n timestamp: options.date.toISOString()\n }\n }\n}\n\nconst makeLog = (options: Logger.Options<unknown>, runId: JournalEvent.RunId): JournalEvent.Input =>\n new JournalEvent.Input({\n runId,\n sourceId,\n // The journal owns the durable per-run/source allocation. A local counter\n // starts over when a layer is rebuilt and makes distinct records collide.\n eventType: \"telemetry.log\",\n payload: snapshotLog(options),\n meta: {\n version: 1,\n source: \"/observability\"\n }\n })\n\n/**\n * Installs a bounded, drop-on-overflow logger forwarder for one explicit run.\n *\n * Configuration is decoded before a worker starts. The callback reads the\n * queue's remaining room first, snapshots and redacts a bounded DTO\n * synchronously only when a slot is free, then performs only non-blocking\n * queue admission. A record a saturated queue cannot take is counted and\n * discarded without being snapshotted. Queue overflow, journal `Dropped` receipts, delivery failures,\n * and journal defects each advance `Metric.droppedLogRecords`. The two failure\n * paths also warn through the ambient loggers with a fixed code and run id,\n * and the worker keeps draining. `Accepted` and `Duplicate` do not advance the\n * counter. Admission receipts cannot identify later drop-oldest evictions of\n * these records or report asynchronous persistence failures or shutdown losses.\n * Closing the scope interrupts the worker and may drop records still queued\n * behind an in-flight write without advancing the counter.\n *\n * The layer replaces the ambient logger set unless `mergeWithExisting` is\n * `true`, and provides `MinimumLogLevel` only when `minimumLogLevel` is given,\n * so an application that set that reference elsewhere keeps it.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerJournalForwarding = (\n options: Options\n): Layer.Layer<never, InvalidJournalLoggerOptions, Journal.Journal> =>\n Layer.unwrap(\n Effect.map(validateOptions(options), (configured) =>\n Layer.merge(\n Layer.effect(\n Logger.CurrentLoggers,\n Effect.gen(function*() {\n const journal = yield* Journal.Journal\n const queue = yield* Queue.bounded<JournalEvent.Input>(configured.capacity ?? 256)\n const dropped = EffectMetric.update(droppedLogRecords, 1)\n // This worker is forked before the logger it feeds is installed, so\n // its ambient logger set cannot contain that logger and a warning\n // here cannot enqueue itself. Delivery stays lossy; the loss is\n // reported and counted instead of vanishing. Warning annotations\n // use fixed codes so ambient sinks never receive raw failures.\n const forward = Effect.fn(\"JournalLogger.forward\")((input: JournalEvent.Input) =>\n journal.emitLossy(input).pipe(\n Effect.tap((receipt) => receipt._tag === \"Dropped\" ? dropped : Effect.void),\n Effect.catch(() =>\n dropped.pipe(\n Effect.andThen(\n Effect.annotateLogs(Effect.logWarning(\"A telemetry log record could not be forwarded\"), {\n runId: configured.runId,\n code: \"journal_forwarding_failed\"\n })\n )\n )\n )\n )\n )\n yield* Effect.forever(\n Queue.take(queue).pipe(\n Effect.flatMap(forward),\n // A defect from a journal implementation would otherwise end\n // this fiber for the rest of the run, silently, while the layer\n // still looks installed. Interruption stays fatal.\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.failCause(cause)\n : dropped.pipe(\n Effect.andThen(\n Effect.annotateLogs(\n Effect.logWarning(\"The telemetry forwarding worker recovered from a defect\"),\n { runId: configured.runId, code: \"journal_forwarding_defect\" }\n )\n )\n )\n )\n )\n ).pipe(Effect.forkScoped)\n\n const logger = Logger.make<unknown, void>((logOptions) => {\n // Snapshotting and redacting the record is the expensive half of\n // admission, and saturation is exactly when that work is thrown\n // away, so a queue with no room refuses before the record is\n // built. Nothing else runs between this read and the offer, so\n // the check cannot refuse a record the queue would have taken,\n // and the offer still reports a queue that closed underneath it.\n const accepted = !Queue.isFullUnsafe(queue)\n && Queue.offerUnsafe(queue, makeLog(logOptions, configured.runId))\n if (!accepted) droppedLogRecords.updateUnsafe(1, logOptions.fiber.context)\n })\n const current = yield* Effect.withFiber((fiber) => Effect.sync(() => fiber.getRef(Logger.CurrentLoggers)))\n return new Set(configured.mergeWithExisting === true ? current : []).add(logger)\n })\n ),\n configured.minimumLogLevel === undefined\n ? Layer.empty\n : Layer.succeed(References.MinimumLogLevel, configured.minimumLogLevel)\n ))\n )\n"],
5
+ "mappings": "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",
6
6
  "names": ["record", "names"]
7
7
  }
@@ -39,7 +39,8 @@ export declare const layerPrettyDev: (options?: Options) => Layer.Layer<never>;
39
39
  */
40
40
  export declare const layerStructuredJson: (options?: Options) => Layer.Layer<never>;
41
41
  /**
42
- * Removes the active logger set while retaining Effect's minimum-level filter.
42
+ * Removes the active logger set and pins the minimum level to `None` unless
43
+ * `options.minimumLogLevel` explicitly selects another level.
43
44
  *
44
45
  * @category layers
45
46
  * @since 0.1.0
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAGhD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;AAuBD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAQnE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMxE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAIrF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMnG,CAAA"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAGhD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;AAuBD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAQnE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMxE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAIrF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMnG,CAAA"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Logger.ts"],
4
- "sourcesContent": ["/**\n * Effect logger layers used by flows.\n *\n * @since 0.1.0\n */\n\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport type * as LogLevel from \"effect/LogLevel\"\nimport * as References from \"effect/References\"\n\n/**\n * Options shared by the built-in logger layers.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Options {\n /**\n * Pins `References.MinimumLogLevel` for the whole application. Omitted, the\n * layer leaves that reference alone and Effect's own `Info` default applies.\n */\n readonly minimumLogLevel?: LogLevel.LogLevel | undefined\n /**\n * Keeps the ambient loggers alongside this one. Defaults to `false`, which\n * replaces the ambient logger set, matching Effect's own `Logger.layer`.\n */\n readonly mergeWithExisting?: boolean | undefined\n}\n\n/**\n * Installs the minimum-level reference only when the caller named a level, so\n * a layer that adds a sink does not pin the level an application chose\n * elsewhere. Effect's own default for the reference is already `Info`.\n */\nconst withMinimumLogLevel = (\n layer: Layer.Layer<never>,\n minimumLogLevel: LogLevel.LogLevel | undefined\n): Layer.Layer<never> =>\n minimumLogLevel === undefined\n ? layer\n : Layer.merge(layer, Layer.succeed(References.MinimumLogLevel, minimumLogLevel))\n\nconst optionsWithDefaults = (options?: Options): {\n readonly minimumLogLevel: LogLevel.LogLevel | undefined\n readonly mergeWithExisting: boolean\n} => ({\n minimumLogLevel: options?.minimumLogLevel,\n mergeWithExisting: options?.mergeWithExisting ?? false\n})\n\n/**\n * Provides a human-readable development logger.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerPrettyDev = (options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([Logger.consolePretty({ colors: \"auto\", mode: \"auto\" })], {\n mergeWithExisting: resolved.mergeWithExisting\n }),\n resolved.minimumLogLevel\n )\n}\n\n/**\n * Provides one structured JSON object per log line.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerStructuredJson = (options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([Logger.consoleJson], { mergeWithExisting: resolved.mergeWithExisting }),\n resolved.minimumLogLevel\n )\n}\n\n/**\n * Removes the active logger set while retaining Effect's minimum-level filter.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerNoop = (options?: Pick<Options, \"minimumLogLevel\">): Layer.Layer<never> =>\n withMinimumLogLevel(\n Logger.layer([]),\n options?.minimumLogLevel ?? \"None\"\n )\n\n/**\n * A logger layer that can be composed without requiring a runtime service.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = (logger: Logger.Logger<unknown, unknown>, options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([logger], { mergeWithExisting: resolved.mergeWithExisting }),\n resolved.minimumLogLevel\n )\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,YAAuB;AACvB,aAAwB;AAExB,iBAA4B;AA0B5B,MAAM,sBAAsB,CAC1BA,QACA,oBAEA,oBAAoB,SAChBA,SACA,MAAM,MAAMA,QAAO,MAAM,QAAQ,WAAW,iBAAiB,eAAe,CAAC;AAEnF,MAAM,sBAAsB,CAAC,aAGvB;AAAA,EACJ,iBAAiB,SAAS;AAAA,EAC1B,mBAAmB,SAAS,qBAAqB;AACnD;AAQO,MAAM,iBAAiB,CAAC,YAA0C;AACvE,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,OAAO,cAAc,EAAE,QAAQ,QAAQ,MAAM,OAAO,CAAC,CAAC,GAAG;AAAA,MACrE,mBAAmB,SAAS;AAAA,IAC9B,CAAC;AAAA,IACD,SAAS;AAAA,EACX;AACF;AAQO,MAAM,sBAAsB,CAAC,YAA0C;AAC5E,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,OAAO,WAAW,GAAG,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACpF,SAAS;AAAA,EACX;AACF;AAQO,MAAM,YAAY,CAAC,YACxB;AAAA,EACE,OAAO,MAAM,CAAC,CAAC;AAAA,EACf,SAAS,mBAAmB;AAC9B;AAQK,MAAM,QAAQ,CAAC,QAAyC,YAA0C;AACvG,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,MAAM,GAAG,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACxE,SAAS;AAAA,EACX;AACF;",
4
+ "sourcesContent": ["/**\n * Effect logger layers used by flows.\n *\n * @since 0.1.0\n */\n\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport type * as LogLevel from \"effect/LogLevel\"\nimport * as References from \"effect/References\"\n\n/**\n * Options shared by the built-in logger layers.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Options {\n /**\n * Pins `References.MinimumLogLevel` for the whole application. Omitted, the\n * layer leaves that reference alone and Effect's own `Info` default applies.\n */\n readonly minimumLogLevel?: LogLevel.LogLevel | undefined\n /**\n * Keeps the ambient loggers alongside this one. Defaults to `false`, which\n * replaces the ambient logger set, matching Effect's own `Logger.layer`.\n */\n readonly mergeWithExisting?: boolean | undefined\n}\n\n/**\n * Installs the minimum-level reference only when the caller named a level, so\n * a layer that adds a sink does not pin the level an application chose\n * elsewhere. Effect's own default for the reference is already `Info`.\n */\nconst withMinimumLogLevel = (\n layer: Layer.Layer<never>,\n minimumLogLevel: LogLevel.LogLevel | undefined\n): Layer.Layer<never> =>\n minimumLogLevel === undefined\n ? layer\n : Layer.merge(layer, Layer.succeed(References.MinimumLogLevel, minimumLogLevel))\n\nconst optionsWithDefaults = (options?: Options): {\n readonly minimumLogLevel: LogLevel.LogLevel | undefined\n readonly mergeWithExisting: boolean\n} => ({\n minimumLogLevel: options?.minimumLogLevel,\n mergeWithExisting: options?.mergeWithExisting ?? false\n})\n\n/**\n * Provides a human-readable development logger.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerPrettyDev = (options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([Logger.consolePretty({ colors: \"auto\", mode: \"auto\" })], {\n mergeWithExisting: resolved.mergeWithExisting\n }),\n resolved.minimumLogLevel\n )\n}\n\n/**\n * Provides one structured JSON object per log line.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerStructuredJson = (options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([Logger.consoleJson], { mergeWithExisting: resolved.mergeWithExisting }),\n resolved.minimumLogLevel\n )\n}\n\n/**\n * Removes the active logger set and pins the minimum level to `None` unless\n * `options.minimumLogLevel` explicitly selects another level.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerNoop = (options?: Pick<Options, \"minimumLogLevel\">): Layer.Layer<never> =>\n withMinimumLogLevel(\n Logger.layer([]),\n options?.minimumLogLevel ?? \"None\"\n )\n\n/**\n * A logger layer that can be composed without requiring a runtime service.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = (logger: Logger.Logger<unknown, unknown>, options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([logger], { mergeWithExisting: resolved.mergeWithExisting }),\n resolved.minimumLogLevel\n )\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,YAAuB;AACvB,aAAwB;AAExB,iBAA4B;AA0B5B,MAAM,sBAAsB,CAC1BA,QACA,oBAEA,oBAAoB,SAChBA,SACA,MAAM,MAAMA,QAAO,MAAM,QAAQ,WAAW,iBAAiB,eAAe,CAAC;AAEnF,MAAM,sBAAsB,CAAC,aAGvB;AAAA,EACJ,iBAAiB,SAAS;AAAA,EAC1B,mBAAmB,SAAS,qBAAqB;AACnD;AAQO,MAAM,iBAAiB,CAAC,YAA0C;AACvE,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,OAAO,cAAc,EAAE,QAAQ,QAAQ,MAAM,OAAO,CAAC,CAAC,GAAG;AAAA,MACrE,mBAAmB,SAAS;AAAA,IAC9B,CAAC;AAAA,IACD,SAAS;AAAA,EACX;AACF;AAQO,MAAM,sBAAsB,CAAC,YAA0C;AAC5E,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,OAAO,WAAW,GAAG,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACpF,SAAS;AAAA,EACX;AACF;AASO,MAAM,YAAY,CAAC,YACxB;AAAA,EACE,OAAO,MAAM,CAAC,CAAC;AAAA,EACf,SAAS,mBAAmB;AAC9B;AAQK,MAAM,QAAQ,CAAC,QAAyC,YAA0C;AACvG,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,MAAM,GAAG,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACxE,SAAS;AAAA,EACX;AACF;",
6
6
  "names": ["layer"]
7
7
  }
@@ -45,7 +45,7 @@ export declare const defaultServiceName = "flows";
45
45
  * @category resource
46
46
  * @since 0.1.0
47
47
  */
48
- export declare const defaultServiceVersion = "1.0.0-rc.6";
48
+ export declare const defaultServiceVersion = "1.0.0-rc.8";
49
49
  /**
50
50
  * Maximum encoded export request size, in bytes.
51
51
  * @category transport
package/dist/cjs/Otlp.js CHANGED
@@ -62,7 +62,7 @@ var Tracer = __toESM(require("effect/Tracer"), 1);
62
62
  var Endpoint = __toESM(require("./Endpoint.js"), 1);
63
63
  var Resource = __toESM(require("./Resource.js"), 1);
64
64
  const defaultServiceName = "flows";
65
- const defaultServiceVersion = "1.0.0-rc.6";
65
+ const defaultServiceVersion = "1.0.0-rc.8";
66
66
  const maxBatchSize = 1e3;
67
67
  const maxInFlight = 4;
68
68
  const maxRequestBytes = 1024 * 1024;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Otlp.ts"],
4
- "sourcesContent": ["/**\n * Default OTLP export wiring for flows telemetry.\n *\n * The store packages already open spans through Effect's tracer and update\n * `Metric` counters on their hot paths; what they deliberately do not do is\n * ship an exporter. This module is that exporter: one layer that installs\n * Effect's own OTLP logger, metrics exporter, and tracer\n * (`effect/observability/Otlp`) against a collector endpoint, with\n * the flows service identity filled in. Nothing beyond `effect` is involved;\n * no OpenTelemetry SDK dependency.\n *\n * Browser support is met by construction rather than by a no-op variant:\n * export happens over Effect's `HttpClient`, and {@link layerFetch} binds the\n * `fetch` implementation the host already has, so no entry point here ever\n * resolves a `node:` built-in. See the\n * {@link https://smithers.sh/docs/reference/api/observability | observability API contract}.\n *\n * @since 0.1.0\n */\n\nimport * as Redaction from \"@smthrs/journal/Redaction\"\nimport * as Cause from \"effect/Cause\"\nimport { Clock } from \"effect/Clock\"\nimport * as ConfigProvider from \"effect/ConfigProvider\"\nimport type * as Duration from \"effect/Duration\"\nimport * as Effect from \"effect/Effect\"\nimport * as Exit from \"effect/Exit\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Headers from \"effect/http/Headers\"\nimport type * as HttpBody from \"effect/http/HttpBody\"\nimport * as HttpClient from \"effect/http/HttpClient\"\nimport type * as HttpClientRequest from \"effect/http/HttpClientRequest\"\nimport * as HttpClientResponse from \"effect/http/HttpClientResponse\"\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport * as Metric from \"effect/Metric\"\nimport * as Otlp from \"effect/observability/Otlp\"\nimport * as Option from \"effect/Option\"\nimport * as References from \"effect/References\"\nimport * as Schema from \"effect/Schema\"\nimport * as Semaphore from \"effect/Semaphore\"\nimport * as Tracer from \"effect/Tracer\"\nimport * as Endpoint from \"./Endpoint.ts\"\nimport * as Resource from \"./Resource.ts\"\n\n/**\n * The `service.name` resource attribute installed when the caller supplies\n * none: the flows distribution itself. Override it per application with\n * {@link Options.serviceName}.\n *\n * @category resource\n * @since 0.1.0\n */\nexport const defaultServiceName = \"flows\"\n\n/**\n * The `service.version` resource attribute installed when the caller supplies\n * none. Mirrors the release version in this package's `package.json`.\n *\n * A published package cannot read its own manifest on every runtime it\n * supports, so the version lives here as a literal.\n * `scripts/set-release-version.mjs` rewrites this declaration with the\n * manifests, and its `--check` mode reports drift, so a release bump cannot\n * leave it behind.\n *\n * @category resource\n * @since 0.1.0\n */\nexport const defaultServiceVersion = \"1.0.0-rc.6\"\n\n// The upstream logger and tracer each buffer at most one 1,000-record batch.\n// Do not queue at the transport: upstream forks every full batch independently.\nconst maxBatchSize = 1000\nconst maxInFlight = 4\n/**\n * Maximum encoded export request size, in bytes.\n * @category transport\n * @since 1.0.0-rc.0\n */\nexport const maxRequestBytes = 1024 * 1024\nconst requestTimeout = \"10 seconds\"\nconst diagnosticIntervalMillis = 60_000\n// The envelope around the resource in a metrics request repeats `service.name`\n// as the instrumentation scope name: at most 1,024 code units, at most six\n// bytes each once JSON-escaped, so under 8 KiB together with the envelope's own\n// keys. Log and trace requests name their scope `effect` with the Effect\n// version instead, which is smaller.\n/**\n * Reserved bytes for request wrappers and the escaped instrumentation scope.\n * @category transport\n * @since 1.0.0-rc.0\n */\nexport const maximumEnvelopeBytes = 8 * 1024\n\n/**\n * Bytes of every export request kept free for the signal batch itself.\n *\n * The transport discards a request over 1 MiB, and the resource rides in every\n * request, so the largest resource `Resource.decode` admits\n * (`Resource.maximumResourceBytes`, 128 KiB) and the envelope, which in a\n * metrics request repeats the service name (under 8 KiB), come off the top.\n * The 888 KiB left gives each\n * record of a full 1,000-record logger or tracer batch about 900 bytes, three\n * to four times a bare log record or span, and gives the metrics snapshot room\n * for several thousand series. Every resource the decoder accepts therefore\n * leaves an ordinary batch of any signal exportable; what this reserve does\n * not bound is a single application record or a registry large enough to\n * exceed it on its own.\n *\n * @category transport\n * @since 1.0.0-rc.0\n */\nexport const reservedBatchBytes = maxRequestBytes - Resource.maximumResourceBytes - maximumEnvelopeBytes\n\ntype DiscardReason = \"oversized\" | \"stalled\" | \"saturated\"\n\n/**\n * A collector's answer reduced to what the exporter acts on: its status and\n * its `retry-after` delay, with no body.\n *\n * `Response` refuses a status outside 200 to 599 and a malformed header value.\n * Neither is a collector's answer, so `Response.error()` reports it as status\n * 0, which the exporter fails without retrying. A browser already reports a\n * refused redirect that way.\n */\nconst withoutBody = (response: HttpClientResponse.HttpClientResponse): HttpClientResponse.HttpClientResponse => {\n const retryAfter = response.headers[\"retry-after\"]\n let answer: Response\n try {\n answer = new Response(null, {\n status: response.status,\n headers: retryAfter === undefined ? {} : { \"retry-after\": retryAfter }\n })\n } catch {\n answer = Response.error()\n }\n return HttpClientResponse.fromWeb(response.request, answer)\n}\n\nconst boundedClient = Layer.effect(\n HttpClient.HttpClient,\n Effect.gen(function*() {\n // The exporter reads every response body to its end, after the deadline\n // and the in-flight limit below have let the request go. A collector that\n // never ended its answer would stall that signal and grow the buffered\n // body without bound. So the exchange ends here: the exporter receives the\n // status and retry delay, and closing the scope aborts the transport with\n // the body unread.\n const client = HttpClient.transformResponse(\n HttpClient.withScope(yield* HttpClient.HttpClient),\n (exchange) => exchange.pipe(Effect.map(withoutBody), Effect.scoped)\n )\n const clock = yield* Clock\n // The loggers installed when this transport is acquired. The OTLP logger\n // the same acquisition installs does not exist yet, so a diagnostic pinned\n // to this set cannot enter the exporter it describes, whichever fiber runs\n // the export: the interval and shutdown fibers inherit this set anyway,\n // but a flush requested from application code runs with the application's\n // loggers, which by then include this exporter.\n const ambientLoggers = yield* Effect.withFiber((fiber) => Effect.succeed(fiber.getRef(Logger.CurrentLoggers)))\n const permits = Semaphore.makeUnsafe(maxInFlight)\n // The counter lives with the transport it describes.\n const droppedExports = Metric.counter(\"flows_observability_otlp_dropped\")\n let nextDiagnosticAt = -Infinity\n // A local discard is terminal, so the upstream retry loop must not retain\n // or retry its payload, and the counter records batches, not records. The\n // warning is the diagnostic the counter cannot be: the counter is exported\n // through this same transport and shares every outage with it. One\n // warning per minute keeps a sustained outage from flooding the ambient\n // loggers; the running total in its annotations carries the volume.\n // Replace ambient annotations and log spans to bound the diagnostic itself.\n const discard = (reason: DiscardReason, request: HttpClientRequest.HttpClientRequest, bytes: number) =>\n Metric.update(droppedExports, 1).pipe(\n Effect.andThen(Effect.suspend(() => {\n const now = clock.currentTimeMillisUnsafe()\n if (now < nextDiagnosticAt) return Effect.void\n nextDiagnosticAt = now + diagnosticIntervalMillis\n return Metric.value(droppedExports).pipe(\n Effect.flatMap((dropped) =>\n Effect.logWarning(\"An OTLP export batch was discarded\").pipe(\n Effect.provideService(References.CurrentLogSpans, []),\n Effect.provideService(References.CurrentLogAnnotations, {\n code: \"otlp_export_discarded\",\n reason,\n bytes,\n limit: maxRequestBytes,\n dropped: dropped.count\n })\n )\n ),\n Effect.provideService(Logger.CurrentLoggers, ambientLoggers)\n )\n })),\n Effect.as(HttpClientResponse.fromWeb(request, new Response(null, { status: 204 })))\n )\n return HttpClient.transform(client, (requestEffect, request) =>\n Effect.suspend(() => {\n // layerJson always supplies a Uint8Array body with a byte length.\n const bytes = (request.body as HttpBody.Uint8Array).contentLength\n if (bytes > maxRequestBytes) return discard(\"oversized\", request, bytes)\n // Fetch must expose redirects before any credential or signal body\n // leaves the configured endpoint, even when the caller enables follow.\n const confinedRequest = Effect.flatMap(Effect.serviceOption(FetchHttpClient.RequestInit), (init) =>\n requestEffect.pipe(\n Effect.provideService(FetchHttpClient.RequestInit, {\n ...Option.getOrUndefined(init),\n redirect: \"manual\"\n })\n ))\n return confinedRequest.pipe(\n Effect.timeoutOrElse({\n duration: requestTimeout,\n orElse: () =>\n discard(\"stalled\", request, bytes)\n }),\n permits.withPermitsIfAvailable(1),\n Effect.flatMap(Option.match({\n onNone: () =>\n discard(\"saturated\", request, bytes),\n onSome: Effect.succeed\n }))\n )\n }))\n })\n)\n\nconst loopbackIpv4 = /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/\n\n/** Whether a decoded endpoint's host never leaves this machine. */\nconst isLoopback = (endpoint: string): boolean => {\n const hostname = new URL(endpoint).hostname\n return hostname === \"localhost\" || hostname === \"[::1]\" || loopbackIpv4.test(hostname)\n}\n\n/**\n * Refuses a credential header bound for a plaintext collector off this\n * machine. Anyone on the network path could read the token from every export\n * request, and the exporter would never report it. Loopback `http://` stays\n * allowed for a local collector or sidecar; non-credential headers such as a\n * tenant id stay allowed on any endpoint.\n */\n/**\n * Vendor credential headers whose names `Redaction.isSensitiveKey` does not\n * recognize. Honeycomb sends its ingest key as `x-honeycomb-team`.\n */\nconst vendorCredentialHeaders: ReadonlySet<string> = new Set([\"x-honeycomb-team\"])\n\nconst isCredentialHeader = (name: string): boolean =>\n Redaction.isSensitiveKey(name) || vendorCredentialHeaders.has(name.toLowerCase())\n\nconst refusePlaintextCredentials = (\n baseUrl: string,\n headers: Headers.Input | undefined\n): Effect.Effect<void, Endpoint.InvalidExporterEndpoint> => {\n if (!baseUrl.toLowerCase().startsWith(\"http:\") || isLoopback(baseUrl)) return Effect.void\n const credential = Object.keys(Headers.fromInput(headers)).some(isCredentialHeader)\n return credential\n ? Effect.fail(\n new Endpoint.InvalidExporterEndpoint({\n code: \"invalid_exporter_endpoint\",\n path: \"baseUrl\",\n message:\n \"OTLP collector baseUrl must use https:// when headers carry credentials, unless it is a loopback address\"\n })\n )\n : Effect.void\n}\n\nconst redactText = (text: string): string => String(Redaction.redact(text))\n\n/**\n * A failed span's error rebuilt with its text redacted. It keeps the original\n * error's `name` and `stack` (redacted) so the collector's exception type and\n * trace stay readable; it is exported to the collector and never thrown.\n */\nclass RedactedSpanError extends Schema.TaggedError<RedactedSpanError>()(\"@smthrs/observability/RedactedSpanError\", {\n message: Schema.String\n}) {}\n\n/**\n * A span failure rendered with credentials removed. The exporter serializes a\n * failed span's cause into its status message and `exception` events, which\n * would otherwise carry any token an error message quoted to the collector.\n */\nconst redactedExit = (exit: Exit.Exit<unknown, unknown>): Exit.Exit<unknown, unknown> => {\n if (exit._tag === \"Success\" || Cause.hasInterruptsOnly(exit.cause)) return exit\n const errors = Cause.prettyErrors(exit.cause, { includeCauseInStack: true }).map((error) => {\n const redacted = new RedactedSpanError({ message: redactText(error.message) })\n Object.defineProperty(redacted, \"name\", { value: redactText(error.name), configurable: true, writable: true })\n // `prettyErrors` always renders a stack.\n redacted.stack = redactText(String(error.stack))\n return redacted\n })\n return Exit.failCause(errors.map(Cause.fail).reduce(Cause.combine, Cause.empty as Cause.Cause<unknown>))\n}\n\n/**\n * Wraps the installed tracer so every exported span's failure and string\n * attributes pass through the journal redaction rules first.\n */\nconst redactedSpans = Layer.effect(Tracer.Tracer)(\n Effect.map(Effect.tracer, (tracer) =>\n Tracer.make({\n ...tracer,\n span(options) {\n const span = tracer.span(options)\n const end = span.end.bind(span)\n const attribute = span.attribute.bind(span)\n span.end = (endTime, exit) => end(endTime, redactedExit(exit))\n span.attribute = (key, value) => attribute(key, typeof value === \"string\" ? redactText(value) : value)\n return span\n }\n }))\n)\n\n/**\n * Configuration for the default OTLP wiring.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Options {\n /**\n * The collector base URL, for example `http://localhost:4318`. Signals are\n * posted below it at `/v1/logs`, `/v1/metrics`, and `/v1/traces`. It must be\n * an absolute `http://` or `https://` URL without credentials, a query,\n * fragment, backslashes, spaces, or controls. A base path is allowed. Invalid\n * values fail acquisition with {@link Endpoint.InvalidExporterEndpoint}.\n * Use {@link Options.headers} for authentication.\n */\n readonly baseUrl: string\n /** Overrides {@link defaultServiceName} as the `service.name` attribute. */\n readonly serviceName?: string | undefined\n /** Overrides {@link defaultServiceVersion} as the `service.version` attribute. */\n readonly serviceVersion?: string | undefined\n /**\n * Additional resource attributes attached to every exported signal, decoded\n * by `Resource.Attributes`. The whole resource must encode to at most\n * `Resource.maximumResourceBytes`; a larger one fails acquisition with\n * {@link Resource.InvalidResourceConfiguration} rather than making every\n * request oversized.\n */\n readonly attributes?: Record<string, unknown> | undefined\n /**\n * Headers sent with every export request, for example vendor auth. A header\n * whose name names a credential (`authorization`, `x-api-key`, anything\n * `Redaction.isSensitiveKey` recognizes, plus `x-honeycomb-team`) requires\n * an `https://` baseUrl unless the host is loopback; otherwise acquisition\n * fails with\n * {@link Endpoint.InvalidExporterEndpoint}.\n */\n readonly headers?: Headers.Input | undefined\n /** Export cadence for all three signals; each signal's Effect default applies when omitted. */\n readonly exportInterval?: Duration.Input | undefined\n /** Upper bound on the shutdown flush when the layer's scope closes. */\n readonly shutdownTimeout?: Duration.Input | undefined\n}\n\n/**\n * Creates the OTLP logs, metrics, and traces layer with flows resource\n * defaults, JSON-serialized. Exports share a four-request limit with no waiting\n * queue. Requests larger than 1 MiB or stalled for ten seconds are discarded;\n * `flows_observability_otlp_dropped` counts discarded batches, and at most\n * once a minute a `Warn` record with code `otlp_export_discarded` names the\n * reason, the request size, and the running total through the loggers that\n * were installed when the layer was acquired, never through this exporter.\n * A collector's response body is never read: the exporter acts on the status\n * and the `retry-after` header, and the exchange ends when they arrive.\n *\n * **Details**\n *\n * The layer still requires an `HttpClient`, which is how it stays\n * platform-neutral: a Node host may hand it `@effect/platform-node`'s Undici\n * client (re-exported by `@smthrs/platform-node`), a browser or test\n * hands it something else. Use {@link layerFetch} when the host's global\n * `fetch` is good enough. On Node 26 and every browser it is.\n * Fetch redirects are refused. Supply `FetchHttpClient.RequestInit` around\n * the whole exporting effect to retain other fetch options; options scoped\n * only to the supplied client's layer are replaced by the redirect policy.\n * Other HTTP transports must independently refuse automatic redirects.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = (\n options: Options\n): Layer.Layer<\n never,\n Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint,\n HttpClient.HttpClient\n> =>\n Layer.unwrap(\n Effect.map(\n Effect.all([\n Resource.decode({\n serviceName: options.serviceName ?? defaultServiceName,\n serviceVersion: options.serviceVersion ?? defaultServiceVersion,\n ...(options.attributes === undefined ? {} : { attributes: options.attributes })\n }),\n Endpoint.decode(options.baseUrl, \"baseUrl\").pipe(\n Effect.tap((baseUrl) => refusePlaintextCredentials(baseUrl, options.headers))\n )\n ]),\n ([decoded, baseUrl]) => {\n const resource = Resource.toOpenTelemetryConfiguration(decoded)\n return (\n Otlp.layerJson({\n baseUrl,\n resource: {\n serviceName: resource.serviceName,\n // `serviceVersion` is supplied above before Resource decoding.\n serviceVersion: resource.serviceVersion!,\n ...(resource.attributes === undefined ? {} : { attributes: resource.attributes })\n },\n headers: options.headers,\n maxBatchSize,\n loggerExportInterval: options.exportInterval,\n metricsExportInterval: options.exportInterval,\n tracerExportInterval: options.exportInterval,\n shutdownTimeout: options.shutdownTimeout\n }).pipe(\n Layer.provide(boundedClient),\n // Upstream merges OTEL_RESOURCE_ATTRIBUTES even with explicit\n // options. Keep unvalidated ambient metadata out of every request.\n Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({}))),\n (exporter) => Layer.provideMerge(redactedSpans, exporter)\n )\n )\n }\n )\n )\n\n/**\n * Provides {@link layer} over the host's global `fetch`, the default wiring\n * for a Node host, and browser-safe by construction because it never touches\n * a `node:` built-in.\n *\n * **Example**\n *\n * ```ts\n * import * as Otlp from \"@smthrs/observability/Otlp\"\n *\n * const Telemetry = Otlp.layerFetch({ baseUrl: \"http://localhost:4318\" })\n * ```\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerFetch = (\n options: Options\n): Layer.Layer<never, Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint> =>\n layer(options).pipe(Layer.provide(FetchHttpClient.layer))\n\n/**\n * Why an OTLP layer refused to start.\n *\n * @category errors\n * @since 1.0.0\n */\nexport type LayerError = Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint\n\n/**\n * Parses `OTEL_EXPORTER_OTLP_HEADERS`: comma-separated `key=value` pairs whose\n * values are percent-decoded, as the OpenTelemetry exporter specification\n * defines. A pair without `=` or with an empty key is skipped.\n *\n * @category environment\n * @since 1.0.0\n */\nexport const parseHeaders = (value: string | undefined): Record<string, string> => {\n const headers: Record<string, string> = {}\n for (const pair of (value ?? \"\").split(\",\")) {\n const separator = pair.indexOf(\"=\")\n const key = pair.slice(0, separator).trim()\n if (separator < 0 || key === \"\") continue\n const raw = pair.slice(separator + 1).trim()\n let decoded = raw\n try {\n decoded = decodeURIComponent(raw)\n } catch { /* A malformed escape is kept verbatim. */ }\n headers[key] = decoded\n }\n return headers\n}\n\n/**\n * {@link layerFetch} when the environment names a collector, otherwise\n * {@link layerNoop}.\n *\n * `OTEL_EXPORTER_OTLP_ENDPOINT` is the collector base URL and\n * `OTEL_EXPORTER_OTLP_HEADERS` the headers sent with every export. An unset or\n * empty endpoint installs no exporter at all.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layerEnvironment = (\n environment: Readonly<Record<string, string | undefined>>,\n options: Omit<Options, \"baseUrl\" | \"headers\"> = {}\n): Layer.Layer<never, LayerError> => {\n const endpoint = environment[\"OTEL_EXPORTER_OTLP_ENDPOINT\"]?.trim()\n if (endpoint === undefined || endpoint === \"\") return layerNoop\n return layerFetch({ ...options, baseUrl: endpoint, headers: parseHeaders(environment[\"OTEL_EXPORTER_OTLP_HEADERS\"]) })\n}\n\n/**\n * Exports nothing. The explicit stand-in for hosts with no collector, such as\n * a development shell, a test, or a browser deployment that has not opted in, so\n * wiring code can switch layers rather than branch.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerNoop: Layer.Layer<never> = Layer.empty\n"],
4
+ "sourcesContent": ["/**\n * Default OTLP export wiring for flows telemetry.\n *\n * The store packages already open spans through Effect's tracer and update\n * `Metric` counters on their hot paths; what they deliberately do not do is\n * ship an exporter. This module is that exporter: one layer that installs\n * Effect's own OTLP logger, metrics exporter, and tracer\n * (`effect/observability/Otlp`) against a collector endpoint, with\n * the flows service identity filled in. Nothing beyond `effect` is involved;\n * no OpenTelemetry SDK dependency.\n *\n * Browser support is met by construction rather than by a no-op variant:\n * export happens over Effect's `HttpClient`, and {@link layerFetch} binds the\n * `fetch` implementation the host already has, so no entry point here ever\n * resolves a `node:` built-in. See the\n * {@link https://smithers.sh/docs/reference/api/observability | observability API contract}.\n *\n * @since 0.1.0\n */\n\nimport * as Redaction from \"@smthrs/journal/Redaction\"\nimport * as Cause from \"effect/Cause\"\nimport { Clock } from \"effect/Clock\"\nimport * as ConfigProvider from \"effect/ConfigProvider\"\nimport type * as Duration from \"effect/Duration\"\nimport * as Effect from \"effect/Effect\"\nimport * as Exit from \"effect/Exit\"\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\"\nimport * as Headers from \"effect/http/Headers\"\nimport type * as HttpBody from \"effect/http/HttpBody\"\nimport * as HttpClient from \"effect/http/HttpClient\"\nimport type * as HttpClientRequest from \"effect/http/HttpClientRequest\"\nimport * as HttpClientResponse from \"effect/http/HttpClientResponse\"\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport * as Metric from \"effect/Metric\"\nimport * as Otlp from \"effect/observability/Otlp\"\nimport * as Option from \"effect/Option\"\nimport * as References from \"effect/References\"\nimport * as Schema from \"effect/Schema\"\nimport * as Semaphore from \"effect/Semaphore\"\nimport * as Tracer from \"effect/Tracer\"\nimport * as Endpoint from \"./Endpoint.ts\"\nimport * as Resource from \"./Resource.ts\"\n\n/**\n * The `service.name` resource attribute installed when the caller supplies\n * none: the flows distribution itself. Override it per application with\n * {@link Options.serviceName}.\n *\n * @category resource\n * @since 0.1.0\n */\nexport const defaultServiceName = \"flows\"\n\n/**\n * The `service.version` resource attribute installed when the caller supplies\n * none. Mirrors the release version in this package's `package.json`.\n *\n * A published package cannot read its own manifest on every runtime it\n * supports, so the version lives here as a literal.\n * `scripts/set-release-version.mjs` rewrites this declaration with the\n * manifests, and its `--check` mode reports drift, so a release bump cannot\n * leave it behind.\n *\n * @category resource\n * @since 0.1.0\n */\nexport const defaultServiceVersion = \"1.0.0-rc.8\"\n\n// The upstream logger and tracer each buffer at most one 1,000-record batch.\n// Do not queue at the transport: upstream forks every full batch independently.\nconst maxBatchSize = 1000\nconst maxInFlight = 4\n/**\n * Maximum encoded export request size, in bytes.\n * @category transport\n * @since 1.0.0-rc.0\n */\nexport const maxRequestBytes = 1024 * 1024\nconst requestTimeout = \"10 seconds\"\nconst diagnosticIntervalMillis = 60_000\n// The envelope around the resource in a metrics request repeats `service.name`\n// as the instrumentation scope name: at most 1,024 code units, at most six\n// bytes each once JSON-escaped, so under 8 KiB together with the envelope's own\n// keys. Log and trace requests name their scope `effect` with the Effect\n// version instead, which is smaller.\n/**\n * Reserved bytes for request wrappers and the escaped instrumentation scope.\n * @category transport\n * @since 1.0.0-rc.0\n */\nexport const maximumEnvelopeBytes = 8 * 1024\n\n/**\n * Bytes of every export request kept free for the signal batch itself.\n *\n * The transport discards a request over 1 MiB, and the resource rides in every\n * request, so the largest resource `Resource.decode` admits\n * (`Resource.maximumResourceBytes`, 128 KiB) and the envelope, which in a\n * metrics request repeats the service name (under 8 KiB), come off the top.\n * The 888 KiB left gives each\n * record of a full 1,000-record logger or tracer batch about 900 bytes, three\n * to four times a bare log record or span, and gives the metrics snapshot room\n * for several thousand series. Every resource the decoder accepts therefore\n * leaves an ordinary batch of any signal exportable; what this reserve does\n * not bound is a single application record or a registry large enough to\n * exceed it on its own.\n *\n * @category transport\n * @since 1.0.0-rc.0\n */\nexport const reservedBatchBytes = maxRequestBytes - Resource.maximumResourceBytes - maximumEnvelopeBytes\n\ntype DiscardReason = \"oversized\" | \"stalled\" | \"saturated\"\n\n/**\n * A collector's answer reduced to what the exporter acts on: its status and\n * its `retry-after` delay, with no body.\n *\n * `Response` refuses a status outside 200 to 599 and a malformed header value.\n * Neither is a collector's answer, so `Response.error()` reports it as status\n * 0, which the exporter fails without retrying. A browser already reports a\n * refused redirect that way.\n */\nconst withoutBody = (response: HttpClientResponse.HttpClientResponse): HttpClientResponse.HttpClientResponse => {\n const retryAfter = response.headers[\"retry-after\"]\n let answer: Response\n try {\n answer = new Response(null, {\n status: response.status,\n headers: retryAfter === undefined ? {} : { \"retry-after\": retryAfter }\n })\n } catch {\n answer = Response.error()\n }\n return HttpClientResponse.fromWeb(response.request, answer)\n}\n\nconst boundedClient = Layer.effect(\n HttpClient.HttpClient,\n Effect.gen(function*() {\n // The exporter reads every response body to its end, after the deadline\n // and the in-flight limit below have let the request go. A collector that\n // never ended its answer would stall that signal and grow the buffered\n // body without bound. So the exchange ends here: the exporter receives the\n // status and retry delay, and closing the scope aborts the transport with\n // the body unread.\n const client = HttpClient.transformResponse(\n HttpClient.withScope(yield* HttpClient.HttpClient),\n (exchange) => exchange.pipe(Effect.map(withoutBody), Effect.scoped)\n )\n const clock = yield* Clock\n // The loggers installed when this transport is acquired. The OTLP logger\n // the same acquisition installs does not exist yet, so a diagnostic pinned\n // to this set cannot enter the exporter it describes, whichever fiber runs\n // the export: the interval and shutdown fibers inherit this set anyway,\n // but a flush requested from application code runs with the application's\n // loggers, which by then include this exporter.\n const ambientLoggers = yield* Effect.withFiber((fiber) => Effect.succeed(fiber.getRef(Logger.CurrentLoggers)))\n const permits = Semaphore.makeUnsafe(maxInFlight)\n // The counter lives with the transport it describes.\n const droppedExports = Metric.counter(\"flows_observability_otlp_dropped\")\n let nextDiagnosticAt = -Infinity\n // A local discard is terminal, so the upstream retry loop must not retain\n // or retry its payload, and the counter records batches, not records. The\n // warning is the diagnostic the counter cannot be: the counter is exported\n // through this same transport and shares every outage with it. One\n // warning per minute keeps a sustained outage from flooding the ambient\n // loggers; the running total in its annotations carries the volume.\n // Replace ambient annotations and log spans to bound the diagnostic itself.\n const discard = (reason: DiscardReason, request: HttpClientRequest.HttpClientRequest, bytes: number) =>\n Metric.update(droppedExports, 1).pipe(\n Effect.andThen(Effect.suspend(() => {\n const now = clock.currentTimeMillisUnsafe()\n if (now < nextDiagnosticAt) return Effect.void\n nextDiagnosticAt = now + diagnosticIntervalMillis\n return Metric.value(droppedExports).pipe(\n Effect.flatMap((dropped) =>\n Effect.logWarning(\"An OTLP export batch was discarded\").pipe(\n Effect.provideService(References.CurrentLogSpans, []),\n Effect.provideService(References.CurrentLogAnnotations, {\n code: \"otlp_export_discarded\",\n reason,\n bytes,\n limit: maxRequestBytes,\n dropped: dropped.count\n })\n )\n ),\n Effect.provideService(Logger.CurrentLoggers, ambientLoggers)\n )\n })),\n Effect.as(HttpClientResponse.fromWeb(request, new Response(null, { status: 204 })))\n )\n return HttpClient.transform(client, (requestEffect, request) =>\n Effect.suspend(() => {\n // layerJson always supplies a Uint8Array body with a byte length.\n const bytes = (request.body as HttpBody.Uint8Array).contentLength\n if (bytes > maxRequestBytes) return discard(\"oversized\", request, bytes)\n // Fetch must expose redirects before any credential or signal body\n // leaves the configured endpoint, even when the caller enables follow.\n const confinedRequest = Effect.flatMap(Effect.serviceOption(FetchHttpClient.RequestInit), (init) =>\n requestEffect.pipe(\n Effect.provideService(FetchHttpClient.RequestInit, {\n ...Option.getOrUndefined(init),\n redirect: \"manual\"\n })\n ))\n return confinedRequest.pipe(\n Effect.timeoutOrElse({\n duration: requestTimeout,\n orElse: () =>\n discard(\"stalled\", request, bytes)\n }),\n permits.withPermitsIfAvailable(1),\n Effect.flatMap(Option.match({\n onNone: () =>\n discard(\"saturated\", request, bytes),\n onSome: Effect.succeed\n }))\n )\n }))\n })\n)\n\nconst loopbackIpv4 = /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/\n\n/** Whether a decoded endpoint's host never leaves this machine. */\nconst isLoopback = (endpoint: string): boolean => {\n const hostname = new URL(endpoint).hostname\n return hostname === \"localhost\" || hostname === \"[::1]\" || loopbackIpv4.test(hostname)\n}\n\n/**\n * Refuses a credential header bound for a plaintext collector off this\n * machine. Anyone on the network path could read the token from every export\n * request, and the exporter would never report it. Loopback `http://` stays\n * allowed for a local collector or sidecar; non-credential headers such as a\n * tenant id stay allowed on any endpoint.\n */\n/**\n * Vendor credential headers whose names `Redaction.isSensitiveKey` does not\n * recognize. Honeycomb sends its ingest key as `x-honeycomb-team`.\n */\nconst vendorCredentialHeaders: ReadonlySet<string> = new Set([\"x-honeycomb-team\"])\n\nconst isCredentialHeader = (name: string): boolean =>\n Redaction.isSensitiveKey(name) || vendorCredentialHeaders.has(name.toLowerCase())\n\nconst refusePlaintextCredentials = (\n baseUrl: string,\n headers: Headers.Input | undefined\n): Effect.Effect<void, Endpoint.InvalidExporterEndpoint> => {\n if (!baseUrl.toLowerCase().startsWith(\"http:\") || isLoopback(baseUrl)) return Effect.void\n const credential = Object.keys(Headers.fromInput(headers)).some(isCredentialHeader)\n return credential\n ? Effect.fail(\n new Endpoint.InvalidExporterEndpoint({\n code: \"invalid_exporter_endpoint\",\n path: \"baseUrl\",\n message:\n \"OTLP collector baseUrl must use https:// when headers carry credentials, unless it is a loopback address\"\n })\n )\n : Effect.void\n}\n\nconst redactText = (text: string): string => String(Redaction.redact(text))\n\n/**\n * A failed span's error rebuilt with its text redacted. It keeps the original\n * error's `name` and `stack` (redacted) so the collector's exception type and\n * trace stay readable; it is exported to the collector and never thrown.\n */\nclass RedactedSpanError extends Schema.TaggedError<RedactedSpanError>()(\"@smthrs/observability/RedactedSpanError\", {\n message: Schema.String\n}) {}\n\n/**\n * A span failure rendered with credentials removed. The exporter serializes a\n * failed span's cause into its status message and `exception` events, which\n * would otherwise carry any token an error message quoted to the collector.\n */\nconst redactedExit = (exit: Exit.Exit<unknown, unknown>): Exit.Exit<unknown, unknown> => {\n if (exit._tag === \"Success\" || Cause.hasInterruptsOnly(exit.cause)) return exit\n const errors = Cause.prettyErrors(exit.cause, { includeCauseInStack: true }).map((error) => {\n const redacted = new RedactedSpanError({ message: redactText(error.message) })\n Object.defineProperty(redacted, \"name\", { value: redactText(error.name), configurable: true, writable: true })\n // `prettyErrors` always renders a stack.\n redacted.stack = redactText(String(error.stack))\n return redacted\n })\n return Exit.failCause(errors.map(Cause.fail).reduce(Cause.combine, Cause.empty as Cause.Cause<unknown>))\n}\n\n/**\n * Wraps the installed tracer so every exported span's failure and string\n * attributes pass through the journal redaction rules first.\n */\nconst redactedSpans = Layer.effect(Tracer.Tracer)(\n Effect.map(Effect.tracer, (tracer) =>\n Tracer.make({\n ...tracer,\n span(options) {\n const span = tracer.span(options)\n const end = span.end.bind(span)\n const attribute = span.attribute.bind(span)\n span.end = (endTime, exit) => end(endTime, redactedExit(exit))\n span.attribute = (key, value) => attribute(key, typeof value === \"string\" ? redactText(value) : value)\n return span\n }\n }))\n)\n\n/**\n * Configuration for the default OTLP wiring.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Options {\n /**\n * The collector base URL, for example `http://localhost:4318`. Signals are\n * posted below it at `/v1/logs`, `/v1/metrics`, and `/v1/traces`. It must be\n * an absolute `http://` or `https://` URL without credentials, a query,\n * fragment, backslashes, spaces, or controls. A base path is allowed. Invalid\n * values fail acquisition with {@link Endpoint.InvalidExporterEndpoint}.\n * Use {@link Options.headers} for authentication.\n */\n readonly baseUrl: string\n /** Overrides {@link defaultServiceName} as the `service.name` attribute. */\n readonly serviceName?: string | undefined\n /** Overrides {@link defaultServiceVersion} as the `service.version` attribute. */\n readonly serviceVersion?: string | undefined\n /**\n * Additional resource attributes attached to every exported signal, decoded\n * by `Resource.Attributes`. The whole resource must encode to at most\n * `Resource.maximumResourceBytes`; a larger one fails acquisition with\n * {@link Resource.InvalidResourceConfiguration} rather than making every\n * request oversized.\n */\n readonly attributes?: Record<string, unknown> | undefined\n /**\n * Headers sent with every export request, for example vendor auth. A header\n * whose name names a credential (`authorization`, `x-api-key`, anything\n * `Redaction.isSensitiveKey` recognizes, plus `x-honeycomb-team`) requires\n * an `https://` baseUrl unless the host is loopback; otherwise acquisition\n * fails with\n * {@link Endpoint.InvalidExporterEndpoint}.\n */\n readonly headers?: Headers.Input | undefined\n /** Export cadence for all three signals; each signal's Effect default applies when omitted. */\n readonly exportInterval?: Duration.Input | undefined\n /** Upper bound on the shutdown flush when the layer's scope closes. */\n readonly shutdownTimeout?: Duration.Input | undefined\n}\n\n/**\n * Creates the OTLP logs, metrics, and traces layer with flows resource\n * defaults, JSON-serialized. Exports share a four-request limit with no waiting\n * queue. Requests larger than 1 MiB or stalled for ten seconds are discarded;\n * `flows_observability_otlp_dropped` counts discarded batches, and at most\n * once a minute a `Warn` record with code `otlp_export_discarded` names the\n * reason, the request size, and the running total through the loggers that\n * were installed when the layer was acquired, never through this exporter.\n * A collector's response body is never read: the exporter acts on the status\n * and the `retry-after` header, and the exchange ends when they arrive.\n *\n * **Details**\n *\n * The layer still requires an `HttpClient`, which is how it stays\n * platform-neutral: a Node host may hand it `@effect/platform-node`'s Undici\n * client (re-exported by `@smthrs/platform-node`), a browser or test\n * hands it something else. Use {@link layerFetch} when the host's global\n * `fetch` is good enough. On Node 26 and every browser it is.\n * Fetch redirects are refused. Supply `FetchHttpClient.RequestInit` around\n * the whole exporting effect to retain other fetch options; options scoped\n * only to the supplied client's layer are replaced by the redirect policy.\n * Other HTTP transports must independently refuse automatic redirects.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = (\n options: Options\n): Layer.Layer<\n never,\n Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint,\n HttpClient.HttpClient\n> =>\n Layer.unwrap(\n Effect.map(\n Effect.all([\n Resource.decode({\n serviceName: options.serviceName ?? defaultServiceName,\n serviceVersion: options.serviceVersion ?? defaultServiceVersion,\n ...(options.attributes === undefined ? {} : { attributes: options.attributes })\n }),\n Endpoint.decode(options.baseUrl, \"baseUrl\").pipe(\n Effect.tap((baseUrl) => refusePlaintextCredentials(baseUrl, options.headers))\n )\n ]),\n ([decoded, baseUrl]) => {\n const resource = Resource.toOpenTelemetryConfiguration(decoded)\n return (\n Otlp.layerJson({\n baseUrl,\n resource: {\n serviceName: resource.serviceName,\n // `serviceVersion` is supplied above before Resource decoding.\n serviceVersion: resource.serviceVersion!,\n ...(resource.attributes === undefined ? {} : { attributes: resource.attributes })\n },\n headers: options.headers,\n maxBatchSize,\n loggerExportInterval: options.exportInterval,\n metricsExportInterval: options.exportInterval,\n tracerExportInterval: options.exportInterval,\n shutdownTimeout: options.shutdownTimeout\n }).pipe(\n Layer.provide(boundedClient),\n // Upstream merges OTEL_RESOURCE_ATTRIBUTES even with explicit\n // options. Keep unvalidated ambient metadata out of every request.\n Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({}))),\n (exporter) => Layer.provideMerge(redactedSpans, exporter)\n )\n )\n }\n )\n )\n\n/**\n * Provides {@link layer} over the host's global `fetch`, the default wiring\n * for a Node host, and browser-safe by construction because it never touches\n * a `node:` built-in.\n *\n * **Example**\n *\n * ```ts\n * import * as Otlp from \"@smthrs/observability/Otlp\"\n *\n * const Telemetry = Otlp.layerFetch({ baseUrl: \"http://localhost:4318\" })\n * ```\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerFetch = (\n options: Options\n): Layer.Layer<never, Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint> =>\n layer(options).pipe(Layer.provide(FetchHttpClient.layer))\n\n/**\n * Why an OTLP layer refused to start.\n *\n * @category errors\n * @since 1.0.0\n */\nexport type LayerError = Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint\n\n/**\n * Parses `OTEL_EXPORTER_OTLP_HEADERS`: comma-separated `key=value` pairs whose\n * values are percent-decoded, as the OpenTelemetry exporter specification\n * defines. A pair without `=` or with an empty key is skipped.\n *\n * @category environment\n * @since 1.0.0\n */\nexport const parseHeaders = (value: string | undefined): Record<string, string> => {\n const headers: Record<string, string> = {}\n for (const pair of (value ?? \"\").split(\",\")) {\n const separator = pair.indexOf(\"=\")\n const key = pair.slice(0, separator).trim()\n if (separator < 0 || key === \"\") continue\n const raw = pair.slice(separator + 1).trim()\n let decoded = raw\n try {\n decoded = decodeURIComponent(raw)\n } catch { /* A malformed escape is kept verbatim. */ }\n headers[key] = decoded\n }\n return headers\n}\n\n/**\n * {@link layerFetch} when the environment names a collector, otherwise\n * {@link layerNoop}.\n *\n * `OTEL_EXPORTER_OTLP_ENDPOINT` is the collector base URL and\n * `OTEL_EXPORTER_OTLP_HEADERS` the headers sent with every export. An unset or\n * empty endpoint installs no exporter at all.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layerEnvironment = (\n environment: Readonly<Record<string, string | undefined>>,\n options: Omit<Options, \"baseUrl\" | \"headers\"> = {}\n): Layer.Layer<never, LayerError> => {\n const endpoint = environment[\"OTEL_EXPORTER_OTLP_ENDPOINT\"]?.trim()\n if (endpoint === undefined || endpoint === \"\") return layerNoop\n return layerFetch({ ...options, baseUrl: endpoint, headers: parseHeaders(environment[\"OTEL_EXPORTER_OTLP_HEADERS\"]) })\n}\n\n/**\n * Exports nothing. The explicit stand-in for hosts with no collector, such as\n * a development shell, a test, or a browser deployment that has not opted in, so\n * wiring code can switch layers rather than branch.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerNoop: Layer.Layer<never> = Layer.empty\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"JournalLogger.d.ts","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAA;AAE5D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAKhD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAKvC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;;;;;;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,gCAOhD;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;EAGxB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;EAGvB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;EAG7B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;IAAkE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAGzB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAuSnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAsE/D,CAAA"}
1
+ {"version":3,"file":"JournalLogger.d.ts","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAA;AAE5D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAKhD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAKvC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;;;;;;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,gCAOhD;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;EAGxB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;EAGvB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;EAG7B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;IAAkE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAGzB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAkTnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAsE/D,CAAA"}
@@ -220,6 +220,17 @@ const boundedText = (value, budget) => {
220
220
  * projects them before any own data property the error added.
221
221
  */
222
222
  const standardErrorKeys = ["name", "message", "stack", "cause"];
223
+ /** Reads inherited data fields without invoking accessors or walking forever. */
224
+ const errorField = (value, key) => {
225
+ let current = value;
226
+ for (let depth = 0; current !== null && depth <= maximumSnapshotDepth; depth++) {
227
+ const descriptor = Object.getOwnPropertyDescriptor(current, key);
228
+ if (descriptor !== undefined)
229
+ return "value" in descriptor ? descriptor.value : unrenderableMarker;
230
+ current = Object.getPrototypeOf(current);
231
+ }
232
+ return current === null ? undefined : truncatedMarker;
233
+ };
223
234
  const snapshotValue = (value, budget, ancestors, depth = 0) => {
224
235
  if (budget.bytes <= 0)
225
236
  return truncatedMarker;
@@ -269,7 +280,7 @@ const snapshotValue = (value, budget, ancestors, depth = 0) => {
269
280
  for (const key of standardErrorKeys.slice(0, budget.members)) {
270
281
  budget.members--;
271
282
  try {
272
- record[key] = snapshotValue(value[key], budget, ancestors, depth + 1);
283
+ record[key] = snapshotValue(errorField(value, key), budget, ancestors, depth + 1);
273
284
  }
274
285
  catch {
275
286
  record[key] = unrenderableMarker;
@@ -1 +1 @@
1
- {"version":3,"file":"JournalLogger.js","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JournalLogger.js","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,8 @@ export declare const layerPrettyDev: (options?: Options) => Layer.Layer<never>;
39
39
  */
40
40
  export declare const layerStructuredJson: (options?: Options) => Layer.Layer<never>;
41
41
  /**
42
- * Removes the active logger set while retaining Effect's minimum-level filter.
42
+ * Removes the active logger set and pins the minimum level to `None` unless
43
+ * `options.minimumLogLevel` explicitly selects another level.
43
44
  *
44
45
  * @category layers
45
46
  * @since 0.1.0
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAGhD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;AAuBD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAQnE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMxE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAIrF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMnG,CAAA"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAGhD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;AAuBD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAQnE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMxE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAIrF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMnG,CAAA"}
@@ -41,7 +41,8 @@ export const layerStructuredJson = (options) => {
41
41
  return withMinimumLogLevel(Logger.layer([Logger.consoleJson], { mergeWithExisting: resolved.mergeWithExisting }), resolved.minimumLogLevel);
42
42
  };
43
43
  /**
44
- * Removes the active logger set while retaining Effect's minimum-level filter.
44
+ * Removes the active logger set and pins the minimum level to `None` unless
45
+ * `options.minimumLogLevel` explicitly selects another level.
45
46
  *
46
47
  * @category layers
47
48
  * @since 0.1.0
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAqB/C;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAC1B,KAAyB,EACzB,eAA8C,EAC1B,EAAE,CACtB,eAAe,KAAK,SAAS;IAC3B,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAA;AAEpF,MAAM,mBAAmB,GAAG,CAAC,OAAiB,EAG5C,EAAE,CAAC,CAAC;IACJ,eAAe,EAAE,OAAO,EAAE,eAAe;IACzC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,KAAK;CACvD,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAiB,EAAsB,EAAE;IACtE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,mBAAmB,CACxB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACrE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;KAC9C,CAAC,EACF,QAAQ,CAAC,eAAe,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAiB,EAAsB,EAAE;IAC3E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,mBAAmB,CACxB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EACrF,QAAQ,CAAC,eAAe,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAA0C,EAAsB,EAAE,CAC1F,mBAAmB,CACjB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAChB,OAAO,EAAE,eAAe,IAAI,MAAM,CACnC,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAuC,EAAE,OAAiB,EAAsB,EAAE;IACtG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,mBAAmB,CACxB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EACzE,QAAQ,CAAC,eAAe,CACzB,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAqB/C;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAC1B,KAAyB,EACzB,eAA8C,EAC1B,EAAE,CACtB,eAAe,KAAK,SAAS;IAC3B,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAA;AAEpF,MAAM,mBAAmB,GAAG,CAAC,OAAiB,EAG5C,EAAE,CAAC,CAAC;IACJ,eAAe,EAAE,OAAO,EAAE,eAAe;IACzC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,KAAK;CACvD,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAiB,EAAsB,EAAE;IACtE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,mBAAmB,CACxB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACrE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;KAC9C,CAAC,EACF,QAAQ,CAAC,eAAe,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAiB,EAAsB,EAAE;IAC3E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,mBAAmB,CACxB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EACrF,QAAQ,CAAC,eAAe,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAA0C,EAAsB,EAAE,CAC1F,mBAAmB,CACjB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAChB,OAAO,EAAE,eAAe,IAAI,MAAM,CACnC,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAuC,EAAE,OAAiB,EAAsB,EAAE;IACtG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,mBAAmB,CACxB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EACzE,QAAQ,CAAC,eAAe,CACzB,CAAA;AACH,CAAC,CAAA"}
@@ -45,7 +45,7 @@ export declare const defaultServiceName = "flows";
45
45
  * @category resource
46
46
  * @since 0.1.0
47
47
  */
48
- export declare const defaultServiceVersion = "1.0.0-rc.6";
48
+ export declare const defaultServiceVersion = "1.0.0-rc.8";
49
49
  /**
50
50
  * Maximum encoded export request size, in bytes.
51
51
  * @category transport
package/dist/esm/Otlp.js CHANGED
@@ -60,7 +60,7 @@ export const defaultServiceName = "flows";
60
60
  * @category resource
61
61
  * @since 0.1.0
62
62
  */
63
- export const defaultServiceVersion = "1.0.0-rc.6";
63
+ export const defaultServiceVersion = "1.0.0-rc.8";
64
64
  // The upstream logger and tracer each buffer at most one 1,000-record batch.
65
65
  // Do not queue at the transport: upstream forks every full batch independently.
66
66
  const maxBatchSize = 1000;
package/docs/README.md CHANGED
@@ -38,7 +38,9 @@ identity, so `service.name` means the same thing whichever one you pick.
38
38
 
39
39
  ## Install
40
40
 
41
- Not on npm yet; see [Installation](https://github.com/smithersai/smithers/blob/main/packages/smithers/flows/flow/docs/installation.md#use-the-libraries).
41
+ ```bash
42
+ npm install @smthrs/observability@next effect
43
+ ```
42
44
 
43
45
  Node.js 26.4.0 or later. For the import forms and the browser rule, see
44
46
  [Installation](./installation.md).
@@ -7,7 +7,11 @@ sidebar:
7
7
 
8
8
  ## Install the package
9
9
 
10
- Not on npm yet; see [Installation](https://github.com/smithersai/smithers/blob/main/packages/smithers/flows/flow/docs/installation.md#use-the-libraries).
10
+ ```bash
11
+ npm install @smthrs/observability@next effect
12
+ ```
13
+
14
+ The `next` tag carries the 1.0 release candidates.
11
15
 
12
16
  The package requires Node.js 26.4.0 or later and ships as both ESM and
13
17
  CommonJS with TypeScript declarations.
@@ -16,7 +16,7 @@ change at the end.
16
16
  - Node.js 26.4.0 or later, which runs a `.ts` file directly by stripping its
17
17
  types.
18
18
  - A package whose `package.json` sets `"type": "module"`, with the
19
- dependencies installed. Not on npm yet; see [Installation](https://github.com/smithersai/smithers/blob/main/packages/smithers/flows/flow/docs/installation.md#use-the-libraries).
19
+ dependencies installed: `npm install @smthrs/observability@next effect`.
20
20
 
21
21
  ## Start a collector stand-in
22
22
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@smthrs/observability",
3
3
  "type": "module",
4
- "version": "1.0.0-rc.6",
4
+ "version": "1.0.0-rc.8",
5
5
  "license": "MIT",
6
6
  "smthrs": {
7
7
  "group": "engine"
@@ -165,7 +165,7 @@
165
165
  "dependencies": {
166
166
  "@opentelemetry/sdk-logs": "0.222.0",
167
167
  "@opentelemetry/sdk-metrics": "2.11.0",
168
- "@smthrs/journal": "1.0.0-rc.6",
168
+ "@smthrs/journal": "1.0.0-rc.8",
169
169
  "@effect/opentelemetry": "4.0.4"
170
170
  },
171
171
  "devDependencies": {
@@ -302,6 +302,17 @@ const boundedText = (value: string, budget: SnapshotBudget): string => {
302
302
  */
303
303
  const standardErrorKeys = ["name", "message", "stack", "cause"] as const
304
304
 
305
+ /** Reads inherited data fields without invoking accessors or walking forever. */
306
+ const errorField = (value: object, key: string): unknown => {
307
+ let current: object | null = value
308
+ for (let depth = 0; current !== null && depth <= maximumSnapshotDepth; depth++) {
309
+ const descriptor = Object.getOwnPropertyDescriptor(current, key)
310
+ if (descriptor !== undefined) return "value" in descriptor ? descriptor.value : unrenderableMarker
311
+ current = Object.getPrototypeOf(current)
312
+ }
313
+ return current === null ? undefined : truncatedMarker
314
+ }
315
+
305
316
  const snapshotValue = (
306
317
  value: unknown,
307
318
  budget: SnapshotBudget,
@@ -346,7 +357,7 @@ const snapshotValue = (
346
357
  for (const key of standardErrorKeys.slice(0, budget.members)) {
347
358
  budget.members--
348
359
  try {
349
- record[key] = snapshotValue(value[key], budget, ancestors, depth + 1)
360
+ record[key] = snapshotValue(errorField(value, key), budget, ancestors, depth + 1)
350
361
  } catch {
351
362
  record[key] = unrenderableMarker
352
363
  }
package/src/Logger.ts CHANGED
@@ -80,7 +80,8 @@ export const layerStructuredJson = (options?: Options): Layer.Layer<never> => {
80
80
  }
81
81
 
82
82
  /**
83
- * Removes the active logger set while retaining Effect's minimum-level filter.
83
+ * Removes the active logger set and pins the minimum level to `None` unless
84
+ * `options.minimumLogLevel` explicitly selects another level.
84
85
  *
85
86
  * @category layers
86
87
  * @since 0.1.0
package/src/Otlp.ts CHANGED
@@ -66,7 +66,7 @@ export const defaultServiceName = "flows"
66
66
  * @category resource
67
67
  * @since 0.1.0
68
68
  */
69
- export const defaultServiceVersion = "1.0.0-rc.6"
69
+ export const defaultServiceVersion = "1.0.0-rc.8"
70
70
 
71
71
  // The upstream logger and tracer each buffer at most one 1,000-record batch.
72
72
  // Do not queue at the transport: upstream forks every full batch independently.