@smthrs/observability 0.34.0 → 1.0.0-rc.3

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 -798
  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 -1343
  182. package/src/index.js +0 -136
  183. package/src/kindPhase.js +0 -17
  184. package/src/logging.js +0 -248
  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 -1185
  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/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,117 @@
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, tracer scope, 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 metrics and tracer instrumentation scope for them.
64
+ * Ownership splits: callers own provider flushing and shutdown, including
65
+ * factory-built providers, while the layer scope shuts down every reader the
66
+ * `metricReader` factory returned. No exporter is allocated by this module.
67
+ *
68
+ * @category layers
69
+ * @since 0.1.0
70
+ */
71
+ export const layerOtel = (options: Options): Layer.Layer<never, InvalidResourceConfiguration> => {
72
+ const resource = resourceLayer(options.resource)
73
+ const tracerProvider = options.tracerProvider
74
+ const loggerProvider = options.loggerProvider
75
+ const tracer = tracerProvider === undefined
76
+ ? Layer.empty
77
+ : Layer.provide(
78
+ OtelTracer.layer,
79
+ Layer.effect(
80
+ OtelTracer.OtelTracerProvider,
81
+ Effect.map(
82
+ Resource,
83
+ (resource) => typeof tracerProvider === "function" ? tracerProvider(resource) : tracerProvider
84
+ )
85
+ )
86
+ )
87
+ const logger = loggerProvider === undefined
88
+ ? Layer.empty
89
+ : Layer.provide(
90
+ OtelLogger.layer({ mergeWithExisting: options.loggerMergeWithExisting }),
91
+ Layer.effect(
92
+ OtelLogger.OtelLoggerProvider,
93
+ Effect.map(
94
+ Resource,
95
+ (resource) => typeof loggerProvider === "function" ? loggerProvider(resource) : loggerProvider
96
+ )
97
+ )
98
+ )
99
+ const acquireMetricReader = options.metricReader
100
+ const metrics = acquireMetricReader === undefined
101
+ ? Layer.empty
102
+ : OtelMetrics.layer(
103
+ () => acquireMetricReader() as unknown as MetricReader | readonly [MetricReader, ...Array<MetricReader>],
104
+ {
105
+ temporality: options.metricTemporality
106
+ }
107
+ )
108
+ return Layer.mergeAll(tracer, logger, metrics).pipe(Layer.provideMerge(resource))
109
+ }
110
+
111
+ /**
112
+ * A no-op OTEL layer for callers that want an explicit optional slot.
113
+ *
114
+ * @category layers
115
+ * @since 0.1.0
116
+ */
117
+ export const layerNoop: Layer.Layer<never> = Layer.empty