@smthrs/observability 0.35.0 → 1.0.0-rc.12

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 +87 -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 +415 -0
  15. package/dist/cjs/JournalLogger.js.map +7 -0
  16. package/dist/cjs/Logger.d.ts +56 -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 +63 -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 +203 -0
  33. package/dist/cjs/Otlp.d.ts.map +1 -0
  34. package/dist/cjs/Otlp.js +251 -0
  35. package/dist/cjs/Otlp.js.map +7 -0
  36. package/dist/cjs/Resource.d.ts +163 -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 +520 -0
  60. package/dist/esm/JournalLogger.js.map +1 -0
  61. package/dist/esm/Logger.d.ts +56 -0
  62. package/dist/esm/Logger.d.ts.map +1 -0
  63. package/dist/esm/Logger.js +61 -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 +63 -0
  74. package/dist/esm/Otel.d.ts.map +1 -0
  75. package/dist/esm/Otel.js +52 -0
  76. package/dist/esm/Otel.js.map +1 -0
  77. package/dist/esm/Otlp.d.ts +203 -0
  78. package/dist/esm/Otlp.d.ts.map +1 -0
  79. package/dist/esm/Otlp.js +384 -0
  80. package/dist/esm/Otlp.js.map +1 -0
  81. package/dist/esm/Resource.d.ts +163 -0
  82. package/dist/esm/Resource.d.ts.map +1 -0
  83. package/dist/esm/Resource.js +238 -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 +164 -0
  94. package/docs/api.md +780 -0
  95. package/docs/concepts/instrumentation-and-export.md +98 -0
  96. package/docs/concepts/layer-map.md +73 -0
  97. package/docs/concepts/validated-acquisition.md +106 -0
  98. package/docs/guides/export-to-a-collector.md +190 -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 +226 -0
  104. package/docs/installation.md +102 -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 +635 -0
  111. package/src/Logger.ts +107 -0
  112. package/src/Metric.ts +88 -0
  113. package/src/NodeOtel.ts +90 -0
  114. package/src/Otel.ts +118 -0
  115. package/src/Otlp.ts +514 -0
  116. package/src/Resource.ts +325 -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
