@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.
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.dev.js +22 -8
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.cjs.prod.js +22 -8
- package/NodeSdk/dist/effect-opentelemetry-NodeSdk.esm.js +15 -8
- package/Tracer/dist/effect-opentelemetry-Tracer.cjs.dev.js +8 -14
- package/Tracer/dist/effect-opentelemetry-Tracer.cjs.prod.js +8 -14
- package/dist/declarations/src/NodeSdk.d.ts +1 -1
- package/dist/declarations/src/NodeSdk.d.ts.map +1 -1
- package/internal/tracer.esm.js +8 -12
- package/package.json +20 -19
- package/src/NodeSdk.ts +25 -13
- package/src/internal/tracer.ts +9 -17
|
@@ -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
|
-
})
|
|
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
|
-
})
|
|
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
|
-
})
|
|
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,
|
|
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,
|
|
117
|
-
return new OtelSpan(OtelApi__namespace.context, tracer, name, parent, context, links,
|
|
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 =
|
|
121
|
-
if (currentSpan
|
|
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
|
|
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,
|
|
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,
|
|
117
|
-
return new OtelSpan(OtelApi__namespace.context, tracer, name, parent, context, links,
|
|
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 =
|
|
121
|
-
if (currentSpan
|
|
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
|
|
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: (
|
|
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;
|
|
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"}
|
package/internal/tracer.esm.js
CHANGED
|
@@ -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,
|
|
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,
|
|
82
|
-
return new OtelSpan(OtelApi.context, tracer, name, parent, context, links,
|
|
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 =
|
|
86
|
-
if (currentSpan
|
|
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
|
|
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.
|
|
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.
|
|
46
|
-
"@opentelemetry/sdk-metrics": "^1.17.
|
|
47
|
-
"@opentelemetry/sdk-node": "^0.
|
|
48
|
-
"@opentelemetry/semantic-conventions": "^1.17.
|
|
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.
|
|
52
|
+
"effect": "2.0.0-next.50"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@babel/core": "^7.23.
|
|
56
|
-
"@babel/preset-typescript": "^7.23.
|
|
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.
|
|
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-
|
|
66
|
-
"@opentelemetry/exporter-
|
|
67
|
-
"@opentelemetry/
|
|
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.
|
|
70
|
-
"@types/node": "^20.8.
|
|
71
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
72
|
-
"@typescript-eslint/parser": "^6.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
40
|
+
evaluate: LazyArg<Configuration>
|
|
29
41
|
): Layer.Layer<Resource, never, never> =>
|
|
30
|
-
Layer.
|
|
31
|
-
Effect.
|
|
32
|
-
|
|
33
|
-
(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
+
)
|
package/src/internal/tracer.ts
CHANGED
|
@@ -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,
|
|
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 =
|
|
123
|
-
|
|
124
|
-
|
|
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
|
|
124
|
+
if (currentSpan === undefined) {
|
|
131
125
|
return execution()
|
|
132
126
|
}
|
|
133
127
|
|
|
134
128
|
return OtelApi.context.with(
|
|
135
|
-
populateContext(OtelApi.context.active(), currentSpan
|
|
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
|
}
|