@effect/opentelemetry 0.60.0 → 4.0.0-beta.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 (160) hide show
  1. package/LICENSE +1 -1
  2. package/dist/{dts/Logger.d.ts → Logger.d.ts} +19 -13
  3. package/dist/Logger.d.ts.map +1 -0
  4. package/dist/Logger.js +76 -0
  5. package/dist/Logger.js.map +1 -0
  6. package/dist/Metrics.d.ts +76 -0
  7. package/dist/Metrics.d.ts.map +1 -0
  8. package/dist/Metrics.js +59 -0
  9. package/dist/Metrics.js.map +1 -0
  10. package/dist/{dts/NodeSdk.d.ts → NodeSdk.d.ts} +12 -9
  11. package/dist/NodeSdk.d.ts.map +1 -0
  12. package/dist/{esm/NodeSdk.js → NodeSdk.js} +23 -14
  13. package/dist/NodeSdk.js.map +1 -0
  14. package/dist/{dts/Resource.d.ts → Resource.d.ts} +10 -13
  15. package/dist/Resource.d.ts.map +1 -0
  16. package/dist/{esm/Resource.js → Resource.js} +12 -13
  17. package/dist/Resource.js.map +1 -0
  18. package/dist/Tracer.d.ts +129 -0
  19. package/dist/Tracer.d.ts.map +1 -0
  20. package/dist/Tracer.js +391 -0
  21. package/dist/Tracer.js.map +1 -0
  22. package/dist/{dts/WebSdk.d.ts → WebSdk.d.ts} +12 -9
  23. package/dist/WebSdk.d.ts.map +1 -0
  24. package/dist/WebSdk.js +41 -0
  25. package/dist/WebSdk.js.map +1 -0
  26. package/dist/index.d.ts +28 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/{esm/index.js → index.js} +4 -20
  29. package/dist/index.js.map +1 -0
  30. package/dist/internal/attributes.d.ts +2 -0
  31. package/dist/internal/attributes.d.ts.map +1 -0
  32. package/dist/internal/attributes.js +19 -0
  33. package/dist/internal/attributes.js.map +1 -0
  34. package/dist/{dts/internal → internal}/metrics.d.ts.map +1 -1
  35. package/dist/internal/metrics.js +406 -0
  36. package/dist/internal/metrics.js.map +1 -0
  37. package/dist/internal/utilities.d.ts +2 -0
  38. package/dist/internal/utilities.d.ts.map +1 -0
  39. package/dist/internal/utilities.js +3 -0
  40. package/dist/internal/utilities.js.map +1 -0
  41. package/package.json +70 -118
  42. package/src/Logger.ts +52 -55
  43. package/src/Metrics.ts +92 -18
  44. package/src/NodeSdk.ts +67 -64
  45. package/src/Resource.ts +16 -24
  46. package/src/Tracer.ts +469 -78
  47. package/src/WebSdk.ts +59 -51
  48. package/src/index.ts +7 -26
  49. package/src/internal/attributes.ts +21 -0
  50. package/src/internal/metrics.ts +381 -250
  51. package/src/internal/utilities.ts +5 -0
  52. package/Logger/package.json +0 -6
  53. package/Metrics/package.json +0 -6
  54. package/NodeSdk/package.json +0 -6
  55. package/Otlp/package.json +0 -6
  56. package/OtlpLogger/package.json +0 -6
  57. package/OtlpMetrics/package.json +0 -6
  58. package/OtlpResource/package.json +0 -6
  59. package/OtlpTracer/package.json +0 -6
  60. package/Resource/package.json +0 -6
  61. package/Tracer/package.json +0 -6
  62. package/WebSdk/package.json +0 -6
  63. package/dist/cjs/Logger.js +0 -85
  64. package/dist/cjs/Logger.js.map +0 -1
  65. package/dist/cjs/Metrics.js +0 -24
  66. package/dist/cjs/Metrics.js.map +0 -1
  67. package/dist/cjs/NodeSdk.js +0 -53
  68. package/dist/cjs/NodeSdk.js.map +0 -1
  69. package/dist/cjs/Otlp.js +0 -46
  70. package/dist/cjs/Otlp.js.map +0 -1
  71. package/dist/cjs/OtlpLogger.js +0 -158
  72. package/dist/cjs/OtlpLogger.js.map +0 -1
  73. package/dist/cjs/OtlpMetrics.js +0 -354
  74. package/dist/cjs/OtlpMetrics.js.map +0 -1
  75. package/dist/cjs/OtlpResource.js +0 -136
  76. package/dist/cjs/OtlpResource.js.map +0 -1
  77. package/dist/cjs/OtlpTracer.js +0 -229
  78. package/dist/cjs/OtlpTracer.js.map +0 -1
  79. package/dist/cjs/Resource.js +0 -75
  80. package/dist/cjs/Resource.js.map +0 -1
  81. package/dist/cjs/Tracer.js +0 -87
  82. package/dist/cjs/Tracer.js.map +0 -1
  83. package/dist/cjs/WebSdk.js +0 -42
  84. package/dist/cjs/WebSdk.js.map +0 -1
  85. package/dist/cjs/index.js +0 -30
  86. package/dist/cjs/index.js.map +0 -1
  87. package/dist/cjs/internal/metrics.js +0 -288
  88. package/dist/cjs/internal/metrics.js.map +0 -1
  89. package/dist/cjs/internal/otlpExporter.js +0 -81
  90. package/dist/cjs/internal/otlpExporter.js.map +0 -1
  91. package/dist/cjs/internal/tracer.js +0 -299
  92. package/dist/cjs/internal/tracer.js.map +0 -1
  93. package/dist/cjs/internal/utils.js +0 -34
  94. package/dist/cjs/internal/utils.js.map +0 -1
  95. package/dist/dts/Logger.d.ts.map +0 -1
  96. package/dist/dts/Metrics.d.ts +0 -29
  97. package/dist/dts/Metrics.d.ts.map +0 -1
  98. package/dist/dts/NodeSdk.d.ts.map +0 -1
  99. package/dist/dts/Otlp.d.ts +0 -31
  100. package/dist/dts/Otlp.d.ts.map +0 -1
  101. package/dist/dts/OtlpLogger.d.ts +0 -46
  102. package/dist/dts/OtlpLogger.d.ts.map +0 -1
  103. package/dist/dts/OtlpMetrics.d.ts +0 -40
  104. package/dist/dts/OtlpMetrics.d.ts.map +0 -1
  105. package/dist/dts/OtlpResource.d.ts +0 -104
  106. package/dist/dts/OtlpResource.d.ts.map +0 -1
  107. package/dist/dts/OtlpTracer.d.ts +0 -49
  108. package/dist/dts/OtlpTracer.d.ts.map +0 -1
  109. package/dist/dts/Resource.d.ts.map +0 -1
  110. package/dist/dts/Tracer.d.ts +0 -143
  111. package/dist/dts/Tracer.d.ts.map +0 -1
  112. package/dist/dts/WebSdk.d.ts.map +0 -1
  113. package/dist/dts/index.d.ts +0 -45
  114. package/dist/dts/index.d.ts.map +0 -1
  115. package/dist/dts/internal/otlpExporter.d.ts +0 -2
  116. package/dist/dts/internal/otlpExporter.d.ts.map +0 -1
  117. package/dist/dts/internal/tracer.d.ts +0 -2
  118. package/dist/dts/internal/tracer.d.ts.map +0 -1
  119. package/dist/dts/internal/utils.d.ts +0 -2
  120. package/dist/dts/internal/utils.d.ts.map +0 -1
  121. package/dist/esm/Logger.js +0 -75
  122. package/dist/esm/Logger.js.map +0 -1
  123. package/dist/esm/Metrics.js +0 -17
  124. package/dist/esm/Metrics.js.map +0 -1
  125. package/dist/esm/NodeSdk.js.map +0 -1
  126. package/dist/esm/Otlp.js +0 -38
  127. package/dist/esm/Otlp.js.map +0 -1
  128. package/dist/esm/OtlpLogger.js +0 -150
  129. package/dist/esm/OtlpLogger.js.map +0 -1
  130. package/dist/esm/OtlpMetrics.js +0 -346
  131. package/dist/esm/OtlpMetrics.js.map +0 -1
  132. package/dist/esm/OtlpResource.js +0 -124
  133. package/dist/esm/OtlpResource.js.map +0 -1
  134. package/dist/esm/OtlpTracer.js +0 -221
  135. package/dist/esm/OtlpTracer.js.map +0 -1
  136. package/dist/esm/Resource.js.map +0 -1
  137. package/dist/esm/Tracer.js +0 -80
  138. package/dist/esm/Tracer.js.map +0 -1
  139. package/dist/esm/WebSdk.js +0 -33
  140. package/dist/esm/WebSdk.js.map +0 -1
  141. package/dist/esm/index.js.map +0 -1
  142. package/dist/esm/internal/metrics.js +0 -278
  143. package/dist/esm/internal/metrics.js.map +0 -1
  144. package/dist/esm/internal/otlpExporter.js +0 -74
  145. package/dist/esm/internal/otlpExporter.js.map +0 -1
  146. package/dist/esm/internal/tracer.js +0 -290
  147. package/dist/esm/internal/tracer.js.map +0 -1
  148. package/dist/esm/internal/utils.js +0 -23
  149. package/dist/esm/internal/utils.js.map +0 -1
  150. package/dist/esm/package.json +0 -4
  151. package/index/package.json +0 -6
  152. package/src/Otlp.ts +0 -66
  153. package/src/OtlpLogger.ts +0 -258
  154. package/src/OtlpMetrics.ts +0 -571
  155. package/src/OtlpResource.ts +0 -232
  156. package/src/OtlpTracer.ts +0 -349
  157. package/src/internal/otlpExporter.ts +0 -124
  158. package/src/internal/tracer.ts +0 -437
  159. package/src/internal/utils.ts +0 -31
  160. /package/dist/{dts/internal → internal}/metrics.d.ts +0 -0
