@theia/telemetry 1.77.0-next.0 → 1.77.0-next.12
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/browser/browser-telemetry-service.d.ts +2 -1
- package/lib/browser/browser-telemetry-service.d.ts.map +1 -1
- package/lib/browser/browser-telemetry-service.js +1 -1
- package/lib/browser/browser-telemetry-service.js.map +1 -1
- package/lib/browser-only/browser-only-telemetry-service.d.ts +2 -1
- package/lib/browser-only/browser-only-telemetry-service.d.ts.map +1 -1
- package/lib/browser-only/browser-only-telemetry-service.js.map +1 -1
- package/lib/common/telemetry-protocol.d.ts +1 -2
- package/lib/common/telemetry-protocol.d.ts.map +1 -1
- package/lib/common/telemetry-protocol.js +4 -5
- package/lib/common/telemetry-protocol.js.map +1 -1
- package/lib/common/telemetry-protocol.spec.d.ts +2 -0
- package/lib/common/telemetry-protocol.spec.d.ts.map +1 -0
- package/lib/common/telemetry-protocol.spec.js +36 -0
- package/lib/common/telemetry-protocol.spec.js.map +1 -0
- package/lib/common/telemetry-service.d.ts +1 -18
- package/lib/common/telemetry-service.d.ts.map +1 -1
- package/lib/common/telemetry-service.js +0 -39
- package/lib/common/telemetry-service.js.map +1 -1
- package/lib/common/telemetry-service.spec.js +0 -88
- package/lib/common/telemetry-service.spec.js.map +1 -1
- package/lib/common/telemetry-types.d.ts +17 -0
- package/lib/common/telemetry-types.d.ts.map +1 -1
- package/lib/common/telemetry-types.js +39 -0
- package/lib/common/telemetry-types.js.map +1 -1
- package/lib/common/telemetry-types.spec.js +80 -0
- package/lib/common/telemetry-types.spec.js.map +1 -1
- package/lib/node/telemetry-service-impl.d.ts +2 -1
- package/lib/node/telemetry-service-impl.d.ts.map +1 -1
- package/lib/node/telemetry-service-impl.js.map +1 -1
- package/package.json +3 -3
- package/src/browser/browser-telemetry-service.ts +2 -2
- package/src/browser-only/browser-only-telemetry-service.ts +2 -1
- package/src/common/telemetry-protocol.spec.ts +36 -0
- package/src/common/telemetry-protocol.ts +3 -2
- package/src/common/telemetry-service.spec.ts +2 -102
- package/src/common/telemetry-service.ts +1 -59
- package/src/common/telemetry-types.spec.ts +94 -1
- package/src/common/telemetry-types.ts +59 -0
- package/src/node/telemetry-service-impl.ts +2 -2
|
@@ -2,7 +2,8 @@ import { FrontendIdProvider } from '@theia/core/lib/browser/messaging/frontend-i
|
|
|
2
2
|
import { ILogger } from '@theia/core/lib/common';
|
|
3
3
|
import { TelemetryConsentProvider } from '../common/telemetry-consent-provider';
|
|
4
4
|
import { TelemetryRpc } from '../common/telemetry-protocol';
|
|
5
|
-
import {
|
|
5
|
+
import { TelemetryService } from '../common/telemetry-service';
|
|
6
|
+
import { TelemetryData, TelemetryReportOptions } from '../common/telemetry-types';
|
|
6
7
|
export declare class BrowserTelemetryService implements TelemetryService {
|
|
7
8
|
protected localSinkInterests: readonly string[] | undefined;
|
|
8
9
|
protected localSinkInterestsPromise: Promise<void> | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-telemetry-service.d.ts","sourceRoot":"","sources":["../../src/browser/browser-telemetry-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EACH,YAAY,EACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"browser-telemetry-service.d.ts","sourceRoot":"","sources":["../../src/browser/browser-telemetry-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EACH,YAAY,EACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAwB,MAAM,2BAA2B,CAAC;AAExG,qBACa,uBAAwB,YAAW,gBAAgB;IAE5D,SAAS,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5D,SAAS,CAAC,yBAAyB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAG/D,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAGrC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAG1D,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;IAG7D,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAexG,SAAS,CAAC,uBAAuB,IAAI,IAAI;CAS5C"}
|
|
@@ -22,8 +22,8 @@ const common_1 = require("@theia/core/lib/common");
|
|
|
22
22
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
23
23
|
const telemetry_consent_provider_1 = require("../common/telemetry-consent-provider");
|
|
24
24
|
const telemetry_protocol_1 = require("../common/telemetry-protocol");
|
|
25
|
-
const telemetry_types_1 = require("../common/telemetry-types");
|
|
26
25
|
const telemetry_topic_1 = require("../common/telemetry-topic");
|
|
26
|
+
const telemetry_types_1 = require("../common/telemetry-types");
|
|
27
27
|
let BrowserTelemetryService = class BrowserTelemetryService {
|
|
28
28
|
report(topic, data, options) {
|
|
29
29
|
const event = (0, telemetry_protocol_1.createTelemetryEvent)(topic, this.frontendIdProvider.getId(), data, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-telemetry-service.js","sourceRoot":"","sources":["../../src/browser/browser-telemetry-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,iGAA4F;AAC5F,mDAAiD;AACjD,4DAAyE;AACzE,qFAAgF;AAChF,qEAEsC;AAEtC,+
|
|
1
|
+
{"version":3,"file":"browser-telemetry-service.js","sourceRoot":"","sources":["../../src/browser/browser-telemetry-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,iGAA4F;AAC5F,mDAAiD;AACjD,4DAAyE;AACzE,qFAAgF;AAChF,qEAEsC;AAEtC,+DAAkE;AAClE,+DAAwG;AAGjG,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAiBhC,MAAM,CAAmB,KAAa,EAAE,IAAuB,EAAE,OAAgC;QAC7F,MAAM,KAAK,GAAG,IAAA,yCAAoB,EAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAA,0CAAqB,EAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,IAAA,2CAAsB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrG,OAAO;QACX,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAA,sCAAoB,EAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;eAC1D,IAAI,CAAC,kBAAkB,KAAK,SAAS;eACrC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAA,uCAAqB,EAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAA,2CAAsB,EAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAES,uBAAuB;QAC7B,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAClC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAClE,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC,EACrD,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC,CAC1C,CAAC;QACN,CAAC;IACL,CAAC;CAEJ,CAAA;AAzCY,0DAAuB;AAMb;IADlB,IAAA,kBAAM,EAAC,iCAAY,CAAC;;oDACgB;AAGlB;IADlB,IAAA,kBAAM,EAAC,yCAAkB,CAAC;;mEAC+B;AAGvC;IADlB,IAAA,kBAAM,EAAC,qDAAwB,CAAC;;gEAC4B;AAG1C;IADlB,IAAA,kBAAM,EAAC,gBAAO,CAAC;IAAE,IAAA,iBAAK,EAAC,mCAAmC,CAAC;;uDACzB;kCAf1B,uBAAuB;IADnC,IAAA,sBAAU,GAAE;GACA,uBAAuB,CAyCnC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TelemetryService } from '../common/telemetry-service';
|
|
2
|
+
import { TelemetryData, TelemetryReportOptions } from '../common/telemetry-types';
|
|
2
3
|
export declare class BrowserOnlyTelemetryService implements TelemetryService {
|
|
3
4
|
report<T extends object>(_topic: string, _data?: TelemetryData<T>, _options?: TelemetryReportOptions): void;
|
|
4
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-only-telemetry-service.d.ts","sourceRoot":"","sources":["../../src/browser-only/browser-only-telemetry-service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"browser-only-telemetry-service.d.ts","sourceRoot":"","sources":["../../src/browser-only/browser-only-telemetry-service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAElF,qBACa,2BAA4B,YAAW,gBAAgB;IAChE,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,sBAAsB,GAAG,IAAI;CAC9G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-only-telemetry-service.js","sourceRoot":"","sources":["../../src/browser-only/browser-only-telemetry-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAA0D;
|
|
1
|
+
{"version":3,"file":"browser-only-telemetry-service.js","sourceRoot":"","sources":["../../src/browser-only/browser-only-telemetry-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAA0D;AAKnD,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACpC,MAAM,CAAmB,MAAc,EAAE,KAAwB,EAAE,QAAiC,IAAU,CAAC;CAClH,CAAA;AAFY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,sBAAU,GAAE;GACA,2BAA2B,CAEvC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { TelemetryData, TelemetryReportOptions, TelemetryValue } from './telemetry-
|
|
2
|
-
import { TelemetryEventKind } from './telemetry-types';
|
|
1
|
+
import { TelemetryData, TelemetryEventKind, TelemetryReportOptions, TelemetryValue } from './telemetry-types';
|
|
3
2
|
/** @experimental */
|
|
4
3
|
export interface TelemetryEvent<T extends object = Record<string, TelemetryValue>> {
|
|
5
4
|
readonly topic: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-protocol.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-protocol.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry-protocol.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-protocol.ts"],"names":[],"mappings":"AAkBA,OAAO,EACH,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAC5E,MAAM,mBAAmB,CAAC;AAE3B,oBAAoB;AACpB,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAED,oBAAoB;AACpB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAY7E;AAED,oBAAoB;AACpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7D;AAED,oBAAoB;AACpB,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKlE;AAED,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACjD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,CAAC,EAAE,sBAAsB,GACjC,cAAc,CAAC,CAAC,CAAC,CASnB;AAED,oBAAoB;AACpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAS5E;AAED,oBAAoB;AACpB,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D,oBAAoB;AACpB,eAAO,MAAM,YAAY,eAAyB,CAAC;AAEnD,oBAAoB;AACpB,MAAM,WAAW,YAAY;IACzB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9C"}
|
|
@@ -22,7 +22,6 @@ exports.describeTelemetryEventTopic = describeTelemetryEventTopic;
|
|
|
22
22
|
exports.createTelemetryEvent = createTelemetryEvent;
|
|
23
23
|
exports.snapshotTelemetryEvent = snapshotTelemetryEvent;
|
|
24
24
|
const types_1 = require("@theia/core/lib/common/types");
|
|
25
|
-
const telemetry_service_1 = require("./telemetry-service");
|
|
26
25
|
const telemetry_topic_1 = require("./telemetry-topic");
|
|
27
26
|
const telemetry_types_1 = require("./telemetry-types");
|
|
28
27
|
/** @experimental */
|
|
@@ -36,8 +35,8 @@ function isValidTelemetryEvent(event) {
|
|
|
36
35
|
&& event.session.length > 0
|
|
37
36
|
&& typeof event.timestamp === 'number'
|
|
38
37
|
&& Number.isFinite(event.timestamp)
|
|
39
|
-
&& (event.data === undefined || (0,
|
|
40
|
-
&& (event.attributes === undefined || (0,
|
|
38
|
+
&& (event.data === undefined || (0, telemetry_types_1.isTelemetryData)(event.data))
|
|
39
|
+
&& (event.attributes === undefined || (0, telemetry_types_1.isTelemetryData)(event.attributes));
|
|
41
40
|
}
|
|
42
41
|
/** @experimental */
|
|
43
42
|
function describeTelemetryTopic(topic) {
|
|
@@ -66,8 +65,8 @@ function snapshotTelemetryEvent(event) {
|
|
|
66
65
|
return Object.freeze({
|
|
67
66
|
topic: event.topic,
|
|
68
67
|
kind: event.kind,
|
|
69
|
-
data: (0,
|
|
70
|
-
attributes: (0,
|
|
68
|
+
data: (0, telemetry_types_1.snapshotTelemetryData)(event.data),
|
|
69
|
+
attributes: (0, telemetry_types_1.snapshotTelemetryData)(event.attributes),
|
|
71
70
|
session: event.session,
|
|
72
71
|
timestamp: event.timestamp
|
|
73
72
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-protocol.js","sourceRoot":"","sources":["../../src/common/telemetry-protocol.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;
|
|
1
|
+
{"version":3,"file":"telemetry-protocol.js","sourceRoot":"","sources":["../../src/common/telemetry-protocol.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAmBhF,sDAYC;AAGD,wDAEC;AAGD,kEAKC;AAGD,oDAcC;AAGD,wDASC;AAvED,wDAAwD;AACxD,uDAA0D;AAC1D,uDAE2B;AAY3B,oBAAoB;AACpB,SAAgB,qBAAqB,CAAC,KAAc;IAChD,IAAI,CAAC,IAAA,gBAAQ,EAAiB,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAA,uCAAqB,EAAC,KAAK,CAAC,KAAK,CAAC;WAClC,IAAA,sCAAoB,EAAC,KAAK,CAAC,IAAI,CAAC;WAChC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;WACjC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;WACxB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;WACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;WAChC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAA,iCAAe,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;WACzD,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,IAAA,iCAAe,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,oBAAoB;AACpB,SAAgB,sBAAsB,CAAC,KAAc;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;AAC3D,CAAC;AAED,oBAAoB;AACpB,SAAgB,2BAA2B,CAAC,KAAc;IACtD,IAAI,CAAC,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,oBAAoB;AACpB,SAAgB,oBAAoB,CAChC,KAAa,EACb,OAAe,EACf,IAAuB,EACvB,OAAgC;IAEhC,OAAO;QACH,KAAK;QACL,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO;QAC9B,IAAI;QACJ,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACxB,CAAC;AACN,CAAC;AAED,oBAAoB;AACpB,SAAgB,sBAAsB,CAAC,KAAqB;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,IAAA,uCAAqB,EAAC,KAAK,CAAC,IAAI,CAAC;QACvC,UAAU,EAAE,IAAA,uCAAqB,EAAC,KAAK,CAAC,UAAU,CAAC;QACnD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;KAC7B,CAAC,CAAC;AACP,CAAC;AAED,oBAAoB;AACP,QAAA,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,oBAAoB;AACP,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-protocol.spec.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-protocol.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 STMicroelectronics and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const chai_1 = require("chai");
|
|
19
|
+
const telemetry_protocol_1 = require("./telemetry-protocol");
|
|
20
|
+
describe('telemetry protocol', () => {
|
|
21
|
+
it('validates event kind, attributes, and session', () => {
|
|
22
|
+
const event = {
|
|
23
|
+
topic: 'consumer/action',
|
|
24
|
+
kind: 'error',
|
|
25
|
+
data: { action: 'open', duration: 12 },
|
|
26
|
+
attributes: { source: 'consumer' },
|
|
27
|
+
session: 'frontend-session',
|
|
28
|
+
timestamp: 42
|
|
29
|
+
};
|
|
30
|
+
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)(event)).to.be.true;
|
|
31
|
+
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)({ ...event, kind: 'invalid' })).to.be.false;
|
|
32
|
+
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)({ ...event, session: '' })).to.be.false;
|
|
33
|
+
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)({ ...event, attributes: { nested: {} } })).to.be.false;
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=telemetry-protocol.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-protocol.spec.js","sourceRoot":"","sources":["../../src/common/telemetry-protocol.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,+BAA8B;AAC9B,6DAA6D;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAG;YACV,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,OAAgB;YACtB,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;YACtC,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;YAClC,OAAO,EAAE,kBAAkB;YAC3B,SAAS,EAAE,EAAE;SAChB,CAAC;QAEF,IAAA,aAAM,EAAC,IAAA,0CAAqB,EAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAChD,IAAA,aAAM,EAAC,IAAA,0CAAqB,EAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACzE,IAAA,aAAM,EAAC,IAAA,0CAAqB,EAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACrE,IAAA,aAAM,EAAC,IAAA,0CAAqB,EAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IACxF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
/** @experimental */
|
|
3
|
-
export type TelemetryPrimitive = string | number | boolean;
|
|
4
|
-
/** @experimental */
|
|
5
|
-
export type TelemetryValue = TelemetryPrimitive | readonly string[] | readonly number[] | readonly boolean[];
|
|
6
|
-
/** @experimental */
|
|
7
|
-
export type TelemetryData<T extends object> = {
|
|
8
|
-
[K in keyof T]: T[K] extends TelemetryValue ? T[K] : never;
|
|
9
|
-
};
|
|
10
|
-
/** @experimental */
|
|
11
|
-
export declare function isTelemetryData(data: unknown): data is Record<string, TelemetryValue>;
|
|
12
|
-
/** @experimental */
|
|
13
|
-
export declare function snapshotTelemetryData<T extends object>(data: TelemetryData<T> | undefined): TelemetryData<T> | undefined;
|
|
14
|
-
/** @experimental */
|
|
15
|
-
export interface TelemetryReportOptions {
|
|
16
|
-
readonly kind?: TelemetryEventKind;
|
|
17
|
-
readonly attributes?: TelemetryData<Record<string, TelemetryValue>>;
|
|
18
|
-
}
|
|
1
|
+
import { TelemetryData, TelemetryReportOptions } from './telemetry-types';
|
|
19
2
|
/** @experimental */
|
|
20
3
|
export declare const TelemetryService: unique symbol;
|
|
21
4
|
/** @experimental */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-service.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry-service.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,oBAAoB;AACpB,eAAO,MAAM,gBAAgB,eAA6B,CAAC;AAE3D,oBAAoB;AACpB,MAAM,WAAW,gBAAgB;IAC7B,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC5G"}
|
|
@@ -16,45 +16,6 @@
|
|
|
16
16
|
// *****************************************************************************
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.TelemetryService = void 0;
|
|
19
|
-
exports.isTelemetryData = isTelemetryData;
|
|
20
|
-
exports.snapshotTelemetryData = snapshotTelemetryData;
|
|
21
|
-
const objects_1 = require("@theia/core/lib/common/objects");
|
|
22
|
-
const types_1 = require("@theia/core/lib/common/types");
|
|
23
|
-
function isTelemetryPrimitive(value) {
|
|
24
|
-
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
25
|
-
}
|
|
26
|
-
function isTelemetryArray(value) {
|
|
27
|
-
if (!Array.isArray(value)) {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
if (value.length === 0) {
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
if (!Object.prototype.hasOwnProperty.call(value, 0) || !isTelemetryPrimitive(value[0])) {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
const elementType = typeof value[0];
|
|
37
|
-
for (let index = 1; index < value.length; index++) {
|
|
38
|
-
if (!Object.prototype.hasOwnProperty.call(value, index) || !isTelemetryPrimitive(value[index]) || typeof value[index] !== elementType) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
function isTelemetryValue(value) {
|
|
45
|
-
return isTelemetryPrimitive(value) || isTelemetryArray(value);
|
|
46
|
-
}
|
|
47
|
-
/** @experimental */
|
|
48
|
-
function isTelemetryData(data) {
|
|
49
|
-
if (!(0, types_1.isObject)(data) || Array.isArray(data) || Object.getPrototypeOf(data) !== Object.prototype) {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
return Object.values(data).every(isTelemetryValue);
|
|
53
|
-
}
|
|
54
|
-
/** @experimental */
|
|
55
|
-
function snapshotTelemetryData(data) {
|
|
56
|
-
return data === undefined ? undefined : (0, objects_1.deepFreeze)((0, objects_1.deepClone)(data));
|
|
57
|
-
}
|
|
58
19
|
/** @experimental */
|
|
59
20
|
exports.TelemetryService = Symbol('TelemetryService');
|
|
60
21
|
//# sourceMappingURL=telemetry-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-service.js","sourceRoot":"","sources":["../../src/common/telemetry-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;
|
|
1
|
+
{"version":3,"file":"telemetry-service.js","sourceRoot":"","sources":["../../src/common/telemetry-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAIhF,oBAAoB;AACP,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -16,9 +16,6 @@
|
|
|
16
16
|
// *****************************************************************************
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
const chai_1 = require("chai");
|
|
19
|
-
const uri_1 = require("@theia/core/lib/common/uri");
|
|
20
|
-
const telemetry_protocol_1 = require("./telemetry-protocol");
|
|
21
|
-
const telemetry_service_1 = require("./telemetry-service");
|
|
22
19
|
const typedPayload = {
|
|
23
20
|
action: 'open',
|
|
24
21
|
duration: 12,
|
|
@@ -35,90 +32,5 @@ describe('telemetry service contract', () => {
|
|
|
35
32
|
it('supports consumer-defined payload interfaces without an index signature', () => {
|
|
36
33
|
(0, chai_1.expect)(compileTimeUsage).to.be.a('function');
|
|
37
34
|
});
|
|
38
|
-
it('validates event kind, attributes, and session', () => {
|
|
39
|
-
const event = {
|
|
40
|
-
topic: 'consumer/action',
|
|
41
|
-
kind: 'error',
|
|
42
|
-
data: typedPayload,
|
|
43
|
-
attributes: { source: 'consumer' },
|
|
44
|
-
session: 'frontend-session',
|
|
45
|
-
timestamp: 42
|
|
46
|
-
};
|
|
47
|
-
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)(event)).to.be.true;
|
|
48
|
-
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)({ ...event, kind: 'invalid' })).to.be.false;
|
|
49
|
-
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)({ ...event, session: '' })).to.be.false;
|
|
50
|
-
(0, chai_1.expect)((0, telemetry_protocol_1.isValidTelemetryEvent)({ ...event, attributes: { nested: {} } })).to.be.false;
|
|
51
|
-
});
|
|
52
|
-
it('accepts plain flat payloads with primitive telemetry values', () => {
|
|
53
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(typedPayload)).to.be.true;
|
|
54
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({})).to.be.true;
|
|
55
|
-
});
|
|
56
|
-
it('accepts homogeneous primitive and empty arrays unchanged', () => {
|
|
57
|
-
const strings = ['editor', 'open'];
|
|
58
|
-
const numbers = [4, 8];
|
|
59
|
-
const booleans = [true, false];
|
|
60
|
-
const empty = [];
|
|
61
|
-
const data = { strings, numbers, booleans, empty };
|
|
62
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(data)).to.be.true;
|
|
63
|
-
(0, chai_1.expect)(data.strings).to.equal(strings);
|
|
64
|
-
(0, chai_1.expect)(data.numbers).to.equal(numbers);
|
|
65
|
-
(0, chai_1.expect)(data.booleans).to.equal(booleans);
|
|
66
|
-
(0, chai_1.expect)(data.empty).to.equal(empty);
|
|
67
|
-
});
|
|
68
|
-
it('creates immutable snapshots without transforming accepted values', () => {
|
|
69
|
-
const strings = ['editor', 'open'];
|
|
70
|
-
const data = { action: 'open', duration: 12, successful: true, strings };
|
|
71
|
-
const snapshot = (0, telemetry_service_1.snapshotTelemetryData)(data);
|
|
72
|
-
(0, chai_1.expect)(snapshot).to.deep.equal(data);
|
|
73
|
-
(0, chai_1.expect)(snapshot).not.to.equal(data);
|
|
74
|
-
(0, chai_1.expect)(snapshot?.strings).not.to.equal(strings);
|
|
75
|
-
(0, chai_1.expect)(Object.isFrozen(snapshot)).to.be.true;
|
|
76
|
-
(0, chai_1.expect)(Object.isFrozen(snapshot?.strings)).to.be.true;
|
|
77
|
-
(0, chai_1.expect)((0, telemetry_service_1.snapshotTelemetryData)(undefined)).to.be.undefined;
|
|
78
|
-
});
|
|
79
|
-
it('rejects non-object payloads', () => {
|
|
80
|
-
for (const value of [undefined, 'value', 1, true]) {
|
|
81
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(value)).to.be.false;
|
|
82
|
-
}
|
|
83
|
-
// eslint-disable-next-line no-null/no-null
|
|
84
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(null)).to.be.false;
|
|
85
|
-
});
|
|
86
|
-
it('rejects top-level arrays and nested objects', () => {
|
|
87
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)([])).to.be.false;
|
|
88
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: { nested: true } })).to.be.false;
|
|
89
|
-
});
|
|
90
|
-
it('rejects mixed, nested, and sparse arrays', () => {
|
|
91
|
-
const sparse = new Array(2);
|
|
92
|
-
sparse[1] = 'value';
|
|
93
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: ['value', 1] })).to.be.false;
|
|
94
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: [['nested']] })).to.be.false;
|
|
95
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: sparse })).to.be.false;
|
|
96
|
-
});
|
|
97
|
-
it('rejects unsupported array elements', () => {
|
|
98
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: [{ nested: true }] })).to.be.false;
|
|
99
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: ['value', undefined] })).to.be.false;
|
|
100
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: ['value', () => 'value'] })).to.be.false;
|
|
101
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: ['value', Symbol('value')] })).to.be.false;
|
|
102
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: new Uint8Array([1, 2]) })).to.be.false;
|
|
103
|
-
});
|
|
104
|
-
it('rejects special and binary objects', () => {
|
|
105
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(new Error('failure'))).to.be.false;
|
|
106
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(new Date())).to.be.false;
|
|
107
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(new uri_1.default('file:///workspace'))).to.be.false;
|
|
108
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(new Uint8Array([1, 2]))).to.be.false;
|
|
109
|
-
});
|
|
110
|
-
it('rejects class instances even when their properties are flat', () => {
|
|
111
|
-
class Payload {
|
|
112
|
-
constructor() {
|
|
113
|
-
this.value = 'value';
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)(new Payload())).to.be.false;
|
|
117
|
-
});
|
|
118
|
-
it('rejects unsupported values in otherwise plain payloads', () => {
|
|
119
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: undefined })).to.be.false;
|
|
120
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: () => 'value' })).to.be.false;
|
|
121
|
-
(0, chai_1.expect)((0, telemetry_service_1.isTelemetryData)({ value: Symbol('value') })).to.be.false;
|
|
122
|
-
});
|
|
123
35
|
});
|
|
124
36
|
//# sourceMappingURL=telemetry-service.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-service.spec.js","sourceRoot":"","sources":["../../src/common/telemetry-service.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,+BAA8B;
|
|
1
|
+
{"version":3,"file":"telemetry-service.spec.js","sourceRoot":"","sources":["../../src/common/telemetry-service.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,+BAA8B;AAa9B,MAAM,YAAY,GAAG;IACjB,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAU;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;CACiB,CAAC;AAE3C,MAAM,gBAAgB,GAAG,CAAC,OAAyB,EAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAkB,iBAAiB,EAAE,YAAY,EAAE;IAC3H,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;CACrC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAC/E,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -8,4 +8,21 @@ export type TelemetryLevel = 'off' | 'crash' | 'error' | 'all';
|
|
|
8
8
|
export declare function isKindAllowedByLevel(level: TelemetryLevel, kind: TelemetryEventKind): boolean;
|
|
9
9
|
/** @experimental */
|
|
10
10
|
export declare const BACKEND_TELEMETRY_SESSION = "backend";
|
|
11
|
+
/** @experimental */
|
|
12
|
+
export type TelemetryPrimitive = string | number | boolean;
|
|
13
|
+
/** @experimental */
|
|
14
|
+
export type TelemetryValue = TelemetryPrimitive | readonly string[] | readonly number[] | readonly boolean[];
|
|
15
|
+
/** @experimental */
|
|
16
|
+
export type TelemetryData<T extends object> = {
|
|
17
|
+
[K in keyof T]: T[K] extends TelemetryValue ? T[K] : never;
|
|
18
|
+
};
|
|
19
|
+
/** @experimental */
|
|
20
|
+
export declare function isTelemetryData(data: unknown): data is Record<string, TelemetryValue>;
|
|
21
|
+
/** @experimental */
|
|
22
|
+
export declare function snapshotTelemetryData<T extends object>(data: TelemetryData<T> | undefined): TelemetryData<T> | undefined;
|
|
23
|
+
/** @experimental */
|
|
24
|
+
export interface TelemetryReportOptions {
|
|
25
|
+
readonly kind?: TelemetryEventKind;
|
|
26
|
+
readonly attributes?: TelemetryData<Record<string, TelemetryValue>>;
|
|
27
|
+
}
|
|
11
28
|
//# sourceMappingURL=telemetry-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-types.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry-types.d.ts","sourceRoot":"","sources":["../../src/common/telemetry-types.ts"],"names":[],"mappings":"AAmBA,oBAAoB;AACpB,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7D,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,oBAAoB;AACpB,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAE/D,oBAAoB;AACpB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAI7F;AAED,oBAAoB;AACpB,eAAO,MAAM,yBAAyB,YAAY,CAAC;AAEnD,oBAAoB;AACpB,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,oBAAoB;AACpB,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,OAAO,EAAE,CAAC;AAE7G,oBAAoB;AACpB,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,IAAI;KACzC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAC7D,CAAC;AA6BF,oBAAoB;AACpB,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAKrF;AAED,oBAAoB;AACpB,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAExH;AAED,oBAAoB;AACpB,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;CACvE"}
|
|
@@ -18,6 +18,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
exports.BACKEND_TELEMETRY_SESSION = void 0;
|
|
19
19
|
exports.isTelemetryEventKind = isTelemetryEventKind;
|
|
20
20
|
exports.isKindAllowedByLevel = isKindAllowedByLevel;
|
|
21
|
+
exports.isTelemetryData = isTelemetryData;
|
|
22
|
+
exports.snapshotTelemetryData = snapshotTelemetryData;
|
|
23
|
+
const objects_1 = require("@theia/core/lib/common/objects");
|
|
24
|
+
const types_1 = require("@theia/core/lib/common/types");
|
|
21
25
|
/** @experimental */
|
|
22
26
|
function isTelemetryEventKind(value) {
|
|
23
27
|
return value === 'usage' || value === 'error' || value === 'crash';
|
|
@@ -30,4 +34,39 @@ function isKindAllowedByLevel(level, kind) {
|
|
|
30
34
|
}
|
|
31
35
|
/** @experimental */
|
|
32
36
|
exports.BACKEND_TELEMETRY_SESSION = 'backend';
|
|
37
|
+
function isTelemetryPrimitive(value) {
|
|
38
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
39
|
+
}
|
|
40
|
+
function isTelemetryArray(value) {
|
|
41
|
+
if (!Array.isArray(value)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (value.length === 0) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (!Object.prototype.hasOwnProperty.call(value, 0) || !isTelemetryPrimitive(value[0])) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const elementType = typeof value[0];
|
|
51
|
+
for (let index = 1; index < value.length; index++) {
|
|
52
|
+
if (!Object.prototype.hasOwnProperty.call(value, index) || !isTelemetryPrimitive(value[index]) || typeof value[index] !== elementType) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
function isTelemetryValue(value) {
|
|
59
|
+
return isTelemetryPrimitive(value) || isTelemetryArray(value);
|
|
60
|
+
}
|
|
61
|
+
/** @experimental */
|
|
62
|
+
function isTelemetryData(data) {
|
|
63
|
+
if (!(0, types_1.isObject)(data) || Array.isArray(data) || Object.getPrototypeOf(data) !== Object.prototype) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return Object.values(data).every(isTelemetryValue);
|
|
67
|
+
}
|
|
68
|
+
/** @experimental */
|
|
69
|
+
function snapshotTelemetryData(data) {
|
|
70
|
+
return data === undefined ? undefined : (0, objects_1.deepFreeze)((0, objects_1.deepClone)(data));
|
|
71
|
+
}
|
|
33
72
|
//# sourceMappingURL=telemetry-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-types.js","sourceRoot":"","sources":["../../src/common/telemetry-types.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;
|
|
1
|
+
{"version":3,"file":"telemetry-types.js","sourceRoot":"","sources":["../../src/common/telemetry-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,13 +15,93 @@
|
|
|
15
15
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
16
|
// *****************************************************************************
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const uri_1 = require("@theia/core/lib/common/uri");
|
|
18
19
|
const chai_1 = require("chai");
|
|
19
20
|
const telemetry_types_1 = require("./telemetry-types");
|
|
21
|
+
const typedPayload = {
|
|
22
|
+
action: 'open',
|
|
23
|
+
duration: 12,
|
|
24
|
+
successful: true,
|
|
25
|
+
tags: ['editor', 'open'],
|
|
26
|
+
measurements: [4, 8],
|
|
27
|
+
states: [true, false]
|
|
28
|
+
};
|
|
20
29
|
describe('telemetry types', () => {
|
|
21
30
|
it('validates telemetry event kinds', () => {
|
|
22
31
|
(0, chai_1.expect)(['usage', 'error', 'crash'].every(telemetry_types_1.isTelemetryEventKind)).to.be.true;
|
|
23
32
|
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryEventKind)('invalid')).to.be.false;
|
|
24
33
|
});
|
|
34
|
+
it('accepts plain flat payloads with primitive telemetry values', () => {
|
|
35
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(typedPayload)).to.be.true;
|
|
36
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({})).to.be.true;
|
|
37
|
+
});
|
|
38
|
+
it('accepts homogeneous primitive and empty arrays unchanged', () => {
|
|
39
|
+
const strings = ['editor', 'open'];
|
|
40
|
+
const numbers = [4, 8];
|
|
41
|
+
const booleans = [true, false];
|
|
42
|
+
const empty = [];
|
|
43
|
+
const data = { strings, numbers, booleans, empty };
|
|
44
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(data)).to.be.true;
|
|
45
|
+
(0, chai_1.expect)(data.strings).to.equal(strings);
|
|
46
|
+
(0, chai_1.expect)(data.numbers).to.equal(numbers);
|
|
47
|
+
(0, chai_1.expect)(data.booleans).to.equal(booleans);
|
|
48
|
+
(0, chai_1.expect)(data.empty).to.equal(empty);
|
|
49
|
+
});
|
|
50
|
+
it('creates immutable snapshots without transforming accepted values', () => {
|
|
51
|
+
const strings = ['editor', 'open'];
|
|
52
|
+
const data = { action: 'open', duration: 12, successful: true, strings };
|
|
53
|
+
const snapshot = (0, telemetry_types_1.snapshotTelemetryData)(data);
|
|
54
|
+
(0, chai_1.expect)(snapshot).to.deep.equal(data);
|
|
55
|
+
(0, chai_1.expect)(snapshot).not.to.equal(data);
|
|
56
|
+
(0, chai_1.expect)(snapshot?.strings).not.to.equal(strings);
|
|
57
|
+
(0, chai_1.expect)(Object.isFrozen(snapshot)).to.be.true;
|
|
58
|
+
(0, chai_1.expect)(Object.isFrozen(snapshot?.strings)).to.be.true;
|
|
59
|
+
(0, chai_1.expect)((0, telemetry_types_1.snapshotTelemetryData)(undefined)).to.be.undefined;
|
|
60
|
+
});
|
|
61
|
+
it('rejects non-object payloads', () => {
|
|
62
|
+
for (const value of [undefined, 'value', 1, true]) {
|
|
63
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(value)).to.be.false;
|
|
64
|
+
}
|
|
65
|
+
// eslint-disable-next-line no-null/no-null
|
|
66
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(null)).to.be.false;
|
|
67
|
+
});
|
|
68
|
+
it('rejects top-level arrays and nested objects', () => {
|
|
69
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)([])).to.be.false;
|
|
70
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: { nested: true } })).to.be.false;
|
|
71
|
+
});
|
|
72
|
+
it('rejects mixed, nested, and sparse arrays', () => {
|
|
73
|
+
const sparse = new Array(2);
|
|
74
|
+
sparse[1] = 'value';
|
|
75
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: ['value', 1] })).to.be.false;
|
|
76
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: [['nested']] })).to.be.false;
|
|
77
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: sparse })).to.be.false;
|
|
78
|
+
});
|
|
79
|
+
it('rejects unsupported array elements', () => {
|
|
80
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: [{ nested: true }] })).to.be.false;
|
|
81
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: ['value', undefined] })).to.be.false;
|
|
82
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: ['value', () => 'value'] })).to.be.false;
|
|
83
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: ['value', Symbol('value')] })).to.be.false;
|
|
84
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: new Uint8Array([1, 2]) })).to.be.false;
|
|
85
|
+
});
|
|
86
|
+
it('rejects special and binary objects', () => {
|
|
87
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(new Error('failure'))).to.be.false;
|
|
88
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(new Date())).to.be.false;
|
|
89
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(new uri_1.default('file:///workspace'))).to.be.false;
|
|
90
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(new Uint8Array([1, 2]))).to.be.false;
|
|
91
|
+
});
|
|
92
|
+
it('rejects class instances even when their properties are flat', () => {
|
|
93
|
+
class Payload {
|
|
94
|
+
constructor() {
|
|
95
|
+
this.value = 'value';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)(new Payload())).to.be.false;
|
|
99
|
+
});
|
|
100
|
+
it('rejects unsupported values in otherwise plain payloads', () => {
|
|
101
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: undefined })).to.be.false;
|
|
102
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: () => 'value' })).to.be.false;
|
|
103
|
+
(0, chai_1.expect)((0, telemetry_types_1.isTelemetryData)({ value: Symbol('value') })).to.be.false;
|
|
104
|
+
});
|
|
25
105
|
it('maps telemetry levels to event kinds', () => {
|
|
26
106
|
const kinds = ['usage', 'error', 'crash'];
|
|
27
107
|
const levels = ['off', 'crash', 'error', 'all'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-types.spec.js","sourceRoot":"","sources":["../../src/common/telemetry-types.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,gDAAgD;AAChD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,+BAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"telemetry-types.spec.js","sourceRoot":"","sources":["../../src/common/telemetry-types.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@ import { BackendApplicationContribution } from '@theia/core/lib/node/backend-app
|
|
|
3
3
|
import { TelemetryConsentProvider } from '../common/telemetry-consent-provider';
|
|
4
4
|
import { TelemetryPreferences } from '../common/telemetry-preferences';
|
|
5
5
|
import { TelemetryEvent, TelemetryRpc } from '../common/telemetry-protocol';
|
|
6
|
-
import {
|
|
6
|
+
import { TelemetryService } from '../common/telemetry-service';
|
|
7
|
+
import { TelemetryData, TelemetryReportOptions } from '../common/telemetry-types';
|
|
7
8
|
import { TelemetrySink } from './telemetry-sink';
|
|
8
9
|
interface ValidatedTelemetrySink {
|
|
9
10
|
readonly sink: TelemetrySink;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-service-impl.d.ts","sourceRoot":"","sources":["../../src/node/telemetry-service-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAE1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAqB,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EACH,cAAc,EAAE,YAAY,EAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"telemetry-service-impl.d.ts","sourceRoot":"","sources":["../../src/node/telemetry-service-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAE1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAqB,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EACH,cAAc,EAAE,YAAY,EAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAA6B,aAAa,EAAE,sBAAsB,EAAwB,MAAM,2BAA2B,CAAC;AACnI,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,UAAU,sBAAsB;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;CACtC;AAED,qBACa,oBAAqB,YAAW,gBAAgB,EAAE,YAAY,EAAE,8BAA8B;IAEvG,SAAS,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,GAAG,SAAS,CAAC;IAC/D,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IACtE,SAAS,CAAC,cAAc,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAa;IACrE,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,CAAM;IAC/C,SAAS,CAAC,0BAA0B,UAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;IAG7D,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAGrD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAGrE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAGnC,SAAS,CAAC,IAAI,IAAI,IAAI;IAyBtB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAIxG,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI3B,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM1C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,IAAI;IAoB3D,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAoBjD,SAAS,CAAC,QAAQ,IAAI,SAAS,sBAAsB,EAAE;IAqCvD,SAAS,CAAC,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAwB9D,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAGhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-service-impl.js","sourceRoot":"","sources":["../../src/node/telemetry-service-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,mDAAuE;AAEvE,4DAAwF;AACxF,qFAAgF;AAChF,2EAA0F;AAC1F,qEAEsC;AAEtC,+DAAwH;AACxH,+
|
|
1
|
+
{"version":3,"file":"telemetry-service-impl.js","sourceRoot":"","sources":["../../src/node/telemetry-service-impl.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/telemetry",
|
|
3
|
-
"version": "1.77.0-next.
|
|
3
|
+
"version": "1.77.0-next.12+3980769cc",
|
|
4
4
|
"description": "Theia - Telemetry Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/core": "1.77.0-next.
|
|
6
|
+
"@theia/core": "1.77.0-next.12+3980769cc",
|
|
7
7
|
"tslib": "^2.8.1"
|
|
8
8
|
},
|
|
9
9
|
"publishConfig": {
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"nyc": {
|
|
49
49
|
"extends": "../../configs/nyc.json"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "3980769cc0ccf74ccac5a5a995f41dce3773d759"
|
|
52
52
|
}
|
|
@@ -21,9 +21,9 @@ import { TelemetryConsentProvider } from '../common/telemetry-consent-provider';
|
|
|
21
21
|
import {
|
|
22
22
|
TelemetryRpc, createTelemetryEvent, describeTelemetryTopic, isValidTelemetryEvent, snapshotTelemetryEvent
|
|
23
23
|
} from '../common/telemetry-protocol';
|
|
24
|
-
import {
|
|
25
|
-
import { isKindAllowedByLevel } from '../common/telemetry-types';
|
|
24
|
+
import { TelemetryService } from '../common/telemetry-service';
|
|
26
25
|
import { matchesTelemetryTopic } from '../common/telemetry-topic';
|
|
26
|
+
import { TelemetryData, TelemetryReportOptions, isKindAllowedByLevel } from '../common/telemetry-types';
|
|
27
27
|
|
|
28
28
|
@injectable()
|
|
29
29
|
export class BrowserTelemetryService implements TelemetryService {
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { injectable } from '@theia/core/shared/inversify';
|
|
18
|
-
import {
|
|
18
|
+
import { TelemetryService } from '../common/telemetry-service';
|
|
19
|
+
import { TelemetryData, TelemetryReportOptions } from '../common/telemetry-types';
|
|
19
20
|
|
|
20
21
|
@injectable()
|
|
21
22
|
export class BrowserOnlyTelemetryService implements TelemetryService {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 STMicroelectronics and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { expect } from 'chai';
|
|
18
|
+
import { isValidTelemetryEvent } from './telemetry-protocol';
|
|
19
|
+
|
|
20
|
+
describe('telemetry protocol', () => {
|
|
21
|
+
it('validates event kind, attributes, and session', () => {
|
|
22
|
+
const event = {
|
|
23
|
+
topic: 'consumer/action',
|
|
24
|
+
kind: 'error' as const,
|
|
25
|
+
data: { action: 'open', duration: 12 },
|
|
26
|
+
attributes: { source: 'consumer' },
|
|
27
|
+
session: 'frontend-session',
|
|
28
|
+
timestamp: 42
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
expect(isValidTelemetryEvent(event)).to.be.true;
|
|
32
|
+
expect(isValidTelemetryEvent({ ...event, kind: 'invalid' })).to.be.false;
|
|
33
|
+
expect(isValidTelemetryEvent({ ...event, session: '' })).to.be.false;
|
|
34
|
+
expect(isValidTelemetryEvent({ ...event, attributes: { nested: {} } })).to.be.false;
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { isObject } from '@theia/core/lib/common/types';
|
|
18
|
-
import { TelemetryData, TelemetryReportOptions, TelemetryValue, isTelemetryData, snapshotTelemetryData } from './telemetry-service';
|
|
19
18
|
import { isValidTelemetryTopic } from './telemetry-topic';
|
|
20
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
TelemetryData, TelemetryEventKind, TelemetryReportOptions, TelemetryValue, isTelemetryData, isTelemetryEventKind, snapshotTelemetryData
|
|
21
|
+
} from './telemetry-types';
|
|
21
22
|
|
|
22
23
|
/** @experimental */
|
|
23
24
|
export interface TelemetryEvent<T extends object = Record<string, TelemetryValue>> {
|
|
@@ -15,9 +15,8 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { expect } from 'chai';
|
|
18
|
-
import
|
|
19
|
-
import {
|
|
20
|
-
import { TelemetryData, TelemetryService, isTelemetryData, snapshotTelemetryData } from './telemetry-service';
|
|
18
|
+
import { TelemetryService } from './telemetry-service';
|
|
19
|
+
import { TelemetryData } from './telemetry-types';
|
|
21
20
|
|
|
22
21
|
interface ConsumerPayload {
|
|
23
22
|
action: string;
|
|
@@ -46,103 +45,4 @@ describe('telemetry service contract', () => {
|
|
|
46
45
|
it('supports consumer-defined payload interfaces without an index signature', () => {
|
|
47
46
|
expect(compileTimeUsage).to.be.a('function');
|
|
48
47
|
});
|
|
49
|
-
|
|
50
|
-
it('validates event kind, attributes, and session', () => {
|
|
51
|
-
const event = {
|
|
52
|
-
topic: 'consumer/action',
|
|
53
|
-
kind: 'error' as const,
|
|
54
|
-
data: typedPayload,
|
|
55
|
-
attributes: { source: 'consumer' },
|
|
56
|
-
session: 'frontend-session',
|
|
57
|
-
timestamp: 42
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
expect(isValidTelemetryEvent(event)).to.be.true;
|
|
61
|
-
expect(isValidTelemetryEvent({ ...event, kind: 'invalid' })).to.be.false;
|
|
62
|
-
expect(isValidTelemetryEvent({ ...event, session: '' })).to.be.false;
|
|
63
|
-
expect(isValidTelemetryEvent({ ...event, attributes: { nested: {} } })).to.be.false;
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('accepts plain flat payloads with primitive telemetry values', () => {
|
|
67
|
-
expect(isTelemetryData(typedPayload)).to.be.true;
|
|
68
|
-
expect(isTelemetryData({})).to.be.true;
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('accepts homogeneous primitive and empty arrays unchanged', () => {
|
|
72
|
-
const strings = ['editor', 'open'];
|
|
73
|
-
const numbers = [4, 8];
|
|
74
|
-
const booleans = [true, false];
|
|
75
|
-
const empty: string[] = [];
|
|
76
|
-
const data = { strings, numbers, booleans, empty };
|
|
77
|
-
|
|
78
|
-
expect(isTelemetryData(data)).to.be.true;
|
|
79
|
-
expect(data.strings).to.equal(strings);
|
|
80
|
-
expect(data.numbers).to.equal(numbers);
|
|
81
|
-
expect(data.booleans).to.equal(booleans);
|
|
82
|
-
expect(data.empty).to.equal(empty);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('creates immutable snapshots without transforming accepted values', () => {
|
|
86
|
-
const strings = ['editor', 'open'];
|
|
87
|
-
const data = { action: 'open', duration: 12, successful: true, strings };
|
|
88
|
-
|
|
89
|
-
const snapshot = snapshotTelemetryData(data);
|
|
90
|
-
|
|
91
|
-
expect(snapshot).to.deep.equal(data);
|
|
92
|
-
expect(snapshot).not.to.equal(data);
|
|
93
|
-
expect(snapshot?.strings).not.to.equal(strings);
|
|
94
|
-
expect(Object.isFrozen(snapshot)).to.be.true;
|
|
95
|
-
expect(Object.isFrozen(snapshot?.strings)).to.be.true;
|
|
96
|
-
expect(snapshotTelemetryData(undefined)).to.be.undefined;
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('rejects non-object payloads', () => {
|
|
100
|
-
for (const value of [undefined, 'value', 1, true]) {
|
|
101
|
-
expect(isTelemetryData(value)).to.be.false;
|
|
102
|
-
}
|
|
103
|
-
// eslint-disable-next-line no-null/no-null
|
|
104
|
-
expect(isTelemetryData(null)).to.be.false;
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('rejects top-level arrays and nested objects', () => {
|
|
108
|
-
expect(isTelemetryData([])).to.be.false;
|
|
109
|
-
expect(isTelemetryData({ value: { nested: true } })).to.be.false;
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('rejects mixed, nested, and sparse arrays', () => {
|
|
113
|
-
const sparse = new Array<string>(2);
|
|
114
|
-
sparse[1] = 'value';
|
|
115
|
-
|
|
116
|
-
expect(isTelemetryData({ value: ['value', 1] })).to.be.false;
|
|
117
|
-
expect(isTelemetryData({ value: [['nested']] })).to.be.false;
|
|
118
|
-
expect(isTelemetryData({ value: sparse })).to.be.false;
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('rejects unsupported array elements', () => {
|
|
122
|
-
expect(isTelemetryData({ value: [{ nested: true }] })).to.be.false;
|
|
123
|
-
expect(isTelemetryData({ value: ['value', undefined] })).to.be.false;
|
|
124
|
-
expect(isTelemetryData({ value: ['value', () => 'value'] })).to.be.false;
|
|
125
|
-
expect(isTelemetryData({ value: ['value', Symbol('value')] })).to.be.false;
|
|
126
|
-
expect(isTelemetryData({ value: new Uint8Array([1, 2]) })).to.be.false;
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('rejects special and binary objects', () => {
|
|
130
|
-
expect(isTelemetryData(new Error('failure'))).to.be.false;
|
|
131
|
-
expect(isTelemetryData(new Date())).to.be.false;
|
|
132
|
-
expect(isTelemetryData(new URI('file:///workspace'))).to.be.false;
|
|
133
|
-
expect(isTelemetryData(new Uint8Array([1, 2]))).to.be.false;
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('rejects class instances even when their properties are flat', () => {
|
|
137
|
-
class Payload {
|
|
138
|
-
value = 'value';
|
|
139
|
-
}
|
|
140
|
-
expect(isTelemetryData(new Payload())).to.be.false;
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('rejects unsupported values in otherwise plain payloads', () => {
|
|
144
|
-
expect(isTelemetryData({ value: undefined })).to.be.false;
|
|
145
|
-
expect(isTelemetryData({ value: () => 'value' })).to.be.false;
|
|
146
|
-
expect(isTelemetryData({ value: Symbol('value') })).to.be.false;
|
|
147
|
-
});
|
|
148
48
|
});
|
|
@@ -14,65 +14,7 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
import { isObject } from '@theia/core/lib/common/types';
|
|
19
|
-
import { TelemetryEventKind } from './telemetry-types';
|
|
20
|
-
|
|
21
|
-
/** @experimental */
|
|
22
|
-
export type TelemetryPrimitive = string | number | boolean;
|
|
23
|
-
/** @experimental */
|
|
24
|
-
export type TelemetryValue = TelemetryPrimitive | readonly string[] | readonly number[] | readonly boolean[];
|
|
25
|
-
|
|
26
|
-
/** @experimental */
|
|
27
|
-
export type TelemetryData<T extends object> = {
|
|
28
|
-
[K in keyof T]: T[K] extends TelemetryValue ? T[K] : never;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
function isTelemetryPrimitive(value: unknown): value is TelemetryPrimitive {
|
|
32
|
-
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function isTelemetryArray(value: unknown): value is readonly TelemetryPrimitive[] {
|
|
36
|
-
if (!Array.isArray(value)) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
if (value.length === 0) {
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
if (!Object.prototype.hasOwnProperty.call(value, 0) || !isTelemetryPrimitive(value[0])) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
const elementType = typeof value[0];
|
|
46
|
-
for (let index = 1; index < value.length; index++) {
|
|
47
|
-
if (!Object.prototype.hasOwnProperty.call(value, index) || !isTelemetryPrimitive(value[index]) || typeof value[index] !== elementType) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function isTelemetryValue(value: unknown): value is TelemetryValue {
|
|
55
|
-
return isTelemetryPrimitive(value) || isTelemetryArray(value);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/** @experimental */
|
|
59
|
-
export function isTelemetryData(data: unknown): data is Record<string, TelemetryValue> {
|
|
60
|
-
if (!isObject(data) || Array.isArray(data) || Object.getPrototypeOf(data) !== Object.prototype) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
return Object.values(data).every(isTelemetryValue);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** @experimental */
|
|
67
|
-
export function snapshotTelemetryData<T extends object>(data: TelemetryData<T> | undefined): TelemetryData<T> | undefined {
|
|
68
|
-
return data === undefined ? undefined : deepFreeze(deepClone(data));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/** @experimental */
|
|
72
|
-
export interface TelemetryReportOptions {
|
|
73
|
-
readonly kind?: TelemetryEventKind;
|
|
74
|
-
readonly attributes?: TelemetryData<Record<string, TelemetryValue>>;
|
|
75
|
-
}
|
|
17
|
+
import { TelemetryData, TelemetryReportOptions } from './telemetry-types';
|
|
76
18
|
|
|
77
19
|
/** @experimental */
|
|
78
20
|
export const TelemetryService = Symbol('TelemetryService');
|
|
@@ -14,8 +14,18 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
|
+
import URI from '@theia/core/lib/common/uri';
|
|
17
18
|
import { expect } from 'chai';
|
|
18
|
-
import { TelemetryLevel, isKindAllowedByLevel, isTelemetryEventKind } from './telemetry-types';
|
|
19
|
+
import { TelemetryLevel, isKindAllowedByLevel, isTelemetryData, isTelemetryEventKind, snapshotTelemetryData } from './telemetry-types';
|
|
20
|
+
|
|
21
|
+
const typedPayload = {
|
|
22
|
+
action: 'open',
|
|
23
|
+
duration: 12,
|
|
24
|
+
successful: true,
|
|
25
|
+
tags: ['editor', 'open'],
|
|
26
|
+
measurements: [4, 8],
|
|
27
|
+
states: [true, false]
|
|
28
|
+
};
|
|
19
29
|
|
|
20
30
|
describe('telemetry types', () => {
|
|
21
31
|
it('validates telemetry event kinds', () => {
|
|
@@ -23,6 +33,89 @@ describe('telemetry types', () => {
|
|
|
23
33
|
expect(isTelemetryEventKind('invalid')).to.be.false;
|
|
24
34
|
});
|
|
25
35
|
|
|
36
|
+
it('accepts plain flat payloads with primitive telemetry values', () => {
|
|
37
|
+
expect(isTelemetryData(typedPayload)).to.be.true;
|
|
38
|
+
expect(isTelemetryData({})).to.be.true;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('accepts homogeneous primitive and empty arrays unchanged', () => {
|
|
42
|
+
const strings = ['editor', 'open'];
|
|
43
|
+
const numbers = [4, 8];
|
|
44
|
+
const booleans = [true, false];
|
|
45
|
+
const empty: string[] = [];
|
|
46
|
+
const data = { strings, numbers, booleans, empty };
|
|
47
|
+
|
|
48
|
+
expect(isTelemetryData(data)).to.be.true;
|
|
49
|
+
expect(data.strings).to.equal(strings);
|
|
50
|
+
expect(data.numbers).to.equal(numbers);
|
|
51
|
+
expect(data.booleans).to.equal(booleans);
|
|
52
|
+
expect(data.empty).to.equal(empty);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('creates immutable snapshots without transforming accepted values', () => {
|
|
56
|
+
const strings = ['editor', 'open'];
|
|
57
|
+
const data = { action: 'open', duration: 12, successful: true, strings };
|
|
58
|
+
|
|
59
|
+
const snapshot = snapshotTelemetryData(data);
|
|
60
|
+
|
|
61
|
+
expect(snapshot).to.deep.equal(data);
|
|
62
|
+
expect(snapshot).not.to.equal(data);
|
|
63
|
+
expect(snapshot?.strings).not.to.equal(strings);
|
|
64
|
+
expect(Object.isFrozen(snapshot)).to.be.true;
|
|
65
|
+
expect(Object.isFrozen(snapshot?.strings)).to.be.true;
|
|
66
|
+
expect(snapshotTelemetryData(undefined)).to.be.undefined;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('rejects non-object payloads', () => {
|
|
70
|
+
for (const value of [undefined, 'value', 1, true]) {
|
|
71
|
+
expect(isTelemetryData(value)).to.be.false;
|
|
72
|
+
}
|
|
73
|
+
// eslint-disable-next-line no-null/no-null
|
|
74
|
+
expect(isTelemetryData(null)).to.be.false;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('rejects top-level arrays and nested objects', () => {
|
|
78
|
+
expect(isTelemetryData([])).to.be.false;
|
|
79
|
+
expect(isTelemetryData({ value: { nested: true } })).to.be.false;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('rejects mixed, nested, and sparse arrays', () => {
|
|
83
|
+
const sparse = new Array<string>(2);
|
|
84
|
+
sparse[1] = 'value';
|
|
85
|
+
|
|
86
|
+
expect(isTelemetryData({ value: ['value', 1] })).to.be.false;
|
|
87
|
+
expect(isTelemetryData({ value: [['nested']] })).to.be.false;
|
|
88
|
+
expect(isTelemetryData({ value: sparse })).to.be.false;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('rejects unsupported array elements', () => {
|
|
92
|
+
expect(isTelemetryData({ value: [{ nested: true }] })).to.be.false;
|
|
93
|
+
expect(isTelemetryData({ value: ['value', undefined] })).to.be.false;
|
|
94
|
+
expect(isTelemetryData({ value: ['value', () => 'value'] })).to.be.false;
|
|
95
|
+
expect(isTelemetryData({ value: ['value', Symbol('value')] })).to.be.false;
|
|
96
|
+
expect(isTelemetryData({ value: new Uint8Array([1, 2]) })).to.be.false;
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('rejects special and binary objects', () => {
|
|
100
|
+
expect(isTelemetryData(new Error('failure'))).to.be.false;
|
|
101
|
+
expect(isTelemetryData(new Date())).to.be.false;
|
|
102
|
+
expect(isTelemetryData(new URI('file:///workspace'))).to.be.false;
|
|
103
|
+
expect(isTelemetryData(new Uint8Array([1, 2]))).to.be.false;
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('rejects class instances even when their properties are flat', () => {
|
|
107
|
+
class Payload {
|
|
108
|
+
value = 'value';
|
|
109
|
+
}
|
|
110
|
+
expect(isTelemetryData(new Payload())).to.be.false;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('rejects unsupported values in otherwise plain payloads', () => {
|
|
114
|
+
expect(isTelemetryData({ value: undefined })).to.be.false;
|
|
115
|
+
expect(isTelemetryData({ value: () => 'value' })).to.be.false;
|
|
116
|
+
expect(isTelemetryData({ value: Symbol('value') })).to.be.false;
|
|
117
|
+
});
|
|
118
|
+
|
|
26
119
|
it('maps telemetry levels to event kinds', () => {
|
|
27
120
|
const kinds = ['usage', 'error', 'crash'] as const;
|
|
28
121
|
const levels: TelemetryLevel[] = ['off', 'crash', 'error', 'all'];
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
|
+
import { deepClone, deepFreeze } from '@theia/core/lib/common/objects';
|
|
18
|
+
import { isObject } from '@theia/core/lib/common/types';
|
|
19
|
+
|
|
17
20
|
/** @experimental */
|
|
18
21
|
export type TelemetryEventKind = 'usage' | 'error' | 'crash';
|
|
19
22
|
|
|
@@ -34,3 +37,59 @@ export function isKindAllowedByLevel(level: TelemetryLevel, kind: TelemetryEvent
|
|
|
34
37
|
|
|
35
38
|
/** @experimental */
|
|
36
39
|
export const BACKEND_TELEMETRY_SESSION = 'backend';
|
|
40
|
+
|
|
41
|
+
/** @experimental */
|
|
42
|
+
export type TelemetryPrimitive = string | number | boolean;
|
|
43
|
+
/** @experimental */
|
|
44
|
+
export type TelemetryValue = TelemetryPrimitive | readonly string[] | readonly number[] | readonly boolean[];
|
|
45
|
+
|
|
46
|
+
/** @experimental */
|
|
47
|
+
export type TelemetryData<T extends object> = {
|
|
48
|
+
[K in keyof T]: T[K] extends TelemetryValue ? T[K] : never;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
function isTelemetryPrimitive(value: unknown): value is TelemetryPrimitive {
|
|
52
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function isTelemetryArray(value: unknown): value is readonly TelemetryPrimitive[] {
|
|
56
|
+
if (!Array.isArray(value)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (value.length === 0) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (!Object.prototype.hasOwnProperty.call(value, 0) || !isTelemetryPrimitive(value[0])) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const elementType = typeof value[0];
|
|
66
|
+
for (let index = 1; index < value.length; index++) {
|
|
67
|
+
if (!Object.prototype.hasOwnProperty.call(value, index) || !isTelemetryPrimitive(value[index]) || typeof value[index] !== elementType) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function isTelemetryValue(value: unknown): value is TelemetryValue {
|
|
75
|
+
return isTelemetryPrimitive(value) || isTelemetryArray(value);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** @experimental */
|
|
79
|
+
export function isTelemetryData(data: unknown): data is Record<string, TelemetryValue> {
|
|
80
|
+
if (!isObject(data) || Array.isArray(data) || Object.getPrototypeOf(data) !== Object.prototype) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return Object.values(data).every(isTelemetryValue);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** @experimental */
|
|
87
|
+
export function snapshotTelemetryData<T extends object>(data: TelemetryData<T> | undefined): TelemetryData<T> | undefined {
|
|
88
|
+
return data === undefined ? undefined : deepFreeze(deepClone(data));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** @experimental */
|
|
92
|
+
export interface TelemetryReportOptions {
|
|
93
|
+
readonly kind?: TelemetryEventKind;
|
|
94
|
+
readonly attributes?: TelemetryData<Record<string, TelemetryValue>>;
|
|
95
|
+
}
|
|
@@ -22,9 +22,9 @@ import { TELEMETRY_FILTERS, TelemetryPreferences } from '../common/telemetry-pre
|
|
|
22
22
|
import {
|
|
23
23
|
TelemetryEvent, TelemetryRpc, createTelemetryEvent, describeTelemetryEventTopic, isValidTelemetryEvent, snapshotTelemetryEvent
|
|
24
24
|
} from '../common/telemetry-protocol';
|
|
25
|
-
import {
|
|
25
|
+
import { TelemetryService } from '../common/telemetry-service';
|
|
26
26
|
import { isValidTelemetrySinkId, isValidTelemetryTopicPattern, matchesTelemetryTopic } from '../common/telemetry-topic';
|
|
27
|
-
import { BACKEND_TELEMETRY_SESSION, isKindAllowedByLevel } from '../common/telemetry-types';
|
|
27
|
+
import { BACKEND_TELEMETRY_SESSION, TelemetryData, TelemetryReportOptions, isKindAllowedByLevel } from '../common/telemetry-types';
|
|
28
28
|
import { TelemetrySink } from './telemetry-sink';
|
|
29
29
|
|
|
30
30
|
const MAX_PENDING_EVENTS = 1_000;
|