@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.
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.dev.js +30 -12
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.mjs +2 -2
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.prod.js +30 -12
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.esm.js +21 -13
- package/Tracer/dist/effect-opentelemetry-Tracer.cjs.dev.js +51 -24
- package/Tracer/dist/effect-opentelemetry-Tracer.cjs.mjs +5 -2
- package/Tracer/dist/effect-opentelemetry-Tracer.cjs.prod.js +51 -24
- package/Tracer/dist/effect-opentelemetry-Tracer.esm.js +22 -4
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.mts +2 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.mts.map +1 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.ts +2 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.d.ts.map +1 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.dev.js +81 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.js +7 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.mjs +4 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.cjs.prod.js +81 -0
- package/WebSdk/dist/effect-opentelemetry-WebSdk.esm.js +42 -0
- package/WebSdk/package.json +4 -0
- package/dist/declarations/src/NodeSdk.d.ts +18 -6
- package/dist/declarations/src/NodeSdk.d.ts.map +1 -1
- package/dist/declarations/src/Tracer.d.ts +20 -5
- package/dist/declarations/src/Tracer.d.ts.map +1 -1
- package/dist/declarations/src/WebSdk.d.ts +35 -0
- package/dist/declarations/src/WebSdk.d.ts.map +1 -0
- package/dist/declarations/src/index.d.ts +4 -0
- package/dist/declarations/src/index.d.ts.map +1 -1
- package/dist/effect-opentelemetry.cjs.dev.js +3 -0
- package/dist/effect-opentelemetry.cjs.mjs +2 -1
- package/dist/effect-opentelemetry.cjs.prod.js +3 -0
- package/dist/effect-opentelemetry.esm.js +2 -0
- package/internal/tracer.esm.js +26 -18
- package/package.json +28 -17
- package/src/NodeSdk.ts +60 -20
- package/src/Tracer.ts +23 -5
- package/src/WebSdk.ts +79 -0
- package/src/index.ts +5 -0
- 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.
|
|
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-
|
|
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.
|
|
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/
|
|
66
|
-
"@opentelemetry/exporter-
|
|
67
|
-
"@opentelemetry/
|
|
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.
|
|
70
|
-
"@types/node": "^20.8.
|
|
71
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
72
|
-
"@typescript-eslint/parser": "^6.
|
|
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.
|
|
78
|
-
"effect": "2.0.0-next.
|
|
79
|
-
"eslint": "^8.
|
|
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.
|
|
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.
|
|
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
|
|
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 {
|
|
5
|
-
import
|
|
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
|
|
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
|
|
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
|
|
33
|
+
* @category layers
|
|
20
34
|
*/
|
|
21
|
-
export const
|
|
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
|
-
|
|
29
|
-
): Layer.Layer<
|
|
30
|
-
Layer.
|
|
31
|
-
Effect.
|
|
32
|
-
|
|
33
|
-
(resource)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
package/src/internal/tracer.ts
CHANGED
|
@@ -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
|
|
9
|
+
import * as EffectTracer from "effect/Tracer"
|
|
12
10
|
import { Resource } from "../Resource"
|
|
13
11
|
|
|
14
12
|
/** @internal */
|
|
15
|
-
export class OtelSpan implements
|
|
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
|
-
|
|
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<
|
|
27
|
+
readonly parent: Option.Option<EffectTracer.ParentSpan>,
|
|
29
28
|
readonly context: Context.Context<never>,
|
|
30
|
-
readonly links: ReadonlyArray<
|
|
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
|
|
103
|
+
export const TracerProvider = Context.Tag<OtelApi.TracerProvider>("@effect/opentelemetry/Tracer/TracerProvider")
|
|
105
104
|
|
|
106
105
|
/** @internal */
|
|
107
|
-
export const
|
|
108
|
-
|
|
109
|
-
|
|
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 =
|
|
123
|
-
|
|
124
|
-
|
|
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
|
|
127
|
+
if (currentSpan === undefined) {
|
|
131
128
|
return execution()
|
|
132
129
|
}
|
|
133
130
|
|
|
134
131
|
return OtelApi.context.with(
|
|
135
|
-
populateContext(OtelApi.context.active(), currentSpan
|
|
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
|
-
}):
|
|
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
|
|
194
|
-
|
|
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
|
-
|
|
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
|
|
209
|
-
|
|
210
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
261
|
+
parent: EffectTracer.ParentSpan,
|
|
252
262
|
context: Context.Context<never>,
|
|
253
263
|
tag: Context.Tag<I, S>
|
|
254
264
|
) =>
|