@effect/opentelemetry 0.19.0 → 0.21.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 (37) hide show
  1. package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.dev.js +30 -12
  2. package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.mjs +2 -2
  3. package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.prod.js +30 -12
  4. package/NodeSdk/dist/effect-opentelemetry-NodeSdk.esm.js +21 -13
  5. package/Tracer/dist/effect-opentelemetry-Tracer.cjs.dev.js +51 -24
  6. package/Tracer/dist/effect-opentelemetry-Tracer.cjs.mjs +5 -2
  7. package/Tracer/dist/effect-opentelemetry-Tracer.cjs.prod.js +51 -24
  8. package/Tracer/dist/effect-opentelemetry-Tracer.esm.js +22 -4
  9. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.mts +2 -0
  10. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.mts.map +1 -0
  11. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.ts +2 -0
  12. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.ts.map +1 -0
  13. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.dev.js +81 -0
  14. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.js +7 -0
  15. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.mjs +4 -0
  16. package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.prod.js +81 -0
  17. package/WebSdk/dist/effect-opentelemetry-WebSdk.esm.js +42 -0
  18. package/WebSdk/package.json +4 -0
  19. package/dist/declarations/src/NodeSdk.d.ts +18 -6
  20. package/dist/declarations/src/NodeSdk.d.ts.map +1 -1
  21. package/dist/declarations/src/Tracer.d.ts +20 -5
  22. package/dist/declarations/src/Tracer.d.ts.map +1 -1
  23. package/dist/declarations/src/WebSdk.d.ts +35 -0
  24. package/dist/declarations/src/WebSdk.d.ts.map +1 -0
  25. package/dist/declarations/src/index.d.ts +4 -0
  26. package/dist/declarations/src/index.d.ts.map +1 -1
  27. package/dist/effect-opentelemetry.cjs.dev.js +3 -0
  28. package/dist/effect-opentelemetry.cjs.mjs +2 -1
  29. package/dist/effect-opentelemetry.cjs.prod.js +3 -0
  30. package/dist/effect-opentelemetry.esm.js +2 -0
  31. package/internal/tracer.esm.js +26 -18
  32. package/package.json +28 -17
  33. package/src/NodeSdk.ts +60 -20
  34. package/src/Tracer.ts +23 -5
  35. package/src/WebSdk.ts +79 -0
  36. package/src/index.ts +5 -0
  37. package/src/internal/tracer.ts +47 -37
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/opentelemetry",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -44,12 +44,14 @@
44
44
  "dependencies": {
45
45
  "@opentelemetry/resources": "^1.17.1",
46
46
  "@opentelemetry/sdk-metrics": "^1.17.1",
47
- "@opentelemetry/sdk-node": "^0.44.0",
47
+ "@opentelemetry/sdk-trace-base": "^1.17.1",
48
+ "@opentelemetry/sdk-trace-node": "^1.17.1",
49
+ "@opentelemetry/sdk-trace-web": "^1.17.1",
48
50
  "@opentelemetry/semantic-conventions": "^1.17.1"
49
51
  },
50
52
  "peerDependencies": {
51
53
  "@opentelemetry/api": "^1.4",
52
- "effect": "2.0.0-next.49"
54
+ "effect": "2.0.0-next.51"
53
55
  },
