@smthrs/observability 0.35.0 → 1.0.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/LICENSE +1 -1
  3. package/README.md +84 -0
  4. package/dist/cjs/BrowserOtel.d.ts +37 -0
  5. package/dist/cjs/BrowserOtel.d.ts.map +1 -0
  6. package/dist/cjs/BrowserOtel.js +47 -0
  7. package/dist/cjs/BrowserOtel.js.map +7 -0
  8. package/dist/cjs/Endpoint.d.ts +70 -0
  9. package/dist/cjs/Endpoint.d.ts.map +1 -0
  10. package/dist/cjs/Endpoint.js +85 -0
  11. package/dist/cjs/Endpoint.js.map +7 -0
  12. package/dist/cjs/JournalLogger.d.ts +232 -0
  13. package/dist/cjs/JournalLogger.d.ts.map +1 -0
  14. package/dist/cjs/JournalLogger.js +388 -0
  15. package/dist/cjs/JournalLogger.js.map +7 -0
  16. package/dist/cjs/Logger.d.ts +55 -0
  17. package/dist/cjs/Logger.d.ts.map +1 -0
  18. package/dist/cjs/Logger.js +72 -0
  19. package/dist/cjs/Logger.js.map +7 -0
  20. package/dist/cjs/Metric.d.ts +67 -0
  21. package/dist/cjs/Metric.d.ts.map +1 -0
  22. package/dist/cjs/Metric.js +68 -0
  23. package/dist/cjs/Metric.js.map +7 -0
  24. package/dist/cjs/NodeOtel.d.ts +42 -0
  25. package/dist/cjs/NodeOtel.d.ts.map +1 -0
  26. package/dist/cjs/NodeOtel.js +78 -0
  27. package/dist/cjs/NodeOtel.js.map +7 -0
  28. package/dist/cjs/Otel.d.ts +62 -0
  29. package/dist/cjs/Otel.d.ts.map +1 -0
  30. package/dist/cjs/Otel.js +75 -0
  31. package/dist/cjs/Otel.js.map +7 -0
  32. package/dist/cjs/Otlp.d.ts +200 -0
  33. package/dist/cjs/Otlp.d.ts.map +1 -0
  34. package/dist/cjs/Otlp.js +235 -0
  35. package/dist/cjs/Otlp.js.map +7 -0
  36. package/dist/cjs/Resource.d.ts +162 -0
  37. package/dist/cjs/Resource.d.ts.map +1 -0
  38. package/dist/cjs/Resource.js +186 -0
  39. package/dist/cjs/Resource.js.map +7 -0
  40. package/dist/cjs/index.d.ts +61 -0
  41. package/dist/cjs/index.d.ts.map +1 -0
  42. package/dist/cjs/index.js +47 -0
  43. package/dist/cjs/index.js.map +7 -0
  44. package/dist/cjs/internal/schemaIssuePath.d.ts +31 -0
  45. package/dist/cjs/internal/schemaIssuePath.d.ts.map +1 -0
  46. package/dist/cjs/internal/schemaIssuePath.js +49 -0
  47. package/dist/cjs/internal/schemaIssuePath.js.map +7 -0
  48. package/dist/cjs/package.json +1 -0
  49. package/dist/esm/BrowserOtel.d.ts +37 -0
  50. package/dist/esm/BrowserOtel.d.ts.map +1 -0
  51. package/dist/esm/BrowserOtel.js +24 -0
  52. package/dist/esm/BrowserOtel.js.map +1 -0
  53. package/dist/esm/Endpoint.d.ts +70 -0
  54. package/dist/esm/Endpoint.d.ts.map +1 -0
  55. package/dist/esm/Endpoint.js +110 -0
  56. package/dist/esm/Endpoint.js.map +1 -0
  57. package/dist/esm/JournalLogger.d.ts +232 -0
  58. package/dist/esm/JournalLogger.d.ts.map +1 -0
  59. package/dist/esm/JournalLogger.js +482 -0
  60. package/dist/esm/JournalLogger.js.map +1 -0
  61. package/dist/esm/Logger.d.ts +55 -0
  62. package/dist/esm/Logger.d.ts.map +1 -0
  63. package/dist/esm/Logger.js +60 -0
  64. package/dist/esm/Logger.js.map +1 -0
  65. package/dist/esm/Metric.d.ts +67 -0
  66. package/dist/esm/Metric.d.ts.map +1 -0
  67. package/dist/esm/Metric.js +80 -0
  68. package/dist/esm/Metric.js.map +1 -0
  69. package/dist/esm/NodeOtel.d.ts +42 -0
  70. package/dist/esm/NodeOtel.d.ts.map +1 -0
  71. package/dist/esm/NodeOtel.js +56 -0
  72. package/dist/esm/NodeOtel.js.map +1 -0
  73. package/dist/esm/Otel.d.ts +62 -0
  74. package/dist/esm/Otel.d.ts.map +1 -0
  75. package/dist/esm/Otel.js +51 -0
  76. package/dist/esm/Otel.js.map +1 -0
  77. package/dist/esm/Otlp.d.ts +200 -0
  78. package/dist/esm/Otlp.d.ts.map +1 -0
  79. package/dist/esm/Otlp.js +350 -0
  80. package/dist/esm/Otlp.js.map +1 -0
  81. package/dist/esm/Resource.d.ts +162 -0
  82. package/dist/esm/Resource.d.ts.map +1 -0
  83. package/dist/esm/Resource.js +237 -0
  84. package/dist/esm/Resource.js.map +1 -0
  85. package/dist/esm/index.d.ts +61 -0
  86. package/dist/esm/index.d.ts.map +1 -0
  87. package/dist/esm/index.js +61 -0
  88. package/dist/esm/index.js.map +1 -0
  89. package/dist/esm/internal/schemaIssuePath.d.ts +31 -0
  90. package/dist/esm/internal/schemaIssuePath.d.ts.map +1 -0
  91. package/dist/esm/internal/schemaIssuePath.js +59 -0
  92. package/dist/esm/internal/schemaIssuePath.js.map +1 -0
  93. package/docs/README.md +162 -0
  94. package/docs/api.md +768 -0
  95. package/docs/concepts/instrumentation-and-export.md +68 -0
  96. package/docs/concepts/layer-map.md +72 -0
  97. package/docs/concepts/validated-acquisition.md +105 -0
  98. package/docs/guides/export-to-a-collector.md +167 -0
  99. package/docs/guides/forward-logs-to-the-journal.md +226 -0
  100. package/docs/guides/install-a-logger.md +111 -0
  101. package/docs/guides/read-runtime-metrics.md +83 -0
  102. package/docs/guides/testing.md +134 -0
  103. package/docs/guides/wire-an-opentelemetry-sdk.md +220 -0
  104. package/docs/installation.md +98 -0
  105. package/docs/quickstart.md +145 -0
  106. package/docs/troubleshooting.md +168 -0
  107. package/package.json +221 -32
  108. package/src/BrowserOtel.ts +51 -0
  109. package/src/Endpoint.ts +131 -0
  110. package/src/JournalLogger.ts +596 -0
  111. package/src/Logger.ts +106 -0
  112. package/src/Metric.ts +88 -0
  113. package/src/NodeOtel.ts +90 -0
  114. package/src/Otel.ts +117 -0
  115. package/src/Otlp.ts +477 -0
  116. package/src/Resource.ts +324 -0
  117. package/src/index.ts +67 -0
  118. package/src/internal/schemaIssuePath.ts +65 -0
  119. package/docker-compose.otel.yml +0 -104
  120. package/grafana/dashboards/smithers-dashboard.json +0 -453
  121. package/grafana/provisioning/dashboards/dashboards.yml +0 -12
  122. package/grafana/provisioning/datasources/datasources.yml +0 -49
  123. package/loki/loki-config.yaml +0 -35
  124. package/otel-collector-config.yml +0 -38
  125. package/prometheus/prometheus.yml +0 -8
  126. package/src/MetricName.ts +0 -1
  127. package/src/MetricsServiceLive.js +0 -9
  128. package/src/README.md +0 -28
  129. package/src/ResolvedSmithersObservabilityOptions.ts +0 -12
  130. package/src/SmithersEvent.ts +0 -843
  131. package/src/SmithersLogFormat.ts +0 -1
  132. package/src/SmithersMetricDefinition.ts +0 -15
  133. package/src/SmithersMetricType.ts +0 -1
  134. package/src/SmithersMetricUnit.ts +0 -1
  135. package/src/SmithersObservability.js +0 -15
  136. package/src/SmithersObservabilityOptions.ts +0 -12
  137. package/src/SmithersObservabilityService.ts +0 -13
  138. package/src/_coreCorrelation/CorrelationContext.ts +0 -10
  139. package/src/_coreCorrelation/CorrelationContextLive.js +0 -11
  140. package/src/_coreCorrelation/CorrelationContextService.js +0 -15
  141. package/src/_coreCorrelation/CorrelationContextServiceShape.ts +0 -12
  142. package/src/_coreCorrelation/CorrelationPatch.ts +0 -3
  143. package/src/_coreCorrelation/README.md +0 -20
  144. package/src/_coreCorrelation/_correlationStorage.js +0 -4
  145. package/src/_coreCorrelation/correlationContextFiberRef.js +0 -5
  146. package/src/_coreCorrelation/correlationContextToLogAnnotations.js +0 -18
  147. package/src/_coreCorrelation/getCurrentCorrelationContext.js +0 -9
  148. package/src/_coreCorrelation/getCurrentCorrelationContextEffect.js +0 -11
  149. package/src/_coreCorrelation/index.js +0 -14
  150. package/src/_coreCorrelation/mergeCorrelationContext.js +0 -51
  151. package/src/_coreCorrelation/runWithCorrelationContext.js +0 -14
  152. package/src/_coreCorrelation/updateCurrentCorrelationContext.js +0 -17
  153. package/src/_coreCorrelation/withCorrelationContext.js +0 -38
  154. package/src/_coreCorrelation/withCurrentCorrelationContext.js +0 -11
  155. package/src/_coreMetrics.js +0 -14
  156. package/src/_coreMetricsShape.ts +0 -44
  157. package/src/_corePrometheus.js +0 -91
  158. package/src/_corePrometheusShape.ts +0 -11
  159. package/src/_coreTracing.js +0 -132
  160. package/src/_coreTracingShape.ts +0 -17
  161. package/src/_otelLogBuilders.js +0 -102
  162. package/src/_sessionFileResolvers.js +0 -164
  163. package/src/_smithersSpanAttributeAliases.js +0 -19
  164. package/src/_smithersTraceSpanStorage.js +0 -3
  165. package/src/_traceEventNormalizers.js +0 -499
  166. package/src/_traceRedaction.js +0 -162
  167. package/src/agentSessionEventToOtelLogRecord.js +0 -55
  168. package/src/agentTrace.ts +0 -144
  169. package/src/agentTraceCapabilities.js +0 -151
  170. package/src/annotateSmithersTrace.js +0 -11
  171. package/src/canonicalTraceEventToOtelLogRecord.js +0 -55
  172. package/src/correlation.js +0 -56
  173. package/src/createSmithersObservabilityLayer.js +0 -59
  174. package/src/createSmithersOtelLayer.js +0 -23
  175. package/src/createSmithersRuntimeLayer.js +0 -2
  176. package/src/detectAgentFamily.js +0 -26
  177. package/src/detectCaptureMode.js +0 -29
  178. package/src/emitOtelLogRecord.js +0 -19
  179. package/src/getCurrentSmithersTraceAnnotations.js +0 -14
  180. package/src/getCurrentSmithersTraceSpan.js +0 -7
  181. package/src/index.d.ts +0 -1392
  182. package/src/index.js +0 -137
  183. package/src/kindPhase.js +0 -17
  184. package/src/logging.js +0 -264
  185. package/src/makeSmithersSpanAttributes.js +0 -20
  186. package/src/metrics/README.md +0 -22
  187. package/src/metrics/SmithersMetricDefinition.ts +0 -17
  188. package/src/metrics/SmithersMetricType.ts +0 -1
  189. package/src/metrics/SmithersMetricUnit.ts +0 -1
  190. package/src/metrics/_asyncExternalWaitCounts.js +0 -4
  191. package/src/metrics/_buckets.js +0 -37
  192. package/src/metrics/_incrementGauge.js +0 -11
  193. package/src/metrics/_processStartMs.js +0 -1
  194. package/src/metrics/activeNodes.js +0 -2
  195. package/src/metrics/activeRuns.js +0 -2
  196. package/src/metrics/agentActionsTotal.js +0 -2
  197. package/src/metrics/agentDurationMs.js +0 -3
  198. package/src/metrics/agentErrorsTotal.js +0 -2
  199. package/src/metrics/agentEventsTotal.js +0 -2
  200. package/src/metrics/agentInvocationsTotal.js +0 -2
  201. package/src/metrics/agentRetriesTotal.js +0 -2
  202. package/src/metrics/agentSessionsTotal.js +0 -2
  203. package/src/metrics/agentTokensTotal.js +0 -2
  204. package/src/metrics/alertDeliveriesAttempted.js +0 -2
  205. package/src/metrics/alertDeliveriesSuppressed.js +0 -2
  206. package/src/metrics/alertsAcknowledgedTotal.js +0 -2
  207. package/src/metrics/alertsActive.js +0 -2
  208. package/src/metrics/alertsEscalatedTotal.js +0 -2
  209. package/src/metrics/alertsFiredTotal.js +0 -2
  210. package/src/metrics/alertsReopenedTotal.js +0 -2
  211. package/src/metrics/alertsResolvedTotal.js +0 -2
  212. package/src/metrics/alertsSilencedTotal.js +0 -2
  213. package/src/metrics/approvalPending.js +0 -2
  214. package/src/metrics/approvalWaitDuration.js +0 -5
  215. package/src/metrics/approvalsDenied.js +0 -2
  216. package/src/metrics/approvalsGranted.js +0 -2
  217. package/src/metrics/approvalsRequested.js +0 -2
  218. package/src/metrics/attemptDuration.js +0 -3
  219. package/src/metrics/attentionBacklog.js +0 -2
  220. package/src/metrics/cacheHits.js +0 -2
  221. package/src/metrics/cacheMisses.js +0 -2
  222. package/src/metrics/dbQueryDuration.js +0 -3
  223. package/src/metrics/dbRetries.js +0 -2
  224. package/src/metrics/dbTransactionDuration.js +0 -3
  225. package/src/metrics/dbTransactionRetries.js +0 -2
  226. package/src/metrics/dbTransactionRollbacks.js +0 -2
  227. package/src/metrics/devtoolsActiveSubscribers.js +0 -2
  228. package/src/metrics/devtoolsBackpressureDisconnectTotal.js +0 -2
  229. package/src/metrics/devtoolsDeltaBuildMs.js +0 -3
  230. package/src/metrics/devtoolsEventBytes.js +0 -3
  231. package/src/metrics/devtoolsEventTotal.js +0 -2
  232. package/src/metrics/devtoolsSnapshotBuildMs.js +0 -5
  233. package/src/metrics/devtoolsSubscribeTotal.js +0 -2
  234. package/src/metrics/errorsTotal.js +0 -2
  235. package/src/metrics/eventsEmittedTotal.js +0 -2
  236. package/src/metrics/externalWaitAsyncPending.js +0 -2
  237. package/src/metrics/gatewayApprovalDecisionsTotal.js +0 -2
  238. package/src/metrics/gatewayAuthEventsTotal.js +0 -2
  239. package/src/metrics/gatewayConnectionsActive.js +0 -2
  240. package/src/metrics/gatewayConnectionsClosedTotal.js +0 -2
  241. package/src/metrics/gatewayConnectionsTotal.js +0 -2
  242. package/src/metrics/gatewayCronTriggersTotal.js +0 -2
  243. package/src/metrics/gatewayErrorsTotal.js +0 -2
  244. package/src/metrics/gatewayHeartbeatTicksTotal.js +0 -2
  245. package/src/metrics/gatewayMessagesReceivedTotal.js +0 -2
  246. package/src/metrics/gatewayMessagesSentTotal.js +0 -2
  247. package/src/metrics/gatewayRpcCallsTotal.js +0 -2
  248. package/src/metrics/gatewayRpcDuration.js +0 -3
  249. package/src/metrics/gatewayRunEventBackpressureDisconnectTotal.js +0 -4
  250. package/src/metrics/gatewayRunsCompletedTotal.js +0 -2
  251. package/src/metrics/gatewayRunsStartedTotal.js +0 -2
  252. package/src/metrics/gatewaySignalsTotal.js +0 -2
  253. package/src/metrics/gatewayWebhooksReceivedTotal.js +0 -2
  254. package/src/metrics/gatewayWebhooksRejectedTotal.js +0 -2
  255. package/src/metrics/gatewayWebhooksVerifiedTotal.js +0 -2
  256. package/src/metrics/heartbeatDataSizeBytes.js +0 -5
  257. package/src/metrics/heartbeatIntervalMs.js +0 -3
  258. package/src/metrics/hotReloadDuration.js +0 -3
  259. package/src/metrics/hotReloadFailures.js +0 -2
  260. package/src/metrics/hotReloads.js +0 -2
  261. package/src/metrics/httpRequestDuration.js +0 -3
  262. package/src/metrics/httpRequests.js +0 -2
  263. package/src/metrics/index.d.ts +0 -1222
  264. package/src/metrics/index.js +0 -168
  265. package/src/metrics/memoryFactReads.js +0 -3
  266. package/src/metrics/memoryFactWrites.js +0 -3
  267. package/src/metrics/memoryMessageSaves.js +0 -3
  268. package/src/metrics/memoryRecallDuration.js +0 -11
  269. package/src/metrics/memoryRecallQueries.js +0 -3
  270. package/src/metrics/metricsServiceAdapter.js +0 -181
  271. package/src/metrics/nodeDuration.js +0 -3
  272. package/src/metrics/nodeRetriesTotal.js +0 -2
  273. package/src/metrics/nodesFailed.js +0 -2
  274. package/src/metrics/nodesFinished.js +0 -2
  275. package/src/metrics/nodesStarted.js +0 -2
  276. package/src/metrics/openApiToolCallErrorsTotal.js +0 -3
  277. package/src/metrics/openApiToolCallsTotal.js +0 -3
  278. package/src/metrics/openApiToolDuration.js +0 -9
  279. package/src/metrics/processHeapUsedBytes.js +0 -2
  280. package/src/metrics/processMemoryRssBytes.js +0 -2
  281. package/src/metrics/processUptimeSeconds.js +0 -2
  282. package/src/metrics/promptSizeBytes.js +0 -3
  283. package/src/metrics/replaysStarted.js +0 -3
  284. package/src/metrics/responseSizeBytes.js +0 -3
  285. package/src/metrics/rewindDurationMs.js +0 -3
  286. package/src/metrics/rewindFramesDeleted.js +0 -3
  287. package/src/metrics/rewindRollbackTotal.js +0 -2
  288. package/src/metrics/rewindSandboxesReverted.js +0 -3
  289. package/src/metrics/rewindTotal.js +0 -2
  290. package/src/metrics/runDuration.js +0 -3
  291. package/src/metrics/runForksCreated.js +0 -3
  292. package/src/metrics/runsAncestryDepth.js +0 -3
  293. package/src/metrics/runsCancelledTotal.js +0 -2
  294. package/src/metrics/runsCarriedStateBytes.js +0 -5
  295. package/src/metrics/runsContinuedTotal.js +0 -2
  296. package/src/metrics/runsFailedTotal.js +0 -2
  297. package/src/metrics/runsFinishedTotal.js +0 -2
  298. package/src/metrics/runsResumedTotal.js +0 -2
  299. package/src/metrics/runsTotal.js +0 -2
  300. package/src/metrics/sandboxActive.js +0 -2
  301. package/src/metrics/sandboxBundleSizeBytes.js +0 -5
  302. package/src/metrics/sandboxCompletedTotal.js +0 -2
  303. package/src/metrics/sandboxCreatedTotal.js +0 -2
  304. package/src/metrics/sandboxDurationMs.js +0 -3
  305. package/src/metrics/sandboxPatchCount.js +0 -3
  306. package/src/metrics/sandboxTransportDurationMs.js +0 -5
  307. package/src/metrics/schedulerConcurrencyUtilization.js +0 -2
  308. package/src/metrics/schedulerQueueDepth.js +0 -2
  309. package/src/metrics/schedulerWaitDuration.js +0 -5
  310. package/src/metrics/scorerDuration.js +0 -9
  311. package/src/metrics/scorerEventsFailed.js +0 -2
  312. package/src/metrics/scorerEventsFinished.js +0 -2
  313. package/src/metrics/scorerEventsStarted.js +0 -2
  314. package/src/metrics/scorersFailed.js +0 -3
  315. package/src/metrics/scorersFinished.js +0 -3
  316. package/src/metrics/scorersStarted.js +0 -3
  317. package/src/metrics/smithersMetricCatalog.js +0 -893
  318. package/src/metrics/smithersMetricCatalogByKey.js +0 -2
  319. package/src/metrics/smithersMetricCatalogByName.js +0 -2
  320. package/src/metrics/smithersMetricCatalogByPrometheusName.js +0 -4
  321. package/src/metrics/snapshotDuration.js +0 -9
  322. package/src/metrics/snapshotsCaptured.js +0 -3
  323. package/src/metrics/supervisorPollDuration.js +0 -5
  324. package/src/metrics/supervisorPollsTotal.js +0 -2
  325. package/src/metrics/supervisorResumeLag.js +0 -5
  326. package/src/metrics/supervisorResumedTotal.js +0 -2
  327. package/src/metrics/supervisorSkippedTotal.js +0 -2
  328. package/src/metrics/supervisorStaleDetected.js +0 -2
  329. package/src/metrics/taskHeartbeatTimeoutTotal.js +0 -2
  330. package/src/metrics/taskHeartbeatsTotal.js +0 -2
  331. package/src/metrics/timerDelayDuration.js +0 -3
  332. package/src/metrics/timersCancelled.js +0 -2
  333. package/src/metrics/timersCreated.js +0 -2
  334. package/src/metrics/timersFired.js +0 -2
  335. package/src/metrics/timersPending.js +0 -2
  336. package/src/metrics/toPrometheusMetricName.js +0 -8
  337. package/src/metrics/tokensCacheReadTotal.js +0 -2
  338. package/src/metrics/tokensCacheWriteTotal.js +0 -2
  339. package/src/metrics/tokensContextWindowBucketTotal.js +0 -2
  340. package/src/metrics/tokensContextWindowPerCall.js +0 -5
  341. package/src/metrics/tokensInputPerCall.js +0 -3
  342. package/src/metrics/tokensInputTotal.js +0 -2
  343. package/src/metrics/tokensOutputPerCall.js +0 -3
  344. package/src/metrics/tokensOutputTotal.js +0 -2
  345. package/src/metrics/tokensReasoningTotal.js +0 -2
  346. package/src/metrics/toolCallErrorsTotal.js +0 -2
  347. package/src/metrics/toolCallsTotal.js +0 -2
  348. package/src/metrics/toolDuration.js +0 -3
  349. package/src/metrics/toolOutputTruncatedTotal.js +0 -2
  350. package/src/metrics/trackEvent.js +0 -608
  351. package/src/metrics/updateAsyncExternalWaitPending.js +0 -18
  352. package/src/metrics/updateProcessMetrics.js +0 -20
  353. package/src/metrics/vcsDuration.js +0 -3
  354. package/src/normalizeStructuredEvent.js +0 -15
  355. package/src/prometheusContentType.js +0 -1
  356. package/src/renderPrometheusMetrics.js +0 -212
  357. package/src/resolveAgentTraceCapabilities.js +0 -59
  358. package/src/resolveSmithersObservabilityOptions.js +0 -109
  359. package/src/smithersMetrics.js +0 -2
  360. package/src/smithersSpanNames.js +0 -6
  361. package/src/unsupportedKindsForCapabilities.js +0 -32
  362. package/src/withSmithersSpan.js +0 -17
  363. package/tempo/tempo.yml +0 -17
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/Resource.ts"],
4
+ "sourcesContent": ["/**\n * Explicit, validated OpenTelemetry resource metadata for Smithers.\n *\n * @since 0.1.0\n */\n\nimport * as OtelResource from \"@effect/opentelemetry/Resource\"\nimport type { Attributes as OtelAttributes } from \"@opentelemetry/api\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Schema from \"effect/Schema\"\nimport * as OtlpResource from \"effect/unstable/observability/OtlpResource\"\nimport { schemaIssueMessage, schemaIssuePath } from \"./internal/schemaIssuePath.ts\"\n\n/**\n * Largest service-name or service-version field accepted by a resource.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumIdentityLength = 1_024\n\n/**\n * Largest attribute key accepted by a resource.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumAttributeKeyLength = 1_024\n\n/**\n * Largest string value accepted by one resource attribute.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumAttributeStringLength = 65_536\n\n/**\n * Largest number of elements accepted in one array attribute value.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumAttributeArrayLength = 256\n\n/**\n * Largest number of attributes accepted by one resource.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumAttributes = 256\n\n/**\n * Largest OTLP/JSON encoding accepted for one whole resource, in UTF-8 bytes.\n *\n * The measure is the OTLP `Resource` message the exporters place in every\n * request, `{\"attributes\":[{\"key\":\u2026,\"value\":{\u2026}}],\"droppedAttributesCount\":0}`\n * with service identity and SDK-added `telemetry.sdk.name` and\n * `telemetry.sdk.language` included, after JSON escaping and UTF-8 encoding.\n * These SDK fields are conservatively reserved even for the default Effect\n * exporter. Caller attributes overwritten by SDK identity or metadata are\n * still counted. It is the bound the per-field limits cannot express: 256\n * attributes at the string ceiling would encode to 16 MiB, and the resource\n * rides in every export request, so the default transport, which discards a\n * request over 1 MiB, would deliver nothing at all. 128 KiB admits one\n * ASCII attribute at the string ceiling and leaves that transport 888 KiB of every\n * request for the signal batch; see `Otlp.reservedBatchBytes`.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumResourceBytes = 131_072\n\nconst loneSurrogate = /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/\nconst embeddedNul = new RegExp(String.fromCharCode(0))\n\nconst isWellFormed = (value: string): boolean => !loneSurrogate.test(value) && !embeddedNul.test(value)\n\nconst identity = Schema.NonEmptyString.check(\n Schema.isMaxLength(maximumIdentityLength),\n Schema.makeFilter((value: string) => isWellFormed(value), { title: \"wellFormedResourceIdentity\" })\n)\n\nconst attributeString = Schema.String.check(\n Schema.isMaxLength(maximumAttributeStringLength),\n Schema.makeFilter((value: string) => isWellFormed(value), { title: \"wellFormedAttributeString\" })\n)\n\nconst attributeNumber = Schema.Number.check(\n Schema.makeFilter((value: number) => Number.isFinite(value), { title: \"finiteAttributeNumber\" })\n)\n\n/**\n * Runtime schema for one OpenTelemetry resource attribute value.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const AttributeValue = Schema.Union([\n attributeString,\n attributeNumber,\n Schema.Boolean,\n Schema.Array(attributeString),\n Schema.Array(attributeNumber),\n Schema.Array(Schema.Boolean)\n]).check(\n Schema.makeFilter(\n (value) =>\n !Array.isArray(value) || value.length <= maximumAttributeArrayLength || {\n path: [],\n issue: `holds ${value.length} elements, over the ${maximumAttributeArrayLength} element limit`\n },\n { title: \"boundedResourceAttributeArrays\" }\n )\n)\n\n/**\n * Runtime schema for OpenTelemetry resource attributes.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const Attributes = Schema.Record(Schema.String, AttributeValue).check(\n Schema.makeFilter(\n (attributes: Readonly<Record<string, unknown>>) => Object.keys(attributes).length <= maximumAttributes,\n { title: \"boundedResourceAttributes\" }\n ),\n Schema.makeFilter(\n (attributes: Readonly<Record<string, unknown>>) =>\n Object.keys(attributes).every(\n (key) => key.length > 0 && key.length <= maximumAttributeKeyLength && isWellFormed(key)\n ),\n { title: \"wellFormedResourceAttributeKeys\" }\n )\n)\n\nconst encoder = new TextEncoder()\n\n/**\n * Counts OTLP JSON fragments, including keys, wrappers, escaping and UTF-8.\n * Stops at the first fragment over budget: the refusal reports a lower bound.\n * A configuration may reuse one large string in thousands of array slots, so\n * serializing the whole resource before checking could allocate gigabytes.\n */\nconst encodedResourceBytes = (configuration: {\n readonly serviceName: string\n readonly serviceVersion?: string | undefined\n readonly attributes?: Record<string, unknown> | undefined\n}): number => {\n const bytes = (value: unknown) => encoder.encode(JSON.stringify(value)).byteLength\n const identityAttributes = OtelResource.configToAttributes({\n serviceName: configuration.serviceName,\n ...(configuration.serviceVersion === undefined ? {} : { serviceVersion: configuration.serviceVersion })\n })\n // Use the pinned SDK projection so its added metadata cannot escape the\n // complete-resource ceiling. Both exporters use these OTLP AnyValue shapes.\n let total = bytes({\n attributes: OtlpResource.entriesToAttributes(Object.entries(identityAttributes)),\n droppedAttributesCount: 0\n })\n for (const [key, value] of Object.entries(configuration.attributes ?? {})) {\n // An identity attribute is always present, so every addition needs a comma.\n total += 1 + bytes({ key, value: Array.isArray(value) ? { arrayValue: { values: [] } } : null })\n if (Array.isArray(value)) {\n for (const [index, element] of value.entries()) {\n total += (index === 0 ? 0 : 1) + bytes(OtlpResource.unknownToAttributeValue(element))\n if (total > maximumResourceBytes) return total\n }\n } else {\n total += bytes(OtlpResource.unknownToAttributeValue(value)) - 4 // replace JSON null\n }\n if (total > maximumResourceBytes) return total\n }\n return total\n}\n\n/**\n * Runtime schema for the service identity attached to exported telemetry.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const Configuration = Schema.Struct({\n serviceName: identity,\n serviceVersion: Schema.optional(identity),\n attributes: Schema.optional(Attributes)\n}).check(\n Schema.makeFilter(\n (configuration: {\n readonly serviceName: string\n readonly serviceVersion?: string | undefined\n readonly attributes?: Record<string, unknown> | undefined\n }) => {\n const bytes = encodedResourceBytes(configuration)\n // Only attributes can carry a resource past the budget: the two identity\n // fields encode to at most 6 KiB each, so the refusal points there.\n return bytes <= maximumResourceBytes || {\n path: [\"attributes\"],\n issue: `bring the resource to at least ${bytes} bytes of OTLP JSON, over the ${maximumResourceBytes} byte limit`\n }\n },\n { title: \"boundedResourceBytes\" }\n )\n)\n\n/**\n * Configuration used to identify the service emitting telemetry.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type Configuration = typeof Configuration.Type\n\n/**\n * Stable resource-configuration refusal shared by every OTEL layer.\n *\n * @category errors\n * @since 1.0.0-rc.0\n */\nexport class InvalidResourceConfiguration extends Schema.TaggedError<InvalidResourceConfiguration>()(\n \"@smthrs/observability/InvalidResourceConfiguration\",\n {\n code: Schema.Literal(\"invalid_resource_configuration\"),\n path: Schema.String,\n message: Schema.String\n }\n) {}\n\nconst invalid = (cause: unknown): InvalidResourceConfiguration => {\n const path = schemaIssuePath(cause, \"resource\")\n return new InvalidResourceConfiguration({\n code: \"invalid_resource_configuration\",\n path,\n message: `OpenTelemetry resource ${path} ${schemaIssueMessage(cause) ?? \"is invalid\"}`\n })\n}\n\n/**\n * Decodes one resource configuration without retaining rejected values.\n *\n * @category decoding\n * @since 1.0.0-rc.0\n */\nexport const decode = (\n configuration: unknown\n): Effect.Effect<Configuration, InvalidResourceConfiguration> =>\n Schema.decodeUnknownEffect(Configuration)(configuration).pipe(Effect.mapError(invalid))\n\n/**\n * Decodes one resource configuration for the package's pure projection API.\n *\n * @category decoding\n * @since 1.0.0-rc.0\n */\nexport const decodeSync = (configuration: unknown): Configuration => {\n try {\n return Schema.decodeUnknownSync(Configuration)(configuration)\n } catch (cause) {\n throw invalid(cause)\n }\n}\n\n/**\n * Projects a decoded resource into the exact optional-property shape expected\n * by the OpenTelemetry SDK.\n *\n * @category conversions\n * @since 1.0.0-rc.0\n */\nexport const toOpenTelemetryConfiguration = (\n configuration: Configuration\n): {\n readonly serviceName: string\n readonly serviceVersion?: string\n readonly attributes?: OtelAttributes\n} => ({\n serviceName: configuration.serviceName,\n ...(configuration.serviceVersion === undefined ? {} : { serviceVersion: configuration.serviceVersion }),\n ...(configuration.attributes === undefined\n ? {}\n : {\n attributes: Object.fromEntries(\n Object.entries(configuration.attributes).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value\n ])\n ) as OtelAttributes\n })\n})\n\n/**\n * Converts explicit service metadata into OpenTelemetry resource attributes.\n *\n * No environment variables are read. Invalid metadata throws the same typed\n * {@link InvalidResourceConfiguration} every layer returns during acquisition.\n *\n * @category conversions\n * @since 1.0.0-rc.0\n */\nexport const configToAttributes = (configuration: Configuration): OtelAttributes =>\n OtelResource.configToAttributes(toOpenTelemetryConfiguration(decodeSync(configuration)))\n\n/**\n * Provides an explicitly validated OpenTelemetry resource.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layer = (\n configuration: Configuration\n): Layer.Layer<OtelResource.Resource, InvalidResourceConfiguration> =>\n Layer.unwrap(\n Effect.map(decode(configuration), (decoded) => OtelResource.layer(toOpenTelemetryConfiguration(decoded)))\n )\n\n/**\n * The OpenTelemetry resource service.\n *\n * @category services\n * @since 1.0.0-rc.0\n */\nexport const Resource = OtelResource.Resource\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Observability for flows: the default OTLP export wiring plus the
3
+ * Effect-native logger, metric, and OpenTelemetry resource layers.
4
+ *
5
+ * The store packages define and update their own metric handles
6
+ * (`JournalMetrics`, `RunStoreMetrics`, `CacheStoreMetrics`,
7
+ * `ArtifactStoreMetrics`, `DatabaseMetrics`) and open spans through Effect's
8
+ * tracer; this package is the exporter they deliberately leave out. `Otlp`
9
+ * only composes what `effect` already ships, so it is browser-bundleable. The
10
+ * remaining modules are the fuller stack folded in from the agent workspace:
11
+ * a structured `Logger`, a `JournalLogger` that mirrors log events into the
12
+ * run journal, `Metric` helpers, the `Resource` descriptor, and the `Otel`
13
+ * layer the OpenTelemetry SDK wiring installs behind.
14
+ *
15
+ * `NodeOtel` and `BrowserOtel` are deliberately NOT re-exported here. Each
16
+ * resolves a host-specific OpenTelemetry SDK. `NodeOtel` reaches Node-only
17
+ * host modules through `@effect/opentelemetry/NodeSdk` and
18
+ * `@opentelemetry/sdk-trace-node`, including the bare `async_hooks` specifier
19
+ * `@opentelemetry/context-async-hooks` imports, so re-exporting it would put a
20
+ * module a browser bundler cannot resolve in the root entry and break the
21
+ * browser bundle this package guarantees. Import them by subpath instead:
22
+ * `@smthrs/observability/NodeOtel`.
23
+ *
24
+ * @since 0.1.0
25
+ */
26
+ /**
27
+ * @category layers
28
+ * @since 0.1.0
29
+ */
30
+ export * as Otlp from "./Otlp.ts";
31
+ /**
32
+ * @category observability
33
+ * @since 1.0.0-rc.0
34
+ */
35
+ export * as Endpoint from "./Endpoint.ts";
36
+ /**
37
+ * @category observability
38
+ * @since 0.1.0
39
+ */
40
+ export * as JournalLogger from "./JournalLogger.ts";
41
+ /**
42
+ * @category observability
43
+ * @since 0.1.0
44
+ */
45
+ export * as Logger from "./Logger.ts";
46
+ /**
47
+ * @category observability
48
+ * @since 0.1.0
49
+ */
50
+ export * as Metric from "./Metric.ts";
51
+ /**
52
+ * @category observability
53
+ * @since 0.1.0
54
+ */
55
+ export * as Otel from "./Otel.ts";
56
+ /**
57
+ * @category observability
58
+ * @since 0.1.0
59
+ */
60
+ export * as Resource from "./Resource.ts";
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC;;;GAGG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;;GAGG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC;;;GAGG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var index_exports = {};
30
+ __export(index_exports, {
31
+ Endpoint: () => Endpoint,
32
+ JournalLogger: () => JournalLogger,
33
+ Logger: () => Logger,
34
+ Metric: () => Metric,
35
+ Otel: () => Otel,
36
+ Otlp: () => Otlp,
37
+ Resource: () => Resource
38
+ });
39
+ module.exports = __toCommonJS(index_exports);
40
+ var Otlp = __toESM(require("./Otlp.js"), 1);
41
+ var Endpoint = __toESM(require("./Endpoint.js"), 1);
42
+ var JournalLogger = __toESM(require("./JournalLogger.js"), 1);
43
+ var Logger = __toESM(require("./Logger.js"), 1);
44
+ var Metric = __toESM(require("./Metric.js"), 1);
45
+ var Otel = __toESM(require("./Otel.js"), 1);
46
+ var Resource = __toESM(require("./Resource.js"), 1);
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": ["/**\n * Observability for flows: the default OTLP export wiring plus the\n * Effect-native logger, metric, and OpenTelemetry resource layers.\n *\n * The store packages define and update their own metric handles\n * (`JournalMetrics`, `RunStoreMetrics`, `CacheStoreMetrics`,\n * `ArtifactStoreMetrics`, `DatabaseMetrics`) and open spans through Effect's\n * tracer; this package is the exporter they deliberately leave out. `Otlp`\n * only composes what `effect` already ships, so it is browser-bundleable. The\n * remaining modules are the fuller stack folded in from the agent workspace:\n * a structured `Logger`, a `JournalLogger` that mirrors log events into the\n * run journal, `Metric` helpers, the `Resource` descriptor, and the `Otel`\n * layer the OpenTelemetry SDK wiring installs behind.\n *\n * `NodeOtel` and `BrowserOtel` are deliberately NOT re-exported here. Each\n * resolves a host-specific OpenTelemetry SDK. `NodeOtel` reaches Node-only\n * host modules through `@effect/opentelemetry/NodeSdk` and\n * `@opentelemetry/sdk-trace-node`, including the bare `async_hooks` specifier\n * `@opentelemetry/context-async-hooks` imports, so re-exporting it would put a\n * module a browser bundler cannot resolve in the root entry and break the\n * browser bundle this package guarantees. Import them by subpath instead:\n * `@smthrs/observability/NodeOtel`.\n *\n * @since 0.1.0\n */\n\n/**\n * @category layers\n * @since 0.1.0\n */\nexport * as Otlp from \"./Otlp.ts\"\n\n/**\n * @category observability\n * @since 1.0.0-rc.0\n */\nexport * as Endpoint from \"./Endpoint.ts\"\n\n/**\n * @category observability\n * @since 0.1.0\n */\nexport * as JournalLogger from \"./JournalLogger.ts\"\n\n/**\n * @category observability\n * @since 0.1.0\n */\nexport * as Logger from \"./Logger.ts\"\n\n/**\n * @category observability\n * @since 0.1.0\n */\nexport * as Metric from \"./Metric.ts\"\n\n/**\n * @category observability\n * @since 0.1.0\n */\nexport * as Otel from \"./Otel.ts\"\n\n/**\n * @category observability\n * @since 0.1.0\n */\nexport * as Resource from \"./Resource.ts\"\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BA,WAAsB;AAMtB,eAA0B;AAM1B,oBAA+B;AAM/B,aAAwB;AAMxB,aAAwB;AAMxB,WAAsB;AAMtB,eAA0B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The decoder-issue walk shared by this package's refusals.
3
+ *
4
+ * `JournalLogger` and `Resource` both publish the path of the option a decode
5
+ * rejected, and `Resource` also publishes the measured size a budget filter
6
+ * attached to its refusal. Effect's issues nest the same way for both, so the
7
+ * traversal lives once and a decoder change is followed once.
8
+ *
9
+ * @private
10
+ * @since 1.0.0-rc.0
11
+ */
12
+ /**
13
+ * Walks a decode failure to the dotted path of the value it refused.
14
+ *
15
+ * Returns the caller's domain name when the failure carries no path at all.
16
+ *
17
+ * @private
18
+ * @since 1.0.0-rc.0
19
+ */
20
+ export declare const schemaIssuePath: (error: unknown, fallback: string) => string;
21
+ /**
22
+ * Reads the message a filter attached to the value a decode refused, when the
23
+ * filter attached one. None of the Effect checks this package composes attach
24
+ * one, so a refusal only ever carries text this package wrote, never the
25
+ * rejected value.
26
+ *
27
+ * @private
28
+ * @since 1.0.0-rc.0
29
+ */
30
+ export declare const schemaIssueMessage: (error: unknown) => string | undefined;
31
+ //# sourceMappingURL=schemaIssuePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaIssuePath.d.ts","sourceRoot":"","sources":["../../../src/internal/schemaIssuePath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA+BH;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,EAAE,UAAU,MAAM,KAAG,MAAoD,CAAA;AAEvH;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAI5D,CAAA"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var schemaIssuePath_exports = {};
20
+ __export(schemaIssuePath_exports, {
21
+ schemaIssueMessage: () => schemaIssueMessage,
22
+ schemaIssuePath: () => schemaIssuePath
23
+ });
24
+ module.exports = __toCommonJS(schemaIssuePath_exports);
25
+ const walk = (error) => {
26
+ let issue = error?.issue;
27
+ const segments = [];
28
+ for (let depth = 0; depth < 64 && typeof issue === "object" && issue !== null; depth++) {
29
+ const node = issue;
30
+ if (Array.isArray(node.path)) segments.push(...node.path.map(String));
31
+ if (node.issue !== void 0) {
32
+ issue = node.issue;
33
+ continue;
34
+ }
35
+ if (Array.isArray(node.issues) && node.issues[0] !== void 0) {
36
+ issue = node.issues[0];
37
+ continue;
38
+ }
39
+ break;
40
+ }
41
+ return { segments, leaf: issue };
42
+ };
43
+ const schemaIssuePath = (error, fallback) => walk(error).segments.join(".") || fallback;
44
+ const schemaIssueMessage = (error) => {
45
+ const leaf = walk(error).leaf;
46
+ const message = leaf?.annotations?.message;
47
+ return typeof message === "string" ? message : void 0;
48
+ };
49
+ //# sourceMappingURL=schemaIssuePath.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/internal/schemaIssuePath.ts"],
4
+ "sourcesContent": ["/**\n * The decoder-issue walk shared by this package's refusals.\n *\n * `JournalLogger` and `Resource` both publish the path of the option a decode\n * rejected, and `Resource` also publishes the measured size a budget filter\n * attached to its refusal. Effect's issues nest the same way for both, so the\n * traversal lives once and a decoder change is followed once.\n *\n * @private\n * @since 1.0.0-rc.0\n */\n\ninterface IssueLeaf {\n readonly segments: ReadonlyArray<string>\n readonly leaf: unknown\n}\n\n/**\n * Walks a decode failure to its first offending leaf, collecting the path\n * segments passed on the way. The walk is bounded so a self-referential issue\n * tree cannot spin.\n */\nconst walk = (error: unknown): IssueLeaf => {\n let issue = (error as { readonly issue?: unknown } | null)?.issue\n const segments: Array<string> = []\n for (let depth = 0; depth < 64 && typeof issue === \"object\" && issue !== null; depth++) {\n const node = issue as { readonly path?: unknown; readonly issue?: unknown; readonly issues?: unknown }\n if (Array.isArray(node.path)) segments.push(...node.path.map(String))\n if (node.issue !== undefined) {\n issue = node.issue\n continue\n }\n if (Array.isArray(node.issues) && node.issues[0] !== undefined) {\n issue = node.issues[0]\n continue\n }\n break\n }\n return { segments, leaf: issue }\n}\n\n/**\n * Walks a decode failure to the dotted path of the value it refused.\n *\n * Returns the caller's domain name when the failure carries no path at all.\n *\n * @private\n * @since 1.0.0-rc.0\n */\nexport const schemaIssuePath = (error: unknown, fallback: string): string => walk(error).segments.join(\".\") || fallback\n\n/**\n * Reads the message a filter attached to the value a decode refused, when the\n * filter attached one. None of the Effect checks this package composes attach\n * one, so a refusal only ever carries text this package wrote, never the\n * rejected value.\n *\n * @private\n * @since 1.0.0-rc.0\n */\nexport const schemaIssueMessage = (error: unknown): string | undefined => {\n const leaf = walk(error).leaf as { readonly annotations?: { readonly message?: unknown } } | null | undefined\n const message = leaf?.annotations?.message\n return typeof message === \"string\" ? message : undefined\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBA,MAAM,OAAO,CAAC,UAA8B;AAC1C,MAAI,QAAS,OAA+C;AAC5D,QAAM,WAA0B,CAAC;AACjC,WAAS,QAAQ,GAAG,QAAQ,MAAM,OAAO,UAAU,YAAY,UAAU,MAAM,SAAS;AACtF,UAAM,OAAO;AACb,QAAI,MAAM,QAAQ,KAAK,IAAI,EAAG,UAAS,KAAK,GAAG,KAAK,KAAK,IAAI,MAAM,CAAC;AACpE,QAAI,KAAK,UAAU,QAAW;AAC5B,cAAQ,KAAK;AACb;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,OAAO,CAAC,MAAM,QAAW;AAC9D,cAAQ,KAAK,OAAO,CAAC;AACrB;AAAA,IACF;AACA;AAAA,EACF;AACA,SAAO,EAAE,UAAU,MAAM,MAAM;AACjC;AAUO,MAAM,kBAAkB,CAAC,OAAgB,aAA6B,KAAK,KAAK,EAAE,SAAS,KAAK,GAAG,KAAK;AAWxG,MAAM,qBAAqB,CAAC,UAAuC;AACxE,QAAM,OAAO,KAAK,KAAK,EAAE;AACzB,QAAM,UAAU,MAAM,aAAa;AACnC,SAAO,OAAO,YAAY,WAAW,UAAU;AACjD;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Browser OpenTelemetry setup with explicitly injected providers/readers.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+ import type { LogRecordProcessor } from "@opentelemetry/sdk-logs";
7
+ import type { MetricReader } from "@opentelemetry/sdk-metrics";
8
+ import type { SpanProcessor } from "@opentelemetry/sdk-trace-base";
9
+ import * as Layer from "effect/Layer";
10
+ import * as Resource from "./Resource.ts";
11
+ import type { Configuration as ResourceConfiguration } from "./Resource.ts";
12
+ /**
13
+ * Browser OTEL layer options. Processors and readers are created by the
14
+ * caller's factories, which keeps this module free of Node imports and browser
15
+ * exporter policy. Every factory is owned: it runs once during layer
16
+ * acquisition, after resource validation, and the layer scope shuts down
17
+ * everything it returned. An empty array installs nothing for that signal.
18
+ *
19
+ * @category models
20
+ * @since 0.1.0
21
+ */
22
+ export interface Options {
23
+ readonly resource: ResourceConfiguration;
24
+ readonly spanProcessor?: (() => SpanProcessor | ReadonlyArray<SpanProcessor>) | undefined;
25
+ readonly logRecordProcessor?: (() => LogRecordProcessor | ReadonlyArray<LogRecordProcessor>) | undefined;
26
+ readonly metricReader?: (() => MetricReader | ReadonlyArray<MetricReader>) | undefined;
27
+ readonly loggerMergeWithExisting?: boolean | undefined;
28
+ }
29
+ /**
30
+ * Builds a scoped browser OpenTelemetry layer. The web SDK owns every
31
+ * processor and reader the factories return and shuts them down on release.
32
+ *
33
+ * @category layers
34
+ * @since 0.1.0
35
+ */
36
+ export declare const layerOtel: (options: Options) => Layer.Layer<never, Resource.InvalidResourceConfiguration>;
37
+ //# sourceMappingURL=BrowserOtel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserOtel.d.ts","sourceRoot":"","sources":["../../src/BrowserOtel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,IAAI,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE3E;;;;;;;;;GASG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAA;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAA;IACzF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC,GAAG,SAAS,CAAA;IACxG,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,GAAG,SAAS,CAAA;IACtF,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACvD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,4BAA4B,CAUlG,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Browser OpenTelemetry setup with explicitly injected providers/readers.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+ import * as WebSdk from "@effect/opentelemetry/WebSdk";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Layer from "effect/Layer";
9
+ import * as Resource from "./Resource.js";
10
+ /**
11
+ * Builds a scoped browser OpenTelemetry layer. The web SDK owns every
12
+ * processor and reader the factories return and shuts them down on release.
13
+ *
14
+ * @category layers
15
+ * @since 0.1.0
16
+ */
17
+ export const layerOtel = (options) => Layer.unwrap(Effect.map(Resource.decode(options.resource), (decoded) => WebSdk.layer(() => ({
18
+ resource: Resource.toOpenTelemetryConfiguration(decoded),
19
+ spanProcessor: options.spanProcessor?.(),
20
+ logRecordProcessor: options.logRecordProcessor?.(),
21
+ metricReader: options.metricReader?.(),
22
+ loggerMergeWithExisting: options.loggerMergeWithExisting
23
+ }))));
24
+ //# sourceMappingURL=BrowserOtel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserOtel.js","sourceRoot":"","sources":["../../src/BrowserOtel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAA;AAItD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAqBzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAgB,EAA6D,EAAE,CACvG,KAAK,CAAC,MAAM,CACV,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CACxD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC,4BAA4B,CAAC,OAAO,CAAC;IACxD,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE;IACxC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE;IAClD,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;IACtC,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;CACzD,CAAC,CAAC,CAAC,CACP,CAAA"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Validated collector endpoints for the OTLP exporters.
3
+ *
4
+ * The endpoint is the field an operator most often gets wrong, and a wrong one
5
+ * is invisible: Effect's exporter absorbs export failure by design, so a layer
6
+ * built against `""` or `"localhost:4318"` looks identical to a working one and
7
+ * simply never delivers. Every builder therefore decodes its endpoint during
8
+ * layer acquisition, the same posture `Resource` already takes.
9
+ *
10
+ * @since 1.0.0-rc.0
11
+ */
12
+ import * as Effect from "effect/Effect";
13
+ import * as Schema from "effect/Schema";
14
+ /**
15
+ * Largest collector endpoint accepted by a builder.
16
+ *
17
+ * @category constants
18
+ * @since 1.0.0-rc.0
19
+ */
20
+ export declare const maximumEndpointLength = 2048;
21
+ /**
22
+ * Runtime schema for an absolute `http:` or `https:` collector endpoint that
23
+ * carries no credentials, query, fragment, backslashes, spaces, or controls.
24
+ * A base path is allowed; authentication belongs in exporter headers.
25
+ *
26
+ * @category schemas
27
+ * @since 1.0.0-rc.0
28
+ */
29
+ export declare const Endpoint: Schema.String;
30
+ declare const InvalidExporterEndpoint_base: Schema.Class<InvalidExporterEndpoint, Schema.TaggedStruct<"@smthrs/observability/InvalidExporterEndpoint", {
31
+ readonly code: Schema.Literal<"invalid_exporter_endpoint">;
32
+ readonly path: Schema.String;
33
+ readonly message: Schema.String;
34
+ }>, import("effect/Cause").YieldableError>;
35
+ /**
36
+ * Stable exporter-endpoint refusal shared by every OTLP builder.
37
+ *
38
+ * @category errors
39
+ * @since 1.0.0-rc.0
40
+ */
41
+ export declare class InvalidExporterEndpoint extends InvalidExporterEndpoint_base {
42
+ }
43
+ /**
44
+ * Removes the repeated trailing separators that would otherwise produce a
45
+ * double slash in a signal URL.
46
+ *
47
+ * @category conversions
48
+ * @since 1.0.0-rc.0
49
+ */
50
+ export declare const normalize: (endpoint: string) => string;
51
+ /**
52
+ * Decodes one collector endpoint into its normalized form without retaining
53
+ * the rejected value.
54
+ *
55
+ * `path` names the option the endpoint arrived on, so the refusal points at the
56
+ * caller's own field rather than at a shared internal name.
57
+ *
58
+ * @category decoding
59
+ * @since 1.0.0-rc.0
60
+ */
61
+ export declare const decode: (endpoint: unknown, path: string) => Effect.Effect<string, InvalidExporterEndpoint>;
62
+ /**
63
+ * Builds the OTLP/HTTP URL one signal is posted to below a decoded endpoint.
64
+ *
65
+ * @category conversions
66
+ * @since 1.0.0-rc.0
67
+ */
68
+ export declare const signalUrl: (endpoint: string, signal: "traces" | "metrics" | "logs") => string;
69
+ export {};
70
+ //# sourceMappingURL=Endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Endpoint.d.ts","sourceRoot":"","sources":["../../src/Endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,OAAQ,CAAA;AAuC1C;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,eAGpB,CAAA;;;;;;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,4BAO5C;CAAG;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,KAAG,MAAsC,CAAA;AAEnF;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,GACjB,UAAU,OAAO,EACjB,MAAM,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAW7C,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS,GAAG,MAAM,KAAG,MAC7C,CAAA"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Validated collector endpoints for the OTLP exporters.
3
+ *
4
+ * The endpoint is the field an operator most often gets wrong, and a wrong one
5
+ * is invisible: Effect's exporter absorbs export failure by design, so a layer
6
+ * built against `""` or `"localhost:4318"` looks identical to a working one and
7
+ * simply never delivers. Every builder therefore decodes its endpoint during
8
+ * layer acquisition, the same posture `Resource` already takes.
9
+ *
10
+ * @since 1.0.0-rc.0
11
+ */
12
+ import * as Effect from "effect/Effect";
13
+ import * as Schema from "effect/Schema";
14
+ /**
15
+ * Largest collector endpoint accepted by a builder.
16
+ *
17
+ * @category constants
18
+ * @since 1.0.0-rc.0
19
+ */
20
+ export const maximumEndpointLength = 2_048;
21
+ /** The largest code unit the WHATWG URL parser repairs away: the space. */
22
+ const largestRepairedCodeUnit = 0x20;
23
+ /**
24
+ * Reports whether the URL parser would repair the value rather than parse it
25
+ * as written. It strips leading and trailing C0 controls and spaces and
26
+ * removes tab, newline, and carriage return from anywhere in its input, and
27
+ * every one of those sits at or below {@link largestRepairedCodeUnit}.
28
+ */
29
+ const repairedByUrlParser = (value) => {
30
+ for (let index = 0; index < value.length; index++) {
31
+ if (value.charCodeAt(index) <= largestRepairedCodeUnit)
32
+ return true;
33
+ }
34
+ return false;
35
+ };
36
+ const isAbsoluteHttpUrl = (value) => {
37
+ // `new URL` alone is not a validator here. It strips padding and inline
38
+ // control characters before parsing, so it reports a copy-pasted
39
+ // `"http://collector:4318\n"` as well formed while the untrimmed original is
40
+ // what a builder would hand its exporter: either an unusable URL or a
41
+ // request to a host nobody typed. No legal collector endpoint carries one of
42
+ // these, so refusing them costs nothing and closes the silent case.
43
+ if (repairedByUrlParser(value))
44
+ return false;
45
+ // Exporters append /v1/<signal> to this base. A query or fragment would
46
+ // swallow that suffix instead of changing the request path. Also refuse
47
+ // missing authority separators and backslashes that WHATWG silently repairs.
48
+ if (!/^https?:\/\/[^/]/i.test(value) || /[?#\\]/.test(value))
49
+ return false;
50
+ let url;
51
+ try {
52
+ url = new URL(value);
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ return url.username === "" && url.password === "";
58
+ };
59
+ /**
60
+ * Runtime schema for an absolute `http:` or `https:` collector endpoint that
61
+ * carries no credentials, query, fragment, backslashes, spaces, or controls.
62
+ * A base path is allowed; authentication belongs in exporter headers.
63
+ *
64
+ * @category schemas
65
+ * @since 1.0.0-rc.0
66
+ */
67
+ export const Endpoint = Schema.String.check(Schema.isMaxLength(maximumEndpointLength), Schema.makeFilter((value) => isAbsoluteHttpUrl(value), { title: "absoluteCollectorEndpoint" }));
68
+ /**
69
+ * Stable exporter-endpoint refusal shared by every OTLP builder.
70
+ *
71
+ * @category errors
72
+ * @since 1.0.0-rc.0
73
+ */
74
+ export class InvalidExporterEndpoint extends Schema.TaggedError()("@smthrs/observability/InvalidExporterEndpoint", {
75
+ code: Schema.Literal("invalid_exporter_endpoint"),
76
+ path: Schema.String,
77
+ message: Schema.String
78
+ }) {
79
+ }
80
+ /**
81
+ * Removes the repeated trailing separators that would otherwise produce a
82
+ * double slash in a signal URL.
83
+ *
84
+ * @category conversions
85
+ * @since 1.0.0-rc.0
86
+ */
87
+ export const normalize = (endpoint) => endpoint.replace(/\/+$/, "");
88
+ /**
89
+ * Decodes one collector endpoint into its normalized form without retaining
90
+ * the rejected value.
91
+ *
92
+ * `path` names the option the endpoint arrived on, so the refusal points at the
93
+ * caller's own field rather than at a shared internal name.
94
+ *
95
+ * @category decoding
96
+ * @since 1.0.0-rc.0
97
+ */
98
+ export const decode = (endpoint, path) => Schema.decodeUnknownEffect(Endpoint)(endpoint).pipe(Effect.map(normalize), Effect.mapError(() => new InvalidExporterEndpoint({
99
+ code: "invalid_exporter_endpoint",
100
+ path,
101
+ message: `OTLP collector ${path} must be an absolute http:// or https:// base URL without credentials, query, fragment, backslashes, spaces, or control characters`
102
+ })));
103
+ /**
104
+ * Builds the OTLP/HTTP URL one signal is posted to below a decoded endpoint.
105
+ *
106
+ * @category conversions
107
+ * @since 1.0.0-rc.0
108
+ */
109
+ export const signalUrl = (endpoint, signal) => `${normalize(endpoint)}/v1/${signal}`;
110
+ //# sourceMappingURL=Endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Endpoint.js","sourceRoot":"","sources":["../../src/Endpoint.ts"],"names":[],"mappings":"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"}