package/src/NodeSdk.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as OtelApi from "@opentelemetry/api"
4
+ import type * as Otel from "@opentelemetry/api"
5
5
  import type { LoggerProviderConfig, LogRecordProcessor } from "@opentelemetry/sdk-logs"
6
6
  import type { MetricReader } from "@opentelemetry/sdk-metrics"
7
7
  import type { SpanProcessor, TracerConfig } from "@opentelemetry/sdk-trace-base"
@@ -11,33 +11,35 @@ import type { DurationInput } from "effect/Duration"
11
11
  import * as Effect from "effect/Effect"
12
12
  import { constant, type LazyArg } from "effect/Function"
13
13
  import * as Layer from "effect/Layer"
14
- import { isNonEmpty } from "./internal/utils.js"
15
- import * as Logger from "./Logger.js"
16
- import * as Metrics from "./Metrics.js"
17
- import * as Resource from "./Resource.js"
18
- import * as Tracer from "./Tracer.js"
14
+ import { isNonEmpty } from "./internal/utilities.ts"
15
+ import * as Logger from "./Logger.ts"
16
+ import * as Metrics from "./Metrics.ts"
17
+ import * as Resource from "./Resource.ts"
18
+ import * as Tracer from "./Tracer.ts"
19
19
 
20
20
  /**
21
21
  * @since 1.0.0
22
- * @category model
22
+ * @category Models
23
23
  */