54
56
  "devDependencies": {
55
57
  "@babel/core": "^7.23.2",
@@ -62,31 +64,33 @@
62
64
  "@effect/eslint-plugin": "^0.1.2",
63
65
  "@effect/language-service": "^0.0.21",
64
66
  "@opentelemetry/api": "^1.6.0",
65
- "@opentelemetry/exporter-prometheus": "^0.44.0",
66
- "@opentelemetry/exporter-trace-otlp-http": "^0.44.0",
67
- "@opentelemetry/sdk-trace-base": "^1.17.1",
67
+ "@opentelemetry/context-async-hooks": "^1.17.1",
68
+ "@opentelemetry/exporter-metrics-otlp-http": "0.43.0",
69
+ "@opentelemetry/exporter-prometheus": "0.43.0",
70
+ "@opentelemetry/exporter-trace-otlp-http": "0.43.0",
71
+ "@opentelemetry/otlp-exporter-base": "0.43.0",
68
72
  "@preconstruct/cli": "^2.8.1",
69
- "@types/chai": "^4.3.8",
70
- "@types/node": "^20.8.6",
71
- "@typescript-eslint/eslint-plugin": "^6.8.0",
72
- "@typescript-eslint/parser": "^6.8.0",
73
+ "@types/chai": "^4.3.9",
74
+ "@types/node": "^20.8.9",
75
+ "@typescript-eslint/eslint-plugin": "^6.9.0",
76
+ "@typescript-eslint/parser": "^6.9.0",
73
77
  "@vitejs/plugin-react": "^4.1.0",
74
78
  "@vitest/coverage-v8": "^0.34.6",
75
79
  "@vitest/expect": "^0.34.6",
76
80
  "babel-plugin-annotate-pure-calls": "^0.4.0",
77
- "concurrently": "^8.2.1",
78
- "effect": "2.0.0-next.49",
79
- "eslint": "^8.51.0",
81
+ "concurrently": "^8.2.2",
82
+ "effect": "2.0.0-next.51",
83
+ "eslint": "^8.52.0",
80
84
  "eslint-import-resolver-typescript": "^3.6.1",
81
85
  "eslint-plugin-codegen": "0.17.0",
82
86
  "eslint-plugin-deprecation": "^2.0.0",
83
- "eslint-plugin-import": "^2.28.1",
87
+ "eslint-plugin-import": "^2.29.0",
84
88
  "eslint-plugin-simple-import-sort": "^10.0.0",
85
89
  "eslint-plugin-sort-destructure-keys": "^1.5.0",
86
90
  "madge": "^6.1.0",
87
91
  "ts-node": "^10.9.1",
88
92
  "typescript": "^5.2.2",
89
- "vite": "^4.4.11",
93
+ "vite": "^4.5.0",
90
94
  "vitest": "0.34.6"
91
95
  },
92
96
  "exports": {
@@ -120,6 +124,12 @@
120
124
  "module": "./Tracer/dist/effect-opentelemetry-Tracer.esm.js",
121
125
  "import": "./Tracer/dist/effect-opentelemetry-Tracer.cjs.mjs",
122
126
  "default": "./Tracer/dist/effect-opentelemetry-Tracer.cjs.js"
127
+ },
128
+ "./WebSdk": {
129
+ "types": "./dist/declarations/src/WebSdk.d.ts",
130
+ "module": "./WebSdk/dist/effect-opentelemetry-WebSdk.esm.js",
131
+ "import": "./WebSdk/dist/effect-opentelemetry-WebSdk.cjs.mjs",
132
+ "default": "./WebSdk/dist/effect-opentelemetry-WebSdk.cjs.js"
123
133
  }
124
134
  },
125
135
  "files": [
@@ -129,10 +139,11 @@
129
139
  "Metrics",
130
140
  "NodeSdk",
131
141
  "Resource",
132
- "Tracer"
142
+ "Tracer",
143
+ "WebSdk"
133
144
  ],
