@effect/opentelemetry 0.18.0 → 0.20.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.
@@ -5,7 +5,15 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var sdkNode = require('@opentelemetry/sdk-node');
6
6
  var Effect = require('effect/Effect');
7
7
  var Layer = require('effect/Layer');
8
+ var Metrics_dist_effectOpentelemetryMetrics = require('../../Metrics/dist/effect-opentelemetry-Metrics.cjs.dev.js');
8
9
  var Resource_dist_effectOpentelemetryResource = require('../../Resource/dist/effect-opentelemetry-Resource.cjs.dev.js');
10
+ require('@opentelemetry/api');
11
+ require('@opentelemetry/sdk-metrics');
12
+ require('effect/HashSet');
13
+ require('effect/Metric');
14
+ require('effect/MetricKeyType');
15
+ require('effect/MetricState');
16
+ require('effect/Option');
9
17
  require('@opentelemetry/resources');
10
18
  require('@opentelemetry/semantic-conventions');
11
19
  require('effect/Context');
@@ -45,19 +53,25 @@ var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
45
53
  * @category constructor
46
54
  */
47
55
  const config = config => config;
48
-
49
- /**
50
- * @since 1.0.0
51
- * @category layer
52
- */
53
- const layer = config => Layer__namespace.scopedDiscard(Effect__namespace.acquireRelease(Effect__namespace.flatMap(Resource_dist_effectOpentelemetryResource.Resource, resource => Effect__namespace.sync(() => {
56
+ const make = config => Effect__namespace.flatMap(Resource_dist_effectOpentelemetryResource.Resource, resource => Effect__namespace.acquireRelease(Effect__namespace.sync(() => {
54
57
  const sdk = new sdkNode.NodeSDK({
55
- ...config(),
58
+ ...config,
59
+ metricReader: undefined,
56
60
  resource
57
61
  });
58
62
  sdk.start();
59
63
  return sdk;
60
- })), sdk => Effect__namespace.promise(() => sdk.shutdown())));
64
+ }), sdk => Effect__namespace.promise(() => sdk.shutdown())));
65
+
66
+ /**
67
+ * @since 1.0.0
68
+ * @category layer
69
+ */
70
+ const layer = evaluate => Layer__namespace.unwrapEffect(Effect__namespace.sync(() => {
71
+ const config = evaluate();
72
+ const Tracing = Layer__namespace.scopedDiscard(make(config));
73
+ return config.metricReader ? Layer__namespace.merge(Tracing, Metrics_dist_effectOpentelemetryMetrics.layer(() => config.metricReader)) : Tracing;
74
+ }));
61
75
 
62
76
  exports.config = config;
63
77
  exports.layer = layer;
@@ -5,7 +5,15 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var sdkNode = require('@opentelemetry/sdk-node');
6
6
  var Effect = require('effect/Effect');
7
7
  var Layer = require('effect/Layer');
8
+ var Metrics_dist_effectOpentelemetryMetrics = require('../../Metrics/dist/effect-opentelemetry-Metrics.cjs.prod.js');
8
9
  var Resource_dist_effectOpentelemetryResource = require('../../Resource/dist/effect-opentelemetry-Resource.cjs.prod.js');
10
+ require('@opentelemetry/api');
11
+ require('@opentelemetry/sdk-metrics');
12
+ require('effect/HashSet');
13
+ require('effect/Metric');
14
+ require('effect/MetricKeyType');
15
+ require('effect/MetricState');
16
+ require('effect/Option');
9
17
  require('@opentelemetry/resources');
10
18
  require('@opentelemetry/semantic-conventions');
11
19
  require('effect/Context');
@@ -45,19 +53,25 @@ var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
45
53
  * @category constructor
46
54
  */
47
55
  const config = config => config;
