@composed-di/instrumentation-otel 0.6.0-alpha → 0.7.0-alpha
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Tracer } from '@opentelemetry/api';
|
|
2
|
-
import { DisposeContext,
|
|
2
|
+
import { DisposeContext, OperationSpan, InitializeContext, MethodCallContext, ServiceInstrumentation } from '@composed-di/instrumentation-core';
|
|
3
3
|
export interface OTELInstrumentationOptions {
|
|
4
4
|
/**
|
|
5
5
|
* The tracer used to create spans. Defaults to a tracer obtained from
|
|
@@ -15,15 +15,16 @@ export interface OTELInstrumentationOptions {
|
|
|
15
15
|
*
|
|
16
16
|
* Arguments and results are recorded (as the
|
|
17
17
|
* `composed_di.service.function.arguments` / `.result` attributes,
|
|
18
|
-
* serialized to JSON) exactly when `instrument()`
|
|
19
|
-
*
|
|
18
|
+
* serialized to JSON) exactly when `instrument()` (inherited from
|
|
19
|
+
* ServiceInstrumentation) delivers them — capture and redaction policy
|
|
20
|
+
* live in the InstrumentOptions, not here.
|
|
20
21
|
*/
|
|
21
|
-
export declare class OTELInstrumentation
|
|
22
|
+
export declare class OTELInstrumentation extends ServiceInstrumentation {
|
|
22
23
|
private readonly tracer;
|
|
23
24
|
constructor(options?: OTELInstrumentationOptions);
|
|
24
|
-
onInitialize(context: InitializeContext):
|
|
25
|
-
onDispose(context: DisposeContext):
|
|
26
|
-
onMethodCall(context: MethodCallContext):
|
|
25
|
+
onInitialize(context: InitializeContext): OperationSpan;
|
|
26
|
+
onDispose(context: DisposeContext): OperationSpan;
|
|
27
|
+
onMethodCall(context: MethodCallContext): OperationSpan;
|
|
27
28
|
private buildSpan;
|
|
28
29
|
private buildAttributes;
|
|
29
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otelInstrumentation.d.ts","sourceRoot":"","sources":["../src/otelInstrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,MAAM,EACP,MAAM,oBAAoB,CAAA;AAM3B,OAAO,EACL,cAAc,EAEd,
|
|
1
|
+
{"version":3,"file":"otelInstrumentation.d.ts","sourceRoot":"","sources":["../src/otelInstrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,MAAM,EACP,MAAM,oBAAoB,CAAA;AAM3B,OAAO,EACL,cAAc,EAEd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,mCAAmC,CAAA;AAG1C,MAAM,WAAW,0BAA0B;IACzC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,sBAAsB;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,OAAO,GAAE,0BAA+B;IAMpD,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa;IAWvD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa;IAWjD,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa;IAYvD,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,eAAe;CAuBxB"}
|
|
@@ -3,17 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OTELInstrumentation = void 0;
|
|
4
4
|
const api_1 = require("@opentelemetry/api");
|
|
5
5
|
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
6
|
+
const instrumentation_core_1 = require("@composed-di/instrumentation-core");
|
|
6
7
|
/**
|
|
7
8
|
* A ServiceInstrumentation that records service events as OTEL spans.
|
|
8
9
|
*
|
|
9
10
|
* Arguments and results are recorded (as the
|
|
10
11
|
* `composed_di.service.function.arguments` / `.result` attributes,
|
|
11
|
-
* serialized to JSON) exactly when `instrument()`
|
|
12
|
-
*
|
|
12
|
+
* serialized to JSON) exactly when `instrument()` (inherited from
|
|
13
|
+
* ServiceInstrumentation) delivers them — capture and redaction policy
|
|
14
|
+
* live in the InstrumentOptions, not here.
|
|
13
15
|
*/
|
|
14
|
-
class OTELInstrumentation {
|
|
16
|
+
class OTELInstrumentation extends instrumentation_core_1.ServiceInstrumentation {
|
|
15
17
|
constructor(options = {}) {
|
|
16
18
|
var _a;
|
|
19
|
+
super();
|
|
17
20
|
this.tracer =
|
|
18
21
|
(_a = options.tracer) !== null && _a !== void 0 ? _a : api_1.trace.getTracer('@composed-di/instrumentation-otel');
|
|
19
22
|
}
|
|
@@ -22,7 +25,7 @@ class OTELInstrumentation {
|
|
|
22
25
|
key: context.key,
|
|
23
26
|
event: 'initialize',
|
|
24
27
|
className: 'ServiceFactory',
|
|
25
|
-
|
|
28
|
+
methodName: 'initialize',
|
|
26
29
|
});
|
|
27
30
|
const spanName = `ServiceFactory[${context.key.name}].initialize`;
|
|
28
31
|
return this.buildSpan(spanName, attributes);
|
|
@@ -32,7 +35,7 @@ class OTELInstrumentation {
|
|
|
32
35
|
key: context.key,
|
|
33
36
|
event: 'dispose',
|
|
34
37
|
className: 'ServiceFactory',
|
|
35
|
-
|
|
38
|
+
methodName: 'dispose',
|
|
36
39
|
});
|
|
37
40
|
const spanName = `ServiceFactory[${context.key.name}].dispose`;
|
|
38
41
|
return this.buildSpan(spanName, attributes);
|
|
@@ -42,7 +45,7 @@ class OTELInstrumentation {
|
|
|
42
45
|
key: context.key,
|
|
43
46
|
event: 'call',
|
|
44
47
|
className: context.className,
|
|
45
|
-
|
|
48
|
+
methodName: context.methodName,
|
|
46
49
|
args: context.args,
|
|
47
50
|
});
|
|
48
51
|
const spanName = attributes[semantic_conventions_1.ATTR_CODE_FUNCTION_NAME];
|
|
@@ -78,7 +81,7 @@ class OTELInstrumentation {
|
|
|
78
81
|
buildAttributes(params) {
|
|
79
82
|
var _a;
|
|
80
83
|
const attributes = {
|
|
81
|
-
[semantic_conventions_1.ATTR_CODE_FUNCTION_NAME]: `${(_a = params.className) !== null && _a !== void 0 ? _a : params.key.name}.${params.
|
|
84
|
+
[semantic_conventions_1.ATTR_CODE_FUNCTION_NAME]: `${(_a = params.className) !== null && _a !== void 0 ? _a : params.key.name}.${params.methodName}`,
|
|
82
85
|
'composed_di.service.key': params.key.name,
|
|
83
86
|
'composed_di.service.event': params.event,
|
|
84
87
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otelInstrumentation.js","sourceRoot":"","sources":["../src/otelInstrumentation.ts"],"names":[],"mappings":";;;AAAA,4CAM2B;AAC3B,8EAI4C;
|
|
1
|
+
{"version":3,"file":"otelInstrumentation.js","sourceRoot":"","sources":["../src/otelInstrumentation.ts"],"names":[],"mappings":";;;AAAA,4CAM2B;AAC3B,8EAI4C;AAC5C,4EAO0C;AAc1C;;;;;;;;GAQG;AACH,MAAa,mBAAoB,SAAQ,6CAAsB;IAG7D,YAAY,UAAsC,EAAE;;QAClD,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,MAAM;YACT,MAAA,OAAO,CAAC,MAAM,mCAAI,WAAK,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;IAC1E,CAAC;IAED,YAAY,CAAC,OAA0B;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,gBAAgB;YAC3B,UAAU,EAAE,YAAY;SACzB,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,kBAAkB,OAAO,CAAC,GAAG,CAAC,IAAI,cAAc,CAAA;QACjE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC7C,CAAC;IAED,SAAS,CAAC,OAAuB;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,gBAAgB;YAC3B,UAAU,EAAE,SAAS;SACtB,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,kBAAkB,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,CAAA;QAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC7C,CAAC;IAED,YAAY,CAAC,OAA0B;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,UAAU,CAAC,8CAAuB,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC7C,CAAC;IAEO,SAAS,CAAC,QAAgB,EAAE,UAAsB;QACxD,MAAM,aAAa,GAAG,aAAW,CAAC,MAAM,EAAE,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,aAAa,CAAC,CAAA;QAC3E,MAAM,WAAW,GAAG,WAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAEtD,OAAO;YACL,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,aAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9C,GAAG,EAAE,CAAC,OAAyB,EAAE,EAAE;gBACjC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;oBAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;oBACpE,IAAI,CAAC,YAAY,CACf,sCAAe,EACf,KAAK,YAAY,KAAK;wBACpB,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,6CAAsB;wBACtC,CAAC,CAAC,6CAAsB,CAC3B,CAAA;oBACD,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,oBAAc,CAAC,KAAK;wBAC1B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAChE,CAAC,CAAA;gBACJ,CAAC;qBAAM,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;oBAC9B,wDAAwD;oBACxD,yDAAyD;oBACzD,IAAI,CAAC,YAAY,CACf,qCAAqC,EACrC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CACzB,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC,GAAG,EAAE,CAAA;YACZ,CAAC;SACF,CAAA;IACH,CAAC;IAEO,eAAe,CAAC,MAMvB;;QACC,MAAM,UAAU,GAA8B;YAC5C,CAAC,8CAAuB,CAAC,EAAE,GAAG,MAAA,MAAM,CAAC,SAAS,mCAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE;YACxF,yBAAyB,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;YAC1C,2BAA2B,EAAE,MAAM,CAAC,KAAK;SAC1C,CAAA;QAED,0DAA0D;QAC1D,uDAAuD;QACvD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,UAAU,CAAC,wCAAwC,CAAC,GAAG,SAAS,CAC9D,MAAM,CAAC,IAAI,CACZ,CAAA;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;CACF;AApGD,kDAoGC;AAED,SAAS,SAAS,CAAC,KAAc;;IAC/B,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,mCAAI,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;IAAC,WAAM,CAAC;QACP,IAAI,GAAG,kBAAkB,CAAA;IAC3B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@composed-di/instrumentation-otel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0-alpha",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dependency injection",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@opentelemetry/semantic-conventions": "^1.30.0",
|
|
40
|
-
"@composed-di/core": "^0.
|
|
41
|
-
"@composed-di/instrumentation-core": "^0.
|
|
40
|
+
"@composed-di/core": "^0.7.0-alpha",
|
|
41
|
+
"@composed-di/instrumentation-core": "^0.7.0-alpha"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@opentelemetry/api": "1.9.1",
|
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
} from '@opentelemetry/semantic-conventions'
|
|
13
13
|
import {
|
|
14
14
|
DisposeContext,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
OperationOutcome,
|
|
16
|
+
OperationSpan,
|
|
17
17
|
InitializeContext,
|
|
18
18
|
MethodCallContext,
|
|
19
19
|
ServiceInstrumentation,
|
|
@@ -36,59 +36,61 @@ export interface OTELInstrumentationOptions {
|
|
|
36
36
|
*
|
|
37
37
|
* Arguments and results are recorded (as the
|
|
38
38
|
* `composed_di.service.function.arguments` / `.result` attributes,
|
|
39
|
-
* serialized to JSON) exactly when `instrument()`
|
|
40
|
-
*
|
|
39
|
+
* serialized to JSON) exactly when `instrument()` (inherited from
|
|
40
|
+
* ServiceInstrumentation) delivers them — capture and redaction policy
|
|
41
|
+
* live in the InstrumentOptions, not here.
|
|
41
42
|
*/
|
|
42
|
-
export class OTELInstrumentation
|
|
43
|
+
export class OTELInstrumentation extends ServiceInstrumentation {
|
|
43
44
|
private readonly tracer: Tracer
|
|
44
45
|
|
|
45
46
|
constructor(options: OTELInstrumentationOptions = {}) {
|
|
47
|
+
super()
|
|
46
48
|
this.tracer =
|
|
47
49
|
options.tracer ?? trace.getTracer('@composed-di/instrumentation-otel')
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
onInitialize(context: InitializeContext):
|
|
52
|
+
onInitialize(context: InitializeContext): OperationSpan {
|
|
51
53
|
const attributes = this.buildAttributes({
|
|
52
54
|
key: context.key,
|
|
53
55
|
event: 'initialize',
|
|
54
56
|
className: 'ServiceFactory',
|
|
55
|
-
|
|
57
|
+
methodName: 'initialize',
|
|
56
58
|
})
|
|
57
59
|
const spanName = `ServiceFactory[${context.key.name}].initialize`
|
|
58
60
|
return this.buildSpan(spanName, attributes)
|
|
59
61
|
}
|
|
60
62
|
|
|
61
|
-
onDispose(context: DisposeContext):
|
|
63
|
+
onDispose(context: DisposeContext): OperationSpan {
|
|
62
64
|
const attributes = this.buildAttributes({
|
|
63
65
|
key: context.key,
|
|
64
66
|
event: 'dispose',
|
|
65
67
|
className: 'ServiceFactory',
|
|
66
|
-
|
|
68
|
+
methodName: 'dispose',
|
|
67
69
|
})
|
|
68
70
|
const spanName = `ServiceFactory[${context.key.name}].dispose`
|
|
69
71
|
return this.buildSpan(spanName, attributes)
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
onMethodCall(context: MethodCallContext):
|
|
74
|
+
onMethodCall(context: MethodCallContext): OperationSpan {
|
|
73
75
|
const attributes = this.buildAttributes({
|
|
74
76
|
key: context.key,
|
|
75
77
|
event: 'call',
|
|
76
78
|
className: context.className,
|
|
77
|
-
|
|
79
|
+
methodName: context.methodName,
|
|
78
80
|
args: context.args,
|
|
79
81
|
})
|
|
80
82
|
const spanName = attributes[ATTR_CODE_FUNCTION_NAME]
|
|
81
83
|
return this.buildSpan(spanName, attributes)
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
private buildSpan(spanName: string, attributes: Attributes):
|
|
86
|
+
private buildSpan(spanName: string, attributes: Attributes): OperationSpan {
|
|
85
87
|
const parentContext = otelContext.active()
|
|
86
88
|
const span = this.tracer.startSpan(spanName, { attributes }, parentContext)
|
|
87
89
|
const spanContext = trace.setSpan(parentContext, span)
|
|
88
90
|
|
|
89
91
|
return {
|
|
90
92
|
run: (fn) => otelContext.with(spanContext, fn),
|
|
91
|
-
end: (outcome:
|
|
93
|
+
end: (outcome: OperationOutcome) => {
|
|
92
94
|
if (outcome.type === 'failure') {
|
|
93
95
|
const error = outcome.error
|
|
94
96
|
span.recordException(error instanceof Error ? error : String(error))
|
|
@@ -119,11 +121,11 @@ export class OTELInstrumentation implements ServiceInstrumentation {
|
|
|
119
121
|
key: ServiceKey<unknown>
|
|
120
122
|
event: 'initialize' | 'dispose' | 'call'
|
|
121
123
|
className?: string
|
|
122
|
-
|
|
124
|
+
methodName: string
|
|
123
125
|
args?: readonly unknown[]
|
|
124
126
|
}) {
|
|
125
127
|
const attributes: { [key: string]: string } = {
|
|
126
|
-
[ATTR_CODE_FUNCTION_NAME]: `${params.className ?? params.key.name}.${params.
|
|
128
|
+
[ATTR_CODE_FUNCTION_NAME]: `${params.className ?? params.key.name}.${params.methodName}`,
|
|
127
129
|
'composed_di.service.key': params.key.name,
|
|
128
130
|
'composed_di.service.event': params.event,
|
|
129
131
|
}
|