package/src/Logger.ts ADDED
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Effect logger layers used by flows.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+
7
+ import * as Layer from "effect/Layer"
8
+ import * as Logger from "effect/Logger"
9
+ import type * as LogLevel from "effect/LogLevel"
10
+ import * as References from "effect/References"
11
+
12
+ /**
13
+ * Options shared by the built-in logger layers.
14
+ *
15
+ * @category models
16
+ * @since 0.1.0
17
+ */
18
+ export interface Options {
19
+ /**
20
+ * Pins `References.MinimumLogLevel` for the whole application. Omitted, the
21
+ * layer leaves that reference alone and Effect's own `Info` default applies.
22
+ */
23
+ readonly minimumLogLevel?: LogLevel.LogLevel | undefined
24
+ /**
25
+ * Keeps the ambient loggers alongside this one. Defaults to `false`, which
26
+ * replaces the ambient logger set, matching Effect's own `Logger.layer`.
27
+ */
28
+ readonly mergeWithExisting?: boolean | undefined
29
+ }
30
+
31
+ /**
32
+ * Installs the minimum-level reference only when the caller named a level, so
33
+ * a layer that adds a sink does not pin the level an application chose
34
+ * elsewhere. Effect's own default for the reference is already `Info`.
35
+ */
36
+ const withMinimumLogLevel = (
37
+ layer: Layer.Layer<never>,
38
+ minimumLogLevel: LogLevel.LogLevel | undefined
39
+ ): Layer.Layer<never> =>
40
+ minimumLogLevel === undefined
41
+ ? layer
42
+ : Layer.merge(layer, Layer.succeed(References.MinimumLogLevel, minimumLogLevel))
43
+
44
+ const optionsWithDefaults = (options?: Options): {
45
+ readonly minimumLogLevel: LogLevel.LogLevel | undefined
46
+ readonly mergeWithExisting: boolean
47
+ } => ({
48
+ minimumLogLevel: options?.minimumLogLevel,
49
+ mergeWithExisting: options?.mergeWithExisting ?? false
50
+ })
51
+
52
+ /**
53
+ * Provides a human-readable development logger.
54
+ *
55
+ * @category layers
56
+ * @since 0.1.0
57
+ */
58
+ export const layerPrettyDev = (options?: Options): Layer.Layer<never> => {
59
+ const resolved = optionsWithDefaults(options)
60
+ return withMinimumLogLevel(
61
+ Logger.layer([Logger.consolePretty({ colors: "auto", mode: "auto" })], {
62
+ mergeWithExisting: resolved.mergeWithExisting
63
+ }),
64
+ resolved.minimumLogLevel
65
+ )
66
+ }
67
+
68
+ /**
69
+ * Provides one structured JSON object per log line.
70
+ *
71
+ * @category layers
72
+ * @since 0.1.0
73
+ */
74
+ export const layerStructuredJson = (options?: Options): Layer.Layer<never> => {
75
+ const resolved = optionsWithDefaults(options)
76
+ return withMinimumLogLevel(
77
+ Logger.layer([Logger.consoleJson], { mergeWithExisting: resolved.mergeWithExisting }),
78
+ resolved.minimumLogLevel
79
+ )
80
+ }
81
+
82
+ /**
83
+ * Removes the active logger set and pins the minimum level to `None` unless
84
+ * `options.minimumLogLevel` explicitly selects another level.
85
+ *
86
+ * @category layers
87
+ * @since 0.1.0
88
+ */
89
+ export const layerNoop = (options?: Pick<Options, "minimumLogLevel">): Layer.Layer<never> =>
90
+ withMinimumLogLevel(
91
+ Logger.layer([]),
92
+ options?.minimumLogLevel ?? "None"
93
+ )
94
+
95
+ /**
96
+ * A logger layer that can be composed without requiring a runtime service.
97
+ *
98
+ * @category layers
99
+ * @since 0.1.0
100
+ */
101
+ export const layer = (logger: Logger.Logger<unknown, unknown>, options?: Options): Layer.Layer<never> => {
102
+ const resolved = optionsWithDefaults(options)
103
+ return withMinimumLogLevel(
104
+ Logger.layer([logger], { mergeWithExisting: resolved.mergeWithExisting }),
105
+ resolved.minimumLogLevel
106
+ )
107
+ }
package/src/Metric.ts ADDED
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Effect metric registry for flows runtime signals.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+
7
+ import * as Metric from "effect/Metric"
8
+
9
+ const prefix = "flows_"
10
+
11
+ /**
12
+ * Counts flow runs that reached a terminal state.
13
+ *
14
+ * @category metrics
15
+ * @since 0.1.0
16
+ */
17
+ export const runThroughput = Metric.counter(`${prefix}run_throughput`, {
18
+ description: "Completed flow runs"
19
+ })
20
+
21
+ /**
22
+ * The number of execution seats currently held.
23
+ *
24
+ * @category metrics
25
+ * @since 0.1.0
26
+ */
27
+ export const activeSeats = Metric.gauge(`${prefix}seat_active`, {
28
+ description: "Currently active execution seats"
29
+ })
30
+
31
+ /**
32
+ * Counts runs parked because a quota was exhausted.
33
+ *
34
+ * @category metrics
35
+ * @since 0.1.0
36
+ */
37
+ export const quotaParks = Metric.counter(`${prefix}quota_park`, {
38
+ description: "Runs parked by quota enforcement"
39
+ })
40
+
41
+ /**
42
+ * Counts agent answers refused by their declared output schema.
43
+ *
44
+ * @category metrics
45
+ * @since 1.0.0-rc.1
46
+ */
47
+ export const structuredOutputRejections = Metric.counter(`${prefix}agent_structured_output_rejections`, {
48
+ description: "Agent answers refused by their declared output schema"
49
+ })
50
+
51
+ /**
52
+ * Counts agent steps that failed after spending every output correction.
53
+ *
54
+ * @category metrics
55
+ * @since 1.0.0-rc.1
56
+ */
57
+ export const structuredOutputExhausted = Metric.counter(`${prefix}agent_structured_output_exhausted`, {
58
+ description: "Agent steps whose output corrections were exhausted"
59
+ })
60
+
61
+ /**
62
+ * Counts operational log records lost before durable delivery.
63
+ *
64
+ * Advances once per record dropped by a saturated forwarding queue, once per
65
+ * journal delivery failure, and once per defect the forwarding worker recovers
66
+ * from, so telemetry loss is distinguishable from an idle logger.
67
+ *
68
+ * @category metrics
69
+ * @since 1.0.0-rc.0
70
+ */
71
+ export const droppedLogRecords = Metric.counter(`${prefix}observability_log_dropped`, {
72
+ description: "Operational log records dropped before durable delivery"
73
+ })
74
+
75
+ /**
76
+ * All metrics declared by this package.
77
+ *
78
+ * @category registry
79
+ * @since 0.1.0
80
+ */
81
+ export const registry = {
82
+ runThroughput,
83
+ activeSeats,
84
+ quotaParks,
85
+ structuredOutputRejections,
86
+ structuredOutputExhausted,
87
+ droppedLogRecords
88
+ } as const
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Node-only OTLP/HTTP OpenTelemetry setup.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+
7
+ import * as NodeSdk from "@effect/opentelemetry/NodeSdk"
8
+ import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http"
9
+ import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"
10
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"
11
+ import { BatchLogRecordProcessor } from "@opentelemetry/sdk-logs"
12
+ import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"
13
+ import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"
14
+ import * as ConfigProvider from "effect/ConfigProvider"
15
+ import type * as Duration from "effect/Duration"
16
+ import * as Effect from "effect/Effect"
17
+ import * as Layer from "effect/Layer"
18
+ import * as Endpoint from "./Endpoint.ts"
19
+ import * as Resource from "./Resource.ts"
20
+ import type { Configuration as ResourceConfiguration } from "./Resource.ts"
21
+
22
+ /**
23
+ * Node OTLP/HTTP layer options.
24
+ *
25
+ * @category models
26
+ * @since 0.1.0
27
+ */
28
+ export interface Options {
29
+ /**
30
+ * The collector base URL. It must be an absolute `http:` or `https:` URL
31
+ * without credentials and free of spaces and control characters; anything
32
+ * else fails layer acquisition with
33
+ * {@link Endpoint.InvalidExporterEndpoint}.
34
+ */
35
+ readonly endpoint: string
36
+ readonly resource: ResourceConfiguration
37
+ readonly shutdownTimeout?: Duration.Input | undefined
38
+ readonly exportIntervalMillis?: number | undefined
39
+ }
40
+
41
+ /**
42
+ * Builds a scoped Node OTLP/HTTP layer for all three telemetry signals.
43
+ * Exporter objects are created only when this layer is built.
44
+ * Resource metadata is explicit: ambient OTEL resource configuration cannot
45
+ * enlarge it after validation. The OpenTelemetry exporters still read the
46
+ * standard `OTEL_EXPORTER_OTLP_*` transport variables (headers, timeout,
47
+ * compression, TLS files) from the process environment and send them to the
48
+ * explicit endpoint, which always wins over `OTEL_EXPORTER_OTLP_ENDPOINT`.
49
+ *
50
+ * @category layers
51
+ * @since 0.1.0
52
+ */
53
+ export const layerOtel = (
54
+ options: Options
55
+ ): Layer.Layer<never, Resource.InvalidResourceConfiguration | Endpoint.InvalidExporterEndpoint> =>
56
+ Layer.unwrap(
57
+ Effect.map(
58
+ Effect.all([Resource.decode(options.resource), Endpoint.decode(options.endpoint, "endpoint")]),
59
+ ([decoded, endpoint]) =>
60
+ NodeSdk.layer(() => {
61
+ const resource = Resource.toOpenTelemetryConfiguration(decoded)
62
+ const spanProcessor = new BatchSpanProcessor(
63
+ new OTLPTraceExporter({ url: Endpoint.signalUrl(endpoint, "traces") })
64
+ )
65
+ const logRecordProcessor = new BatchLogRecordProcessor({
66
+ exporter: new OTLPLogExporter({ url: Endpoint.signalUrl(endpoint, "logs") })
67
+ })
68
+ const metricReader = options.exportIntervalMillis === undefined
69
+ ? new PeriodicExportingMetricReader({
70
+ exporter: new OTLPMetricExporter({ url: Endpoint.signalUrl(endpoint, "metrics") })
71
+ })
72
+ : new PeriodicExportingMetricReader({
73
+ exporter: new OTLPMetricExporter({ url: Endpoint.signalUrl(endpoint, "metrics") }),
74
+ exportIntervalMillis: options.exportIntervalMillis
75
+ })
76
+ return {
77
+ resource,
78
+ spanProcessor,
79
+ logRecordProcessor,
80
+ metricReader,
81
+ shutdownTimeout: options.shutdownTimeout
82
+ }
83
+ }).pipe(
84
+ // NodeSdk merges Resource.layerFromEnv after our admission check.
85
+ // Isolate that lookup so only the validated explicit resource and
86
+ // the SDK metadata already included in its budget reach exporters.
87
+ Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({})))
88
+ )
89
+ )
90
+ )
package/src/Otel.ts ADDED
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Provider-neutral composition for injected OpenTelemetry providers.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+
7
+ import * as OtelLogger from "@effect/opentelemetry/OtelLogger"
8
+ import * as OtelMetrics from "@effect/opentelemetry/OtelMetrics"
9
+ import * as OtelTracer from "@effect/opentelemetry/OtelTracer"
10
+ import type * as Api from "@opentelemetry/api"
11
+ import type { LoggerProvider } from "@opentelemetry/sdk-logs"
12
+ import type { MetricReader } from "@opentelemetry/sdk-metrics"
13
+ import * as Effect from "effect/Effect"
14
+ import * as Layer from "effect/Layer"
15
+ import {
16
+ type Configuration as ResourceConfiguration,
17
+ type InvalidResourceConfiguration,
18
+ layer as resourceLayer,
19
+ Resource
20
+ } from "./Resource.ts"
21
+
22
+ /**
23
+ * Injected providers used by the provider-neutral OTEL layer.
24
+ *
25
+ * @category models
26
+ * @since 0.1.0
27
+ */
28
+ export interface Options {
29
+ /** Validated resource for metrics and provider factories. */
30
+ readonly resource: ResourceConfiguration
31
+ /**
32
+ * Borrowed: the layer bridges onto this provider and never flushes or shuts
33
+ * it down, including a provider a factory returns. Existing providers retain
34
+ * their resource. Factories must pass the supplied resource to the SDK.
35
+ */
36
+ readonly tracerProvider?:
37
+ | Api.TracerProvider
38
+ | ((resource: typeof Resource.Service) => Api.TracerProvider)
39
+ | undefined
40
+ /** Borrowed on the same terms as `tracerProvider`. */
41
+ readonly loggerProvider?:
42
+ | LoggerProvider
43
+ | ((resource: typeof Resource.Service) => LoggerProvider)
44
+ | undefined
45
+ /**
46
+ * Owned: the factory runs once during layer acquisition, after resource
47
+ * validation, and every reader it returns is shut down when the scope
48
+ * closes. Build the readers inside the factory rather than returning one a
49
+ * longer-lived composition still exports through, which that shutdown would
50
+ * disable. An empty array registers no reader at all.
51
+ */
52
+ readonly metricReader?: (() => MetricReader | ReadonlyArray<MetricReader>) | undefined
53
+ readonly loggerMergeWithExisting?: boolean | undefined
54
+ readonly metricTemporality?: OtelMetrics.TemporalityPreference | undefined
55
+ }
56
+
57
+ /**
58
+ * Composes Effect tracer, logger, and metric bridges from already-created
59
+ * OpenTelemetry providers or provider factories, and from metric readers this
60
+ * layer acquires. Factories run during layer acquisition after resource
61
+ * validation, and the provider factories receive the metric resource.
62
+ * Already-created providers keep the resource captured at construction; the
63
+ * resource option only sets the metric resource for them. Spans and log
64
+ * records carry the instrumentation scope `effect` with the Effect version.
65
+ * Ownership splits: callers own provider flushing and shutdown, including
66
+ * factory-built providers, while the layer scope shuts down every reader the
67
+ * `metricReader` factory returned. No exporter is allocated by this module.
68
+ *
69
+ * @category layers
70
+ * @since 0.1.0
71
+ */
72
+ export const layerOtel = (options: Options): Layer.Layer<never, InvalidResourceConfiguration> => {
73
+ const resource = resourceLayer(options.resource)
74
+ const tracerProvider = options.tracerProvider
75
+ const loggerProvider = options.loggerProvider
76
+ const tracer = tracerProvider === undefined
77
+ ? Layer.empty
78
+ : Layer.provide(
79
+ OtelTracer.layer,
80
+ Layer.effect(
81
+ OtelTracer.OtelTracerProvider,
82
+ Effect.map(
83
+ Resource,
84
+ (resource) => typeof tracerProvider === "function" ? tracerProvider(resource) : tracerProvider
85
+ )
86
+ )
87
+ )
88
+ const logger = loggerProvider === undefined
89
+ ? Layer.empty
90
+ : Layer.provide(
91
+ OtelLogger.layer({ mergeWithExisting: options.loggerMergeWithExisting }),
92
+ Layer.effect(
93
+ OtelLogger.OtelLoggerProvider,
94
+ Effect.map(
95
+ Resource,
96
+ (resource) => typeof loggerProvider === "function" ? loggerProvider(resource) : loggerProvider
97
+ )
98
+ )
99
+ )
100
+ const acquireMetricReader = options.metricReader
101
+ const metrics = acquireMetricReader === undefined
102
+ ? Layer.empty
103
+ : OtelMetrics.layer(
104
+ () => acquireMetricReader() as unknown as MetricReader | readonly [MetricReader, ...Array<MetricReader>],
105
+ {
106
+ temporality: options.metricTemporality
107
+ }
108
+ )
109
+ return Layer.mergeAll(tracer, logger, metrics).pipe(Layer.provideMerge(resource))
110
+ }
111
+
112
+ /**
113
+ * A no-op OTEL layer for callers that want an explicit optional slot.
114
+ *
115
+ * @category layers
116
+ * @since 0.1.0
117
+ */
118
+ export const layerNoop: Layer.Layer<never> = Layer.empty