134
145
  "scripts": {
135
- "example": "ts-node --project tsconfig.examples.json",
146
+ "example": "node -r ts-node/register",
136
147
  "version": "changeset version",
137
148
  "clean": "node scripts/clean.mjs",
138
149
  "build": "pnpm gen && preconstruct fix && preconstruct build && pnpm gen",
package/src/NodeSdk.ts CHANGED
@@ -1,41 +1,81 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type { NodeSDKConfiguration } from "@opentelemetry/sdk-node"
5
- import { NodeSDK } from "@opentelemetry/sdk-node"
4
+ import type { TracerProvider } from "@opentelemetry/api"
5
+ import type * as Resources from "@opentelemetry/resources"
6
+ import type { MetricReader } from "@opentelemetry/sdk-metrics"
7
+ import type { SpanProcessor, TracerConfig } from "@opentelemetry/sdk-trace-base"
8
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node"
6
9
  import * as Effect from "effect/Effect"
7
10
  import type { LazyArg } from "effect/Function"
8
11
  import * as Layer from "effect/Layer"
9
- import { Resource } from "./Resource"
12
+ import * as Metrics from "./Metrics"
13
+ import * as Resource from "./Resource"
14
+ import * as Tracer from "./Tracer"
10
15
 
11
16
  /**
12
17
  * @since 1.0.0
13
18
  * @category model
14
19
  */
15
- export type Configuration = Partial<Omit<NodeSDKConfiguration, "resource" | "serviceName">>
20
+ export interface Configuration {
21
+ readonly spanProcessor?: SpanProcessor
22
+ readonly tracerConfig?: Omit<TracerConfig, "resource">
23
+ readonly metricReader?: MetricReader
24
+ readonly resource: {
25
+ readonly serviceName: string
26
+ readonly serviceVersion?: string
27
+ readonly attributes?: Resources.ResourceAttributes
28
+ }
29
+ }
16
30
 
17
31
  /**
18
32
  * @since 1.0.0
19
- * @category constructor
33
+ * @category layers
20
34
  */
21
- export const config: (config: Configuration) => Configuration = (config: Configuration) => config
35
+ export const layerTracerProvider = (
36
+ processor: SpanProcessor,
37
+ config?: Omit<TracerConfig, "resource">
38
+ ): Layer.Layer<Resource.Resource, never, TracerProvider> =>
39
+ Layer.scoped(
40
+ Tracer.TracerProvider,
41
+ Effect.flatMap(
42
+ Resource.Resource,
43
+ (resource) =>
44
+ Effect.acquireRelease(
45
+ Effect.sync(() => {
46
+ const provider = new NodeTracerProvider({
47
+ ...(config ?? {}),
48
+ resource
49
+ })
50
+ provider.addSpanProcessor(processor)
51
+ return provider
52
+ }),
53
+ (provider) => Effect.promise(() => provider.shutdown())
54
+ )
55
+ )
56
+ )
22
57
 
23
58
  /**
24
59
  * @since 1.0.0
25
60
  * @category layer
26
61
  */
27
62
  export const layer = (
28
- config: LazyArg<Configuration>
29
- ): Layer.Layer<Resource, never, never> =>
30
- Layer.scopedDiscard(Effect.acquireRelease(
31
- Effect.flatMap(
32
- Resource,
33
- (resource) =>
34
- Effect.sync(() => {
35
- const sdk = new NodeSDK({ ...config(), resource })
36
- sdk.start()
37
- return sdk
38
- })
39
- ),
40
- (sdk) => Effect.promise(() => sdk.shutdown())
41
- ))
63
+ evaluate: LazyArg<Configuration>
64
+ ): Layer.Layer<never, never, Resource.Resource> =>
65
+ Layer.unwrapEffect(
66
+ Effect.sync(() => {
67
+ const config = evaluate()
68
+ const ResourceLive = Resource.layer(config.resource)
69
+ const TracerLive = config.spanProcessor ?
70
+ Tracer.layer.pipe(
71
+ Layer.use(layerTracerProvider(config.spanProcessor, config.tracerConfig))
72
+ )
73
+ : Layer.effectDiscard(Effect.unit)
74
+ const MetricsLive = config.metricReader
75
+ ? Metrics.layer(() => config.metricReader!)
76
+ : Layer.effectDiscard(Effect.unit)
77
+ return Layer.merge(TracerLive, MetricsLive).pipe(
78
+ Layer.useMerge(ResourceLive)
79
+ )
80
+ })
81
+ )
package/src/Tracer.ts CHANGED
@@ -6,7 +6,7 @@ import type { Tag } from "effect/Context"
6
6
  import type { Effect } from "effect/Effect"
7
7
  import type { Layer } from "effect/Layer"
8
8
  import type * as Option from "effect/Option"
9
- import type { ExternalSpan, Tracer } from "effect/Tracer"
9
+ import type { ExternalSpan, Tracer as EffectTracer } from "effect/Tracer"
10
10
  import * as internal from "./internal/tracer"
11
11
  import type { Resource } from "./Resource"
12
12
 
@@ -14,7 +14,7 @@ import type { Resource } from "./Resource"
14
14
  * @since 1.0.0
15
15
  * @category constructors
16
16
  */
17
- export const make: Effect<Otel.Tracer, never, Tracer> = internal.make
17
+ export const make: Effect<Otel.Tracer, never, EffectTracer> = internal.make
18
18
 
19
19
  /**
20
20
  * @since 1.0.0
@@ -39,19 +39,37 @@ export const currentOtelSpan: Effect<never, never, Option.Option<Otel.Span>> = i
39
39
  * @since 1.0.0
40
40
  * @category layers
41
41
  */
42
- export const layer: Layer<Resource, never, never> = internal.layer
42
+ export const layer: Layer<Resource | Otel.TracerProvider, never, never> = internal.layer
43
43
 
44
44
  /**
45
45
  * @since 1.0.0
46
46
  * @category layers
47
47
  */
