@livestore/utils 0.0.0

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 (322) hide show
  1. package/dist/.tsbuildinfo.json +1 -0
  2. package/dist/Deferred.d.ts +10 -0
  3. package/dist/Deferred.d.ts.map +1 -0
  4. package/dist/Deferred.js +18 -0
  5. package/dist/Deferred.js.map +1 -0
  6. package/dist/NoopTracer.d.ts +9 -0
  7. package/dist/NoopTracer.d.ts.map +1 -0
  8. package/dist/NoopTracer.js +54 -0
  9. package/dist/NoopTracer.js.map +1 -0
  10. package/dist/base64.d.ts +12 -0
  11. package/dist/base64.d.ts.map +1 -0
  12. package/dist/base64.js +114 -0
  13. package/dist/base64.js.map +1 -0
  14. package/dist/binary.d.ts +4 -0
  15. package/dist/binary.d.ts.map +1 -0
  16. package/dist/binary.js +23 -0
  17. package/dist/binary.js.map +1 -0
  18. package/dist/browser.d.ts +3 -0
  19. package/dist/browser.d.ts.map +1 -0
  20. package/dist/browser.js +28 -0
  21. package/dist/browser.js.map +1 -0
  22. package/dist/effect/Debounce.d.ts +5 -0
  23. package/dist/effect/Debounce.d.ts.map +1 -0
  24. package/dist/effect/Debounce.js +33 -0
  25. package/dist/effect/Debounce.js.map +1 -0
  26. package/dist/effect/Effect.d.ts +7 -0
  27. package/dist/effect/Effect.d.ts.map +1 -0
  28. package/dist/effect/Effect.js +17 -0
  29. package/dist/effect/Effect.js.map +1 -0
  30. package/dist/effect/EndableQueue.d.ts +11 -0
  31. package/dist/effect/EndableQueue.d.ts.map +1 -0
  32. package/dist/effect/EndableQueue.js +22 -0
  33. package/dist/effect/EndableQueue.js.map +1 -0
  34. package/dist/effect/EnvVar.d.ts +16 -0
  35. package/dist/effect/EnvVar.d.ts.map +1 -0
  36. package/dist/effect/EnvVar.js +21 -0
  37. package/dist/effect/EnvVar.js.map +1 -0
  38. package/dist/effect/Error.d.ts +12 -0
  39. package/dist/effect/Error.d.ts.map +1 -0
  40. package/dist/effect/Error.js +13 -0
  41. package/dist/effect/Error.js.map +1 -0
  42. package/dist/effect/Gate.d.ts +14 -0
  43. package/dist/effect/Gate.d.ts.map +1 -0
  44. package/dist/effect/Gate.js +17 -0
  45. package/dist/effect/Gate.js.map +1 -0
  46. package/dist/effect/Layer.d.ts +6 -0
  47. package/dist/effect/Layer.d.ts.map +1 -0
  48. package/dist/effect/Layer.js +11 -0
  49. package/dist/effect/Layer.js.map +1 -0
  50. package/dist/effect/Otel/Dummy.d.ts +5 -0
  51. package/dist/effect/Otel/Dummy.d.ts.map +1 -0
  52. package/dist/effect/Otel/Dummy.js +22 -0
  53. package/dist/effect/Otel/Dummy.js.map +1 -0
  54. package/dist/effect/Otel/Meter.d.ts +20 -0
  55. package/dist/effect/Otel/Meter.d.ts.map +1 -0
  56. package/dist/effect/Otel/Meter.js +76 -0
  57. package/dist/effect/Otel/Meter.js.map +1 -0
  58. package/dist/effect/Otel/OtlpGrpc.d.ts +6 -0
  59. package/dist/effect/Otel/OtlpGrpc.d.ts.map +1 -0
  60. package/dist/effect/Otel/OtlpGrpc.js +42 -0
  61. package/dist/effect/Otel/OtlpGrpc.js.map +1 -0
  62. package/dist/effect/Otel/OtlpHttp.d.ts +6 -0
  63. package/dist/effect/Otel/OtlpHttp.d.ts.map +1 -0
  64. package/dist/effect/Otel/OtlpHttp.js +42 -0
  65. package/dist/effect/Otel/OtlpHttp.js.map +1 -0
  66. package/dist/effect/Otel/OtlpWebsocket.d.ts +6 -0
  67. package/dist/effect/Otel/OtlpWebsocket.d.ts.map +1 -0
  68. package/dist/effect/Otel/OtlpWebsocket.js +42 -0
  69. package/dist/effect/Otel/OtlpWebsocket.js.map +1 -0
  70. package/dist/effect/Otel/Span.d.ts +32 -0
  71. package/dist/effect/Otel/Span.d.ts.map +1 -0
  72. package/dist/effect/Otel/Span.js +97 -0
  73. package/dist/effect/Otel/Span.js.map +1 -0
  74. package/dist/effect/Otel/Tracer.d.ts +15 -0
  75. package/dist/effect/Otel/Tracer.d.ts.map +1 -0
  76. package/dist/effect/Otel/Tracer.js +17 -0
  77. package/dist/effect/Otel/Tracer.js.map +1 -0
  78. package/dist/effect/Otel/index.d.ts +8 -0
  79. package/dist/effect/Otel/index.d.ts.map +1 -0
  80. package/dist/effect/Otel/index.js +9 -0
  81. package/dist/effect/Otel/index.js.map +1 -0
  82. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.d.ts +14 -0
  83. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.d.ts.map +1 -0
  84. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.js +15 -0
  85. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.js.map +1 -0
  86. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.d.ts +14 -0
  87. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.d.ts.map +1 -0
  88. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.js +15 -0
  89. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.js.map +1 -0
  90. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.d.ts +19 -0
  91. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.d.ts.map +1 -0
  92. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.js +17 -0
  93. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.js.map +1 -0
  94. package/dist/effect/Otel/lib-metrics/MetricsProvider.d.ts +10 -0
  95. package/dist/effect/Otel/lib-metrics/MetricsProvider.d.ts.map +1 -0
  96. package/dist/effect/Otel/lib-metrics/MetricsProvider.js +4 -0
  97. package/dist/effect/Otel/lib-metrics/MetricsProvider.js.map +1 -0
  98. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.d.ts +16 -0
  99. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.d.ts.map +1 -0
  100. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.js +39 -0
  101. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.js.map +1 -0
  102. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.d.ts +16 -0
  103. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.d.ts.map +1 -0
  104. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.js +39 -0
  105. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.js.map +1 -0
  106. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.d.ts +16 -0
  107. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.d.ts.map +1 -0
  108. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.js +39 -0
  109. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.js.map +1 -0
  110. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.d.ts +17 -0
  111. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.d.ts.map +1 -0
  112. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.js +27 -0
  113. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.js.map +1 -0
  114. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.d.ts +18 -0
  115. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.d.ts.map +1 -0
  116. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.js +31 -0
  117. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.js.map +1 -0
  118. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.d.ts +19 -0
  119. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.d.ts.map +1 -0
  120. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.js +36 -0
  121. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.js.map +1 -0
  122. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.d.ts +19 -0
  123. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.d.ts.map +1 -0
  124. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.js +36 -0
  125. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.js.map +1 -0
  126. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.d.ts +9 -0
  127. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.d.ts.map +1 -0
  128. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.js +29 -0
  129. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.js.map +1 -0
  130. package/dist/effect/Otel/lib-tracer/SimpleProcessor.d.ts +19 -0
  131. package/dist/effect/Otel/lib-tracer/SimpleProcessor.d.ts.map +1 -0
  132. package/dist/effect/Otel/lib-tracer/SimpleProcessor.js +25 -0
  133. package/dist/effect/Otel/lib-tracer/SimpleProcessor.js.map +1 -0
  134. package/dist/effect/Otel/lib-tracer/TracerProvider.d.ts +10 -0
  135. package/dist/effect/Otel/lib-tracer/TracerProvider.d.ts.map +1 -0
  136. package/dist/effect/Otel/lib-tracer/TracerProvider.js +7 -0
  137. package/dist/effect/Otel/lib-tracer/TracerProvider.js.map +1 -0
  138. package/dist/effect/Otel/lib-tracer/WebProvider.d.ts +18 -0
  139. package/dist/effect/Otel/lib-tracer/WebProvider.d.ts.map +1 -0
  140. package/dist/effect/Otel/lib-tracer/WebProvider.js +25 -0
  141. package/dist/effect/Otel/lib-tracer/WebProvider.js.map +1 -0
  142. package/dist/effect/ReadonlyArray.d.ts +4 -0
  143. package/dist/effect/ReadonlyArray.d.ts.map +1 -0
  144. package/dist/effect/ReadonlyArray.js +11 -0
  145. package/dist/effect/ReadonlyArray.js.map +1 -0
  146. package/dist/effect/RequestResolver.d.ts +11 -0
  147. package/dist/effect/RequestResolver.d.ts.map +1 -0
  148. package/dist/effect/RequestResolver.js +18 -0
  149. package/dist/effect/RequestResolver.js.map +1 -0
  150. package/dist/effect/STM.d.ts +3 -0
  151. package/dist/effect/STM.d.ts.map +1 -0
  152. package/dist/effect/STM.js +3 -0
  153. package/dist/effect/STM.js.map +1 -0
  154. package/dist/effect/Schedule.d.ts +5 -0
  155. package/dist/effect/Schedule.d.ts.map +1 -0
  156. package/dist/effect/Schedule.js +7 -0
  157. package/dist/effect/Schedule.js.map +1 -0
  158. package/dist/effect/Scheduler.d.ts +49 -0
  159. package/dist/effect/Scheduler.d.ts.map +1 -0
  160. package/dist/effect/Scheduler.js +168 -0
  161. package/dist/effect/Scheduler.js.map +1 -0
  162. package/dist/effect/Schema/SchemaHash.d.ts +3 -0
  163. package/dist/effect/Schema/SchemaHash.d.ts.map +1 -0
  164. package/dist/effect/Schema/SchemaHash.js +15 -0
  165. package/dist/effect/Schema/SchemaHash.js.map +1 -0
  166. package/dist/effect/Schema/SchemaHash.test.d.ts +2 -0
  167. package/dist/effect/Schema/SchemaHash.test.d.ts.map +1 -0
  168. package/dist/effect/Schema/SchemaHash.test.js +13 -0
  169. package/dist/effect/Schema/SchemaHash.test.js.map +1 -0
  170. package/dist/effect/Schema/SchemaJsonWrapper.d.ts +11 -0
  171. package/dist/effect/Schema/SchemaJsonWrapper.d.ts.map +1 -0
  172. package/dist/effect/Schema/SchemaJsonWrapper.js +38 -0
  173. package/dist/effect/Schema/SchemaJsonWrapper.js.map +1 -0
  174. package/dist/effect/Schema/SchemaJsonWrapper.test.d.ts +2 -0
  175. package/dist/effect/Schema/SchemaJsonWrapper.test.d.ts.map +1 -0
  176. package/dist/effect/Schema/SchemaJsonWrapper.test.js +42 -0
  177. package/dist/effect/Schema/SchemaJsonWrapper.test.js.map +1 -0
  178. package/dist/effect/Schema/index.d.ts +15 -0
  179. package/dist/effect/Schema/index.d.ts.map +1 -0
  180. package/dist/effect/Schema/index.js +14 -0
  181. package/dist/effect/Schema/index.js.map +1 -0
  182. package/dist/effect/ServiceContext.d.ts +39 -0
  183. package/dist/effect/ServiceContext.d.ts.map +1 -0
  184. package/dist/effect/ServiceContext.js +61 -0
  185. package/dist/effect/ServiceContext.js.map +1 -0
  186. package/dist/effect/SmartQueue.d.ts +38 -0
  187. package/dist/effect/SmartQueue.d.ts.map +1 -0
  188. package/dist/effect/SmartQueue.js +123 -0
  189. package/dist/effect/SmartQueue.js.map +1 -0
  190. package/dist/effect/Stream/chainSwitch.d.ts +3 -0
  191. package/dist/effect/Stream/chainSwitch.d.ts.map +1 -0
  192. package/dist/effect/Stream/chainSwitch.js +48 -0
  193. package/dist/effect/Stream/chainSwitch.js.map +1 -0
  194. package/dist/effect/Stream/index.d.ts +37 -0
  195. package/dist/effect/Stream/index.d.ts.map +1 -0
  196. package/dist/effect/Stream/index.js +82 -0
  197. package/dist/effect/Stream/index.js.map +1 -0
  198. package/dist/effect/SubscriptionRef.d.ts +10 -0
  199. package/dist/effect/SubscriptionRef.d.ts.map +1 -0
  200. package/dist/effect/SubscriptionRef.js +8 -0
  201. package/dist/effect/SubscriptionRef.js.map +1 -0
  202. package/dist/effect/TimeoutGate.d.ts +13 -0
  203. package/dist/effect/TimeoutGate.d.ts.map +1 -0
  204. package/dist/effect/TimeoutGate.js +41 -0
  205. package/dist/effect/TimeoutGate.js.map +1 -0
  206. package/dist/effect/WebCrypto.d.ts +18 -0
  207. package/dist/effect/WebCrypto.d.ts.map +1 -0
  208. package/dist/effect/WebCrypto.js +56 -0
  209. package/dist/effect/WebCrypto.js.map +1 -0
  210. package/dist/effect/WebLock.d.ts +5 -0
  211. package/dist/effect/WebLock.d.ts.map +1 -0
  212. package/dist/effect/WebLock.js +20 -0
  213. package/dist/effect/WebLock.js.map +1 -0
  214. package/dist/effect/browser.d.ts +19 -0
  215. package/dist/effect/browser.d.ts.map +1 -0
  216. package/dist/effect/browser.js +82 -0
  217. package/dist/effect/browser.js.map +1 -0
  218. package/dist/effect/fetch.d.ts +89 -0
  219. package/dist/effect/fetch.d.ts.map +1 -0
  220. package/dist/effect/fetch.js +142 -0
  221. package/dist/effect/fetch.js.map +1 -0
  222. package/dist/effect/index.d.ts +50 -0
  223. package/dist/effect/index.d.ts.map +1 -0
  224. package/dist/effect/index.js +58 -0
  225. package/dist/effect/index.js.map +1 -0
  226. package/dist/global.d.ts +5 -0
  227. package/dist/global.d.ts.map +1 -0
  228. package/dist/global.js +2 -0
  229. package/dist/global.js.map +1 -0
  230. package/dist/guards.d.ts +6 -0
  231. package/dist/guards.d.ts.map +1 -0
  232. package/dist/guards.js +6 -0
  233. package/dist/guards.js.map +1 -0
  234. package/dist/index.d.ts +69 -0
  235. package/dist/index.d.ts.map +1 -0
  236. package/dist/index.js +162 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/object/index.d.ts +10 -0
  239. package/dist/object/index.d.ts.map +1 -0
  240. package/dist/object/index.js +10 -0
  241. package/dist/object/index.js.map +1 -0
  242. package/dist/object/omit.d.ts +3 -0
  243. package/dist/object/omit.d.ts.map +1 -0
  244. package/dist/object/omit.js +14 -0
  245. package/dist/object/omit.js.map +1 -0
  246. package/dist/object/pick.d.ts +14 -0
  247. package/dist/object/pick.d.ts.map +1 -0
  248. package/dist/object/pick.js +17 -0
  249. package/dist/object/pick.js.map +1 -0
  250. package/dist/promise.d.ts +6 -0
  251. package/dist/promise.d.ts.map +1 -0
  252. package/dist/promise.js +27 -0
  253. package/dist/promise.js.map +1 -0
  254. package/dist/set.d.ts +2 -0
  255. package/dist/set.d.ts.map +1 -0
  256. package/dist/set.js +10 -0
  257. package/dist/set.js.map +1 -0
  258. package/dist/single-item.d.ts +8 -0
  259. package/dist/single-item.d.ts.map +1 -0
  260. package/dist/single-item.js +9 -0
  261. package/dist/single-item.js.map +1 -0
  262. package/dist/string.d.ts +3 -0
  263. package/dist/string.d.ts.map +1 -0
  264. package/dist/string.js +3 -0
  265. package/dist/string.js.map +1 -0
  266. package/dist/time.d.ts +12 -0
  267. package/dist/time.d.ts.map +1 -0
  268. package/dist/time.js +22 -0
  269. package/dist/time.js.map +1 -0
  270. package/dist/types/index.d.ts +2 -0
  271. package/dist/types/index.d.ts.map +1 -0
  272. package/dist/types/index.js +2 -0
  273. package/dist/types/index.js.map +1 -0
  274. package/dist/types/json.d.ts +27 -0
  275. package/dist/types/json.d.ts.map +1 -0
  276. package/dist/types/json.js +2 -0
  277. package/dist/types/json.js.map +1 -0
  278. package/package.json +58 -0
  279. package/src/Deferred.ts +24 -0
  280. package/src/NoopTracer.ts +75 -0
  281. package/src/base64.ts +118 -0
  282. package/src/browser.ts +32 -0
  283. package/src/effect/Effect.ts +27 -0
  284. package/src/effect/Error.ts +12 -0
  285. package/src/effect/Otel/Dummy.ts +32 -0
  286. package/src/effect/Otel/Meter.ts +145 -0
  287. package/src/effect/Otel/OtlpGrpc.ts +75 -0
  288. package/src/effect/Otel/OtlpHttp.ts +75 -0
  289. package/src/effect/Otel/OtlpWebsocket.ts +75 -0
  290. package/src/effect/Otel/Span.ts +222 -0
  291. package/src/effect/Otel/Tracer.ts +30 -0
  292. package/src/effect/Otel/index.ts +8 -0
  293. package/src/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.ts +39 -0
  294. package/src/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.ts +39 -0
  295. package/src/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.ts +47 -0
  296. package/src/effect/Otel/lib-metrics/MetricsProvider.ts +12 -0
  297. package/src/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.ts +77 -0
  298. package/src/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.ts +77 -0
  299. package/src/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.ts +80 -0
  300. package/src/effect/Otel/lib-metrics/PeriodicMetricsProvider.ts +55 -0
  301. package/src/effect/Otel/lib-tracer/BatchSpanProcessor.ts +58 -0
  302. package/src/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.ts +64 -0
  303. package/src/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.ts +64 -0
  304. package/src/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.ts +38 -0
  305. package/src/effect/Otel/lib-tracer/README.md +1 -0
  306. package/src/effect/Otel/lib-tracer/SimpleProcessor.ts +46 -0
  307. package/src/effect/Otel/lib-tracer/TracerProvider.ts +16 -0
  308. package/src/effect/Otel/lib-tracer/WebProvider.ts +48 -0
  309. package/src/effect/Schedule.ts +12 -0
  310. package/src/effect/ServiceContext.ts +116 -0
  311. package/src/effect/index.ts +65 -0
  312. package/src/global.ts +5 -0
  313. package/src/guards.ts +8 -0
  314. package/src/index.ts +217 -0
  315. package/src/object/index.ts +24 -0
  316. package/src/object/omit.ts +17 -0
  317. package/src/object/pick.ts +27 -0
  318. package/src/promise.ts +43 -0
  319. package/src/set.ts +10 -0
  320. package/src/string.ts +2 -0
  321. package/src/time.ts +25 -0
  322. package/tsconfig.json +13 -0