48
-
49
- /**
50
- * @since 1.0.0
51
- * @category layer
52
- */
53
- const layer = config => Layer__namespace.scopedDiscard(Effect__namespace.acquireRelease(Effect__namespace.flatMap(Resource_dist_effectOpentelemetryResource.Resource, resource => Effect__namespace.sync(() => {
56
+ const make = config => Effect__namespace.flatMap(Resource_dist_effectOpentelemetryResource.Resource, resource => Effect__namespace.acquireRelease(Effect__namespace.sync(() => {
54
57
  const sdk = new sdkNode.NodeSDK({
55
- ...config(),
58
+ ...config,
59
+ metricReader: undefined,
56
60
  resource
57
61
  });
58
62
  sdk.start();
59
63
  return sdk;
60
- })), sdk => Effect__namespace.promise(() => sdk.shutdown())));
64
+ }), sdk => Effect__namespace.promise(() => sdk.shutdown())));
65
+
66
+ /**
67
+ * @since 1.0.0
68
+ * @category layer
69
+ */
70
+ const layer = evaluate => Layer__namespace.unwrapEffect(Effect__namespace.sync(() => {
71
+ const config = evaluate();
72
+ const Tracing = Layer__namespace.scopedDiscard(make(config));
73
+ return config.metricReader ? Layer__namespace.merge(Tracing, Metrics_dist_effectOpentelemetryMetrics.layer(() => config.metricReader)) : Tracing;
74
+ }));
61
75
 
62
76
  exports.config = config;
63
77
  exports.layer = layer;
@@ -1,6 +1,7 @@
1
1
  import { NodeSDK } from '@opentelemetry/sdk-node';
2
2
  import * as Effect from 'effect/Effect';
3
3
  import * as Layer from 'effect/Layer';
4
+ import { layer as layer$1 } from '../../Metrics/dist/effect-opentelemetry-Metrics.esm.js';
4
5
  import { Resource } from '../../Resource/dist/effect-opentelemetry-Resource.esm.js';
5
6
 
6
7
  /**
@@ -17,18 +18,24 @@ import { Resource } from '../../Resource/dist/effect-opentelemetry-Resource.esm.
17
18
  * @category constructor
18
19
  */
19
20
  const config = config => config;
20
-
21
- /**
22
- * @since 1.0.0
23
- * @category layer
24
- */
25
- const layer = config => Layer.scopedDiscard(Effect.acquireRelease(Effect.flatMap(Resource, resource => Effect.sync(() => {
21
+ const make = config => Effect.flatMap(Resource, resource => Effect.acquireRelease(Effect.sync(() => {
26
22
  const sdk = new NodeSDK({
27
- ...config(),
23
+ ...config,
24
+ metricReader: undefined,
28
25
  resource
29
26
  });
30
27
  sdk.start();
31
28
  return sdk;
32
- })), sdk => Effect.promise(() => sdk.shutdown())));
29
+ }), sdk => Effect.promise(() => sdk.shutdown())));
30
+
31
+ /**
32
+ * @since 1.0.0
33
+ * @category layer
34
+ */
35
+ const layer = evaluate => Layer.unwrapEffect(Effect.sync(() => {
36
+ const config = evaluate();
37
+ const Tracing = Layer.scopedDiscard(make(config));
38
+ return config.metricReader ? Layer.merge(Tracing, layer$1(() => config.metricReader)) : Tracing;
39
+ }));
33
40
 
34
41
  export { config, layer };
@@ -7,9 +7,7 @@ var Cause = require('effect/Cause');
7
7
  var Context = require('effect/Context');
8
8
  var Effect = require('effect/Effect');
9
9
  var FiberRef = require('effect/FiberRef');
10
- var FiberRefs = require('effect/FiberRefs');
11
10
  var Layer = require('effect/Layer');
12
- var List = require('effect/List');
13
11
  var Option = require('effect/Option');
14
12
  var Tracer = require('effect/Tracer');
15
13
  var Resource_dist_effectOpentelemetryResource = require('../../Resource/dist/effect-opentelemetry-Resource.cjs.dev.js');