48
- export const layerOtelTracer: Layer<Resource, never, Otel.Tracer> = internal.layerOtelTracer
48
+ export const layerGlobal: Layer<Resource, never, never> = internal.layerGlobal
49
+
50
+ /**
51
+ * @since 1.0.0
52
+ * @category layers
53
+ */
54
+ export const layerTracer: Layer<Resource | Otel.TracerProvider, never, Otel.Tracer> = internal.layerTracer
55
+
56
+ /**
57
+ * @since 1.0.0
58
+ * @category layers
59
+ */
60
+ export const layerGlobalTracer: Layer<Resource, never, Otel.Tracer> = internal.layerGlobalTracer
61
+
62
+ /**
63
+ * @since 1.0.0
64
+ * @category tags
65
+ */
66
+ export const TracerProvider: Tag<Otel.TracerProvider, Otel.TracerProvider> = internal.TracerProvider
49
67
 
50
68
  /**
51
69
  * @since 1.0.0
52
70
  * @category tags
53
71
  */
54
- export const OtelTracer: Tag<Otel.Tracer, Otel.Tracer> = internal.OtelTracer
72
+ export const Tracer: Tag<Otel.Tracer, Otel.Tracer> = internal.Tracer
55
73
 
56
74
  /**
57
75
  * @since 1.0.0
package/src/WebSdk.ts ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import type { TracerProvider } from "@opentelemetry/api"
5
+ import type * as Resources from "@opentelemetry/resources"
6
+ import type { MetricReader } from "@opentelemetry/sdk-metrics"
7
+ import type { SpanProcessor, TracerConfig } from "@opentelemetry/sdk-trace-base"
8
+ import { WebTracerProvider } from "@opentelemetry/sdk-trace-web"
9
+ import * as Effect from "effect/Effect"
10
+ import type { LazyArg } from "effect/Function"
11
+ import * as Layer from "effect/Layer"
12
+ import * as Metrics from "./Metrics"
13
+ import * as Resource from "./Resource"
14
+ import * as Tracer from "./Tracer"
15
+
16
+ /**
17
+ * @since 1.0.0
18
+ * @category model
19
+ */
20
+ export interface Configuration {
21
+ readonly spanProcessor?: SpanProcessor
22
+ readonly tracerConfig?: Omit<TracerConfig, "resource">
23
+ readonly metricReader?: MetricReader
24
+ readonly resource: {
25
+ readonly serviceName: string
26
+ readonly serviceVersion?: string
27
+ readonly attributes?: Resources.ResourceAttributes
28
+ }
29
+ }
30
+
31
+ /**
32
+ * @since 1.0.0
33
+ * @category layers
34
+ */
35
+ export const layerTracerProvider = (
36
+ processor: SpanProcessor,
37
+ config?: Omit<TracerConfig, "resource">
38
+ ): Layer.Layer<Resource.Resource, never, TracerProvider> =>
39
+ Layer.scoped(
40
+ Tracer.TracerProvider,
41
+ Effect.flatMap(
42
+ Resource.Resource,
43
+ (resource) =>
44
+ Effect.acquireRelease(
45
+ Effect.sync(() => {
46
+ const provider = new WebTracerProvider({
47
+ ...(config ?? {}),
48
+ resource
49
+ })
50
+ provider.addSpanProcessor(processor)
51
+ return provider
52
+ }),
53
+ (provider) => Effect.promise(() => provider.shutdown())
54
+ )
55
+ )
56
+ )
57
+
58
+ /**
59
+ * @since 1.0.0
60
+ * @category layer
61
+ */
62
+ export const layer = (
63
+ evaluate: LazyArg<Configuration>
64
+ ): Layer.Layer<never, never, Resource.Resource> =>
65
+ Layer.unwrapEffect(
66
+ Effect.sync(() => {
67
+ const config = evaluate()
68
+ const ResourceLive = Resource.layer(config.resource)
69
+ const TracerLive = config.spanProcessor ?
70
+ Tracer.layer.pipe(Layer.use(layerTracerProvider(config.spanProcessor, config.tracerConfig)))
71
+ : Layer.effectDiscard(Effect.unit)
72
+ const MetricsLive = config.metricReader
73
+ ? Metrics.layer(() => config.metricReader!)
74
+ : Layer.effectDiscard(Effect.unit)
75
+ return Layer.merge(TracerLive, MetricsLive).pipe(
76
+ Layer.useMerge(ResourceLive)
77
+ )
78
+ })
79
+ )
package/src/index.ts CHANGED
@@ -17,3 +17,8 @@ export * as Resource from "@effect/opentelemetry/Resource"
17
17
  * @since 1.0.0
18
18
  */
19
19
  export * as Tracer from "@effect/opentelemetry/Tracer"