@@ -0,0 +1,39 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { pipe } from '@effect/data/Function'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Layer from '@effect/io/Layer'
5
+ import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
6
+ import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'
7
+
8
+ import { PeriodicMetricsProvider } from './PeriodicMetricsProvider.js'
9
+
10
+ export interface OTLPMetricExporterConfig {
11
+ readonly _: unique symbol
12
+ }
13
+
14
+ export const OTLPMetricExporterConfig = Context.Tag<OTLPMetricExporterConfig, OTLPExporterNodeConfigBase>(
15
+ 'otel-metric-exporter-config',
16
+ )
17
+
18
+ export const makeOTLPMetricExporterConfigLayer = (config: OTLPExporterNodeConfigBase) =>
19
+ Layer.succeed(OTLPMetricExporterConfig, config)
20
+
21
+ export const makeMetricExporter = Effect.gen(function* (_) {
22
+ const config = yield* _(OTLPMetricExporterConfig)
23
+
24
+ const metricExporter = yield* _(
25
+ pipe(
26
+ Effect.sync(() => new OTLPMetricExporter(config)),
27
+ Effect.acquireRelease((p) =>
28
+ pipe(
29
+ Effect.tryPromise(() => p.shutdown()),
30
+ Effect.orDie,
31
+ ),
32
+ ),
33
+ ),
34
+ )
35
+
36
+ return metricExporter
37
+ })
38
+
39
+ export const LivePeriodicMetricsProvider = PeriodicMetricsProvider(makeMetricExporter)
@@ -0,0 +1,47 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { pipe } from '@effect/data/Function'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Layer from '@effect/io/Layer'
5
+ import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'
6
+ import { WebsocketMetricExporter } from 'otel-websocket-exporter'
7
+
8
+ import { PeriodicMetricsProvider } from './PeriodicMetricsProvider.js'
9
+
10
+ export const OTLPMetricExporterConfigSymbol = Symbol.for('otel-metric-exporter-config')
11
+ type OTLPMetricExporterConfigSymbol = typeof OTLPMetricExporterConfigSymbol
12
+
13
+ export interface OTLPMetricExporterConfig {
14
+ readonly [OTLPMetricExporterConfigSymbol]: OTLPMetricExporterConfigSymbol
15
+ readonly config: OTLPExporterNodeConfigBase
16
+ }
17
+
18
+ export const OTLPMetricExporterConfig = Context.Tag<OTLPMetricExporterConfig>(OTLPMetricExporterConfigSymbol)
19
+
20
+ export const makeOTLPMetricExporterConfigLayer = (config: OTLPExporterNodeConfigBase) =>
21
+ Layer.succeed(OTLPMetricExporterConfig, { [OTLPMetricExporterConfigSymbol]: OTLPMetricExporterConfigSymbol, config })
22
+
23
+ export const makeOTLPMetricExporterConfigLayerM = <R, E>(configEff: Effect.Effect<R, E, OTLPExporterNodeConfigBase>) =>
24
+ Layer.effect(
25
+ OTLPMetricExporterConfig,
26
+ Effect.map(
27
+ configEff,
28
+ (config) => ({ [OTLPMetricExporterConfigSymbol]: OTLPMetricExporterConfigSymbol, config }) as const,
29
+ ),
30
+ )
31
+
32
+ export const makeMetricExporter = Effect.gen(function* (_) {
33
+ const { config } = yield* _(OTLPMetricExporterConfig)
34
+
35
+ const metricExporter = yield* _(
36
+ Effect.acquireRelease(Effect.succeed(new WebsocketMetricExporter(config)), (p) =>
37
+ pipe(
38
+ Effect.tryPromise(() => p.shutdown()),
39
+ Effect.orDie,
40
+ ),
41
+ ),
42
+ )
43
+
44
+ return metricExporter
45
+ })
46
+
47
+ export const LivePeriodicMetricsProvider = PeriodicMetricsProvider(makeMetricExporter)
@@ -0,0 +1,12 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import type { MeterProvider } from '@opentelemetry/sdk-metrics'
3
+
4
+ export const MeterProviderSymbol = Symbol.for('effect-otel/MetricsProvider')
5
+ export type MeterProviderSymbol = typeof MeterProviderSymbol
6
+
7
+ export interface MetricsProvider {
8
+ readonly [MeterProviderSymbol]: MeterProviderSymbol
9
+ readonly metricsProvider: MeterProvider
10
+ }
11
+
12
+ export const MetricsProvider = Context.Tag<MetricsProvider>(MeterProviderSymbol)
@@ -0,0 +1,77 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity, pipe } from '@effect/data/Function'
3
+ import * as Option from '@effect/data/Option'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Layer from '@effect/io/Layer'
6
+ import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'
7
+ import type { MeterProviderOptions } from '@opentelemetry/sdk-metrics'
8
+ import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
9
+
10
+ import { OTLPMetricExporterConfig } from './ExporterMetricsOltpGrpc.js'
11
+ import { MeterProviderSymbol, MetricsProvider } from './MetricsProvider.js'
12
+
13
+ export const OTLPMetricsProviderConfigSymbol = Symbol.for('effect-otel/OTLPMetricsProviderConfig')
14
+
15
+ export interface OTLPMetricsProviderConfig {
16
+ readonly options: MeterProviderOptions
17
+ }
18
+
19
+ export const OTLPMetricsProviderConfig = Context.Tag<OTLPMetricsProviderConfig>(OTLPMetricsProviderConfigSymbol)
20
+
21
+ export const LiveOTLPMetricsProviderConfig = (options: MeterProviderOptions) =>
22
+ Layer.succeed(OTLPMetricsProviderConfig, { options })
23
+
24
+ export const makeOTLPMetricsProvider = Effect.gen(function* ($) {
25
+ const ctx = yield* $(Effect.context<never>())
26
+
27
+ const options = pipe(
28
+ Context.getOption(ctx, OTLPMetricsProviderConfig),
29
+ Option.map((_) => _.options),
30
+ Option.getOrUndefined,
31
+ )
32
+
33
+ const metricsProvider = yield* $(Effect.sync(() => new MeterProvider(options)))
34
+
35
+ // TODO remove below
36
+
37
+ // const metricsExporter = yield* _(exporter)
38
+ const config = yield* $(OTLPMetricExporterConfig)
39
+
40
+ const metricExporter = yield* $(
41
+ Effect.sync(() => new OTLPMetricExporter(config)),
42
+ // TODO re-enable
43
+ Effect.acquireRelease((_p) =>
44
+ pipe(
45
+ // Effect.tryPromise(() => p.shutdown()),
46
+ Effect.unit, // TODO without this I'm seeing a "`config` of undefined" bug
47
+ Effect.orDie,
48
+ ),
49
+ ),
50
+ )
51
+
52
+ const metricReader = yield* $(
53
+ Effect.sync(
54
+ () =>
55
+ new PeriodicExportingMetricReader({
56
+ exporter: metricExporter,
57
+ exportIntervalMillis: 1000, // TODO make configurable
58
+ }),
59
+ ),
60
+ )
61
+
62
+ yield* $(Effect.sync(() => metricsProvider.addMetricReader(metricReader)))
63
+
64
+ // TODO remove above
65
+
66
+ return identity<MetricsProvider>({
67
+ [MeterProviderSymbol]: MeterProviderSymbol,
68
+ metricsProvider,
69
+ })
70
+ })
71
+
72
+ export const OTLPMetricsProviderLayer = Layer.scoped(MetricsProvider, makeOTLPMetricsProvider)
73
+
74
+ export const OTLPMetricsProvider = (
75
+ config?: MeterProviderOptions,
76
+ ): Layer.Layer<OTLPMetricExporterConfig, never, MetricsProvider> =>
77
+ config ? Layer.provide(LiveOTLPMetricsProviderConfig(config), OTLPMetricsProviderLayer) : OTLPMetricsProviderLayer
@@ -0,0 +1,77 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity, pipe } from '@effect/data/Function'
3
+ import * as Option from '@effect/data/Option'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Layer from '@effect/io/Layer'
6
+ import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
7
+ import type { MeterProviderOptions } from '@opentelemetry/sdk-metrics'
8
+ import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
9
+
10
+ import { OTLPMetricExporterConfig } from './ExporterMetricsOltpHttp.js'
11
+ import { MeterProviderSymbol, MetricsProvider } from './MetricsProvider.js'
12
+
13
+ export const OTLPMetricsProviderConfigSymbol = Symbol.for('effect-otel/OTLPMetricsProviderConfig')
14
+
15
+ export interface OTLPMetricsProviderConfig {
16
+ readonly options: MeterProviderOptions
17
+ }
18
+
19
+ export const OTLPMetricsProviderConfig = Context.Tag<OTLPMetricsProviderConfig>(OTLPMetricsProviderConfigSymbol)
20
+
21
+ export const LiveOTLPMetricsProviderConfig = (options: MeterProviderOptions) =>
22
+ Layer.succeed(OTLPMetricsProviderConfig, { options })
23
+
24
+ export const makeOTLPMetricsProvider = Effect.gen(function* ($) {
25
+ const ctx = yield* $(Effect.context<never>())
26
+
27
+ const options = pipe(
28
+ Context.getOption(ctx, OTLPMetricsProviderConfig),
29
+ Option.map((_) => _.options),
30
+ Option.getOrUndefined,
31
+ )
32
+
33
+ const metricsProvider = yield* $(Effect.sync(() => new MeterProvider(options)))
34
+
35
+ // TODO remove below
36
+
37
+ // const metricsExporter = yield* _(exporter)
38
+ const config = yield* $(OTLPMetricExporterConfig)
39
+
40
+ const metricExporter = yield* $(
41
+ Effect.sync(() => new OTLPMetricExporter(config)),
42
+ // TODO re-enable
43
+ Effect.acquireRelease((_p) =>
44
+ pipe(
45
+ // Effect.tryPromise(() => p.shutdown()),
46
+ Effect.unit, // TODO without this I'm seeing a "`config` of undefined" bug
47
+ Effect.orDie,
48
+ ),
49
+ ),
50
+ )
51
+
52
+ const metricReader = yield* $(
53
+ Effect.sync(
54
+ () =>
55
+ new PeriodicExportingMetricReader({
56
+ exporter: metricExporter,
57
+ exportIntervalMillis: 1000, // TODO make configurable
58
+ }),
59
+ ),
60
+ )
61
+
62
+ yield* $(Effect.sync(() => metricsProvider.addMetricReader(metricReader)))
63
+
64
+ // TODO remove above
65
+
66
+ return identity<MetricsProvider>({
67
+ [MeterProviderSymbol]: MeterProviderSymbol,
68
+ metricsProvider,
69
+ })
70
+ })
71
+
72
+ export const OTLPMetricsProviderLayer = Layer.scoped(MetricsProvider, makeOTLPMetricsProvider)
73
+
74
+ export const OTLPMetricsProvider = (
75
+ config?: MeterProviderOptions,
76
+ ): Layer.Layer<OTLPMetricExporterConfig, never, MetricsProvider> =>
77
+ config ? Layer.provide(LiveOTLPMetricsProviderConfig(config), OTLPMetricsProviderLayer) : OTLPMetricsProviderLayer
@@ -0,0 +1,80 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity, pipe } from '@effect/data/Function'
3
+ import * as Option from '@effect/data/Option'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Layer from '@effect/io/Layer'
6
+ // import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
7
+ import type { MeterProviderOptions } from '@opentelemetry/sdk-metrics'
8
+ import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
9
+ import { WebsocketMetricExporter } from 'otel-websocket-exporter'
10
+
11
+ import { OTLPMetricExporterConfig } from './ExporterMetricsOltpWebsocket.js'
12
+ import { MeterProviderSymbol, MetricsProvider } from './MetricsProvider.js'
13
+
14
+ export const OTLPMetricsProviderConfigSymbol = Symbol.for('effect-otel/OTLPMetricsProviderConfig')
15
+
16
+ export interface OTLPMetricsProviderConfig {
17
+ readonly options: MeterProviderOptions
18
+ }
19
+
20
+ export const OTLPMetricsProviderConfig = Context.Tag<OTLPMetricsProviderConfig>(OTLPMetricsProviderConfigSymbol)
21
+
22
+ export const LiveOTLPMetricsProviderConfig = (options: MeterProviderOptions) =>
23
+ Layer.succeed(OTLPMetricsProviderConfig, { options })
24
+
25
+ export const makeOTLPMetricsProvider = Effect.gen(function* ($) {
26
+ const ctx = yield* $(Effect.context<never>())
27
+
28
+ const options = pipe(
29
+ Context.getOption(ctx, OTLPMetricsProviderConfig),
30
+ Option.map((_) => _.options),
31
+ Option.getOrUndefined,
32
+ )
33
+
34
+ const metricsProvider = yield* $(Effect.sync(() => new MeterProvider(options)))
35
+
36
+ // TODO remove below
37
+
38
+ // const metricsExporter = yield* _(exporter)
39
+ const { config } = yield* $(OTLPMetricExporterConfig)
40
+
41
+ const metricExporter = yield* $(
42
+ pipe(
43
+ Effect.sync(() => new WebsocketMetricExporter(config)),
44
+ // TODO re-enable
45
+ Effect.acquireRelease((_p) =>
46
+ pipe(
47
+ // Effect.tryPromise(() => p.shutdown()),
48
+ Effect.unit, // TODO without this I'm seeing a "`config` of undefined" bug
49
+ Effect.orDie,
50
+ ),
51
+ ),
52
+ ),
53
+ )
54
+
55
+ const metricReader = yield* $(
56
+ Effect.sync(
57
+ () =>
58
+ new PeriodicExportingMetricReader({
59
+ exporter: metricExporter,
60
+ exportIntervalMillis: 1000, // TODO make configurable
61
+ }),
62
+ ),
63
+ )
64
+
65
+ yield* $(Effect.sync(() => metricsProvider.addMetricReader(metricReader)))
66
+
67
+ // TODO remove above
68
+
69
+ return identity<MetricsProvider>({
70
+ [MeterProviderSymbol]: MeterProviderSymbol,
71
+ metricsProvider,
72
+ })
73
+ })
74
+
75
+ export const OTLPMetricsProviderLayer = Layer.scoped(MetricsProvider, makeOTLPMetricsProvider)
76
+
77
+ export const OTLPMetricsProvider = (
78
+ config?: MeterProviderOptions,
79
+ ): Layer.Layer<OTLPMetricExporterConfig, never, MetricsProvider> =>
80
+ config ? Layer.provide(LiveOTLPMetricsProviderConfig(config), OTLPMetricsProviderLayer) : OTLPMetricsProviderLayer
@@ -0,0 +1,55 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity } from '@effect/data/Function'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Layer from '@effect/io/Layer'
5
+ import type * as Scope from '@effect/io/Scope'
6
+ import type { MetricReader, PushMetricExporter } from '@opentelemetry/sdk-metrics'
7
+ import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
8
+
9
+ import { MetricsProvider } from './MetricsProvider.js'
10
+
11
+ //
12
+ // Span Processor
13
+ //
14
+
15
+ export const PeriodicMetricsProviderSymbol = Symbol.for('effect-otel/PeriodicMetricsProvider')
16
+ export type PeriodicMetricsProviderSymbol = typeof PeriodicMetricsProviderSymbol
17
+
18
+ export interface PeriodicMetricsProvider {
19
+ readonly [PeriodicMetricsProviderSymbol]: PeriodicMetricsProviderSymbol
20
+ readonly metricsExporter: PushMetricExporter
21
+ readonly metricReader: MetricReader
22
+ }
23
+
24
+ export const makePeriodicMetricsProvider = <R, E, A extends PushMetricExporter>(
25
+ exporter: Effect.Effect<R | Scope.Scope, E, A>,
26
+ ) =>
27
+ Effect.gen(function* ($) {
28
+ const { metricsProvider } = yield* $(MetricsProvider)
29
+
30
+ const metricsExporter = yield* $(exporter)
31
+
32
+ const metricReader = yield* $(
33
+ Effect.sync(
34
+ () =>
35
+ new PeriodicExportingMetricReader({
36
+ exporter: metricsExporter,
37
+ exportIntervalMillis: 1000, // TODO make configurable
38
+ }),
39
+ ),
40
+ )
41
+
42
+ yield* $(Effect.sync(() => metricsProvider.addMetricReader(metricReader)))
43
+
44
+ return identity<PeriodicMetricsProvider>({
45
+ [PeriodicMetricsProviderSymbol]: PeriodicMetricsProviderSymbol,
46
+ metricsExporter,
47
+ metricReader,
48
+ })
49
+ })
50
+
51
+ export const PeriodicMetricsProviderTag = Context.Tag<PeriodicMetricsProvider>(PeriodicMetricsProviderSymbol)
52
+
53
+ export const PeriodicMetricsProvider = <R, E, A extends PushMetricExporter>(
54
+ exporter: Effect.Effect<R | Scope.Scope, E, A>,
55
+ ) => Layer.scoped(PeriodicMetricsProviderTag, makePeriodicMetricsProvider(exporter))
@@ -0,0 +1,58 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity } from '@effect/data/Function'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Layer from '@effect/io/Layer'
5
+ import type * as Scope from '@effect/io/Scope'
6
+ import type { SpanExporter } from '@opentelemetry/sdk-trace-base'
7
+ import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
8
+
9
+ import { TracerProvider } from './TracerProvider.js'
10
+
11
+ //
12
+ // Span Processor
13
+ //
14
+
15
+ export const BatchProcessorSymbol = Symbol.for('effect-otel/BatchProcessor')
16
+ export type BatchProcessorSymbol = typeof BatchProcessorSymbol
17
+
18
+ export interface BatchProcessor {
19
+ readonly [BatchProcessorSymbol]: BatchProcessorSymbol
20
+ readonly spanExporter: SpanExporter
21
+ readonly spanProcessor: BatchSpanProcessor
22
+ }
23
+
24
+ export const makeBatchProcessor = <R, E, A extends SpanExporter>(exporter: Effect.Effect<R | Scope.Scope, E, A>) =>
25
+ Effect.gen(function* ($) {
26
+ const { tracerProvider } = yield* $(TracerProvider)
27
+
28
+ const spanExporter = yield* $(exporter)
29
+
30
+ const spanProcessor = yield* $(
31
+ Effect.sync(
32
+ () =>
33
+ new BatchSpanProcessor(
34
+ spanExporter,
35
+ // TODO make this configurable
36
+ {
37
+ scheduledDelayMillis: 500,
38
+ maxExportBatchSize: 1000,
39
+ maxQueueSize: 10_000_000,
40
+ exportTimeoutMillis: 1000 * 60 * 3, // 3 minutes
41
+ },
42
+ ),
43
+ ),
44
+ )
45
+
46
+ yield* $(Effect.sync(() => tracerProvider.addSpanProcessor(spanProcessor)))
47
+
48
+ return identity<BatchProcessor>({
49
+ [BatchProcessorSymbol]: BatchProcessorSymbol,
50
+ spanExporter,
51
+ spanProcessor,
52
+ })
53
+ })
54
+
55
+ export const BatchProcessorTag = Context.Tag<BatchProcessor>(BatchProcessorSymbol)
56
+
57
+ export const BatchProcessor = <R, E, A extends SpanExporter>(exporter: Effect.Effect<R | Scope.Scope, E, A>) =>
58
+ Layer.scoped(BatchProcessorTag, makeBatchProcessor(exporter))
@@ -0,0 +1,64 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import * as Duration from '@effect/data/Duration'
3
+ import { pipe } from '@effect/data/Function'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Layer from '@effect/io/Layer'
6
+ import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api'
7
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'
8
+ import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'
9
+
10
+ import { SimpleProcessor } from './SimpleProcessor.js'
11
+
12
+ export const OTLPTraceExporterConfigSymbol = Symbol.for('effect-otel/OTLPTraceExporterConfig')
13
+ type OTLPTraceExporterConfigSymbol = typeof OTLPTraceExporterConfigSymbol
14
+
15
+ export interface OTLPTraceExporterConfig {
16
+ readonly [OTLPTraceExporterConfigSymbol]: OTLPTraceExporterConfigSymbol
17
+ readonly config: OTLPExporterNodeConfigBase
18
+ }
19
+
20
+ export const OTLPTraceExporterConfig = Context.Tag<OTLPTraceExporterConfig>(OTLPTraceExporterConfigSymbol)
21
+
22
+ export const makeOTLPTraceExporterConfigLayer = (config: OTLPExporterNodeConfigBase) =>
23
+ Layer.succeed(OTLPTraceExporterConfig, { [OTLPTraceExporterConfigSymbol]: OTLPTraceExporterConfigSymbol, config })
24
+
25
+ export const makeOTLPTraceExporterConfigLayerM = <R, E>(configEff: Effect.Effect<R, E, OTLPExporterNodeConfigBase>) =>
26
+ Layer.effect(
27
+ OTLPTraceExporterConfig,
28
+ Effect.map(
29
+ configEff,
30
+ (config) => ({ [OTLPTraceExporterConfigSymbol]: OTLPTraceExporterConfigSymbol, config }) as const,
31
+ ),
32
+ )
33
+ export const makeTracingSpanExporter = Effect.gen(function* ($) {
34
+ const { config } = yield* $(OTLPTraceExporterConfig)
35
+
36
+ diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR)
37
+
38
+ const spanExporter = yield* $(
39
+ pipe(
40
+ Effect.sync(() => new OTLPTraceExporter(config)),
41
+ // NOTE Unfortunately this workaround/"hack" is currently needed since Otel doesn't yet provide a graceful
42
+ // way to shutdown.
43
+ //
44
+ // Related issue: https://github.com/open-telemetry/opentelemetry-js/issues/987
45
+ Effect.acquireRelease((p) =>
46
+ Effect.gen(function* ($) {
47
+ while (1) {
48
+ yield* $(Effect.sleep(Duration.millis(0)))
49
+ const promises = p['_sendingPromises'] as any[]
50
+ if (promises.length > 0) {
51
+ yield* $(Effect.exit(Effect.promise(() => Promise.all(promises))))
52
+ } else {
53
+ break
54
+ }
55
+ }
56
+ }),
57
+ ),
58
+ ),
59
+ )
60
+
61
+ return spanExporter
62
+ })
63
+
64
+ export const LiveSimpleProcessor = SimpleProcessor(makeTracingSpanExporter)
@@ -0,0 +1,64 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import * as Duration from '@effect/data/Duration'
3
+ import { pipe } from '@effect/data/Function'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Layer from '@effect/io/Layer'
6
+ import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api'
7
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
8
+ import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'
9
+
10
+ import { SimpleProcessor } from './SimpleProcessor.js'
11
+
12
+ export const OTLPTraceExporterConfigSymbol = Symbol.for('effect-otel/OTLPTraceExporterConfig')
13
+ type OTLPTraceExporterConfigSymbol = typeof OTLPTraceExporterConfigSymbol
14
+
15
+ export interface OTLPTraceExporterConfig {
16
+ readonly [OTLPTraceExporterConfigSymbol]: OTLPTraceExporterConfigSymbol
17
+ readonly config: OTLPExporterNodeConfigBase
18
+ }
19
+
20
+ export const OTLPTraceExporterConfig = Context.Tag<OTLPTraceExporterConfig>(OTLPTraceExporterConfigSymbol)
21
+
22
+ export const makeOTLPTraceExporterConfigLayer = (config: OTLPExporterNodeConfigBase) =>
23
+ Layer.succeed(OTLPTraceExporterConfig, { [OTLPTraceExporterConfigSymbol]: OTLPTraceExporterConfigSymbol, config })
24
+
25
+ export const makeOTLPTraceExporterConfigLayerM = <R, E>(configEff: Effect.Effect<R, E, OTLPExporterNodeConfigBase>) =>
26
+ Layer.effect(
27
+ OTLPTraceExporterConfig,
28
+ Effect.map(
29
+ configEff,
30
+ (config) => ({ [OTLPTraceExporterConfigSymbol]: OTLPTraceExporterConfigSymbol, config }) as const,
31
+ ),
32
+ )
33
+ export const makeTracingSpanExporter = Effect.gen(function* ($) {
34
+ const { config } = yield* $(OTLPTraceExporterConfig)
35
+
36
+ diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR)
37
+
38
+ const spanExporter = yield* $(
39
+ pipe(
40
+ Effect.sync(() => new OTLPTraceExporter(config)),
41
+ // NOTE Unfortunately this workaround/"hack" is currently needed since Otel doesn't yet provide a graceful
42
+ // way to shutdown.
43
+ //
44
+ // Related issue: https://github.com/open-telemetry/opentelemetry-js/issues/987
45
+ Effect.acquireRelease((p) =>
46
+ Effect.gen(function* ($) {
47
+ while (1) {
48
+ yield* $(Effect.sleep(Duration.millis(0)))
49
+ const promises = p['_sendingPromises'] as any[]
50
+ if (promises.length > 0) {
51
+ yield* $(Effect.exit(Effect.promise(() => Promise.all(promises))))
52
+ } else {
53
+ break
54
+ }
55
+ }
56
+ }),
57
+ ),
58
+ ),
59
+ )
60
+
61
+ return spanExporter
62
+ })
63
+
64
+ export const LiveSimpleProcessor = SimpleProcessor(makeTracingSpanExporter)
@@ -0,0 +1,38 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import * as Duration from '@effect/data/Duration'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Layer from '@effect/io/Layer'
5
+ import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base'
6
+ import { WebsocketTraceExporter } from 'otel-websocket-exporter'
7
+
8
+ export const OTLPTraceExporterConfig = Context.Tag<OTLPExporterNodeConfigBase>('effect-otel/OTLPTraceExporterConfig')
9
+
10
+ export const makeOTLPTraceExporterConfigLayer = (config: OTLPExporterNodeConfigBase) =>
11
+ Layer.succeed(OTLPTraceExporterConfig, config)
12
+
13
+ export const makeTracingSpanExporter = Effect.gen(function* ($) {
14
+ const config = yield* $(OTLPTraceExporterConfig)
15
+
16
+ const spanExporter = yield* $(
17
+ Effect.sync(() => new WebsocketTraceExporter(config)),
18
+ // NOTE Unfortunately this workaround/"hack" is currently needed since Otel doesn't yet provide a graceful
19
+ // way to shutdown.
20
+ //
21
+ // Related issue: https://github.com/open-telemetry/opentelemetry-js/issues/987
22
+ Effect.acquireRelease((p) =>
23
+ Effect.gen(function* ($) {
24
+ while (1) {
25
+ yield* $(Effect.sleep(Duration.millis(0)))
26
+ const promises = p['_sendingPromises'] as any[]
27
+ if (promises.length > 0) {
28
+ yield* $(Effect.exit(Effect.promise(() => Promise.all(promises))))
29
+ } else {
30
+ break
31
+ }
32
+ }
33
+ }),
34
+ ),
35
+ )
36
+
37
+ return spanExporter
38
+ })
@@ -0,0 +1 @@
1
+ The files in this folder should be contributed back into effect/otel.
@@ -0,0 +1,46 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity } from '@effect/data/Function'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Layer from '@effect/io/Layer'
5
+ import type * as Scope from '@effect/io/Scope'
6
+ import type { SpanExporter } from '@opentelemetry/sdk-trace-base'
7
+ import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'
8
+
9
+ import { TracerProvider } from './TracerProvider.js'
10
+
11
+ //
12
+ // Span Processor
13
+ //
14
+
15
+ export const SimpleProcessorSymbol = Symbol.for('effect-otel/SimpleProcessor')
16
+ export type SimpleProcessorSymbol = typeof SimpleProcessorSymbol
17
+
18
+ export interface SimpleProcessor {
19
+ readonly [SimpleProcessorSymbol]: SimpleProcessorSymbol
20
+ readonly spanExporter: SpanExporter
21
+ readonly spanProcessor: SimpleSpanProcessor
22
+ }
23
+
24
+ export const makeSimpleProcessor = <R, E, A extends SpanExporter>(exporter: Effect.Effect<R | Scope.Scope, E, A>) =>
25
+ Effect.gen(function* ($) {
26
+ const { tracerProvider } = yield* $(TracerProvider)
27
+
28
+ const spanExporter = yield* $(exporter)
29
+
30
+ const spanProcessor = yield* $(Effect.sync(() => new SimpleSpanProcessor(spanExporter)))
31
+
32
+ yield* $(Effect.sync(() => tracerProvider.addSpanProcessor(spanProcessor)))
33
+
34
+ return identity<SimpleProcessor>({
35
+ [SimpleProcessorSymbol]: SimpleProcessorSymbol,
36
+ spanExporter,
37
+ spanProcessor,
38
+ })
39
+ })
40
+
41
+ export const SimpleProcessorTag = Context.Tag<SimpleProcessor>(SimpleProcessorSymbol)
42
+
43
+ export const SimpleProcessor = <R, E, A extends SpanExporter>(exporter: Effect.Effect<R | Scope.Scope, E, A>) =>
44
+ Layer.scoped(SimpleProcessorTag, makeSimpleProcessor(exporter))
45
+
46
+ export const LiveConsoleSimple = SimpleProcessor(Effect.sync(() => new ConsoleSpanExporter()))