24
24
  export interface Configuration {
25
25
  readonly spanProcessor?: SpanProcessor | ReadonlyArray<SpanProcessor> | undefined
26
26
  readonly tracerConfig?: Omit<TracerConfig, "resource"> | undefined
27
27
  readonly metricReader?: MetricReader | ReadonlyArray<MetricReader> | undefined
28
+ readonly metricTemporality?: Metrics.TemporalityPreference | undefined
28
29
  readonly logRecordProcessor?: LogRecordProcessor | ReadonlyArray<LogRecordProcessor> | undefined
29
30
  readonly loggerProviderConfig?: Omit<LoggerProviderConfig, "resource"> | undefined
31
+ readonly loggerMergeWithExisting?: boolean | undefined
30
32
  readonly resource?: {
31
33
  readonly serviceName: string
32
34
  readonly serviceVersion?: string
33
- readonly attributes?: OtelApi.Attributes
35
+ readonly attributes?: Otel.Attributes
34
36
  } | undefined
35
37
  readonly shutdownTimeout?: DurationInput | undefined
36
38
  }
37
39
 
38
40
  /**
39
41
  * @since 1.0.0
40
- * @category layers
42
+ * @category Layers
41
43
  */
42
44
  export const layerTracerProvider = (
43
45
  processor: SpanProcessor | NonEmptyReadonlyArray<SpanProcessor>,
@@ -45,85 +47,86 @@ export const layerTracerProvider = (
45
47
  readonly shutdownTimeout?: DurationInput | undefined
46
48
  }
47
49
  ): Layer.Layer<Tracer.OtelTracerProvider, never, Resource.Resource> =>
