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 CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  - Fix a type bug in ArvoEvent creation
42
42
 
43
- ## [1.0.22] - 2024-09-07
43
+ ## [1.0.23] - 2024-09-07
44
44
 
45
45
  - Updated OpenTelemetry propagation and fixed propagation in the event factory
46
46
 
@@ -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, telemetry?: TelemetryContext) => ArvoEvent<TData, TExtension, TType>;
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, telemetry) {
50
- return (0, OpenTelemetry_1.createOtelSpan)(telemetry || 'ArvoEvent Creation Tracer', "createArvoEvent<".concat(event.type, ">"), {}, function (telemetryContext) {
51
- if (event.datacontenttype &&
52
- event.datacontenttype !== schema_1.ArvoDataContentType) {
53
- 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 "));
54
- (0, OpenTelemetry_1.logToSpan)(telemetryContext.span, {
55
- level: 'WARNING',
56
- message: warning,
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,5 +1,5 @@
1
- import ArvoEventFactory from ".";
2
- import ArvoContract from "../ArvoContract";
1
+ import ArvoEventFactory from '.';
2
+ import ArvoContract from '../ArvoContract';
3
3
  import { z } from 'zod';
4
4
  /**
5
5
  * Creates a ArvoEventFactory instance based on the provided contract.
@@ -1,7 +1,6 @@
1
- import ArvoContract from "../ArvoContract";
1
+ import ArvoContract from '../ArvoContract';
2
2
  import { z } from 'zod';
3
- import { CreateArvoEvent } from "../ArvoEvent/types";
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 ContractualArvoEventFactory.
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, telemetry?: TelemetryContext): import("..").ArvoEvent<z.TypeOf<TAcceptSchema>, TExtension, TType>;
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, telemetry?: TelemetryContext): import("..").ArvoEvent<z.TypeOf<TEmits[U]>, TExtension, U>;
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, telemetry?: TelemetryContext): import("..").ArvoEvent<{
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 ContractualArvoEventFactory.
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, telemetry) {
55
+ ArvoEventFactory.prototype.accepts = function (event, extensions) {
56
56
  var _this = this;
57
- return (0, OpenTelemetry_1.createOtelSpan)(telemetry || 'ArvoEvent Creation Tracer', "ContractualArvoEventFactory<".concat(this.contract.uri, ">.accepts<").concat(this.contract.accepts.type, ">.create"), {}, function (telemetryContext) {
58
- var validationResult = _this.contract.validateInput(_this.contract.accepts.type, event.data);
59
- if (!validationResult.success) {
60
- throw new Error("Accept Event data validation failed: ".concat(validationResult.error.message));
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, telemetry) {
90
+ ArvoEventFactory.prototype.emits = function (event, extensions) {
77
91
  var _this = this;
78
- return (0, OpenTelemetry_1.createOtelSpan)(telemetry || 'ArvoEvent Creation Tracer', "ContractualArvoEventFactory<".concat(this.contract.uri, ">.emits<").concat(event.type, ">.create"), {}, function (telemetryContext) {
79
- var validationResult = _this.contract.validateOutput(event.type, event.data);
80
- if (!validationResult.success) {
81
- throw new Error("Emit Event data validation failed: ".concat(validationResult.error.message));
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, telemetry) {
123
+ ArvoEventFactory.prototype.systemError = function (event, extensions) {
96
124
  var _this = this;
97
- return (0, OpenTelemetry_1.createOtelSpan)(telemetry || 'ArvoEvent Creation Tracer', "ContractualArvoEventFactory<".concat(this.contract.uri, ">.systemError<sys.").concat(this.contract.accepts.type, ".error>.create"), {}, function (telemetryContext) {
98
- var error = event.error, _events = __rest(event, ["error"]);
99
- return (0, helpers_1.createArvoEvent)(__assign(__assign({}, event), { type: "sys.".concat(_this.contract.accepts.type, ".error"), data: {
100
- errorName: error.name,
101
- errorMessage: error.message,
102
- errorStack: error.stack || null,
103
- }, datacontenttype: schema_1.ArvoDataContentType, dataschema: _this.contract.uri }), extensions, telemetryContext);
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 { Context, Span, SpanOptions } from '@opentelemetry/api';
2
- import { TelemetryCarrier, TelemetryLogLevel, TelemetryContext } from './types';
1
+ import { Span } from '@opentelemetry/api';
2
+ import { TelemetryLogLevel, OpenTelemetryHeaders } from './types';
3
3
  /**
4
- * Retrieves the active context based on the provided trace header.
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 getTelemetryContext: (carrier?: TelemetryCarrier) => Context;
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, level: TelemetryLogLevel, error: Error) => void;
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.createOtelSpan = exports.exceptionToSpan = exports.logToSpan = exports.getTelemetryCarrier = exports.getTelemetryContext = void 0;
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
- * Retrieves the active context based on the provided trace header.
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
- var getTelemetryCarrier = function (span, activeContext) {
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, level, error) {
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': "[".concat(level, "] ").concat(error.name),
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 TelemetryCarrier = {
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,4 @@
1
+ export declare function getPackageInfo(): {
2
+ name: string;
3
+ version: string;
4
+ };
@@ -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, getTelemetryContext, getTelemetryCarrier, createOtelSpan, OTelNull } from './OpenTelemetry';
6
- import { TelemetryCarrier, TelemetryContext, TelemetryLogLevel } from './OpenTelemetry/types';
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, getTelemetryCarrier, getTelemetryContext, createOtelSpan, TelemetryCarrier, TelemetryContext, TelemetryLogLevel, OTelNull, validateURI, cleanString, ArvoContract, createArvoContract, ArvoContractValidators, ArvoContractRecord, InferArvoContract, IArvoContract, ResolveArvoContractRecord, ArvoContractLibrary, createArvoContractLibrary, ArvoEventFactory, createArvoEventFactory, ArvoErrorSchema };
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.createOtelSpan = exports.getTelemetryContext = exports.getTelemetryCarrier = exports.logToSpan = exports.exceptionToSpan = exports.ArvoEventSchemas = exports.ArvoDataContentType = exports.createArvoEvent = exports.ArvoEvent = void 0;
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; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arvo-core",
3
- "version": "1.0.22",
3
+ "version": "1.0.24",
4
4
  "description": "This core package contains all the core classes and components of the Arvo Event Driven System",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {