@itwin/core-backend 3.3.0-dev.19 → 3.3.0-dev.21
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/lib/cjs/RpcBackend.d.ts +2 -0
- package/lib/cjs/RpcBackend.d.ts.map +1 -1
- package/lib/cjs/RpcBackend.js +19 -2
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/package.json +12 -14
package/lib/cjs/RpcBackend.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export declare class RpcTrace {
|
|
|
21
21
|
static get expectCurrentActivity(): RpcActivity;
|
|
22
22
|
/** Start the processing of an RpcActivity. */
|
|
23
23
|
static run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T>;
|
|
24
|
+
/** Start the processing of an RpcActivity inside an OpenTelemetry span */
|
|
25
|
+
static runWithSpan<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T>;
|
|
24
26
|
}
|
|
25
27
|
/** @internal */
|
|
26
28
|
export declare function initializeRpcBackend(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcBackend.d.ts","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"RpcBackend.d.ts","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAiD,WAAW,EAAmD,MAAM,oBAAoB,CAAC;AAMjJ;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAElD;;SAEK;IACL,WAAkB,eAAe,IAAI,WAAW,GAAG,SAAS,CAE3D;IAED;;SAEK;IACL,WAAkB,qBAAqB,IAAI,WAAW,CAGrD;IAED,8CAA8C;WAC1B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAInF,0EAA0E;WACtD,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAM5F;AAGD,gBAAgB;AAChB,wBAAgB,oBAAoB,SAwEnC"}
|
package/lib/cjs/RpcBackend.js
CHANGED
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.initializeRpcBackend = exports.RpcTrace = void 0;
|
|
11
11
|
// cspell:ignore calltrace
|
|
12
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
13
|
+
const core_common_1 = require("@itwin/core-common");
|
|
12
14
|
const async_hooks_1 = require("async_hooks");
|
|
13
15
|
const FormData = require("form-data");
|
|
14
16
|
const multiparty = require("multiparty");
|
|
15
|
-
const
|
|
16
|
-
const core_common_1 = require("@itwin/core-common");
|
|
17
|
+
const IModelHost_1 = require("./IModelHost");
|
|
17
18
|
/**
|
|
18
19
|
* Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this
|
|
19
20
|
* class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending
|
|
@@ -39,6 +40,14 @@ class RpcTrace {
|
|
|
39
40
|
static async run(activity, fn) {
|
|
40
41
|
return RpcTrace._storage.run(activity, fn);
|
|
41
42
|
}
|
|
43
|
+
/** Start the processing of an RpcActivity inside an OpenTelemetry span */
|
|
44
|
+
static async runWithSpan(activity, fn) {
|
|
45
|
+
var _a;
|
|
46
|
+
return core_bentley_1.Tracing.withSpan((_a = activity.rpcMethod) !== null && _a !== void 0 ? _a : "unknown RPC method", async () => RpcTrace.run(activity, fn), {
|
|
47
|
+
attributes: { ...core_common_1.RpcInvocation.sanitizeForLog(activity) },
|
|
48
|
+
kind: core_bentley_1.SpanKind.SERVER,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
42
51
|
}
|
|
43
52
|
exports.RpcTrace = RpcTrace;
|
|
44
53
|
RpcTrace._storage = new async_hooks_1.AsyncLocalStorage();
|
|
@@ -49,6 +58,14 @@ function initializeRpcBackend() {
|
|
|
49
58
|
return;
|
|
50
59
|
initialized = true;
|
|
51
60
|
core_common_1.RpcInvocation.runActivity = RpcTrace.run; // redirect the invocation processing to the tracer
|
|
61
|
+
try {
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
63
|
+
const api = require("@opentelemetry/api");
|
|
64
|
+
const tracer = api.trace.getTracer("@itwin/core-backend", IModelHost_1.IModelHost.backendVersion);
|
|
65
|
+
core_bentley_1.Tracing.enableOpenTelemetry(tracer, api);
|
|
66
|
+
core_common_1.RpcInvocation.runActivity = RpcTrace.runWithSpan; // wrap invocation in an OpenTelemetry span in addition to RpcTrace
|
|
67
|
+
}
|
|
68
|
+
catch (_e) { }
|
|
52
69
|
// set up static logger metadata to include current RpcActivity information for logs during rpc processing
|
|
53
70
|
core_bentley_1.Logger.staticMetaData.set("rpc", () => core_common_1.RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));
|
|
54
71
|
core_common_1.RpcMultipart.createStream = (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcBackend.js","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,0BAA0B;AAE1B,6CAAgD;AAChD,sCAAsC;AACtC,yCAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"RpcBackend.js","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,0BAA0B;AAE1B,sDAAwE;AACxE,oDAAiJ;AACjJ,6CAAgD;AAChD,sCAAsC;AACtC,yCAAyC;AACzC,6CAA0C;AAE1C;;;;;;GAMG;AACH,MAAa,QAAQ;IAGnB;;SAEK;IACE,MAAM,KAAK,eAAe;QAC/B,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAA6B,CAAC;IACjE,CAAC;IAED;;SAEK;IACE,MAAM,KAAK,qBAAqB;QACrC,IAAA,qBAAM,EAAC,SAAS,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,eAAe,CAAC;IAClC,CAAC;IAED,8CAA8C;IACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,QAAqB,EAAE,EAAoB;QACpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IACnE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAI,QAAqB,EAAE,EAAoB;;QAC5E,OAAO,sBAAO,CAAC,QAAQ,CAAC,MAAA,QAAQ,CAAC,SAAS,mCAAI,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YAC1G,UAAU,EAAE,EAAE,GAAG,2BAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;YACzD,IAAI,EAAE,uBAAQ,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;;AA7BH,4BA8BC;AA7BgB,iBAAQ,GAAG,IAAI,+BAAiB,EAAE,CAAC;AA+BpD,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,gBAAgB;AAChB,SAAgB,oBAAoB;IAClC,IAAI,WAAW;QACb,OAAO;IAET,WAAW,GAAG,IAAI,CAAC;IAEnB,2BAAa,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,mDAAmD;IAE7F,IAAI;QACF,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,uBAAU,CAAC,cAAc,CAAC,CAAC;QACrF,sBAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACzC,2BAAa,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,mEAAmE;KACtH;IAAC,OAAO,EAAE,EAAE,GAAG;IAEhB,0GAA0G;IAC1G,qBAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,2BAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IAE/F,0BAAY,CAAC,YAAY,GAAG,CAAC,KAAyB,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,0BAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,mHAAmH;QACnH,gBAAgB;QAChB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,0BAAY,CAAC,YAAY,GAAG,KAAK,EAAE,GAAsB,EAAE,EAAE;QAC3D,OAAO,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,gCAAkB,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,GAA4D,EAAE,CAAC;YAEzE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE;gBACxC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;oBACzC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;wBAC3B,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;qBACnC;yBAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;wBACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;yBAC3C;wBAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;wBACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBACpC;yBAAM;wBACL,MAAM,IAAI,yBAAW,CAAC,2BAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;qBAC9D;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,SAAU;oBACR,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/B,IAAI,CAAC,IAAI,EAAE;wBACT,MAAM;qBACP;oBAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACvD,EAAE,CAAC,CAAC;iBACL;gBAED,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAxED,oDAwEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n// cspell:ignore calltrace\r\n\r\nimport { assert, Logger, SpanKind, Tracing } from \"@itwin/core-bentley\";\r\nimport { BentleyStatus, HttpServerRequest, IModelError, RpcActivity, RpcInvocation, RpcMultipart, RpcSerializedValue } from \"@itwin/core-common\";\r\nimport { AsyncLocalStorage } from \"async_hooks\";\r\nimport * as FormData from \"form-data\";\r\nimport * as multiparty from \"multiparty\";\r\nimport { IModelHost } from \"./IModelHost\";\r\n\r\n/**\r\n * Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this\r\n * class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending\r\n * of RpcActivity to log messages emitted during Rpc processing. It may also be used to retrieve the user accessToken\r\n * from the RpcActivity.\r\n * @public\r\n */\r\nexport class RpcTrace {\r\n private static _storage = new AsyncLocalStorage();\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no\r\n * RpcActivity in the current call stack.\r\n * */\r\n public static get currentActivity(): RpcActivity | undefined {\r\n return RpcTrace._storage.getStore() as RpcActivity | undefined;\r\n }\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity\r\n * exists in the current call stack.\r\n * */\r\n public static get expectCurrentActivity(): RpcActivity {\r\n assert(undefined !== RpcTrace.currentActivity);\r\n return RpcTrace.currentActivity;\r\n }\r\n\r\n /** Start the processing of an RpcActivity. */\r\n public static async run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return RpcTrace._storage.run(activity, fn);\r\n }\r\n\r\n /** Start the processing of an RpcActivity inside an OpenTelemetry span */\r\n public static async runWithSpan<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return Tracing.withSpan(activity.rpcMethod ?? \"unknown RPC method\", async () => RpcTrace.run(activity, fn), {\r\n attributes: { ...RpcInvocation.sanitizeForLog(activity) },\r\n kind: SpanKind.SERVER,\r\n });\r\n }\r\n}\r\n\r\nlet initialized = false;\r\n/** @internal */\r\nexport function initializeRpcBackend() {\r\n if (initialized)\r\n return;\r\n\r\n initialized = true;\r\n\r\n RpcInvocation.runActivity = RpcTrace.run; // redirect the invocation processing to the tracer\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const api = require(\"@opentelemetry/api\");\r\n const tracer = api.trace.getTracer(\"@itwin/core-backend\", IModelHost.backendVersion);\r\n Tracing.enableOpenTelemetry(tracer, api);\r\n RpcInvocation.runActivity = RpcTrace.runWithSpan; // wrap invocation in an OpenTelemetry span in addition to RpcTrace\r\n } catch (_e) { }\r\n\r\n // set up static logger metadata to include current RpcActivity information for logs during rpc processing\r\n Logger.staticMetaData.set(\"rpc\", () => RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));\r\n\r\n RpcMultipart.createStream = (value: RpcSerializedValue) => {\r\n const form = new FormData();\r\n RpcMultipart.writeValueToForm(form, value);\r\n // Type information for FormData is lying. It actually extends Stream but not Readable, although it appears to work\r\n // fine for now.\r\n return form;\r\n };\r\n\r\n RpcMultipart.parseRequest = async (req: HttpServerRequest) => {\r\n return new Promise<RpcSerializedValue>((resolve, reject) => {\r\n const form = new multiparty.Form({ maxFieldsSize: Infinity });\r\n form.on(\"error\", (err) => {\r\n reject(err);\r\n });\r\n\r\n const value = RpcSerializedValue.create();\r\n const data: { [index: string]: { size: number, chunks: Buffer[] } } = {};\r\n\r\n form.on(\"part\", (part: multiparty.Part) => {\r\n part.on(\"data\", (chunk: string | Buffer) => {\r\n if (part.name === \"objects\") {\r\n value.objects += chunk.toString();\r\n } else if (Buffer.isBuffer(chunk)) {\r\n if (!data[part.name]) {\r\n data[part.name] = { size: 0, chunks: [] };\r\n }\r\n\r\n data[part.name].size += chunk.byteLength;\r\n data[part.name].chunks.push(chunk);\r\n } else {\r\n throw new IModelError(BentleyStatus.ERROR, \"Unknown input.\");\r\n }\r\n });\r\n });\r\n\r\n form.on(\"close\", () => {\r\n let i = 0;\r\n for (; ;) {\r\n const part = data[`data-${i}`];\r\n if (!part) {\r\n break;\r\n }\r\n\r\n value.data.push(Buffer.concat(part.chunks, part.size));\r\n ++i;\r\n }\r\n\r\n resolve(value);\r\n });\r\n\r\n form.parse(req);\r\n });\r\n };\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-backend",
|
|
3
|
-
"version": "3.3.0-dev.
|
|
3
|
+
"version": "3.3.0-dev.21",
|
|
4
4
|
"description": "iTwin.js backend components",
|
|
5
5
|
"main": "lib/cjs/core-backend.js",
|
|
6
6
|
"typings": "lib/cjs/core-backend",
|
|
@@ -24,13 +24,10 @@
|
|
|
24
24
|
"url": "http://www.bentley.com"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@
|
|
28
|
-
"@itwin/core-common": "^3.3.0-dev.19",
|
|
29
|
-
"@itwin/core-geometry": "^3.3.0-dev.19",
|
|
30
|
-
"@itwin/ecschema-metadata": "^3.3.0-dev.19"
|
|
27
|
+
"@opentelemetry/api": "^1.0.4"
|
|
31
28
|
},
|
|
32
29
|
"peerDependenciesMeta": {
|
|
33
|
-
"@
|
|
30
|
+
"@opentelemetry/api": {
|
|
34
31
|
"optional": true
|
|
35
32
|
}
|
|
36
33
|
},
|
|
@@ -39,13 +36,14 @@
|
|
|
39
36
|
"NOTE: All tools used by scripts in this package must be listed as devDependencies"
|
|
40
37
|
],
|
|
41
38
|
"devDependencies": {
|
|
42
|
-
"@itwin/build-tools": "3.3.0-dev.
|
|
43
|
-
"@itwin/core-bentley": "3.3.0-dev.
|
|
44
|
-
"@itwin/core-common": "3.3.0-dev.
|
|
45
|
-
"@itwin/core-geometry": "3.3.0-dev.
|
|
46
|
-
"@itwin/core-webpack-tools": "3.3.0-dev.
|
|
47
|
-
"@itwin/ecschema-metadata": "3.3.0-dev.
|
|
48
|
-
"@itwin/eslint-plugin": "3.3.0-dev.
|
|
39
|
+
"@itwin/build-tools": "3.3.0-dev.21",
|
|
40
|
+
"@itwin/core-bentley": "3.3.0-dev.21",
|
|
41
|
+
"@itwin/core-common": "3.3.0-dev.21",
|
|
42
|
+
"@itwin/core-geometry": "3.3.0-dev.21",
|
|
43
|
+
"@itwin/core-webpack-tools": "3.3.0-dev.21",
|
|
44
|
+
"@itwin/ecschema-metadata": "3.3.0-dev.21",
|
|
45
|
+
"@itwin/eslint-plugin": "3.3.0-dev.21",
|
|
46
|
+
"@opentelemetry/api": "^1.0.4",
|
|
49
47
|
"@types/chai": "^4.1.4",
|
|
50
48
|
"@types/chai-as-promised": "^7",
|
|
51
49
|
"@types/fs-extra": "^4.0.7",
|
|
@@ -75,7 +73,7 @@
|
|
|
75
73
|
"dependencies": {
|
|
76
74
|
"@azure/storage-blob": "^12.7.0",
|
|
77
75
|
"@bentley/imodeljs-native": "3.2.8",
|
|
78
|
-
"@itwin/core-telemetry": "3.3.0-dev.
|
|
76
|
+
"@itwin/core-telemetry": "3.3.0-dev.21",
|
|
79
77
|
"form-data": "^2.3.2",
|
|
80
78
|
"fs-extra": "^8.1.0",
|
|
81
79
|
"json5": "^2.2.0",
|