@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
@@ -1,212 +0,0 @@
1
- import { Effect, Metric, Option } from "effect";
2
- import { smithersMetricCatalog, toPrometheusMetricName, updateProcessMetrics } from "./metrics/index.js";
3
- /** @typedef {import("./metrics/SmithersMetricDefinition.ts").SmithersMetricDefinition} SmithersMetricDefinition */
4
- /** @typedef {{ boundary: number; count: number | bigint }} PrometheusBucket */
5
- /** @typedef {"counter" | "gauge" | "histogram" | "summary"} PrometheusMetricType */
6
- /** @typedef {{ type: PrometheusMetricType; help: string | undefined; lines: string[] }} PrometheusMetricRecord */
7
-
8
- /**
9
- * @param {string} text
10
- * @returns {string}
11
- */
12
- function escapePrometheusText(text) {
13
- return text.replace(/\\/g, "\\\\").replace(/\n/g, "\\n");
14
- }
15
- /**
16
- * @param {string} value
17
- * @returns {string}
18
- */
19
- function escapePrometheusLabelValue(value) {
20
- return escapePrometheusText(value).replace(/"/g, '\\"');
21
- }
22
- /**
23
- * @param {number | bigint} value
24
- * @returns {string}
25
- */
26
- function formatPrometheusNumber(value) {
27
- if (typeof value === "bigint") return value.toString();
28
- if (Number.isNaN(value)) return "NaN";
29
- if (value === Number.POSITIVE_INFINITY) return "+Inf";
30
- if (value === Number.NEGATIVE_INFINITY) return "-Inf";
31
- return String(value);
32
- }
33
- /**
34
- * @param {ReadonlyArray<[string, string]>} labels
35
- * @returns {string}
36
- */
37
- function formatPrometheusLabels(labels) {
38
- if (labels.length === 0) return "";
39
- return `{${labels
40
- .map(([key, value]) => `${toPrometheusMetricName(key)}="${escapePrometheusLabelValue(value)}"`)
41
- .join(",")}}`;
42
- }
43
- /**
44
- * @param {ReadonlyArray<[string, string]>} base
45
- * @param {ReadonlyArray<[string, string]>} extra
46
- * @returns {string}
47
- */
48
- function mergePrometheusLabels(base, extra) {
49
- const merged = [...base, ...extra].sort(([left], [right]) => left.localeCompare(right));
50
- return formatPrometheusLabels(merged);
51
- }
52
- /**
53
- * @param {Record<string, string> | undefined} attributes
54
- * @returns {ReadonlyArray<[string, string]>}
55
- */
56
- function metricLabels(attributes) {
57
- return Object.entries(attributes ?? {}).sort(([left], [right]) => left.localeCompare(right));
58
- }
59
- /**
60
- * @param {string | undefined} description
61
- * @returns {string | undefined}
62
- */
63
- function metricHelp(description) {
64
- return description?.trim() ? description : undefined;
65
- }
66
- /**
67
- * @param {any} metricState
68
- * @returns {PrometheusBucket[]}
69
- */
70
- function histogramBuckets(metricState) {
71
- const buckets = [];
72
- if (!metricState?.buckets || typeof metricState.buckets[Symbol.iterator] !== "function") {
73
- return buckets;
74
- }
75
- for (const [boundary, count] of metricState.buckets) {
76
- // Effect appends a +Inf boundary to every histogram; the explicit +Inf line below emits it.
77
- if (!Number.isFinite(boundary)) continue;
78
- buckets.push({ boundary, count });
79
- }
80
- return buckets.sort((left, right) => left.boundary - right.boundary);
81
- }
82
- /**
83
- * @param {SmithersMetricDefinition} definition
84
- * @returns {string[]}
85
- */
86
- function defaultPrometheusMetricLines(definition) {
87
- const labelSets =
88
- definition.defaultLabels && definition.defaultLabels.length > 0
89
- ? definition.defaultLabels.map((labels) => Object.entries(labels))
90
- : [[]];
91
- if (definition.type === "histogram") {
92
- const boundaries = (definition.boundaries ?? []).filter(Number.isFinite);
93
- return labelSets.flatMap((labelSet) => {
94
- const baseLabels = labelSet;
95
- return [
96
- ...boundaries.map(
97
- (boundary) =>
98
- `${definition.prometheusName}_bucket${mergePrometheusLabels(baseLabels, [["le", String(boundary)]])} 0`,
99
- ),
100
- `${definition.prometheusName}_bucket${mergePrometheusLabels(baseLabels, [["le", "+Inf"]])} 0`,
101
- `${definition.prometheusName}_sum${formatPrometheusLabels(baseLabels)} 0`,
102
- `${definition.prometheusName}_count${formatPrometheusLabels(baseLabels)} 0`,
103
- ];
104
- });
105
- }
106
- return labelSets.map((labelSet) => `${definition.prometheusName}${formatPrometheusLabels(labelSet)} 0`);
107
- }
108
- /**
109
- * @param {Map<string, PrometheusMetricRecord>} registry
110
- * @param {string} name
111
- * @param {PrometheusMetricType} type
112
- * @param {string | undefined} help
113
- */
114
- function registerPrometheusMetric(registry, name, type, help) {
115
- const existing = registry.get(name);
116
- if (existing) {
117
- if (!existing.help && help) {
118
- existing.help = help;
119
- }
120
- return existing;
121
- }
122
- const created = { type, help, lines: [] };
123
- registry.set(name, created);
124
- return created;
125
- }
126
- /**
127
- * @returns {string}
128
- */
129
- export function renderPrometheusMetrics() {
130
- // Snapshot process-level gauges before rendering
131
- try {
132
- Effect.runSync(updateProcessMetrics());
133
- } catch {
134
- /* non-critical */
135
- }
136
- const registry = new Map();
137
- for (const snapshot of Effect.runSync(Metric.snapshot)) {
138
- const metricState = snapshot.state;
139
- const name = toPrometheusMetricName(snapshot.id);
140
- if (!name) continue;
141
- const labels = metricLabels(snapshot.attributes);
142
- const help = metricHelp(snapshot.description);
143
- if (snapshot.type === "Counter") {
144
- const metric = registerPrometheusMetric(registry, name, "counter", help);
145
- metric.lines.push(`${name}${formatPrometheusLabels(labels)} ${formatPrometheusNumber(metricState.count)}`);
146
- continue;
147
- }
148
- if (snapshot.type === "Gauge") {
149
- const metric = registerPrometheusMetric(registry, name, "gauge", help);
150
- metric.lines.push(`${name}${formatPrometheusLabels(labels)} ${formatPrometheusNumber(metricState.value)}`);
151
- continue;
152
- }
153
- if (snapshot.type === "Histogram") {
154
- const metric = registerPrometheusMetric(registry, name, "histogram", help);
155
- for (const bucket of histogramBuckets(metricState)) {
156
- metric.lines.push(
157
- `${name}_bucket${mergePrometheusLabels(labels, [["le", String(bucket.boundary)]])} ${formatPrometheusNumber(bucket.count)}`,
158
- );
159
- }
160
- metric.lines.push(
161
- `${name}_bucket${mergePrometheusLabels(labels, [["le", "+Inf"]])} ${formatPrometheusNumber(metricState.count)}`,
162
- );
163
- metric.lines.push(`${name}_sum${formatPrometheusLabels(labels)} ${formatPrometheusNumber(metricState.sum)}`);
164
- metric.lines.push(`${name}_count${formatPrometheusLabels(labels)} ${formatPrometheusNumber(metricState.count)}`);
165
- continue;
166
- }
167
- if (snapshot.type === "Frequency") {
168
- const metric = registerPrometheusMetric(registry, name, "counter", help);
169
- for (const [key, count] of metricState.occurrences) {
170
- metric.lines.push(`${name}${mergePrometheusLabels(labels, [["key", key]])} ${formatPrometheusNumber(count)}`);
171
- }
172
- continue;
173
- }
174
- if (snapshot.type === "Summary") {
175
- const metric = registerPrometheusMetric(registry, name, "summary", help);
176
- metric.lines.push(
177
- `${name}${mergePrometheusLabels(labels, [["quantile", "min"]])} ${formatPrometheusNumber(metricState.min)}`,
178
- );
179
- for (const [quantile, value] of metricState.quantiles) {
180
- metric.lines.push(
181
- `${name}${mergePrometheusLabels(labels, [["quantile", String(quantile)]])} ${formatPrometheusNumber(Option.getOrElse(value, () => 0))}`,
182
- );
183
- }
184
- metric.lines.push(
185
- `${name}${mergePrometheusLabels(labels, [["quantile", "max"]])} ${formatPrometheusNumber(metricState.max)}`,
186
- );
187
- metric.lines.push(`${name}_sum${formatPrometheusLabels(labels)} ${formatPrometheusNumber(metricState.sum)}`);
188
- metric.lines.push(`${name}_count${formatPrometheusLabels(labels)} ${formatPrometheusNumber(metricState.count)}`);
189
- }
190
- }
191
- for (const definition of smithersMetricCatalog) {
192
- // description is the long-form HELP text; label is the required short human name.
193
- const metric = registerPrometheusMetric(
194
- registry,
195
- definition.prometheusName,
196
- definition.type,
197
- definition.description ?? definition.label,
198
- );
199
- if (metric.lines.length === 0) {
200
- metric.lines.push(...defaultPrometheusMetricLines(definition));
201
- }
202
- }
203
- const lines = [];
204
- for (const [name, metric] of [...registry.entries()].sort(([left], [right]) => left.localeCompare(right))) {
205
- if (metric.help) {
206
- lines.push(`# HELP ${name} ${escapePrometheusText(metric.help)}`);
207
- }
208
- lines.push(`# TYPE ${name} ${metric.type}`);
209
- lines.push(...metric.lines);
210
- }
211
- return lines.join("\n") + (lines.length > 0 ? "\n" : "");
212
- }
@@ -1,59 +0,0 @@
1
- import { agentTraceCapabilities } from "./agentTraceCapabilities.js";
2
- /**
3
- * @typedef {import('./agentTrace.ts').AgentFamily} AgentFamily
4
- * @typedef {import('./agentTrace.ts').AgentCaptureMode} AgentCaptureMode
5
- * @typedef {import('./agentTrace.ts').AgentTraceCapabilityProfile} AgentTraceCapabilityProfile
6
- */
7
-
8
- /**
9
- * @param {AgentFamily} agentFamily
10
- * @param {AgentCaptureMode} captureMode
11
- * @returns {AgentTraceCapabilityProfile}
12
- */
13
- export function resolveAgentTraceCapabilities(agentFamily, captureMode) {
14
- const base = {
15
- ...agentTraceCapabilities[agentFamily],
16
- // Smithers persists a canonical NDJSON trace artifact for every successful
17
- // flush regardless of the upstream agent family.
18
- persistedSessionArtifact: true,
19
- };
20
- if (captureMode === "sdk-events" || captureMode === "cli-text") {
21
- return base;
22
- }
23
- if (agentFamily === "codex") {
24
- return {
25
- ...base,
26
- assistantTextDeltas: captureMode === "cli-json-stream",
27
- toolExecutionStart: captureMode === "cli-json-stream",
28
- toolExecutionUpdate: captureMode === "cli-json-stream",
29
- toolExecutionEnd: captureMode === "cli-json-stream",
30
- };
31
- }
32
- if (agentFamily === "claude-code") {
33
- return {
34
- ...base,
35
- toolExecutionStart: captureMode === "cli-json-stream",
36
- toolExecutionUpdate: captureMode === "cli-json-stream",
37
- toolExecutionEnd: captureMode === "cli-json-stream",
38
- };
39
- }
40
- if (agentFamily === "gemini" || agentFamily === "antigravity") {
41
- return {
42
- ...base,
43
- assistantTextDeltas: captureMode === "cli-json-stream",
44
- toolExecutionStart: captureMode === "cli-json-stream",
45
- toolExecutionUpdate: captureMode === "cli-json-stream",
46
- toolExecutionEnd: captureMode === "cli-json-stream",
47
- };
48
- }
49
- if (agentFamily === "kimi") {
50
- return {
51
- ...base,
52
- assistantTextDeltas: captureMode === "cli-json-stream",
53
- toolExecutionStart: captureMode === "cli-json-stream",
54
- toolExecutionUpdate: captureMode === "cli-json-stream",
55
- toolExecutionEnd: captureMode === "cli-json-stream",
56
- };
57
- }
58
- return base;
59
- }
@@ -1,109 +0,0 @@
1
- import { LogLevel } from "effect";
2
- /** @typedef {import("./SmithersLogFormat.ts").SmithersLogFormat} SmithersLogFormat */
3
-
4
- /** @typedef {import("./ResolvedSmithersObservabilityOptions.ts").ResolvedSmithersObservabilityOptions} ResolvedSmithersObservabilityOptions */
5
- /** @typedef {import("./SmithersObservabilityOptions.ts").SmithersObservabilityOptions} SmithersObservabilityOptions */
6
-
7
- // 4318 is the OTLP/HTTP receiver port of the local collector started by
8
- // `smithers observability` (docker-compose.otel.yml).
9
- const DEFAULT_OTLP_HTTP_ENDPOINT = "http://localhost:4318";
10
-
11
- /**
12
- * @param {LogLevel.LogLevel | string | undefined} value
13
- * @returns {LogLevel.LogLevel}
14
- */
15
- function resolveLogLevel(value) {
16
- if (typeof value !== "string") {
17
- return value ?? "Info";
18
- }
19
- switch (value.toLowerCase()) {
20
- case "none":
21
- return "None";
22
- case "trace":
23
- return "Trace";
24
- case "debug":
25
- return "Debug";
26
- case "warning":
27
- case "warn":
28
- return "Warn";
29
- case "error":
30
- return "Error";
31
- case "fatal":
32
- return "Fatal";
33
- case "all":
34
- return "All";
35
- case "info":
36
- default:
37
- return "Info";
38
- }
39
- }
40
- /**
41
- * @param {string | undefined} value
42
- * @returns {SmithersLogFormat}
43
- */
44
- function resolveLogFormat(value) {
45
- switch ((value ?? "").toLowerCase()) {
46
- case "json":
47
- return "json";
48
- case "pretty":
49
- return "pretty";
50
- case "string":
51
- return "string";
52
- case "logfmt":
53
- default:
54
- return "logfmt";
55
- }
56
- }
57
- /**
58
- * @param {boolean | undefined} value
59
- * @returns {boolean}
60
- */
61
- function resolveEnabled(value) {
62
- if (typeof value === "boolean") return value;
63
- const env = (process.env.SMITHERS_OTEL_ENABLED ?? "").toLowerCase();
64
- return env === "1" || env === "true";
65
- }
66
- /**
67
- * @param {string | undefined} value
68
- * @returns {Record<string, string> | undefined}
69
- */
70
- export function parseOtlpHeaders(value) {
71
- if (!value) {
72
- return undefined;
73
- }
74
- /** @type {Record<string, string>} */
75
- const headers = {};
76
- for (const entry of value.split(",")) {
77
- const separator = entry.indexOf("=");
78
- if (separator === -1) {
79
- continue;
80
- }
81
- const key = entry.slice(0, separator).trim();
82
- if (!key) {
83
- continue;
84
- }
85
- try {
86
- headers[key] = decodeURIComponent(entry.slice(separator + 1).trim());
87
- } catch {
88
- continue;
89
- }
90
- }
91
- return Object.keys(headers).length > 0 ? headers : undefined;
92
- }
93
- /**
94
- * @param {SmithersObservabilityOptions} [options]
95
- * @returns {ResolvedSmithersObservabilityOptions}
96
- */
97
- export function resolveSmithersObservabilityOptions(options = {}) {
98
- return {
99
- enabled: resolveEnabled(options.enabled),
100
- endpoint: options.endpoint ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? DEFAULT_OTLP_HTTP_ENDPOINT,
101
- headers: options.headers ?? parseOtlpHeaders(process.env.OTEL_EXPORTER_OTLP_HEADERS),
102
- serviceName: options.serviceName ?? process.env.OTEL_SERVICE_NAME ?? "smithers",
103
- logFormat: options.logFormat
104
- ? resolveLogFormat(options.logFormat)
105
- : resolveLogFormat(process.env.SMITHERS_LOG_FORMAT),
106
- logLevel: resolveLogLevel(options.logLevel ?? process.env.SMITHERS_LOG_LEVEL),
107
- installLogger: options.installLogger !== false,
108
- };
109
- }
@@ -1,2 +0,0 @@
1
- import { smithersMetricCatalog } from "./metrics/index.js";
2
- export const smithersMetrics = Object.fromEntries(smithersMetricCatalog.map((metric) => [metric.key, metric.metric]));
@@ -1,6 +0,0 @@
1
- export const smithersSpanNames = {
2
- run: "smithers.run",
3
- task: "smithers.task",
4
- agent: "smithers.agent",
5
- tool: "smithers.tool",
6
- };
@@ -1,32 +0,0 @@
1
- /**
2
- * @typedef {import('./agentTrace.ts').AgentTraceCapabilityProfile} AgentTraceCapabilityProfile
3
- * @typedef {import('./agentTrace.ts').CanonicalAgentTraceEventKind} CanonicalAgentTraceEventKind
4
- */
5
-
6
- /** @type {Array<[keyof AgentTraceCapabilityProfile, CanonicalAgentTraceEventKind[]]>} */
7
- const capabilityKindMap = [
8
- ["sessionMetadata", ["session.start", "session.end"]],
9
- ["assistantTextDeltas", ["assistant.text.delta"]],
10
- ["visibleThinkingDeltas", ["assistant.thinking.delta"]],
11
- ["finalAssistantMessage", ["assistant.message.final"]],
12
- ["toolExecutionStart", ["tool.execution.start"]],
13
- ["toolExecutionUpdate", ["tool.execution.update"]],
14
- ["toolExecutionEnd", ["tool.execution.end", "tool.result"]],
15
- ["retryEvents", ["retry.start", "retry.end"]],
16
- ["compactionEvents", ["compaction.start", "compaction.end"]],
17
- ["rawStderrDiagnostics", ["stderr"]],
18
- ["persistedSessionArtifact", ["artifact.created"]],
19
- ];
20
-
21
- /**
22
- * @param {AgentTraceCapabilityProfile} profile
23
- * @returns {CanonicalAgentTraceEventKind[]}
24
- */
25
- export function unsupportedKindsForCapabilities(profile) {
26
- /** @type {CanonicalAgentTraceEventKind[]} */
27
- const kinds = [];
28
- for (const [field, mappedKinds] of capabilityKindMap) {
29
- if (!profile[field]) kinds.push(...mappedKinds);
30
- }
31
- return kinds;
32
- }
@@ -1,17 +0,0 @@
1
- import { TracingService, withSmithersSpan as withCoreSmithersSpan } from "./_coreTracing.js";
2
- import { Effect } from "effect";
3
- /**
4
- * @template A, E, R
5
- * @param {string} name
6
- * @param {Effect.Effect<A, E, R>} effect
7
- * @param {Readonly<Record<string, unknown>>} [attributes]
8
- * @param {Omit<import("effect/Tracer").SpanOptions, "attributes" | "kind"> & { readonly kind?: import("effect/Tracer").SpanKind; }} [_options]
9
- * @returns {Effect.Effect<A, E, Exclude<R, import("effect/Tracer").ParentSpan>>}
10
- */
11
- export function withSmithersSpan(name, effect, attributes, _options) {
12
- return Effect.flatMap(Effect.serviceOption(TracingService), (service) =>
13
- service._tag === "Some"
14
- ? service.value.withSpan(name, effect, attributes ? { ...attributes } : undefined)
15
- : withCoreSmithersSpan(name, effect, attributes),
16
- );
17
- }
package/tempo/tempo.yml DELETED
@@ -1,17 +0,0 @@
1
- server:
2
- http_listen_port: 3200
3
-
4
- distributor:
5
- receivers:
6
- otlp:
7
- protocols:
8
- grpc:
9
- endpoint: "0.0.0.0:4317"
10
-
11
- storage:
12
- trace:
13
- backend: local
14
- local:
15
- path: /tmp/tempo/blocks
16
- wal:
17
- path: /tmp/tempo/wal