@@ -39,9 +37,7 @@ var Cause__namespace = /*#__PURE__*/_interopNamespace(Cause);
39
37
  var Context__namespace = /*#__PURE__*/_interopNamespace(Context);
40
38
  var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
41
39
  var FiberRef__namespace = /*#__PURE__*/_interopNamespace(FiberRef);
42
- var FiberRefs__namespace = /*#__PURE__*/_interopNamespace(FiberRefs);
43
40
  var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
44
- var List__namespace = /*#__PURE__*/_interopNamespace(List);
45
41
  var Option__namespace = /*#__PURE__*/_interopNamespace(Option);
46
42
  var Tracer__namespace = /*#__PURE__*/_interopNamespace(Tracer);
47
43
 
@@ -49,12 +45,11 @@ var Tracer__namespace = /*#__PURE__*/_interopNamespace(Tracer);
49
45
  class OtelSpan {
50
46
  _tag = "Span";
51
47
  attributes = new Map();
52
- constructor(contextApi, tracer, name, parent, context, links, sampled, startTime) {
48
+ constructor(contextApi, tracer, name, parent, context, links, startTime) {
53
49
  this.name = name;
54
50
  this.parent = parent;
55
51
  this.context = context;
56
52
  this.links = links;
57
- this.sampled = sampled;
58
53
  const active = contextApi.active();
59
54
  this.span = tracer.startSpan(name, {
60
55
  startTime: nanosToHrTime(startTime),
@@ -70,6 +65,7 @@ class OtelSpan {
70
65
  _tag: "Started",
71
66
  startTime
72
67
  };
68
+ this.sampled = (spanContext.traceFlags & OtelApi__namespace.TraceFlags.SAMPLED) === OtelApi__namespace.TraceFlags.SAMPLED;
73
69
  }
74
70
  attribute(key, value) {
75
71
  this.span.setAttribute(key, unknownToAttributeValue(value));
@@ -113,20 +109,18 @@ const OtelTracer$1 = /*#__PURE__*/Context__namespace.Tag("@effect/opentelemetry/
113
109
 
114
110
  /** @internal */
115
111
  const make$1 = /*#__PURE__*/Effect__namespace.map(OtelTracer$1, tracer => Tracer__namespace.make({
116
- span(name, parent, context, links, sampled, startTime) {
117
- return new OtelSpan(OtelApi__namespace.context, tracer, name, parent, context, links, sampled, startTime);
112
+ span(name, parent, context, links, startTime) {
113
+ return new OtelSpan(OtelApi__namespace.context, tracer, name, parent, context, links, startTime);
118
114
  },
119
115
  context(execution, fiber) {
120
- const currentSpan = Option__namespace.flatMap(FiberRefs__namespace.get(fiber.getFiberRefs(), FiberRef__namespace.currentTracerSpan), List__namespace.head);
121
- if (currentSpan._tag === "None") {
116
+ const currentSpan = fiber.getFiberRef(FiberRef__namespace.currentContext).unsafeMap.get(Tracer__namespace.ParentSpan);
117
+ if (currentSpan === undefined) {
122
118
  return execution();
123
119
  }
124
- return OtelApi__namespace.context.with(populateContext(OtelApi__namespace.context.active(), currentSpan.value), execution);
120
+ return OtelApi__namespace.context.with(populateContext(OtelApi__namespace.context.active(), currentSpan), execution);
125
121
  }
126
122
  }));
127
123
 
128
- /** @internal */
129
-
130
124
  /** @internal */
131
125
  const traceFlagsTag = /*#__PURE__*/Context__namespace.Tag("@effect/opentelemetry/traceFlags");
132
126
 
@@ -151,7 +145,7 @@ const makeExternalSpan$1 = options => {
151
145
  _tag: "ExternalSpan",
152
146
  traceId: options.traceId,
153
147
  spanId: options.spanId,
154
- sampled: options.traceFlags ? options.traceFlags === OtelApi__namespace.TraceFlags.SAMPLED : true,
148
+ sampled: options.traceFlags ? (options.traceFlags & OtelApi__namespace.TraceFlags.SAMPLED) === OtelApi__namespace.TraceFlags.SAMPLED : true,
155
149
  context
156
150
  };
157
151
  };
@@ -7,9 +7,7 @@ var Cause = require('effect/Cause');
7
7
  var Context = require('effect/Context');
8
8
  var Effect = require('effect/Effect');
9
9
  var FiberRef = require('effect/FiberRef');
10
- var FiberRefs = require('effect/FiberRefs');
11
10
  var Layer = require('effect/Layer');
12
- var List = require('effect/List');
13
11
  var Option = require('effect/Option');
14
12
  var Tracer = require('effect/Tracer');
15
13
  var Resource_dist_effectOpentelemetryResource = require('../../Resource/dist/effect-opentelemetry-Resource.cjs.prod.js');
@@ -39,9 +37,7 @@ var Cause__namespace = /*#__PURE__*/_interopNamespace(Cause);
39
37
  var Context__namespace = /*#__PURE__*/_interopNamespace(Context);
40
38
  var Effect__namespace = /*#__PURE__*/_interopNamespace(Effect);
41
39
  var FiberRef__namespace = /*#__PURE__*/_interopNamespace(FiberRef);
42
- var FiberRefs__namespace = /*#__PURE__*/_interopNamespace(FiberRefs);
43
40
  var Layer__namespace = /*#__PURE__*/_interopNamespace(Layer);
44
- var List__namespace = /*#__PURE__*/_interopNamespace(List);
45
41
  var Option__namespace = /*#__PURE__*/_interopNamespace(Option);
46
42
  var Tracer__namespace = /*#__PURE__*/_interopNamespace(Tracer);
47
43
 
@@ -49,12 +45,11 @@ var Tracer__namespace = /*#__PURE__*/_interopNamespace(Tracer);
49
45
  class OtelSpan {
50
46
  _tag = "Span";
51
47
  attributes = new Map();
52
- constructor(contextApi, tracer, name, parent, context, links, sampled, startTime) {
48
+ constructor(contextApi, tracer, name, parent, context, links, startTime) {
53
49
  this.name = name;
54
50
  this.parent = parent;
55
51
  this.context = context;
56
52
  this.links = links;
57
- this.sampled = sampled;
58
53
  const active = contextApi.active();
59
54
  this.span = tracer.startSpan(name, {
60
55
  startTime: nanosToHrTime(startTime),
@@ -70,6 +65,7 @@ class OtelSpan {
70
65
  _tag: "Started",
71
66
  startTime
72
67
  };
68
+ this.sampled = (spanContext.traceFlags & OtelApi__namespace.TraceFlags.SAMPLED) === OtelApi__namespace.TraceFlags.SAMPLED;
73
69
  }
74
70
  attribute(key, value) {
75
71
  this.span.setAttribute(key, unknownToAttributeValue(value));
@@ -113,20 +109,18 @@ const OtelTracer$1 = /*#__PURE__*/Context__namespace.Tag("@effect/opentelemetry/
113
109
 
114
110
  /** @internal */
115
111
  const make$1 = /*#__PURE__*/Effect__namespace.map(OtelTracer$1, tracer => Tracer__namespace.make({
116
- span(name, parent, context, links, sampled, startTime) {
117
- return new OtelSpan(OtelApi__namespace.context, tracer, name, parent, context, links, sampled, startTime);
112
+ span(name, parent, context, links, startTime) {
113
+ return new OtelSpan(OtelApi__namespace.context, tracer, name, parent, context, links, startTime);
118
114
  },
119
115
  context(execution, fiber) {
120
- const currentSpan = Option__namespace.flatMap(FiberRefs__namespace.get(fiber.getFiberRefs(), FiberRef__namespace.currentTracerSpan), List__namespace.head);
121
- if (currentSpan._tag === "None") {
116
+ const currentSpan = fiber.getFiberRef(FiberRef__namespace.currentContext).unsafeMap.get(Tracer__namespace.ParentSpan);
117
+ if (currentSpan === undefined) {
122
118
  return execution();
123
119
  }
124
- return OtelApi__namespace.context.with(populateContext(OtelApi__namespace.context.active(), currentSpan.value), execution);
120
+ return OtelApi__namespace.context.with(populateContext(OtelApi__namespace.context.active(), currentSpan), execution);
125
121
  }
126
122
  }));
127
123
 
128
- /** @internal */
129
-
130
124
  /** @internal */
131
125
  const traceFlagsTag = /*#__PURE__*/Context__namespace.Tag("@effect/opentelemetry/traceFlags");
132
126
 
@@ -151,7 +145,7 @@ const makeExternalSpan$1 = options => {
151
145
  _tag: "ExternalSpan",
152
146
  traceId: options.traceId,
153
147
  spanId: options.spanId,
154
- sampled: options.traceFlags ? options.traceFlags === OtelApi__namespace.TraceFlags.SAMPLED : true,
148
+ sampled: options.traceFlags ? (options.traceFlags & OtelApi__namespace.TraceFlags.SAMPLED) === OtelApi__namespace.TraceFlags.SAMPLED : true,
155
149
  context
156
150
  };
157
151
  };
@@ -19,5 +19,5 @@ export declare const config: (config: Configuration) => Configuration;
19
19
  * @since 1.0.0
20
20
  * @category layer
21
21
  */
22
- export declare const layer: (config: LazyArg<Configuration>) => Layer.Layer<Resource, never, never>;
22
+ export declare const layer: (evaluate: LazyArg<Configuration>) => Layer.Layer<Resource, never, never>;
23
23
  //# sourceMappingURL=NodeSdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeSdk.d.ts","sourceRoot":"../../../src","sources":["NodeSdk.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAGnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,sBAAkB;AAErC;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,CAAA;AAE3F;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAiD,CAAA;AAEjG;;;GAGG;AACH,eAAO,MAAM,KAAK,WACR,QAAQ,aAAa,CAAC,KAC7B,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAYjC,CAAA"}
1
+ {"version":3,"file":"NodeSdk.d.ts","sourceRoot":"../../../src","sources":["NodeSdk.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAGnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,QAAQ,EAAE,sBAAkB;AAErC;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,CAAA;AAE3F;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAiD,CAAA;AAajG;;;GAGG;AACH,eAAO,MAAM,KAAK,aACN,QAAQ,aAAa,CAAC,KAC/B,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAYlC,CAAA"}
@@ -3,9 +3,7 @@ import * as Cause from 'effect/Cause';
3
3
  import * as Context from 'effect/Context';
4
4
  import * as Effect from 'effect/Effect';
5
5
  import * as FiberRef from 'effect/FiberRef';
6
- import * as FiberRefs from 'effect/FiberRefs';
7
6
  import * as Layer from 'effect/Layer';
8
- import * as List from 'effect/List';
9
7
  import * as Option from 'effect/Option';
10
8
  import * as Tracer from 'effect/Tracer';
11
9
  import { Resource } from '../Resource/dist/effect-opentelemetry-Resource.esm.js';
@@ -14,12 +12,11 @@ import { Resource } from '../Resource/dist/effect-opentelemetry-Resource.esm.js'
14
12
  class OtelSpan {
15
13
  _tag = "Span";
16
14
  attributes = new Map();
17
- constructor(contextApi, tracer, name, parent, context, links, sampled, startTime) {
15
+ constructor(contextApi, tracer, name, parent, context, links, startTime) {
18
16
  this.name = name;
19
17
  this.parent = parent;
20
18
  this.context = context;
21
19
  this.links = links;
22
- this.sampled = sampled;
23
20
  const active = contextApi.active();
24
21
  this.span = tracer.startSpan(name, {
25
22
  startTime: nanosToHrTime(startTime),
@@ -35,6 +32,7 @@ class OtelSpan {
35
32
  _tag: "Started",
36
33
  startTime
37
34
  };
35
+ this.sampled = (spanContext.traceFlags & OtelApi.TraceFlags.SAMPLED) === OtelApi.TraceFlags.SAMPLED;
38
36
  }
39
37
  attribute(key, value) {
40
38
  this.span.setAttribute(key, unknownToAttributeValue(value));
@@ -78,20 +76,18 @@ const OtelTracer = /*#__PURE__*/Context.Tag("@effect/opentelemetry/Tracer/OtelTr
78
76
 
79
77
  /** @internal */
80
78
  const make = /*#__PURE__*/Effect.map(OtelTracer, tracer => Tracer.make({
81
- span(name, parent, context, links, sampled, startTime) {
82
- return new OtelSpan(OtelApi.context, tracer, name, parent, context, links, sampled, startTime);
79
+ span(name, parent, context, links, startTime) {
80
+ return new OtelSpan(OtelApi.context, tracer, name, parent, context, links, startTime);
83
81
  },
84
82
  context(execution, fiber) {
85
- const currentSpan = Option.flatMap(FiberRefs.get(fiber.getFiberRefs(), FiberRef.currentTracerSpan), List.head);
86
- if (currentSpan._tag === "None") {
83
+ const currentSpan = fiber.getFiberRef(FiberRef.currentContext).unsafeMap.get(Tracer.ParentSpan);
84
+ if (currentSpan === undefined) {
87
85
  return execution();
88
86
  }
89
- return OtelApi.context.with(populateContext(OtelApi.context.active(), currentSpan.value), execution);
87
+ return OtelApi.context.with(populateContext(OtelApi.context.active(), currentSpan), execution);
90
88
  }
91
89
  }));
92
90
 
93
- /** @internal */
94
-
95
91
  /** @internal */
96
92
  const traceFlagsTag = /*#__PURE__*/Context.Tag("@effect/opentelemetry/traceFlags");
97
93
 
@@ -116,7 +112,7 @@ const makeExternalSpan = options => {
116
112
  _tag: "ExternalSpan",
117
113
  traceId: options.traceId,
118
114
  spanId: options.spanId,
119
- sampled: options.traceFlags ? options.traceFlags === OtelApi.TraceFlags.SAMPLED : true,
115
+ sampled: options.traceFlags ? (options.traceFlags & OtelApi.TraceFlags.SAMPLED) === OtelApi.TraceFlags.SAMPLED : true,
120
116
  context
121
117
  };
122
118
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/opentelemetry",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -42,40 +42,41 @@
42
42
  },
43
43
  "packageManager": "pnpm@8.6.10",
44
44
  "dependencies": {
45
- "@opentelemetry/resources": "^1.17.0",
46
- "@opentelemetry/sdk-metrics": "^1.17.0",
47
- "@opentelemetry/sdk-node": "^0.43.0",
48
- "@opentelemetry/semantic-conventions": "^1.17.0"
45
+ "@opentelemetry/resources": "^1.17.1",
46
+ "@opentelemetry/sdk-metrics": "^1.17.1",
47
+ "@opentelemetry/sdk-node": "^0.44.0",
48
+ "@opentelemetry/semantic-conventions": "^1.17.1"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@opentelemetry/api": "^1.4",
52
- "effect": "2.0.0-next.48"
52
+ "effect": "2.0.0-next.50"
53
53
  },
54
54
  "devDependencies": {
55
- "@babel/core": "^7.23.0",
56
- "@babel/preset-typescript": "^7.23.0",
55
+ "@babel/core": "^7.23.2",
56
+ "@babel/preset-typescript": "^7.23.2",
57
57
  "@changesets/changelog-github": "^0.4.8",
58
58
  "@changesets/cli": "^2.26.2",
59
59
  "@effect/babel-plugin": "^0.2.0",
60
60
  "@effect/build-utils": "^0.1.9",
61
- "@effect/docgen": "^0.1.8",
61
+ "@effect/docgen": "^0.2.0",
62
62
  "@effect/eslint-plugin": "^0.1.2",
63
63
  "@effect/language-service": "^0.0.21",
64
64
  "@opentelemetry/api": "^1.6.0",
65
- "@opentelemetry/exporter-prometheus": "^0.43.0",
66
- "@opentelemetry/exporter-trace-otlp-http": "^0.43.0",
67
- "@opentelemetry/sdk-trace-base": "^1.17.0",
65
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.44.0",
66
+ "@opentelemetry/exporter-prometheus": "^0.44.0",
67
+ "@opentelemetry/exporter-trace-otlp-http": "^0.44.0",
68
+ "@opentelemetry/sdk-trace-base": "^1.17.1",
68
69
  "@preconstruct/cli": "^2.8.1",
69
- "@types/chai": "^4.3.7",
70
- "@types/node": "^20.8.4",
71
- "@typescript-eslint/eslint-plugin": "^6.7.5",
72
- "@typescript-eslint/parser": "^6.7.5",
70
+ "@types/chai": "^4.3.9",
71
+ "@types/node": "^20.8.7",
72
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
73
+ "@typescript-eslint/parser": "^6.8.0",
73
74
  "@vitejs/plugin-react": "^4.1.0",
74
75
  "@vitest/coverage-v8": "^0.34.6",
75
76
  "@vitest/expect": "^0.34.6",
76
77
  "babel-plugin-annotate-pure-calls": "^0.4.0",
77
78
  "concurrently": "^8.2.1",
78
- "effect": "2.0.0-next.48",
79
+ "effect": "2.0.0-next.50",
79
80
  "eslint": "^8.51.0",
80
81
  "eslint-import-resolver-typescript": "^3.6.1",
81
82
  "eslint-plugin-codegen": "0.17.0",
@@ -86,7 +87,7 @@
86
87
  "madge": "^6.1.0",
87
88
  "ts-node": "^10.9.1",
88
89
  "typescript": "^5.2.2",
89
- "vite": "^4.4.11",
90
+ "vite": "^4.5.0",
90
91
  "vitest": "0.34.6"
91
92
  },
92
93
  "exports": {
@@ -132,7 +133,7 @@
132
133
  "Tracer"
133
134
  ],
134
135
  "scripts": {
135
- "example": "ts-node --project tsconfig.examples.json",
136
+ "example": "node -r ts-node/register",
136
137
  "version": "changeset version",
137
138
  "clean": "node scripts/clean.mjs",
138
139
  "build": "pnpm gen && preconstruct fix && preconstruct build && pnpm gen",
package/src/NodeSdk.ts CHANGED
@@ -6,6 +6,7 @@ import { NodeSDK } from "@opentelemetry/sdk-node"
6
6
  import * as Effect from "effect/Effect"
7
7
  import type { LazyArg } from "effect/Function"
8
8
  import * as Layer from "effect/Layer"
9
+ import * as Metrics from "./Metrics"
9
10
  import { Resource } from "./Resource"
10
11
 
11
12
  /**
@@ -20,22 +21,33 @@ export type Configuration = Partial<Omit<NodeSDKConfiguration, "resource" | "ser
20
21
  */
21
22
  export const config: (config: Configuration) => Configuration = (config: Configuration) => config
22
23
 
24
+ const make = (config: Configuration) =>
25
+ Effect.flatMap(Resource, (resource) =>
26
+ Effect.acquireRelease(
27
+ Effect.sync(() => {
28
+ const sdk = new NodeSDK({ ...config, metricReader: undefined, resource })
29
+ sdk.start()
30
+ return sdk
31
+ }),
32
+ (sdk) => Effect.promise(() => sdk.shutdown())
33
+ ))
34
+
23
35
  /**
24
36
  * @since 1.0.0
25
37
  * @category layer
26
38
  */
27
39
  export const layer = (
28
- config: LazyArg<Configuration>
40
+ evaluate: LazyArg<Configuration>
29
41
  ): 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
- ))
42
+ Layer.unwrapEffect(
43
+ Effect.sync(() => {
44
+ const config = evaluate()
45
+ const Tracing = Layer.scopedDiscard(make(config))
46
+ return config.metricReader ?
47
+ Layer.merge(
48
+ Tracing,
49
+ Metrics.layer(() => config.metricReader!)
50
+ ) :
51
+ Tracing
52
+ })
53
+ )
@@ -4,9 +4,7 @@ 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
9
  import * as Tracer from "effect/Tracer"
12
10
  import { Resource } from "../Resource"
@@ -19,6 +17,7 @@ export class OtelSpan implements Tracer.Span {
19
17
  readonly spanId: string
20
18
  readonly traceId: string
21
19
  readonly attributes = new Map<string, unknown>()
20
+ readonly sampled: boolean
22
21
  status: Tracer.SpanStatus
23
22
 
24
23
  constructor(
@@ -28,7 +27,6 @@ export class OtelSpan implements Tracer.Span {
28
27
  readonly parent: Option.Option<Tracer.ParentSpan>,
29
28
  readonly context: Context.Context<never>,
30
29
  readonly links: ReadonlyArray<Tracer.SpanLink>,
31
- readonly sampled: boolean,
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) {
@@ -106,7 +105,7 @@ export const OtelTracer = Context.Tag<OtelApi.Tracer>("@effect/opentelemetry/Tra
106
105
  /** @internal */
107
106
  export const make = Effect.map(OtelTracer, (tracer) =>
108
107
  Tracer.make({
109
- span(name, parent, context, links, sampled, startTime) {
108
+ span(name, parent, context, links, startTime) {
110
109
  return new OtelSpan(
111
110
  OtelApi.context,
112
111
  tracer,
@@ -114,32 +113,25 @@ export const make = Effect.map(OtelTracer, (tracer) =>
114
113
  parent,
115
114
  context,
116
115
  links,
117
- sampled,
118
116
  startTime
119
117
  )
120
118
  },
121
119
  context(execution, fiber) {
122
- const currentSpan = Option.flatMap(
123
- FiberRefs.get(
124
- fiber.getFiberRefs(),
125
- FiberRef.currentTracerSpan
126
- ),
127
- List.head
128
- )
120
+ const currentSpan = fiber.getFiberRef(FiberRef.currentContext).unsafeMap.get(Tracer.ParentSpan) as
121
+ | Tracer.ParentSpan
122
+ | undefined
129
123
 
130
- if (currentSpan._tag === "None") {
124
+ if (currentSpan === undefined) {
131
125
  return execution()
132
126
  }
133
127
 
134
128
  return OtelApi.context.with(
135
- populateContext(OtelApi.context.active(), currentSpan.value),
129
+ populateContext(OtelApi.context.active(), currentSpan),
136
130
  execution
137
131
  )
138
132
  }
139
133
  }))
140
134
 
141
- /** @internal */
142
-
143
135
  /** @internal */
144
136
  export const traceFlagsTag = Context.Tag<OtelApi.TraceFlags>("@effect/opentelemetry/traceFlags")
145
137
 
@@ -173,7 +165,7 @@ export const makeExternalSpan = (options: {
173
165
  traceId: options.traceId,
174
166
  spanId: options.spanId,
175
167
  sampled: options.traceFlags
176
- ? options.traceFlags === OtelApi.TraceFlags.SAMPLED
168
+ ? (options.traceFlags & OtelApi.TraceFlags.SAMPLED) === OtelApi.TraceFlags.SAMPLED
177
169
  : true,
178
170
  context
179
171
  }