48
- Layer.scoped(
50
+ Layer.effect(
49
51
  Tracer.OtelTracerProvider,
50
- Effect.flatMap(
51
- Resource.Resource,
52
- (resource) =>
53
- Effect.acquireRelease(
54
- Effect.sync(() => {
55
- const provider = new NodeTracerProvider({
56
- ...(config ?? undefined),
57
- resource,
58
- spanProcessors: Array.isArray(processor) ? (processor as any) : [processor]
59
- })
60
- return provider
61
- }),
62
- (provider) =>
63
- Effect.promise(() => provider.forceFlush().then(() => provider.shutdown())).pipe(
64
- Effect.ignoreLogged,
65
- Effect.interruptible,
66
- Effect.timeoutOption(config?.shutdownTimeout ?? 3000)
67
- )
68
- )
69
- )
52
+ Effect.gen(function*() {
53
+ const resource = yield* Resource.Resource
54
+ return yield* Effect.acquireRelease(
55
+ Effect.sync(() => {
56
+ const provider = new NodeTracerProvider({
57
+ ...(config ?? undefined),
58
+ resource,
59
+ spanProcessors: Array.isArray(processor) ? (processor as any) : [processor]
60
+ })
61
+ return provider
62
+ }),
63
+ (provider) =>
64
+ Effect.promise(() => provider.forceFlush().then(() => provider.shutdown())).pipe(
65
+ Effect.ignore,
66
+ Effect.interruptible,
67
+ Effect.timeoutOption(config?.shutdownTimeout ?? 3000)
68
+ )
69
+ )
70
+ })
70
71
  )
71
72
 
72
73
  /**
73
74
  * @since 1.0.0
74
- * @category layer
75
+ * @category Layers
75
76
  */
76
77
  export const layer: {
77
78
  /**
78
79
  * @since 1.0.0
79
- * @category layer
80
+ * @category Layers
80
81
  */
81
82
  (evaluate: LazyArg<Configuration>): Layer.Layer<Resource.Resource>
82
83
  /**
83
84
  * @since 1.0.0
84
- * @category layer
85
+ * @category Layers
85
86
  */
86
87
  <R, E>(evaluate: Effect.Effect<Configuration, E, R>): Layer.Layer<Resource.Resource, E, R>
87
88
  } = (
88
89
  evaluate: LazyArg<Configuration> | Effect.Effect<Configuration, any, any>
89
90
  ): Layer.Layer<Resource.Resource> =>
90
- Layer.unwrapEffect(
91
- Effect.map(
92
- Effect.isEffect(evaluate)
91
+ Layer.unwrap(
92
+ Effect.gen(function*() {
93
+ const config = yield* Effect.isEffect(evaluate)
93
94
  ? evaluate as Effect.Effect<Configuration>
94
- : Effect.sync(evaluate),
95
- (config) => {
96
- const ResourceLive = Resource.layerFromEnv(config.resource && Resource.configToAttributes(config.resource))
95
+ : Effect.sync(evaluate)
97
96
 
98
- const TracerLive = isNonEmpty(config.spanProcessor)
99
- ? Layer.provide(
100
- Tracer.layer,
101
- layerTracerProvider(config.spanProcessor, {
102
- ...config.tracerConfig,
103
- shutdownTimeout: config.shutdownTimeout
104
- })
105
- )
106
- : Layer.empty
97
+ const ResourceLive = Resource.layerFromEnv(config.resource && Resource.configToAttributes(config.resource))
107
98
 
108
- const MetricsLive = isNonEmpty(config.metricReader)
109
- ? Metrics.layer(constant(config.metricReader), config)
110
- : Layer.empty
99
+ const TracerLive = isNonEmpty(config.spanProcessor)
100
+ ? Layer.provide(
101
+ Tracer.layer,
102
+ layerTracerProvider(config.spanProcessor, {
103
+ ...config.tracerConfig,
104
+ shutdownTimeout: config.shutdownTimeout
105
+ })
106
+ )
107
+ : Layer.empty
111
108
 
112
- const LoggerLive = isNonEmpty(config.logRecordProcessor)
113
- ? Layer.provide(
114
- Logger.layerLoggerAdd,
115
- Logger.layerLoggerProvider(config.logRecordProcessor, {
116
- ...config.loggerProviderConfig,
117
- shutdownTimeout: config.shutdownTimeout
118
- })
119
- )
120
- : Layer.empty
109
+ const MetricsLive = isNonEmpty(config.metricReader)
110
+ ? Metrics.layer(constant(config.metricReader), {
111
+ shutdownTimeout: config.shutdownTimeout,
112
+ temporality: config.metricTemporality
113
+ })
114
+ : Layer.empty
121
115
 
122
- return Layer.mergeAll(TracerLive, MetricsLive, LoggerLive).pipe(
123
- Layer.provideMerge(ResourceLive)
116
+ const LoggerLive = isNonEmpty(config.logRecordProcessor)
117
+ ? Layer.provide(
118
+ Logger.layer({ mergeWithExisting: config.loggerMergeWithExisting }),
119
+ Logger.layerLoggerProvider(config.logRecordProcessor, {
120
+ ...config.loggerProviderConfig,
121
+ shutdownTimeout: config.shutdownTimeout
122
+ })
124
123
  )
125
- }
126
- )
124
+ : Layer.empty
125
+
126
+ return Layer.mergeAll(TracerLive, MetricsLive, LoggerLive).pipe(
127
+ Layer.provideMerge(ResourceLive)
128
+ )
129
+ })
127
130
  )
128
131
 
129
132
  /**
package/src/Resource.ts CHANGED
@@ -6,28 +6,22 @@ import * as Resources from "@opentelemetry/resources"
6
6
  import * as OtelSemConv from "@opentelemetry/semantic-conventions"
7
7
  import * as Arr from "effect/Array"
8
8
  import * as Config from "effect/Config"
9
- import { GenericTag } from "effect/Context"
10
9
  import * as Effect from "effect/Effect"
11
- import { pipe } from "effect/Function"
12
10
  import * as Layer from "effect/Layer"
11
+ import * as ServiceMap from "effect/ServiceMap"
13
12
 
14
13
  /**
15
14
  * @since 1.0.0
16
- * @category identifier
15
+ * @category Services
17
16
  */
18
- export interface Resource {
19
- readonly _: unique symbol
20
- }
21
-
22
- /**
23
- * @since 1.0.0
24
- * @category tag
25
- */
26
- export const Resource = GenericTag<Resource, Resources.Resource>("@effect/opentelemetry/Resource")
17
+ export class Resource extends ServiceMap.Service<
18
+ Resource,
19
+ Resources.Resource
20
+ >()("@effect/opentelemetry/Resource") {}
27
21
 
28
22
  /**
29
23
  * @since 1.0.0
30
- * @category layer
24
+ * @category Layers
31
25
  */
32
26
  export const layer = (config: {
33
27
  readonly serviceName: string
@@ -41,7 +35,7 @@ export const layer = (config: {
41
35
 
42
36
  /**
43
37
  * @since 1.0.0
44
- * @category config
38
+ * @category Configuration
45
39
  */
46
40
  export const configToAttributes = (options: {
47
41
  readonly serviceName: string
@@ -64,7 +58,7 @@ export const configToAttributes = (options: {
64
58
 
65
59
  /**
66
60
  * @since 1.0.0
67
- * @category layer
61
+ * @category Layers
68
62
  */
69
63
  export const layerFromEnv = (
70
64
  additionalAttributes?:
@@ -74,10 +68,9 @@ export const layerFromEnv = (
74
68
  Layer.effect(
75
69
  Resource,
76
70
  Effect.gen(function*() {
77
- const serviceName = yield* pipe(Config.string("OTEL_SERVICE_NAME"), Config.option, Effect.orDie)
78
- const attributes = yield* pipe(
79
- Config.string("OTEL_RESOURCE_ATTRIBUTES"),
80
- Config.withDefault(""),
71
+ const serviceName = yield* Config.option(Config.string("OTEL_SERVICE_NAME"))
72
+ const attributes = yield* Config.string("OTEL_RESOURCE_ATTRIBUTES").pipe(
73
+ Config.withDefault(() => ""),
81
74
  Config.map((s) => {
82
75
  const attrs = s.split(",")
83
76
  return Arr.reduce(attrs, {} as OtelApi.Attributes, (acc, attr) => {
@@ -88,8 +81,7 @@ export const layerFromEnv = (
88
81
  acc[parts[0].trim()] = parts[1].trim()
89
82
  return acc
90
83
  })
91
- }),
92
- Effect.orDie
84
+ })
93
85
  )
94
86
  if (serviceName._tag === "Some") {
95
87
  attributes[OtelSemConv.ATTR_SERVICE_NAME] = serviceName.value
@@ -98,12 +90,12 @@ export const layerFromEnv = (
98
90
  Object.assign(attributes, additionalAttributes)
99
91
  }
100
92
  return Resources.resourceFromAttributes(attributes)
101
- })
93
+ }).pipe(Effect.orDie)
102
94
  )
103
95
 
104
96
  /**
105
- * @since 2.0.0
106
- * @category layer
97
+ * @since 1.0.0
98
+ * @category Layers
107
99
  */
108
100
  export const layerEmpty = Layer.succeed(
109
101
  Resource,