arvo-core 1.0.22 → 1.0.24
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/CHANGELOG.md +1 -1
- package/dist/ArvoEvent/helpers.d.ts +1 -5
- package/dist/ArvoEvent/helpers.js +40 -27
- package/dist/ArvoEventFactory/helpers.d.ts +2 -2
- package/dist/ArvoEventFactory/index.d.ts +6 -10
- package/dist/ArvoEventFactory/index.js +67 -24
- package/dist/OpenTelemetry/index.d.ts +10 -73
- package/dist/OpenTelemetry/index.js +33 -142
- package/dist/OpenTelemetry/types.d.ts +1 -22
- package/dist/OpenTelemetry/utils.d.ts +4 -0
- package/dist/OpenTelemetry/utils.js +44 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
import ArvoEvent from '.';
|
2
|
-
import { TelemetryContext } from '../OpenTelemetry/types';
|
3
2
|
import { ArvoEventData, CloudEventExtension, CreateArvoEvent } from './types';
|
4
3
|
/**
|
5
4
|
* Creates an ArvoEvent with the provided data and extensions.
|
6
5
|
*
|
7
6
|
* This function creates a new ArvoEvent instance using the provided event data and optional extensions.
|
8
|
-
* It also supports OpenTelemetry tracing if a telemetry context is provided.
|
9
7
|
*
|
10
8
|
* @template TData - The type of the event data, extending ArvoEventData.
|
11
9
|
* @template TExtension - The type of the cloud event extension, extending CloudEventExtension.
|
@@ -13,7 +11,6 @@ import { ArvoEventData, CloudEventExtension, CreateArvoEvent } from './types';
|
|
13
11
|
*
|
14
12
|
* @param {CreateArvoEvent<TData>} event - The event data and metadata to create the ArvoEvent.
|
15
13
|
* @param {TExtension} [extensions] - Optional cloud event extensions.
|
16
|
-
* @param {TelemetryContext} [telemetry] - Optional telemetry context for tracing.
|
17
14
|
*
|
18
15
|
* @returns {ArvoEvent<TData, TExtension>} The created ArvoEvent instance.
|
19
16
|
*
|
@@ -35,7 +32,6 @@ import { ArvoEventData, CloudEventExtension, CreateArvoEvent } from './types';
|
|
35
32
|
* data: { key: 'value' }
|
36
33
|
* },
|
37
34
|
* { customExtension: 'value' },
|
38
|
-
* telemetryContext
|
39
35
|
* );
|
40
36
|
*/
|
41
|
-
export declare const createArvoEvent: <TData extends ArvoEventData, TExtension extends CloudEventExtension, TType extends string>(event: CreateArvoEvent<TData, TType>, extensions?: TExtension
|
37
|
+
export declare const createArvoEvent: <TData extends ArvoEventData, TExtension extends CloudEventExtension, TType extends string>(event: CreateArvoEvent<TData, TType>, extensions?: TExtension) => ArvoEvent<TData, TExtension, TType>;
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.createArvoEvent = void 0;
|
7
|
+
var api_1 = require("@opentelemetry/api");
|
7
8
|
var _1 = __importDefault(require("."));
|
8
9
|
var OpenTelemetry_1 = require("../OpenTelemetry");
|
9
10
|
var utils_1 = require("../utils");
|
@@ -13,7 +14,6 @@ var uuid_1 = require("uuid");
|
|
13
14
|
* Creates an ArvoEvent with the provided data and extensions.
|
14
15
|
*
|
15
16
|
* This function creates a new ArvoEvent instance using the provided event data and optional extensions.
|
16
|
-
* It also supports OpenTelemetry tracing if a telemetry context is provided.
|
17
17
|
*
|
18
18
|
* @template TData - The type of the event data, extending ArvoEventData.
|
19
19
|
* @template TExtension - The type of the cloud event extension, extending CloudEventExtension.
|
@@ -21,7 +21,6 @@ var uuid_1 = require("uuid");
|
|
21
21
|
*
|
22
22
|
* @param {CreateArvoEvent<TData>} event - The event data and metadata to create the ArvoEvent.
|
23
23
|
* @param {TExtension} [extensions] - Optional cloud event extensions.
|
24
|
-
* @param {TelemetryContext} [telemetry] - Optional telemetry context for tracing.
|
25
24
|
*
|
26
25
|
* @returns {ArvoEvent<TData, TExtension>} The created ArvoEvent instance.
|
27
26
|
*
|
@@ -43,35 +42,49 @@ var uuid_1 = require("uuid");
|
|
43
42
|
* data: { key: 'value' }
|
44
43
|
* },
|
45
44
|
* { customExtension: 'value' },
|
46
|
-
* telemetryContext
|
47
45
|
* );
|
48
46
|
*/
|
49
|
-
var createArvoEvent = function (event, extensions
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
var createArvoEvent = function (event, extensions) {
|
48
|
+
var span = OpenTelemetry_1.ArvoCoreTracer.startSpan("createArvoEvent<".concat(event.type, ">"), {});
|
49
|
+
return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), function () {
|
50
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
51
|
+
try {
|
52
|
+
if (event.datacontenttype &&
|
53
|
+
event.datacontenttype !== schema_1.ArvoDataContentType) {
|
54
|
+
var warning = (0, utils_1.cleanString)("\n Warning! The provided datacontenttype(=".concat(event.datacontenttype, ")\n is not ArvoEvent compatible (=").concat(schema_1.ArvoDataContentType, "). There may \n be some limited functionality.\n "));
|
55
|
+
(0, OpenTelemetry_1.logToSpan)(span, {
|
56
|
+
level: 'WARNING',
|
57
|
+
message: warning,
|
58
|
+
});
|
59
|
+
}
|
60
|
+
return new _1.default({
|
61
|
+
id: event.id || (0, uuid_1.v4)(),
|
62
|
+
type: event.type,
|
63
|
+
accesscontrol: event.accesscontrol || null,
|
64
|
+
executionunits: event.executionunits || null,
|
65
|
+
traceparent: event.traceparent || null,
|
66
|
+
tracestate: event.tracestate || null,
|
67
|
+
datacontenttype: event.datacontenttype || schema_1.ArvoDataContentType,
|
68
|
+
specversion: event.specversion || '1.0',
|
69
|
+
time: event.time || (0, utils_1.createTimestamp)(),
|
70
|
+
source: encodeURI(event.source),
|
71
|
+
subject: encodeURI(event.subject),
|
72
|
+
to: event.to ? encodeURI(event.to) : null,
|
73
|
+
redirectto: event.redirectto ? encodeURI(event.redirectto) : null,
|
74
|
+
dataschema: event.dataschema ? encodeURI(event.dataschema) : null,
|
75
|
+
}, event.data, extensions);
|
76
|
+
}
|
77
|
+
catch (error) {
|
78
|
+
(0, OpenTelemetry_1.exceptionToSpan)(span, error);
|
79
|
+
span.setStatus({
|
80
|
+
code: api_1.SpanStatusCode.ERROR,
|
81
|
+
message: error.message,
|
57
82
|
});
|
83
|
+
throw error;
|
84
|
+
}
|
85
|
+
finally {
|
86
|
+
span.end();
|
58
87
|
}
|
59
|
-
return new _1.default({
|
60
|
-
id: event.id || (0, uuid_1.v4)(),
|
61
|
-
type: event.type,
|
62
|
-
accesscontrol: event.accesscontrol || null,
|
63
|
-
executionunits: event.executionunits || null,
|
64
|
-
traceparent: event.traceparent || null,
|
65
|
-
tracestate: event.tracestate || null,
|
66
|
-
datacontenttype: event.datacontenttype || schema_1.ArvoDataContentType,
|
67
|
-
specversion: event.specversion || '1.0',
|
68
|
-
time: event.time || (0, utils_1.createTimestamp)(),
|
69
|
-
source: encodeURI(event.source),
|
70
|
-
subject: encodeURI(event.subject),
|
71
|
-
to: event.to ? encodeURI(event.to) : null,
|
72
|
-
redirectto: event.redirectto ? encodeURI(event.redirectto) : null,
|
73
|
-
dataschema: event.dataschema ? encodeURI(event.dataschema) : null,
|
74
|
-
}, event.data, extensions);
|
75
88
|
});
|
76
89
|
};
|
77
90
|
exports.createArvoEvent = createArvoEvent;
|
@@ -1,7 +1,6 @@
|
|
1
|
-
import ArvoContract from
|
1
|
+
import ArvoContract from '../ArvoContract';
|
2
2
|
import { z } from 'zod';
|
3
|
-
import { CreateArvoEvent } from
|
4
|
-
import { TelemetryContext } from "../OpenTelemetry/types";
|
3
|
+
import { CreateArvoEvent } from '../ArvoEvent/types';
|
5
4
|
/**
|
6
5
|
* A factory class for creating contractual ArvoEvents based on a given ArvoContract.
|
7
6
|
*
|
@@ -13,7 +12,7 @@ import { TelemetryContext } from "../OpenTelemetry/types";
|
|
13
12
|
export default class ArvoEventFactory<TUri extends string = string, TType extends string = string, TAcceptSchema extends z.ZodTypeAny = z.ZodTypeAny, TEmits extends Record<string, z.ZodTypeAny> = Record<string, z.ZodTypeAny>> {
|
14
13
|
private contract;
|
15
14
|
/**
|
16
|
-
* Creates an instance of
|
15
|
+
* Creates an instance of ArvoEventFactory.
|
17
16
|
*
|
18
17
|
* @param contract - The ArvoContract to base the events on.
|
19
18
|
*/
|
@@ -24,13 +23,12 @@ export default class ArvoEventFactory<TUri extends string = string, TType extend
|
|
24
23
|
* @template TExtension - The type of extensions to add to the event.
|
25
24
|
* @param event - The event to create. The field 'type' is automatically infered
|
26
25
|
* @param [extensions] - Optional extensions to add to the event.
|
27
|
-
* @param [telemetry] - Optional telemetry context for tracing.
|
28
26
|
* @returns The created ArvoEvent as per the accept record of the contract.
|
29
27
|
* @throws If the event data fails validation against the contract.
|
30
28
|
*/
|
31
29
|
accepts<TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<z.infer<TAcceptSchema>, TType>, 'type'> & {
|
32
30
|
to: string;
|
33
|
-
}, extensions?: TExtension
|
31
|
+
}, extensions?: TExtension): import("..").ArvoEvent<z.TypeOf<TAcceptSchema>, TExtension, TType>;
|
34
32
|
/**
|
35
33
|
* Creates an ArvoEvent as per one of the emits record in the contract.
|
36
34
|
*
|
@@ -38,26 +36,24 @@ export default class ArvoEventFactory<TUri extends string = string, TType extend
|
|
38
36
|
* @template TExtension - The type of extensions to add to the event.
|
39
37
|
* @param event - The event to create.
|
40
38
|
* @param [extensions] - Optional extensions to add to the event.
|
41
|
-
* @param [telemetry] - Optional telemetry context for tracing.
|
42
39
|
* @returns The created ArvoEvent as per one of the emits records of the contract.
|
43
40
|
* @throws If the event data fails validation against the contract.
|
44
41
|
*/
|
45
42
|
emits<U extends keyof TEmits & string, TExtension extends Record<string, any>>(event: CreateArvoEvent<z.infer<TEmits[U]>, U> & {
|
46
43
|
to: string;
|
47
|
-
}, extensions?: TExtension
|
44
|
+
}, extensions?: TExtension): import("..").ArvoEvent<z.TypeOf<TEmits[U]>, TExtension, U>;
|
48
45
|
/**
|
49
46
|
* Creates a system error ArvoEvent.
|
50
47
|
*
|
51
48
|
* @template TExtension - The type of extensions to add to the event.
|
52
49
|
* @param event - The event to create, including the error.
|
53
50
|
* @param [extensions] - Optional extensions to add to the event.
|
54
|
-
* @param [telemetry] - Optional telemetry context for tracing.
|
55
51
|
* @returns The created system error ArvoEvent.
|
56
52
|
*/
|
57
53
|
systemError<TExtension extends Record<string, any>>(event: Omit<CreateArvoEvent<any, any>, 'data' | 'type'> & {
|
58
54
|
error: Error;
|
59
55
|
to: string;
|
60
|
-
}, extensions?: TExtension
|
56
|
+
}, extensions?: TExtension): import("..").ArvoEvent<{
|
61
57
|
errorName: string;
|
62
58
|
errorMessage: string;
|
63
59
|
errorStack: string | null;
|
@@ -25,6 +25,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
var helpers_1 = require("../ArvoEvent/helpers");
|
26
26
|
var schema_1 = require("../ArvoEvent/schema");
|
27
27
|
var OpenTelemetry_1 = require("../OpenTelemetry");
|
28
|
+
var api_1 = require("@opentelemetry/api");
|
28
29
|
/**
|
29
30
|
* A factory class for creating contractual ArvoEvents based on a given ArvoContract.
|
30
31
|
*
|
@@ -35,7 +36,7 @@ var OpenTelemetry_1 = require("../OpenTelemetry");
|
|
35
36
|
*/
|
36
37
|
var ArvoEventFactory = /** @class */ (function () {
|
37
38
|
/**
|
38
|
-
* Creates an instance of
|
39
|
+
* Creates an instance of ArvoEventFactory.
|
39
40
|
*
|
40
41
|
* @param contract - The ArvoContract to base the events on.
|
41
42
|
*/
|
@@ -48,18 +49,32 @@ var ArvoEventFactory = /** @class */ (function () {
|
|
48
49
|
* @template TExtension - The type of extensions to add to the event.
|
49
50
|
* @param event - The event to create. The field 'type' is automatically infered
|
50
51
|
* @param [extensions] - Optional extensions to add to the event.
|
51
|
-
* @param [telemetry] - Optional telemetry context for tracing.
|
52
52
|
* @returns The created ArvoEvent as per the accept record of the contract.
|
53
53
|
* @throws If the event data fails validation against the contract.
|
54
54
|
*/
|
55
|
-
ArvoEventFactory.prototype.accepts = function (event, extensions
|
55
|
+
ArvoEventFactory.prototype.accepts = function (event, extensions) {
|
56
56
|
var _this = this;
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
var span = OpenTelemetry_1.ArvoCoreTracer.startSpan("ArvoEventFactory<".concat(this.contract.uri, ">.accepts<").concat(this.contract.accepts.type, ">.create"));
|
58
|
+
return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), function () {
|
59
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
60
|
+
try {
|
61
|
+
var validationResult = _this.contract.validateInput(_this.contract.accepts.type, event.data);
|
62
|
+
if (!validationResult.success) {
|
63
|
+
throw new Error("Accept Event data validation failed: ".concat(validationResult.error.message));
|
64
|
+
}
|
65
|
+
return (0, helpers_1.createArvoEvent)(__assign(__assign({}, event), { type: _this.contract.accepts.type, datacontenttype: schema_1.ArvoDataContentType, dataschema: _this.contract.uri, data: validationResult.data }), extensions);
|
66
|
+
}
|
67
|
+
catch (error) {
|
68
|
+
(0, OpenTelemetry_1.exceptionToSpan)(span, error);
|
69
|
+
span.setStatus({
|
70
|
+
code: api_1.SpanStatusCode.ERROR,
|
71
|
+
message: error.message,
|
72
|
+
});
|
73
|
+
throw error;
|
74
|
+
}
|
75
|
+
finally {
|
76
|
+
span.end();
|
61
77
|
}
|
62
|
-
return (0, helpers_1.createArvoEvent)(__assign(__assign({}, event), { type: _this.contract.accepts.type, datacontenttype: schema_1.ArvoDataContentType, dataschema: _this.contract.uri, data: validationResult.data }), extensions, telemetryContext);
|
63
78
|
});
|
64
79
|
};
|
65
80
|
/**
|
@@ -69,18 +84,32 @@ var ArvoEventFactory = /** @class */ (function () {
|
|
69
84
|
* @template TExtension - The type of extensions to add to the event.
|
70
85
|
* @param event - The event to create.
|
71
86
|
* @param [extensions] - Optional extensions to add to the event.
|
72
|
-
* @param [telemetry] - Optional telemetry context for tracing.
|
73
87
|
* @returns The created ArvoEvent as per one of the emits records of the contract.
|
74
88
|
* @throws If the event data fails validation against the contract.
|
75
89
|
*/
|
76
|
-
ArvoEventFactory.prototype.emits = function (event, extensions
|
90
|
+
ArvoEventFactory.prototype.emits = function (event, extensions) {
|
77
91
|
var _this = this;
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
92
|
+
var span = OpenTelemetry_1.ArvoCoreTracer.startSpan("ArvoEventFactory<".concat(this.contract.uri, ">.emits<").concat(event.type, ">.create"));
|
93
|
+
return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), function () {
|
94
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
95
|
+
try {
|
96
|
+
var validationResult = _this.contract.validateOutput(event.type, event.data);
|
97
|
+
if (!validationResult.success) {
|
98
|
+
throw new Error("Emit Event data validation failed: ".concat(validationResult.error.message));
|
99
|
+
}
|
100
|
+
return (0, helpers_1.createArvoEvent)(__assign(__assign({}, event), { datacontenttype: schema_1.ArvoDataContentType, dataschema: _this.contract.uri, data: validationResult.data }), extensions);
|
101
|
+
}
|
102
|
+
catch (error) {
|
103
|
+
(0, OpenTelemetry_1.exceptionToSpan)(span, error);
|
104
|
+
span.setStatus({
|
105
|
+
code: api_1.SpanStatusCode.ERROR,
|
106
|
+
message: error.message,
|
107
|
+
});
|
108
|
+
throw error;
|
109
|
+
}
|
110
|
+
finally {
|
111
|
+
span.end();
|
82
112
|
}
|
83
|
-
return (0, helpers_1.createArvoEvent)(__assign(__assign({}, event), { datacontenttype: schema_1.ArvoDataContentType, dataschema: _this.contract.uri, data: validationResult.data }), extensions, telemetryContext);
|
84
113
|
});
|
85
114
|
};
|
86
115
|
/**
|
@@ -89,18 +118,32 @@ var ArvoEventFactory = /** @class */ (function () {
|
|
89
118
|
* @template TExtension - The type of extensions to add to the event.
|
90
119
|
* @param event - The event to create, including the error.
|
91
120
|
* @param [extensions] - Optional extensions to add to the event.
|
92
|
-
* @param [telemetry] - Optional telemetry context for tracing.
|
93
121
|
* @returns The created system error ArvoEvent.
|
94
122
|
*/
|
95
|
-
ArvoEventFactory.prototype.systemError = function (event, extensions
|
123
|
+
ArvoEventFactory.prototype.systemError = function (event, extensions) {
|
96
124
|
var _this = this;
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
125
|
+
var span = OpenTelemetry_1.ArvoCoreTracer.startSpan("ArvoEventFactory<".concat(this.contract.uri, ">.systemError<sys.").concat(this.contract.accepts.type, ".error>.create"));
|
126
|
+
return api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), function () {
|
127
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
128
|
+
try {
|
129
|
+
var error = event.error, _events = __rest(event, ["error"]);
|
130
|
+
return (0, helpers_1.createArvoEvent)(__assign(__assign({}, event), { type: "sys.".concat(_this.contract.accepts.type, ".error"), data: {
|
131
|
+
errorName: error.name,
|
132
|
+
errorMessage: error.message,
|
133
|
+
errorStack: error.stack || null,
|
134
|
+
}, datacontenttype: schema_1.ArvoDataContentType, dataschema: _this.contract.uri }), extensions);
|
135
|
+
}
|
136
|
+
catch (error) {
|
137
|
+
(0, OpenTelemetry_1.exceptionToSpan)(span, error);
|
138
|
+
span.setStatus({
|
139
|
+
code: api_1.SpanStatusCode.ERROR,
|
140
|
+
message: error.message,
|
141
|
+
});
|
142
|
+
throw error;
|
143
|
+
}
|
144
|
+
finally {
|
145
|
+
span.end();
|
146
|
+
}
|
104
147
|
});
|
105
148
|
};
|
106
149
|
return ArvoEventFactory;
|
@@ -1,18 +1,9 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import { Span } from '@opentelemetry/api';
|
2
|
+
import { TelemetryLogLevel, OpenTelemetryHeaders } from './types';
|
3
3
|
/**
|
4
|
-
*
|
5
|
-
* @param traceparent - The trace header string.
|
6
|
-
* @returns The active context.
|
4
|
+
* A tracer instance for the ArvoCore package.
|
7
5
|
*/
|
8
|
-
export declare const
|
9
|
-
/**
|
10
|
-
* Parses the context from a span and active context.
|
11
|
-
* @param span - The span to parse the context from.
|
12
|
-
* @param activeContext - The active context (optional, defaults to the current active context).
|
13
|
-
* @returns The parsed telemetry context.
|
14
|
-
*/
|
15
|
-
export declare const getTelemetryCarrier: (span: Span, activeContext?: Context) => TelemetryCarrier;
|
6
|
+
export declare const ArvoCoreTracer: import("@opentelemetry/api").Tracer;
|
16
7
|
/**
|
17
8
|
* Logs a message to a span with additional parameters.
|
18
9
|
* @param span - The span to log the message to.
|
@@ -30,67 +21,13 @@ export declare const logToSpan: (span: Span, params: {
|
|
30
21
|
* @param level - The log level for the exception.
|
31
22
|
* @param error - The error object to be logged.
|
32
23
|
*/
|
33
|
-
export declare const exceptionToSpan: (span: Span,
|
34
|
-
/**
|
35
|
-
* Creates a new OpenTelemetry span and executes the provided function within its context.
|
36
|
-
*
|
37
|
-
* This function enhances tracing by creating a new span, executing the given function within
|
38
|
-
* that span's context, and properly handling any errors that may occur. It also ensures that
|
39
|
-
* the wrapped function has access to the current span.
|
40
|
-
*
|
41
|
-
* @template TArgs - The type of the arguments array for the wrapped function.
|
42
|
-
* @template TReturn - The return type of the wrapped function.
|
43
|
-
*
|
44
|
-
* @param {TelemetryContext | string} telemetryContext - The OpenTelemetry context object or a tracer name.
|
45
|
-
* If a string is provided, it will be used as the tracer name to retrieve the tracer.
|
46
|
-
* If a `TelemetryContext` object is provided, it should contain the span, tracer, and carrier information.
|
47
|
-
* @param {string} spanName - The name of the span to be created.
|
48
|
-
* @param {SpanOptions} [spanOptions] - Optional configuration for the span, such as attributes, links, and sampling.
|
49
|
-
* @param {(telemetryContext: TelemetryContext, ...args: TArgs) => TReturn} wrappedFunction - The function to be executed within the new span.
|
50
|
-
* This function will receive the `TelemetryContext` object as its first argument, containing the current span, tracer, and carrier.
|
51
|
-
* The rest of the arguments will be passed as additional parameters to the wrapped function.
|
52
|
-
* @param {ThisParameterType<TFunction>} [thisArg] - The 'this' context to be used when calling the wrapped function.
|
53
|
-
* @param {...TArgs} args - The arguments to be passed to the wrapped function.
|
54
|
-
*
|
55
|
-
* @returns {TReturn} The result of the wrapped function execution.
|
56
|
-
*
|
57
|
-
* @throws {Error} Rethrows any error that occurs during the execution of the wrapped function.
|
58
|
-
* The error will be logged to the span with an 'ERROR' level, and the span status will be set to `SpanStatusCode.ERROR`.
|
59
|
-
*
|
60
|
-
* @example
|
61
|
-
* // Using with TelemetryContext
|
62
|
-
* const telemetryContext: TelemetryContext = {
|
63
|
-
* span: currentSpan,
|
64
|
-
* tracer: currentTracer,
|
65
|
-
* carrier: { traceparent: 'traceparent-value', tracestate: 'tracestate-value' }
|
66
|
-
* };
|
67
|
-
* const result = createOtelSpan(
|
68
|
-
* telemetryContext,
|
69
|
-
* 'ProcessOrder',
|
70
|
-
* { attributes: { orderId: '12345' } },
|
71
|
-
* (telemetryContext, orderId) => {
|
72
|
-
* telemetryContext.span.addEvent('Processing order');
|
73
|
-
* return processOrder(orderId);
|
74
|
-
* },
|
75
|
-
* null,
|
76
|
-
* '12345'
|
77
|
-
* );
|
78
|
-
*
|
79
|
-
* @example
|
80
|
-
* // Using with tracer name
|
81
|
-
* const result = createOtelSpan(
|
82
|
-
* 'OrderService',
|
83
|
-
* 'FetchOrderDetails',
|
84
|
-
* undefined,
|
85
|
-
* (telemetryContext, orderId) => {
|
86
|
-
* telemetryContext.span.setAttribute('orderId', orderId);
|
87
|
-
* return fetchOrderDetails(orderId);
|
88
|
-
* },
|
89
|
-
* null,
|
90
|
-
* '12345'
|
91
|
-
* );
|
92
|
-
*/ export declare const createOtelSpan: <TArgs extends unknown[], TReturn>(telemetryContext: TelemetryContext | string, spanName: string, spanOptions: SpanOptions | undefined, wrappedFunction: (telemetryContext: TelemetryContext, ...args: TArgs) => TReturn, thisArg?: ThisParameterType<typeof wrappedFunction>, ...args: TArgs) => TReturn;
|
24
|
+
export declare const exceptionToSpan: (span: Span, error: Error) => void;
|
93
25
|
/**
|
94
26
|
* A constant representing a null or not applicable value in OpenTelemetry context.
|
95
27
|
*/
|
96
28
|
export declare const OTelNull = "N/A";
|
29
|
+
/**
|
30
|
+
* Retrieves the current OpenTelemetry headers from the active context.
|
31
|
+
* @returns An object containing the traceparent and tracestate headers.
|
32
|
+
*/
|
33
|
+
export declare function currentOpenTelemetryHeaders(): OpenTelemetryHeaders;
|
@@ -10,46 +10,17 @@ var __assign = (this && this.__assign) || function () {
|
|
10
10
|
};
|
11
11
|
return __assign.apply(this, arguments);
|
12
12
|
};
|
13
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
14
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
15
|
-
if (ar || !(i in from)) {
|
16
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
17
|
-
ar[i] = from[i];
|
18
|
-
}
|
19
|
-
}
|
20
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
21
|
-
};
|
22
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
23
|
-
exports.OTelNull = exports.
|
14
|
+
exports.OTelNull = exports.exceptionToSpan = exports.logToSpan = exports.ArvoCoreTracer = void 0;
|
15
|
+
exports.currentOpenTelemetryHeaders = currentOpenTelemetryHeaders;
|
24
16
|
var api_1 = require("@opentelemetry/api");
|
17
|
+
var utils_1 = require("./utils");
|
18
|
+
var core_1 = require("@opentelemetry/core");
|
19
|
+
var pkg = (0, utils_1.getPackageInfo)();
|
25
20
|
/**
|
26
|
-
*
|
27
|
-
* @param traceparent - The trace header string.
|
28
|
-
* @returns The active context.
|
29
|
-
*/
|
30
|
-
var getTelemetryContext = function (carrier) {
|
31
|
-
if (carrier && (carrier.traceparent || carrier.tracestate)) {
|
32
|
-
return api_1.propagation.extract(api_1.ROOT_CONTEXT, carrier);
|
33
|
-
}
|
34
|
-
return api_1.context.active();
|
35
|
-
};
|
36
|
-
exports.getTelemetryContext = getTelemetryContext;
|
37
|
-
/**
|
38
|
-
* Parses the context from a span and active context.
|
39
|
-
* @param span - The span to parse the context from.
|
40
|
-
* @param activeContext - The active context (optional, defaults to the current active context).
|
41
|
-
* @returns The parsed telemetry context.
|
21
|
+
* A tracer instance for the ArvoCore package.
|
42
22
|
*/
|
43
|
-
|
44
|
-
if (activeContext === void 0) { activeContext = api_1.context.active(); }
|
45
|
-
var carrier = {
|
46
|
-
traceparent: null,
|
47
|
-
tracestate: null,
|
48
|
-
};
|
49
|
-
api_1.propagation.inject(activeContext, carrier);
|
50
|
-
return carrier;
|
51
|
-
};
|
52
|
-
exports.getTelemetryCarrier = getTelemetryCarrier;
|
23
|
+
exports.ArvoCoreTracer = api_1.trace.getTracer(pkg.name, pkg.version);
|
53
24
|
/**
|
54
25
|
* Logs a message to a span with additional parameters.
|
55
26
|
* @param span - The span to log the message to.
|
@@ -67,118 +38,38 @@ exports.logToSpan = logToSpan;
|
|
67
38
|
* @param level - The log level for the exception.
|
68
39
|
* @param error - The error object to be logged.
|
69
40
|
*/
|
70
|
-
var exceptionToSpan = function (span,
|
71
|
-
(0, exports.logToSpan)(span, {
|
72
|
-
level: level,
|
73
|
-
message: error.message,
|
74
|
-
});
|
41
|
+
var exceptionToSpan = function (span, error) {
|
75
42
|
span.setAttributes({
|
76
|
-
'exception.type':
|
43
|
+
'exception.type': error.name,
|
77
44
|
'exception.message': error.message,
|
78
|
-
'exception.stacktrace': error.stack || exports.OTelNull,
|
79
45
|
});
|
46
|
+
span.recordException(error);
|
80
47
|
};
|
81
48
|
exports.exceptionToSpan = exceptionToSpan;
|
82
|
-
/**
|
83
|
-
* Creates a new OpenTelemetry span and executes the provided function within its context.
|
84
|
-
*
|
85
|
-
* This function enhances tracing by creating a new span, executing the given function within
|
86
|
-
* that span's context, and properly handling any errors that may occur. It also ensures that
|
87
|
-
* the wrapped function has access to the current span.
|
88
|
-
*
|
89
|
-
* @template TArgs - The type of the arguments array for the wrapped function.
|
90
|
-
* @template TReturn - The return type of the wrapped function.
|
91
|
-
*
|
92
|
-
* @param {TelemetryContext | string} telemetryContext - The OpenTelemetry context object or a tracer name.
|
93
|
-
* If a string is provided, it will be used as the tracer name to retrieve the tracer.
|
94
|
-
* If a `TelemetryContext` object is provided, it should contain the span, tracer, and carrier information.
|
95
|
-
* @param {string} spanName - The name of the span to be created.
|
96
|
-
* @param {SpanOptions} [spanOptions] - Optional configuration for the span, such as attributes, links, and sampling.
|
97
|
-
* @param {(telemetryContext: TelemetryContext, ...args: TArgs) => TReturn} wrappedFunction - The function to be executed within the new span.
|
98
|
-
* This function will receive the `TelemetryContext` object as its first argument, containing the current span, tracer, and carrier.
|
99
|
-
* The rest of the arguments will be passed as additional parameters to the wrapped function.
|
100
|
-
* @param {ThisParameterType<TFunction>} [thisArg] - The 'this' context to be used when calling the wrapped function.
|
101
|
-
* @param {...TArgs} args - The arguments to be passed to the wrapped function.
|
102
|
-
*
|
103
|
-
* @returns {TReturn} The result of the wrapped function execution.
|
104
|
-
*
|
105
|
-
* @throws {Error} Rethrows any error that occurs during the execution of the wrapped function.
|
106
|
-
* The error will be logged to the span with an 'ERROR' level, and the span status will be set to `SpanStatusCode.ERROR`.
|
107
|
-
*
|
108
|
-
* @example
|
109
|
-
* // Using with TelemetryContext
|
110
|
-
* const telemetryContext: TelemetryContext = {
|
111
|
-
* span: currentSpan,
|
112
|
-
* tracer: currentTracer,
|
113
|
-
* carrier: { traceparent: 'traceparent-value', tracestate: 'tracestate-value' }
|
114
|
-
* };
|
115
|
-
* const result = createOtelSpan(
|
116
|
-
* telemetryContext,
|
117
|
-
* 'ProcessOrder',
|
118
|
-
* { attributes: { orderId: '12345' } },
|
119
|
-
* (telemetryContext, orderId) => {
|
120
|
-
* telemetryContext.span.addEvent('Processing order');
|
121
|
-
* return processOrder(orderId);
|
122
|
-
* },
|
123
|
-
* null,
|
124
|
-
* '12345'
|
125
|
-
* );
|
126
|
-
*
|
127
|
-
* @example
|
128
|
-
* // Using with tracer name
|
129
|
-
* const result = createOtelSpan(
|
130
|
-
* 'OrderService',
|
131
|
-
* 'FetchOrderDetails',
|
132
|
-
* undefined,
|
133
|
-
* (telemetryContext, orderId) => {
|
134
|
-
* telemetryContext.span.setAttribute('orderId', orderId);
|
135
|
-
* return fetchOrderDetails(orderId);
|
136
|
-
* },
|
137
|
-
* null,
|
138
|
-
* '12345'
|
139
|
-
* );
|
140
|
-
*/ var createOtelSpan = function (telemetryContext, spanName, spanOptions, wrappedFunction, thisArg) {
|
141
|
-
var args = [];
|
142
|
-
for (var _i = 5; _i < arguments.length; _i++) {
|
143
|
-
args[_i - 5] = arguments[_i];
|
144
|
-
}
|
145
|
-
var activeContext = api_1.ROOT_CONTEXT;
|
146
|
-
var activeTracer;
|
147
|
-
if (typeof telemetryContext === 'string') {
|
148
|
-
activeTracer = api_1.trace.getTracer(telemetryContext);
|
149
|
-
}
|
150
|
-
else {
|
151
|
-
activeContext = (0, exports.getTelemetryContext)(telemetryContext.carrier);
|
152
|
-
activeTracer = telemetryContext.tracer;
|
153
|
-
}
|
154
|
-
var newSpan = activeTracer.startSpan(spanName, spanOptions, activeContext);
|
155
|
-
newSpan.setStatus({
|
156
|
-
code: api_1.SpanStatusCode.OK,
|
157
|
-
});
|
158
|
-
try {
|
159
|
-
var result = api_1.context.with(api_1.trace.setSpan(activeContext, newSpan), function () {
|
160
|
-
return wrappedFunction.call.apply(wrappedFunction, __spreadArray([thisArg,
|
161
|
-
{
|
162
|
-
span: newSpan,
|
163
|
-
tracer: activeTracer,
|
164
|
-
carrier: (0, exports.getTelemetryCarrier)(newSpan, activeContext),
|
165
|
-
}], args, false));
|
166
|
-
});
|
167
|
-
newSpan.end();
|
168
|
-
return result;
|
169
|
-
}
|
170
|
-
catch (error) {
|
171
|
-
(0, exports.exceptionToSpan)(newSpan, 'ERROR', error);
|
172
|
-
newSpan.setStatus({
|
173
|
-
code: api_1.SpanStatusCode.ERROR,
|
174
|
-
message: error.message,
|
175
|
-
});
|
176
|
-
newSpan.end();
|
177
|
-
throw error;
|
178
|
-
}
|
179
|
-
};
|
180
|
-
exports.createOtelSpan = createOtelSpan;
|
181
49
|
/**
|
182
50
|
* A constant representing a null or not applicable value in OpenTelemetry context.
|
183
51
|
*/
|
184
52
|
exports.OTelNull = 'N/A';
|
53
|
+
/**
|
54
|
+
* Retrieves the current OpenTelemetry headers from the active context.
|
55
|
+
* @returns An object containing the traceparent and tracestate headers.
|
56
|
+
*/
|
57
|
+
function currentOpenTelemetryHeaders() {
|
58
|
+
var propagator = new core_1.W3CTraceContextPropagator();
|
59
|
+
var carrier = {
|
60
|
+
traceparent: null,
|
61
|
+
tracestate: null
|
62
|
+
};
|
63
|
+
var setter = {
|
64
|
+
set: function (carrier, key, value) {
|
65
|
+
if (carrier && typeof carrier === 'object') {
|
66
|
+
carrier[key] = value;
|
67
|
+
}
|
68
|
+
},
|
69
|
+
};
|
70
|
+
propagator.inject(api_1.context.active(), carrier, setter);
|
71
|
+
return {
|
72
|
+
traceparent: carrier.traceparent,
|
73
|
+
tracestate: carrier.tracestate
|
74
|
+
};
|
75
|
+
}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import { Span, Tracer } from '@opentelemetry/api';
|
2
1
|
/**
|
3
2
|
* Represents the available log levels for telemetry.
|
4
3
|
* - DEBUG: Used for detailed information, typically of interest only when diagnosing problems.
|
@@ -12,29 +11,9 @@ export type TelemetryLogLevel = 'DEBUG' | 'INFO' | 'WARNING' | 'ERROR' | 'CRITIC
|
|
12
11
|
* Represents the context for telemetry.
|
13
12
|
* See reference standard documentation [here](https://www.w3.org/TR/trace-context/#design-overview)
|
14
13
|
*/
|
15
|
-
export type
|
14
|
+
export type OpenTelemetryHeaders = {
|
16
15
|
/** The traceparent header value */
|
17
16
|
traceparent: string | null;
|
18
17
|
/** The tracestate header value */
|
19
18
|
tracestate: string | null;
|
20
19
|
};
|
21
|
-
/**
|
22
|
-
* Represents the OpenTelemetry context for a handler.
|
23
|
-
* See reference documentation [here](https://opentelemetry.io/docs/languages/js/instrumentation/#traces)
|
24
|
-
*/
|
25
|
-
export type TelemetryContext = {
|
26
|
-
/**
|
27
|
-
* The current OpenTelemetry Span. If passed to a function,
|
28
|
-
* then for that function, this is the parent span object
|
29
|
-
*/
|
30
|
-
span: Span;
|
31
|
-
/**
|
32
|
-
* The current OpenTelemetry tracer object being
|
33
|
-
* used.
|
34
|
-
*/
|
35
|
-
tracer: Tracer;
|
36
|
-
/**
|
37
|
-
* The telemetry headers
|
38
|
-
*/
|
39
|
-
carrier: TelemetryCarrier;
|
40
|
-
};
|
@@ -0,0 +1,44 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
+
exports.getPackageInfo = getPackageInfo;
|
27
|
+
var fs = __importStar(require("fs"));
|
28
|
+
var path = __importStar(require("path"));
|
29
|
+
function getPackageInfo() {
|
30
|
+
try {
|
31
|
+
// Read the package.json file
|
32
|
+
var packageJsonPath = path.resolve(__dirname, '../../package.json');
|
33
|
+
var packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8');
|
34
|
+
// Parse the JSON content
|
35
|
+
var packageJson = JSON.parse(packageJsonContent);
|
36
|
+
// Extract name and version
|
37
|
+
var name_1 = packageJson.name, version = packageJson.version;
|
38
|
+
return { name: name_1, version: version };
|
39
|
+
}
|
40
|
+
catch (error) {
|
41
|
+
console.error('Error reading package.json:', error);
|
42
|
+
return { name: 'Unknown', version: 'Unknown' };
|
43
|
+
}
|
44
|
+
}
|
package/dist/index.d.ts
CHANGED
@@ -2,8 +2,8 @@ import ArvoEvent from './ArvoEvent';
|
|
2
2
|
import { ArvoDataContentType } from './ArvoEvent/schema';
|
3
3
|
import { createArvoEvent } from './ArvoEvent/helpers';
|
4
4
|
import { CloudEventContext, CloudEventExtension, ArvoEventData, ArvoExtension, OpenTelemetryExtension, CreateArvoEvent } from './ArvoEvent/types';
|
5
|
-
import { exceptionToSpan, logToSpan,
|
6
|
-
import {
|
5
|
+
import { exceptionToSpan, logToSpan, OTelNull, currentOpenTelemetryHeaders } from './OpenTelemetry';
|
6
|
+
import { OpenTelemetryHeaders, TelemetryLogLevel } from './OpenTelemetry/types';
|
7
7
|
import { validateURI, cleanString } from './utils';
|
8
8
|
import ArvoContract from './ArvoContract';
|
9
9
|
import { createArvoContract, InferArvoContract } from './ArvoContract/helpers';
|
@@ -80,4 +80,4 @@ declare const ArvoEventSchemas: {
|
|
80
80
|
tracestate: string | null;
|
81
81
|
}>;
|
82
82
|
};
|
83
|
-
export { ArvoEvent, createArvoEvent, ArvoDataContentType, ArvoEventData, CloudEventExtension, ArvoEventSchemas, CloudEventContext, ArvoExtension, OpenTelemetryExtension, CreateArvoEvent, exceptionToSpan, logToSpan,
|
83
|
+
export { ArvoEvent, createArvoEvent, ArvoDataContentType, ArvoEventData, CloudEventExtension, ArvoEventSchemas, CloudEventContext, ArvoExtension, OpenTelemetryExtension, CreateArvoEvent, exceptionToSpan, logToSpan, OpenTelemetryHeaders, TelemetryLogLevel, OTelNull, validateURI, cleanString, ArvoContract, createArvoContract, ArvoContractValidators, ArvoContractRecord, InferArvoContract, IArvoContract, ResolveArvoContractRecord, ArvoContractLibrary, createArvoContractLibrary, ArvoEventFactory, createArvoEventFactory, ArvoErrorSchema, currentOpenTelemetryHeaders, };
|
package/dist/index.js
CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.ArvoErrorSchema = exports.createArvoEventFactory = exports.ArvoEventFactory = exports.createArvoContractLibrary = exports.ArvoContractLibrary = exports.ArvoContractValidators = exports.createArvoContract = exports.ArvoContract = exports.cleanString = exports.validateURI = exports.OTelNull = exports.
|
6
|
+
exports.currentOpenTelemetryHeaders = exports.ArvoErrorSchema = exports.createArvoEventFactory = exports.ArvoEventFactory = exports.createArvoContractLibrary = exports.ArvoContractLibrary = exports.ArvoContractValidators = exports.createArvoContract = exports.ArvoContract = exports.cleanString = exports.validateURI = exports.OTelNull = exports.logToSpan = exports.exceptionToSpan = exports.ArvoEventSchemas = exports.ArvoDataContentType = exports.createArvoEvent = exports.ArvoEvent = void 0;
|
7
7
|
var ArvoEvent_1 = __importDefault(require("./ArvoEvent"));
|
8
8
|
exports.ArvoEvent = ArvoEvent_1.default;
|
9
9
|
var schema_1 = require("./ArvoEvent/schema");
|
@@ -13,10 +13,8 @@ Object.defineProperty(exports, "createArvoEvent", { enumerable: true, get: funct
|
|
13
13
|
var OpenTelemetry_1 = require("./OpenTelemetry");
|
14
14
|
Object.defineProperty(exports, "exceptionToSpan", { enumerable: true, get: function () { return OpenTelemetry_1.exceptionToSpan; } });
|
15
15
|
Object.defineProperty(exports, "logToSpan", { enumerable: true, get: function () { return OpenTelemetry_1.logToSpan; } });
|
16
|
-
Object.defineProperty(exports, "getTelemetryContext", { enumerable: true, get: function () { return OpenTelemetry_1.getTelemetryContext; } });
|
17
|
-
Object.defineProperty(exports, "getTelemetryCarrier", { enumerable: true, get: function () { return OpenTelemetry_1.getTelemetryCarrier; } });
|
18
|
-
Object.defineProperty(exports, "createOtelSpan", { enumerable: true, get: function () { return OpenTelemetry_1.createOtelSpan; } });
|
19
16
|
Object.defineProperty(exports, "OTelNull", { enumerable: true, get: function () { return OpenTelemetry_1.OTelNull; } });
|
17
|
+
Object.defineProperty(exports, "currentOpenTelemetryHeaders", { enumerable: true, get: function () { return OpenTelemetry_1.currentOpenTelemetryHeaders; } });
|
20
18
|
var utils_1 = require("./utils");
|
21
19
|
Object.defineProperty(exports, "validateURI", { enumerable: true, get: function () { return utils_1.validateURI; } });
|
22
20
|
Object.defineProperty(exports, "cleanString", { enumerable: true, get: function () { return utils_1.cleanString; } });
|