@moostjs/otel 0.4.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/README.md +1 -0
- package/dist/index.cjs +108 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.mjs +102 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @moostjs/otel
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var api = require('@opentelemetry/api');
|
|
4
|
+
var moost = require('moost');
|
|
5
|
+
|
|
6
|
+
function useOtelContext() {
|
|
7
|
+
const store = moost.useAsyncEventContext().store('otel');
|
|
8
|
+
const getSpan = () => store.get('span');
|
|
9
|
+
const getSpanContext = () => {
|
|
10
|
+
const span = getSpan();
|
|
11
|
+
if (span) {
|
|
12
|
+
return span.spanContext();
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const getPropagationHeaders = () => {
|
|
16
|
+
const c = getSpanContext();
|
|
17
|
+
if (c) {
|
|
18
|
+
return {
|
|
19
|
+
traceparent: `00-${c.traceId}-${c.spanId}-${c.traceFlags}`,
|
|
20
|
+
tracestate: c.traceState,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return {};
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
trace: api.trace,
|
|
27
|
+
withChildSpan: (name, cb, opts) => {
|
|
28
|
+
const parentSpan = getSpan();
|
|
29
|
+
if (parentSpan) {
|
|
30
|
+
const tracer = api.trace.getTracer('moost-tracer');
|
|
31
|
+
const span = tracer.startSpan(name, opts);
|
|
32
|
+
return () => api.context.with(api.trace.setSpan(api.context.active(), span), () => cb());
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return cb();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
getSpan,
|
|
39
|
+
getSpanContext,
|
|
40
|
+
getPropagationHeaders,
|
|
41
|
+
registerSpan: (span) => store.set('span', span),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function useTrace() {
|
|
45
|
+
return api.trace;
|
|
46
|
+
}
|
|
47
|
+
function useSpan() {
|
|
48
|
+
return useOtelContext().getSpan();
|
|
49
|
+
}
|
|
50
|
+
function useOtelPropagation() {
|
|
51
|
+
const { getPropagationHeaders, getSpanContext } = useOtelContext();
|
|
52
|
+
return {
|
|
53
|
+
...getSpanContext(),
|
|
54
|
+
headers: getPropagationHeaders(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function enableOtelForMoost() {
|
|
59
|
+
moost.eventContextHooks.onStartEvent((eventType) => {
|
|
60
|
+
const { registerSpan } = useOtelContext();
|
|
61
|
+
let span;
|
|
62
|
+
if (eventType === 'HTTP') {
|
|
63
|
+
span = api.trace.getSpan(api.context.active());
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const tracer = api.trace.getTracer('moost-tracer');
|
|
67
|
+
span = tracer.startSpan(`${eventType} Event`);
|
|
68
|
+
}
|
|
69
|
+
if (span) {
|
|
70
|
+
registerSpan(span);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
moost.eventContextHooks.onEndEvent((eventType, abortReason) => {
|
|
74
|
+
const { getSpan } = useOtelContext();
|
|
75
|
+
const span = getSpan();
|
|
76
|
+
if (span) {
|
|
77
|
+
const { getMethod, getMethodMeta, getController } = moost.useControllerContext();
|
|
78
|
+
const methodName = getMethod();
|
|
79
|
+
const methodMeta = getMethodMeta();
|
|
80
|
+
span.setAttributes({
|
|
81
|
+
'custom.event_type': eventType,
|
|
82
|
+
'custom.event_description': methodMeta?.description || methodMeta?.label || methodName,
|
|
83
|
+
'moost.controller': moost.getConstructor(getController()).name,
|
|
84
|
+
'moost.handler': methodName,
|
|
85
|
+
});
|
|
86
|
+
if (abortReason) {
|
|
87
|
+
span.recordException(new Error(abortReason));
|
|
88
|
+
span.setStatus({ code: api.SpanStatusCode.ERROR, message: abortReason });
|
|
89
|
+
}
|
|
90
|
+
if (eventType === 'HTTP') {
|
|
91
|
+
const req = moost.useAsyncEventContext()
|
|
92
|
+
.store('event')
|
|
93
|
+
.get('req');
|
|
94
|
+
span.updateName(`${req?.method || ''} ${methodMeta?.id || methodMeta?.label || methodName}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
span.updateName(`${methodMeta?.label || methodName}`);
|
|
98
|
+
span.end();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.enableOtelForMoost = enableOtelForMoost;
|
|
105
|
+
exports.useOtelContext = useOtelContext;
|
|
106
|
+
exports.useOtelPropagation = useOtelPropagation;
|
|
107
|
+
exports.useSpan = useSpan;
|
|
108
|
+
exports.useTrace = useTrace;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as _opentelemetry_api from '@opentelemetry/api';
|
|
2
|
+
import { Span, SpanOptions } from '@opentelemetry/api';
|
|
3
|
+
|
|
4
|
+
interface TOtelContext {
|
|
5
|
+
otel?: {
|
|
6
|
+
span?: Span;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
declare function useOtelContext(): {
|
|
10
|
+
trace: _opentelemetry_api.TraceAPI;
|
|
11
|
+
withChildSpan: <T>(name: string, cb: (...a: any[]) => T, opts?: SpanOptions) => T | (() => T);
|
|
12
|
+
getSpan: () => Span | undefined;
|
|
13
|
+
getSpanContext: () => _opentelemetry_api.SpanContext | undefined;
|
|
14
|
+
getPropagationHeaders: () => {
|
|
15
|
+
traceparent: string;
|
|
16
|
+
tracestate: _opentelemetry_api.TraceState | undefined;
|
|
17
|
+
} | {
|
|
18
|
+
traceparent?: undefined;
|
|
19
|
+
tracestate?: undefined;
|
|
20
|
+
};
|
|
21
|
+
registerSpan: (span: Span) => unknown;
|
|
22
|
+
};
|
|
23
|
+
declare function useTrace(): _opentelemetry_api.TraceAPI;
|
|
24
|
+
declare function useSpan(): Span | undefined;
|
|
25
|
+
declare function useOtelPropagation(): {
|
|
26
|
+
headers: {
|
|
27
|
+
traceparent: string;
|
|
28
|
+
tracestate: _opentelemetry_api.TraceState | undefined;
|
|
29
|
+
} | {
|
|
30
|
+
traceparent?: undefined;
|
|
31
|
+
tracestate?: undefined;
|
|
32
|
+
};
|
|
33
|
+
traceId?: string | undefined;
|
|
34
|
+
spanId?: string | undefined;
|
|
35
|
+
isRemote?: boolean | undefined;
|
|
36
|
+
traceFlags?: number | undefined;
|
|
37
|
+
traceState?: _opentelemetry_api.TraceState | undefined;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
declare function enableOtelForMoost(): void;
|
|
41
|
+
|
|
42
|
+
export { type TOtelContext, enableOtelForMoost, useOtelContext, useOtelPropagation, useSpan, useTrace };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { trace, context, SpanStatusCode } from '@opentelemetry/api';
|
|
2
|
+
import { useAsyncEventContext, eventContextHooks, useControllerContext, getConstructor } from 'moost';
|
|
3
|
+
|
|
4
|
+
function useOtelContext() {
|
|
5
|
+
const store = useAsyncEventContext().store('otel');
|
|
6
|
+
const getSpan = () => store.get('span');
|
|
7
|
+
const getSpanContext = () => {
|
|
8
|
+
const span = getSpan();
|
|
9
|
+
if (span) {
|
|
10
|
+
return span.spanContext();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const getPropagationHeaders = () => {
|
|
14
|
+
const c = getSpanContext();
|
|
15
|
+
if (c) {
|
|
16
|
+
return {
|
|
17
|
+
traceparent: `00-${c.traceId}-${c.spanId}-${c.traceFlags}`,
|
|
18
|
+
tracestate: c.traceState,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {};
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
trace,
|
|
25
|
+
withChildSpan: (name, cb, opts) => {
|
|
26
|
+
const parentSpan = getSpan();
|
|
27
|
+
if (parentSpan) {
|
|
28
|
+
const tracer = trace.getTracer('moost-tracer');
|
|
29
|
+
const span = tracer.startSpan(name, opts);
|
|
30
|
+
return () => context.with(trace.setSpan(context.active(), span), () => cb());
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return cb();
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
getSpan,
|
|
37
|
+
getSpanContext,
|
|
38
|
+
getPropagationHeaders,
|
|
39
|
+
registerSpan: (span) => store.set('span', span),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function useTrace() {
|
|
43
|
+
return trace;
|
|
44
|
+
}
|
|
45
|
+
function useSpan() {
|
|
46
|
+
return useOtelContext().getSpan();
|
|
47
|
+
}
|
|
48
|
+
function useOtelPropagation() {
|
|
49
|
+
const { getPropagationHeaders, getSpanContext } = useOtelContext();
|
|
50
|
+
return {
|
|
51
|
+
...getSpanContext(),
|
|
52
|
+
headers: getPropagationHeaders(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function enableOtelForMoost() {
|
|
57
|
+
eventContextHooks.onStartEvent((eventType) => {
|
|
58
|
+
const { registerSpan } = useOtelContext();
|
|
59
|
+
let span;
|
|
60
|
+
if (eventType === 'HTTP') {
|
|
61
|
+
span = trace.getSpan(context.active());
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const tracer = trace.getTracer('moost-tracer');
|
|
65
|
+
span = tracer.startSpan(`${eventType} Event`);
|
|
66
|
+
}
|
|
67
|
+
if (span) {
|
|
68
|
+
registerSpan(span);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
eventContextHooks.onEndEvent((eventType, abortReason) => {
|
|
72
|
+
const { getSpan } = useOtelContext();
|
|
73
|
+
const span = getSpan();
|
|
74
|
+
if (span) {
|
|
75
|
+
const { getMethod, getMethodMeta, getController } = useControllerContext();
|
|
76
|
+
const methodName = getMethod();
|
|
77
|
+
const methodMeta = getMethodMeta();
|
|
78
|
+
span.setAttributes({
|
|
79
|
+
'custom.event_type': eventType,
|
|
80
|
+
'custom.event_description': methodMeta?.description || methodMeta?.label || methodName,
|
|
81
|
+
'moost.controller': getConstructor(getController()).name,
|
|
82
|
+
'moost.handler': methodName,
|
|
83
|
+
});
|
|
84
|
+
if (abortReason) {
|
|
85
|
+
span.recordException(new Error(abortReason));
|
|
86
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: abortReason });
|
|
87
|
+
}
|
|
88
|
+
if (eventType === 'HTTP') {
|
|
89
|
+
const req = useAsyncEventContext()
|
|
90
|
+
.store('event')
|
|
91
|
+
.get('req');
|
|
92
|
+
span.updateName(`${req?.method || ''} ${methodMeta?.id || methodMeta?.label || methodName}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
span.updateName(`${methodMeta?.label || methodName}`);
|
|
96
|
+
span.end();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export { enableOtelForMoost, useOtelContext, useOtelPropagation, useSpan, useTrace };
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@moostjs/otel",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "@moostjs/otel",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"exports": {
|
|
10
|
+
"./package.json": "./package.json",
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.cjs",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/moostjs/moostjs.git",
|
|
23
|
+
"directory": "packages/otel"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"moost",
|
|
27
|
+
"moostjs",
|
|
28
|
+
"composables",
|
|
29
|
+
"framework",
|
|
30
|
+
"wooksjs",
|
|
31
|
+
"prostojs"
|
|
32
|
+
],
|
|
33
|
+
"author": "Artem Maltsev",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/moostjs/moostjs/issues"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/moostjs/moostjs/tree/main/packages/otel#readme",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@opentelemetry/api": "^1.9.0",
|
|
41
|
+
"moost": "0.4.0"
|
|
42
|
+
}
|
|
43
|
+
}
|