20
+
21
+ /**
22
+ * @since 1.0.0
23
+ */
24
+ export * as WebSdk from "@effect/opentelemetry/WebSdk"
@@ -4,31 +4,29 @@ import * as Context from "effect/Context"
4
4
  import * as Effect from "effect/Effect"
5
5
  import type { Exit } from "effect/Exit"
6
6
  import * as FiberRef from "effect/FiberRef"
7
- import * as FiberRefs from "effect/FiberRefs"
8
7
  import * as Layer from "effect/Layer"
9
- import * as List from "effect/List"
10
8
  import * as Option from "effect/Option"
11
- import * as Tracer from "effect/Tracer"
9
+ import * as EffectTracer from "effect/Tracer"
12
10
  import { Resource } from "../Resource"
13
11
 
14
12
  /** @internal */
15
- export class OtelSpan implements Tracer.Span {
13
+ export class OtelSpan implements EffectTracer.Span {
16
14
  readonly _tag = "Span"
17
15
 
18
16
  readonly span: OtelApi.Span
19
17
  readonly spanId: string
20
18
  readonly traceId: string
21
19
  readonly attributes = new Map<string, unknown>()
22
- status: Tracer.SpanStatus
20
+ readonly sampled: boolean
21
+ status: EffectTracer.SpanStatus
23
22
 
24
23
  constructor(
25
24
  contextApi: OtelApi.ContextAPI,
26
25
  tracer: OtelApi.Tracer,
27
26
  readonly name: string,
28
- readonly parent: Option.Option<Tracer.ParentSpan>,
27
+ readonly parent: Option.Option<EffectTracer.ParentSpan>,
29
28
  readonly context: Context.Context<never>,
30
- readonly links: ReadonlyArray<Tracer.SpanLink>,
31
- readonly sampled: boolean,
29
+ readonly links: ReadonlyArray<EffectTracer.SpanLink>,
32
30
  startTime: bigint
33
31
  ) {
34
32
  const active = contextApi.active()
@@ -54,6 +52,7 @@ export class OtelSpan implements Tracer.Span {
54
52
  _tag: "Started",
55
53
  startTime
56
54
  }
55
+ this.sampled = (spanContext.traceFlags & OtelApi.TraceFlags.SAMPLED) === OtelApi.TraceFlags.SAMPLED
57
56
  }
58
57
 
59
58
  attribute(key: string, value: unknown) {
@@ -101,12 +100,15 @@ export class OtelSpan implements Tracer.Span {
101
100
  }
102
101
 
103
102
  /** @internal */
104
- export const OtelTracer = Context.Tag<OtelApi.Tracer>("@effect/opentelemetry/Tracer/OtelTracer")
103
+ export const TracerProvider = Context.Tag<OtelApi.TracerProvider>("@effect/opentelemetry/Tracer/TracerProvider")
105
104
 
106
105
  /** @internal */
107
- export const make = Effect.map(OtelTracer, (tracer) =>
108
- Tracer.make({
109
- span(name, parent, context, links, sampled, startTime) {
106
+ export const Tracer = Context.Tag<OtelApi.Tracer>("@effect/opentelemetry/Tracer/Tracer")
107
+
108
+ /** @internal */
109
+ export const make = Effect.map(Tracer, (tracer) =>
110
+ EffectTracer.make({
111
+ span(name, parent, context, links, startTime) {
110
112
  return new OtelSpan(
111
113
  OtelApi.context,
112
114
  tracer,
@@ -114,32 +116,25 @@ export const make = Effect.map(OtelTracer, (tracer) =>
114
116
  parent,
115
117
  context,
116
118
  links,
117
- sampled,
118
119
  startTime
119
120
  )
120
121
  },
121
122
  context(execution, fiber) {
122
- const currentSpan = Option.flatMap(
123
- FiberRefs.get(
124
- fiber.getFiberRefs(),
125
- FiberRef.currentTracerSpan
126
- ),
127
- List.head
128
- )
123
+ const currentSpan = fiber.getFiberRef(FiberRef.currentContext).unsafeMap.get(EffectTracer.ParentSpan) as
124
+ | EffectTracer.ParentSpan
125
+ | undefined
129
126
 
130
- if (currentSpan._tag === "None") {
127
+ if (currentSpan === undefined) {
131
128
  return execution()
132
129
  }
133
130
 
134
131
  return OtelApi.context.with(
135
- populateContext(OtelApi.context.active(), currentSpan.value),
132
+ populateContext(OtelApi.context.active(), currentSpan),
136
133
  execution
137
134
  )
138
135
  }
139
136
  }))
140
137
 
141
- /** @internal */
142
-
143
138
  /** @internal */
144
139
  export const traceFlagsTag = Context.Tag<OtelApi.TraceFlags>("@effect/opentelemetry/traceFlags")
145
140
 
@@ -152,7 +147,7 @@ export const makeExternalSpan = (options: {
152
147
  readonly spanId: string
153
148
  readonly traceFlags?: number
154
149
  readonly traceState?: string | OtelApi.TraceState
155
- }): Tracer.ExternalSpan => {
150
+ }): EffectTracer.ExternalSpan => {
156
151
  let context = Context.empty()
157
152
 
158
153
  if (options.traceFlags) {
@@ -173,7 +168,7 @@ export const makeExternalSpan = (options: {
173
168
  traceId: options.traceId,
174
169
  spanId: options.spanId,
175
170
  sampled: options.traceFlags
176
- ? options.traceFlags === OtelApi.TraceFlags.SAMPLED
171
+ ? (options.traceFlags & OtelApi.TraceFlags.SAMPLED) === OtelApi.TraceFlags.SAMPLED
177
172
  : true,
178
173
  context
179
174
  }
@@ -190,13 +185,19 @@ export const currentOtelSpan = Effect.map(
190
185
  )
191
186
 
192
187
  /** @internal */
193
- export const layerOtelTracer = Layer.effect(
194
- OtelTracer,
188
+ export const layerGlobalProvider = Layer.sync(
189
+ TracerProvider,
190
+ () => OtelApi.trace.getTracerProvider()
191
+ )
192
+
193
+ /** @internal */
194
+ export const layerTracer = Layer.effect(
195
+ Tracer,
195
196
  Effect.flatMap(
196
- Resource,
197
- (resource) =>
197
+ Effect.zip(Resource, TracerProvider),
198
+ ([resource, provider]) =>
198
199
  Effect.sync(() =>
199
- OtelApi.trace.getTracer(
200
+ provider.getTracer(
200
201
  resource.attributes["service.name"] as string,
201
202
  resource.attributes["service.version"] as string
202
203
  )
@@ -205,9 +206,18 @@ export const layerOtelTracer = Layer.effect(
205
206
  )
206
207
 
207
208
  /** @internal */
208
- export const layer = Layer.provide(
209
- layerOtelTracer,
210
- Layer.unwrapEffect(Effect.map(make, Layer.setTracer))
209
+ export const layerGlobalTracer = layerTracer.pipe(
210
+ Layer.use(layerGlobalProvider)
211
+ )
212
+
213
+ /** @internal */
214
+ export const layerGlobal = Layer.unwrapEffect(Effect.map(make, Layer.setTracer)).pipe(
215
+ Layer.use(layerGlobalTracer)
216
+ )
217
+
218
+ /** @internal */
219
+ export const layer = Layer.unwrapEffect(Effect.map(make, Layer.setTracer)).pipe(
220
+ Layer.use(layerTracer)
211
221
  )
212
222
 
213
223
  // -------------------------------------------------------------------------------------
@@ -223,14 +233,14 @@ const createTraceState = Option.liftThrowable(OtelApi.createTraceState)
223
233
 
224
234
  const populateContext = (
225
235
  otelContext: OtelApi.Context,
226
- span: Tracer.ParentSpan,
236
+ span: EffectTracer.ParentSpan,
227
237
  context?: Context.Context<never>
228
238
  ): OtelApi.Context =>
229
239
  span instanceof OtelSpan ?
230
240
  OtelApi.trace.setSpan(otelContext, span.span) :
231
241
  OtelApi.trace.setSpanContext(otelContext, makeSpanContext(span, context))
232
242
 
233
- const makeSpanContext = (span: Tracer.ParentSpan, context?: Context.Context<never>): OtelApi.SpanContext => ({
243
+ const makeSpanContext = (span: EffectTracer.ParentSpan, context?: Context.Context<never>): OtelApi.SpanContext => ({
234
244
  spanId: span.spanId,
235
245
  traceId: span.traceId,
236
246
  isRemote: span._tag === "ExternalSpan",
@@ -248,7 +258,7 @@ const makeSpanContext = (span: Tracer.ParentSpan, context?: Context.Context<neve
248
258
  })
249
259
 
250
260
  const extractTraceTag = <I, S>(
251
- parent: Tracer.ParentSpan,
261
+ parent: EffectTracer.ParentSpan,
252
262
  context: Context.Context<never>,
253
263
  tag: Context.Tag<I, S>
254
264
  ) =>