@dxos/observability 0.3.11-main.5c52a13 → 0.3.11-main.5cbcf4e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/dist/lib/browser/{chunk-2J5YS65Q.mjs → chunk-6ZTMPKEG.mjs} +3 -3
- package/dist/lib/browser/{chunk-2J5YS65Q.mjs.map → chunk-6ZTMPKEG.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-ROSK6U3K.mjs → chunk-HPGC4HC7.mjs} +3 -3
- package/dist/lib/browser/chunk-HPGC4HC7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-STWCJK52.mjs → chunk-OCQVYNE3.mjs} +223 -129
- package/dist/lib/browser/chunk-OCQVYNE3.mjs.map +7 -0
- package/dist/lib/browser/datadog/index.mjs +1 -1
- package/dist/lib/browser/index.mjs +9 -5
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/observability-QNG5QON4.mjs +10 -0
- package/dist/lib/browser/segment/index.mjs +1 -1
- package/dist/lib/node/{chunk-ARUBPK2W.cjs → chunk-BHF4PKAP.cjs} +6 -6
- package/dist/lib/node/chunk-BHF4PKAP.cjs.map +7 -0
- package/dist/lib/node/{chunk-DE7OVD7T.cjs → chunk-CBMRJXSL.cjs} +211 -119
- package/dist/lib/node/chunk-CBMRJXSL.cjs.map +7 -0
- package/dist/lib/node/{chunk-VDBBIYH6.cjs → chunk-ZJRKFREX.cjs} +6 -6
- package/dist/lib/node/{chunk-VDBBIYH6.cjs.map → chunk-ZJRKFREX.cjs.map} +3 -3
- package/dist/lib/node/datadog/index.cjs +3 -3
- package/dist/lib/node/datadog/index.cjs.map +1 -1
- package/dist/lib/node/index.cjs +20 -16
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{observability-YMIQHLME.cjs → observability-JMKBRR4L.cjs} +8 -8
- package/dist/lib/node/observability-JMKBRR4L.cjs.map +7 -0
- package/dist/lib/node/segment/index.cjs +2 -2
- package/dist/lib/node/segment/index.cjs.map +1 -1
- package/dist/types/src/datadog/metrics.d.ts +3 -1
- package/dist/types/src/datadog/metrics.d.ts.map +1 -1
- package/dist/types/src/datadog/metrics.js +1 -1
- package/dist/types/src/datadog/metrics.js.map +1 -1
- package/dist/types/src/helpers/{app-observability.d.ts → browser-observability.d.ts} +4 -6
- package/dist/types/src/helpers/browser-observability.d.ts.map +1 -0
- package/dist/types/src/helpers/{app-observability.js → browser-observability.js} +22 -51
- package/dist/types/src/helpers/browser-observability.js.map +1 -0
- package/dist/types/src/helpers/common.d.ts +10 -0
- package/dist/types/src/helpers/common.d.ts.map +1 -0
- package/dist/types/src/helpers/common.js +23 -0
- package/dist/types/src/helpers/common.js.map +1 -0
- package/dist/types/src/helpers/index.d.ts +3 -1
- package/dist/types/src/helpers/index.d.ts.map +1 -1
- package/dist/types/src/helpers/index.js +3 -1
- package/dist/types/src/helpers/index.js.map +1 -1
- package/dist/types/src/helpers/node-observability.d.ts +34 -0
- package/dist/types/src/helpers/node-observability.d.ts.map +1 -0
- package/dist/types/src/helpers/node-observability.js +106 -0
- package/dist/types/src/helpers/node-observability.js.map +1 -0
- package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +1 -1
- package/dist/types/src/helpers/setup-telemetry-listeners.js +7 -12
- package/dist/types/src/helpers/setup-telemetry-listeners.js.map +1 -1
- package/dist/types/src/observability.d.ts +5 -4
- package/dist/types/src/observability.d.ts.map +1 -1
- package/dist/types/src/observability.js +29 -16
- package/dist/types/src/observability.js.map +1 -1
- package/dist/types/src/segment/browser.d.ts.map +1 -1
- package/dist/types/src/segment/browser.js +2 -2
- package/dist/types/src/segment/browser.js.map +1 -1
- package/dist/types/src/segment/node.d.ts.map +1 -1
- package/dist/types/src/segment/node.js +2 -2
- package/dist/types/src/segment/node.js.map +1 -1
- package/dist/types/src/segment/types.d.ts +3 -1
- package/dist/types/src/segment/types.d.ts.map +1 -1
- package/package.json +17 -14
- package/src/datadog/metrics.ts +3 -5
- package/src/helpers/{app-observability.ts → browser-observability.ts} +26 -54
- package/src/helpers/common.ts +25 -0
- package/src/helpers/index.ts +3 -1
- package/src/helpers/node-observability.ts +151 -0
- package/src/helpers/setup-telemetry-listeners.ts +2 -7
- package/src/observability.ts +40 -20
- package/src/segment/browser.ts +3 -3
- package/src/segment/node.ts +3 -3
- package/src/segment/types.ts +1 -1
- package/dist/lib/browser/chunk-ROSK6U3K.mjs.map +0 -7
- package/dist/lib/browser/chunk-STWCJK52.mjs.map +0 -7
- package/dist/lib/browser/observability-XIDFB6PJ.mjs +0 -10
- package/dist/lib/node/chunk-ARUBPK2W.cjs.map +0 -7
- package/dist/lib/node/chunk-DE7OVD7T.cjs.map +0 -7
- package/dist/lib/node/observability-YMIQHLME.cjs.map +0 -7
- package/dist/types/src/helpers/app-observability.d.ts.map +0 -1
- package/dist/types/src/helpers/app-observability.js.map +0 -1
- /package/dist/lib/browser/{observability-XIDFB6PJ.mjs.map → observability-QNG5QON4.mjs.map} +0 -0
|
@@ -25,44 +25,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
__setModuleDefault(result, mod);
|
|
26
26
|
return result;
|
|
27
27
|
};
|
|
28
|
-
var _a;
|
|
29
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.initializeAppObservability = exports.storeObservabilityGroup = exports.getObservabilityGroup = exports.storeObservabilityDisabled = exports.isObservabilityDisabled = exports.
|
|
29
|
+
exports.initializeAppObservability = exports.storeObservabilityGroup = exports.getObservabilityGroup = exports.storeObservabilityDisabled = exports.isObservabilityDisabled = exports.OBSERVABILITY_GROUP_KEY = exports.OBSERVABILITY_DISABLED_KEY = void 0;
|
|
31
30
|
// NOTE: localStorage is not available in web workers.
|
|
32
31
|
const localForage = __importStar(require("localforage"));
|
|
33
32
|
const log_1 = require("@dxos/log");
|
|
34
|
-
exports.
|
|
35
|
-
|
|
36
|
-
exports.OBSERVABILITY_DISABLED_KEY = 'telemetry-disabled';
|
|
37
|
-
exports.OBSERVABILITY_GROUP_KEY = 'telemetry-group';
|
|
38
|
-
if (typeof navigator !== 'undefined' && ((_a = navigator.storage) === null || _a === void 0 ? void 0 : _a.estimate)) {
|
|
39
|
-
setInterval(async () => {
|
|
40
|
-
try {
|
|
41
|
-
const storageEstimate = await navigator.storage.estimate();
|
|
42
|
-
exports.BASE_TELEMETRY_PROPERTIES.storageUsage = storageEstimate.usage;
|
|
43
|
-
exports.BASE_TELEMETRY_PROPERTIES.storageQuota = storageEstimate.quota;
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
log_1.log.warn('Failed to run estimate()', error);
|
|
47
|
-
}
|
|
48
|
-
}, 10e3);
|
|
49
|
-
}
|
|
50
|
-
// TODO(wittjosiah): Improve privacy of telemetry identifiers.
|
|
51
|
-
// - Identifier should be generated client-side with no attachment to identity.
|
|
52
|
-
// - Identifier can then be reset by user.
|
|
53
|
-
// - Identifier can be synced via HALO to allow for correlation of events bewteen devices.
|
|
54
|
-
// - Identifier should also be stored outside of HALO such that it is available immediately on startup.
|
|
55
|
-
const getTelemetryIdentifier = (client) => {
|
|
56
|
-
if (!(client === null || client === void 0 ? void 0 : client.initialized)) {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
const identity = client.halo.identity.get();
|
|
60
|
-
if (identity) {
|
|
61
|
-
return identity.identityKey.truncate();
|
|
62
|
-
}
|
|
63
|
-
return undefined;
|
|
64
|
-
};
|
|
65
|
-
exports.getTelemetryIdentifier = getTelemetryIdentifier;
|
|
33
|
+
exports.OBSERVABILITY_DISABLED_KEY = 'observability-disabled';
|
|
34
|
+
exports.OBSERVABILITY_GROUP_KEY = 'observability-group';
|
|
66
35
|
const isObservabilityDisabled = async (namespace) => {
|
|
67
36
|
try {
|
|
68
37
|
return (await localForage.getItem(`${namespace}:${exports.OBSERVABILITY_DISABLED_KEY}`)) === 'true';
|
|
@@ -101,11 +70,11 @@ const storeObservabilityGroup = async (namespace, value) => {
|
|
|
101
70
|
}
|
|
102
71
|
};
|
|
103
72
|
exports.storeObservabilityGroup = storeObservabilityGroup;
|
|
104
|
-
// TODO(wittjosiah): Store preference for disabling
|
|
73
|
+
// TODO(wittjosiah): Store preference for disabling observability.
|
|
105
74
|
// At minimum should be stored locally (i.e., localstorage), possibly in halo preference.
|
|
106
75
|
// Needs to be hooked up to settings page for user visibility.
|
|
107
76
|
const initializeAppObservability = async ({ namespace, config, mode = 'basic', tracingEnable = true, replayEnable = true, }) => {
|
|
108
|
-
var _a;
|
|
77
|
+
var _a, _b;
|
|
109
78
|
(0, log_1.log)('initializeAppObservability', { config });
|
|
110
79
|
/*
|
|
111
80
|
const platform = (await client.services.services.SystemService?.getPlatform()) as Platform;
|
|
@@ -117,9 +86,6 @@ const initializeAppObservability = async ({ namespace, config, mode = 'basic', t
|
|
|
117
86
|
const group = (_a = (await (0, exports.getObservabilityGroup)(namespace))) !== null && _a !== void 0 ? _a : undefined;
|
|
118
87
|
const release = `${namespace}@${config.get('runtime.app.build.version')}`;
|
|
119
88
|
const environment = config.get('runtime.app.env.DX_ENVIRONMENT');
|
|
120
|
-
exports.BASE_TELEMETRY_PROPERTIES.group = group;
|
|
121
|
-
exports.BASE_TELEMETRY_PROPERTIES.release = release;
|
|
122
|
-
exports.BASE_TELEMETRY_PROPERTIES.environment = environment;
|
|
123
89
|
const observabilityDisabled = await (0, exports.isObservabilityDisabled)(namespace);
|
|
124
90
|
const { Observability } = await Promise.resolve().then(() => __importStar(require('../observability')));
|
|
125
91
|
// TODO(nf): configure mode
|
|
@@ -151,11 +117,10 @@ const initializeAppObservability = async ({ namespace, config, mode = 'basic', t
|
|
|
151
117
|
const getIPData = async (config) => {
|
|
152
118
|
const IP_DATA_CACHE_TIMEOUT = 6 * 60 * 60 * 1000; // 6 hours
|
|
153
119
|
// Check cache first.
|
|
154
|
-
const cachedData = await localForage.getItem('dxos:
|
|
120
|
+
const cachedData = await localForage.getItem('dxos:observability:ipdata');
|
|
155
121
|
if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
|
|
156
122
|
return cachedData.data;
|
|
157
123
|
}
|
|
158
|
-
// TODO(nf): move into observability
|
|
159
124
|
// Fetch data if not cached.
|
|
160
125
|
const IPDATA_API_KEY = config.get('runtime.app.env.DX_IPDATA_API_KEY');
|
|
161
126
|
if (IPDATA_API_KEY) {
|
|
@@ -164,7 +129,7 @@ const initializeAppObservability = async ({ namespace, config, mode = 'basic', t
|
|
|
164
129
|
.then((data) => {
|
|
165
130
|
// Cache data.
|
|
166
131
|
localForage
|
|
167
|
-
.setItem('dxos:
|
|
132
|
+
.setItem('dxos:observability:ipdata', {
|
|
168
133
|
data,
|
|
169
134
|
timestamp: Date.now(),
|
|
170
135
|
})
|
|
@@ -174,17 +139,23 @@ const initializeAppObservability = async ({ namespace, config, mode = 'basic', t
|
|
|
174
139
|
.catch((err) => observability.captureException(err));
|
|
175
140
|
}
|
|
176
141
|
};
|
|
177
|
-
const ipData = await getIPData(config);
|
|
178
|
-
if (ipData && ipData.city) {
|
|
179
|
-
exports.BASE_TELEMETRY_PROPERTIES.city = ipData.city;
|
|
180
|
-
exports.BASE_TELEMETRY_PROPERTIES.region = ipData.region;
|
|
181
|
-
exports.BASE_TELEMETRY_PROPERTIES.country = ipData.country;
|
|
182
|
-
exports.BASE_TELEMETRY_PROPERTIES.latitude = ipData.latitude;
|
|
183
|
-
exports.BASE_TELEMETRY_PROPERTIES.longitude = ipData.longitude;
|
|
184
|
-
}
|
|
185
142
|
// TODO(nf): plugin state?
|
|
186
143
|
// TODO(nf): should provide capability to init Sentry earlier in booting process to capture errors during initialization.
|
|
187
144
|
observability.initialize();
|
|
145
|
+
const ipData = await getIPData(config);
|
|
146
|
+
ipData && observability.addIPDataTelemetryTags(ipData);
|
|
147
|
+
if (typeof navigator !== 'undefined' && ((_b = navigator.storage) === null || _b === void 0 ? void 0 : _b.estimate)) {
|
|
148
|
+
setInterval(async () => {
|
|
149
|
+
try {
|
|
150
|
+
const storageEstimate = await navigator.storage.estimate();
|
|
151
|
+
storageEstimate.usage && observability.setTag('storageUsage', storageEstimate.usage.toString(), 'telemetry');
|
|
152
|
+
storageEstimate.quota && observability.setTag('storageQuota', storageEstimate.quota.toString(), 'telemetry');
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
log_1.log.warn('Failed to run estimate()', error);
|
|
156
|
+
}
|
|
157
|
+
}, 10e3);
|
|
158
|
+
}
|
|
188
159
|
}
|
|
189
160
|
catch (err) {
|
|
190
161
|
log_1.log.error('Failed to initialize app observability', err);
|
|
@@ -192,4 +163,4 @@ const initializeAppObservability = async ({ namespace, config, mode = 'basic', t
|
|
|
192
163
|
return observability;
|
|
193
164
|
};
|
|
194
165
|
exports.initializeAppObservability = initializeAppObservability;
|
|
195
|
-
//# sourceMappingURL=
|
|
166
|
+
//# sourceMappingURL=browser-observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-observability.js","sourceRoot":"","sources":["../../../../src/helpers/browser-observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Client } from '@dxos/client';
|
|
2
|
+
export declare const getTelemetryIdentifier: (client: Client) => string | undefined;
|
|
3
|
+
export type IPData = {
|
|
4
|
+
city: string;
|
|
5
|
+
region: string;
|
|
6
|
+
country: string;
|
|
7
|
+
latitude: number;
|
|
8
|
+
longitude: number;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/helpers/common.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAO3C,eAAO,MAAM,sBAAsB,WAAY,MAAM,uBAWpD,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2022 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getTelemetryIdentifier = void 0;
|
|
7
|
+
// TODO(wittjosiah): Improve privacy of telemetry identifiers.
|
|
8
|
+
// - Identifier should be generated client-side with no attachment to identity.
|
|
9
|
+
// - Identifier can then be reset by user.
|
|
10
|
+
// - Identifier can be synced via HALO to allow for correlation of events bewteen devices.
|
|
11
|
+
// - Identifier should also be stored outside of HALO such that it is available immediately on startup.
|
|
12
|
+
const getTelemetryIdentifier = (client) => {
|
|
13
|
+
if (!(client === null || client === void 0 ? void 0 : client.initialized)) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const identity = client.halo.identity.get();
|
|
17
|
+
if (identity) {
|
|
18
|
+
return identity.identityKey.truncate();
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
};
|
|
22
|
+
exports.getTelemetryIdentifier = getTelemetryIdentifier;
|
|
23
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/helpers/common.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;AAIF,8DAA8D;AAC9D,gFAAgF;AAChF,2CAA2C;AAC3C,2FAA2F;AAC3F,wGAAwG;AACjG,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE;IACvD,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,CAAA,EAAE;QACxB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,QAAQ,EAAE;QACZ,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;KACxC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAXW,QAAA,sBAAsB,0BAWjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/helpers/index.ts"],"names":[],"mappings":"AAIA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/helpers/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC;AACxC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC"}
|
|
@@ -17,7 +17,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
__exportStar(require("./
|
|
20
|
+
__exportStar(require("./browser-observability"), exports);
|
|
21
|
+
__exportStar(require("./common"), exports);
|
|
22
|
+
__exportStar(require("./node-observability"), exports);
|
|
21
23
|
__exportStar(require("./map-spaces"), exports);
|
|
22
24
|
__exportStar(require("./setup-telemetry-listeners"), exports);
|
|
23
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/helpers/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/helpers/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,0DAAwC;AACxC,2CAAyB;AACzB,uDAAqC;AACrC,+CAA6B;AAC7B,8DAA4C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Config } from '@dxos/client';
|
|
2
|
+
import { Observability, type Mode } from '../observability';
|
|
3
|
+
/**
|
|
4
|
+
* Print observability banner once per installation.
|
|
5
|
+
*/
|
|
6
|
+
export declare const showObservabilityBanner: (configDir: string, bannercb: (input: string) => void) => Promise<void>;
|
|
7
|
+
export declare const getObservabilityState: (configDir: string) => Promise<PersistentObservabilityState>;
|
|
8
|
+
export type TelemetryContext = {
|
|
9
|
+
mode: Mode;
|
|
10
|
+
installationId?: string;
|
|
11
|
+
group?: string;
|
|
12
|
+
timezone: string;
|
|
13
|
+
runtime: string;
|
|
14
|
+
os: string;
|
|
15
|
+
arch: string;
|
|
16
|
+
ci: boolean;
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
};
|
|
19
|
+
export type PersistentObservabilityState = {
|
|
20
|
+
installationId: string;
|
|
21
|
+
group?: string;
|
|
22
|
+
mode: Mode;
|
|
23
|
+
};
|
|
24
|
+
export type NodeObservabilityOptions = {
|
|
25
|
+
installationId: string;
|
|
26
|
+
group?: string;
|
|
27
|
+
namespace: string;
|
|
28
|
+
config: Config;
|
|
29
|
+
mode?: Mode;
|
|
30
|
+
tracingEnable?: boolean;
|
|
31
|
+
replayEnable?: boolean;
|
|
32
|
+
};
|
|
33
|
+
export declare const initializeNodeObservability: ({ namespace, config, installationId, group, mode, tracingEnable, replayEnable, }: NodeObservabilityOptions) => Promise<Observability>;
|
|
34
|
+
//# sourceMappingURL=node-observability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-observability.d.ts","sourceRoot":"","sources":["../../../../src/helpers/node-observability.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,uBAAuB,cAAqB,MAAM,oBAAoB,MAAM,KAAK,IAAI,kBAcjG,CAAC;AAEF,eAAO,MAAM,qBAAqB,cAAqB,MAAM,KAAG,QAAQ,4BAA4B,CAkBnG,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AA8BF,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CAExB,CAAC;AAEF,eAAO,MAAM,2BAA2B,qFAQrC,wBAAwB,KAAG,QAAQ,aAAa,CAgClD,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initializeNodeObservability = exports.getObservabilityState = exports.showObservabilityBanner = void 0;
|
|
7
|
+
//
|
|
8
|
+
// Copyright 2022 DXOS.org
|
|
9
|
+
//
|
|
10
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const promises_1 = require("node:fs/promises");
|
|
13
|
+
const node_path_1 = require("node:path");
|
|
14
|
+
const uuid_1 = require("uuid");
|
|
15
|
+
const log_1 = require("@dxos/log");
|
|
16
|
+
const observability_1 = require("../observability");
|
|
17
|
+
/**
|
|
18
|
+
* Print observability banner once per installation.
|
|
19
|
+
*/
|
|
20
|
+
const showObservabilityBanner = async (configDir, bannercb) => {
|
|
21
|
+
const path = (0, node_path_1.join)(configDir, '.observability-banner-printed');
|
|
22
|
+
if ((0, node_fs_1.existsSync)(path)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
bannercb(
|
|
26
|
+
// eslint-disable-next-line no-multi-str
|
|
27
|
+
'Basic observability data will be sent to the DXOS team in order to improve the product. This includes \
|
|
28
|
+
performance metrics, error logs, and usage data. No personally identifiable information, other than your \
|
|
29
|
+
public key, is included with this data and no private data ever leaves your devices. To disable sending \
|
|
30
|
+
observability data, set the environment variable DX_DISABLE_TELEMETRY=true.');
|
|
31
|
+
await (0, promises_1.writeFile)(path, '', 'utf-8');
|
|
32
|
+
};
|
|
33
|
+
exports.showObservabilityBanner = showObservabilityBanner;
|
|
34
|
+
const getObservabilityState = async (configDir) => {
|
|
35
|
+
// check whether configDir exists and if it's a directory
|
|
36
|
+
var _a;
|
|
37
|
+
if ((0, node_fs_1.existsSync)(configDir)) {
|
|
38
|
+
if (!(0, node_fs_1.statSync)(configDir).isDirectory()) {
|
|
39
|
+
throw new Error(`Config directory ${configDir} exists but is not a directory`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
await (0, promises_1.mkdir)(configDir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
const idPath = (0, node_path_1.join)(configDir, 'observability.yml');
|
|
46
|
+
if ((0, node_fs_1.existsSync)(idPath)) {
|
|
47
|
+
const context = await (0, promises_1.readFile)(idPath, 'utf-8');
|
|
48
|
+
return (_a = validate(context)) !== null && _a !== void 0 ? _a : initializeState(idPath);
|
|
49
|
+
}
|
|
50
|
+
return initializeState(idPath);
|
|
51
|
+
};
|
|
52
|
+
exports.getObservabilityState = getObservabilityState;
|
|
53
|
+
// create initial state and write to file, using environment variables to override defaults.
|
|
54
|
+
const initializeState = async (idPath) => {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
// TODO(nf): read initial values from config or seed file
|
|
57
|
+
const observabilityState = {
|
|
58
|
+
installationId: (0, uuid_1.v4)(),
|
|
59
|
+
group: (_a = process.env.DX_TELEMETRY_GROUP) !== null && _a !== void 0 ? _a : undefined,
|
|
60
|
+
mode: (process.env.DX_DISABLE_TELEMETRY ? 'disabled' : (_b = process.env.DX_TELEMETRY_MODE) !== null && _b !== void 0 ? _b : 'basic'),
|
|
61
|
+
};
|
|
62
|
+
await (0, promises_1.writeFile)(idPath, '# This file is automatically generated by the @dxos/cli.\n' + js_yaml_1.default.dump(observabilityState), 'utf-8');
|
|
63
|
+
return observabilityState;
|
|
64
|
+
};
|
|
65
|
+
const validate = (contextString) => {
|
|
66
|
+
var _a;
|
|
67
|
+
const context = js_yaml_1.default.load(contextString);
|
|
68
|
+
if (Boolean(context.installationId) && (0, uuid_1.validate)(context.installationId)) {
|
|
69
|
+
return {
|
|
70
|
+
...context,
|
|
71
|
+
mode: process.env.DX_DISABLE_TELEMETRY ? 'disabled' : (_a = context.mode) !== null && _a !== void 0 ? _a : 'basic',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const initializeNodeObservability = async ({ namespace, config, installationId, group, mode = 'basic', tracingEnable = true, replayEnable = true, }) => {
|
|
76
|
+
(0, log_1.log)('initializeCliObservability', { config });
|
|
77
|
+
const release = `${namespace}@${config.get('runtime.app.build.version')}`;
|
|
78
|
+
const environment = config.get('runtime.app.env.DX_ENVIRONMENT');
|
|
79
|
+
const observability = new observability_1.Observability({
|
|
80
|
+
namespace,
|
|
81
|
+
group,
|
|
82
|
+
mode,
|
|
83
|
+
errorLog: {
|
|
84
|
+
sentryInitOptions: {
|
|
85
|
+
environment,
|
|
86
|
+
release,
|
|
87
|
+
// TODO(wittjosiah): Configure this.
|
|
88
|
+
sampleRate: 1.0,
|
|
89
|
+
},
|
|
90
|
+
logProcessor: true,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
observability.setTag('installationId', installationId);
|
|
94
|
+
const IPDATA_API_KEY = config.get('runtime.app.env.DX_IPDATA_API_KEY');
|
|
95
|
+
try {
|
|
96
|
+
const res = await fetch(`https://api.ipdata.co/?api-key=${IPDATA_API_KEY}`);
|
|
97
|
+
const ipData = await res.json();
|
|
98
|
+
ipData && observability.addIPDataTelemetryTags(ipData);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
observability === null || observability === void 0 ? void 0 : observability.captureException(err);
|
|
102
|
+
}
|
|
103
|
+
return observability;
|
|
104
|
+
};
|
|
105
|
+
exports.initializeNodeObservability = initializeNodeObservability;
|
|
106
|
+
//# sourceMappingURL=node-observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-observability.js","sourceRoot":"","sources":["../../../../src/helpers/node-observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-telemetry-listeners.d.ts","sourceRoot":"","sources":["../../../../src/helpers/setup-telemetry-listeners.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD,eAAO,MAAM,uBAAuB,cAAe,MAAM,UAAU,MAAM,iBAAiB,aAAa,
|
|
1
|
+
{"version":3,"file":"setup-telemetry-listeners.d.ts","sourceRoot":"","sources":["../../../../src/helpers/setup-telemetry-listeners.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD,eAAO,MAAM,uBAAuB,cAAe,MAAM,UAAU,MAAM,iBAAiB,aAAa,eAiGtG,CAAC"}
|
|
@@ -4,22 +4,21 @@
|
|
|
4
4
|
//
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.setupTelemetryListeners = void 0;
|
|
7
|
-
const
|
|
7
|
+
const common_1 = require("./common");
|
|
8
8
|
let lastFocusEvent = new Date();
|
|
9
9
|
let totalTime = 0;
|
|
10
10
|
const setupTelemetryListeners = (namespace, client, observability) => {
|
|
11
11
|
const clickCallback = (event) => {
|
|
12
|
-
if (
|
|
12
|
+
if (observability.group === 'dxos' && event.target && !event.target.id) {
|
|
13
13
|
// TODO(wittjosiah): Use @dxos/log so these can be filtered.
|
|
14
14
|
console.warn('Click event on element without id:', event.target);
|
|
15
15
|
}
|
|
16
16
|
setTimeout(() => {
|
|
17
17
|
var _a, _b;
|
|
18
18
|
return observability.event({
|
|
19
|
-
identityId: (0,
|
|
19
|
+
identityId: (0, common_1.getTelemetryIdentifier)(client),
|
|
20
20
|
name: `${namespace}.window.click`,
|
|
21
21
|
properties: {
|
|
22
|
-
...app_observability_1.BASE_TELEMETRY_PROPERTIES,
|
|
23
22
|
href: window.location.href,
|
|
24
23
|
id: (_a = event.target) === null || _a === void 0 ? void 0 : _a.id,
|
|
25
24
|
path: (_b = event.path) === null || _b === void 0 ? void 0 : _b.filter((el) => Boolean(el.tagName)).map((el) => `${el.tagName.toLowerCase()}${el.id ? `#${el.id}` : ''}`).reverse().join('>'),
|
|
@@ -30,10 +29,9 @@ const setupTelemetryListeners = (namespace, client, observability) => {
|
|
|
30
29
|
const focusCallback = () => {
|
|
31
30
|
const now = new Date();
|
|
32
31
|
setTimeout(() => observability.event({
|
|
33
|
-
identityId: (0,
|
|
32
|
+
identityId: (0, common_1.getTelemetryIdentifier)(client),
|
|
34
33
|
name: `${namespace}.window.focus`,
|
|
35
34
|
properties: {
|
|
36
|
-
...app_observability_1.BASE_TELEMETRY_PROPERTIES,
|
|
37
35
|
href: window.location.href,
|
|
38
36
|
timeAway: now.getTime() - lastFocusEvent.getTime(),
|
|
39
37
|
},
|
|
@@ -44,10 +42,9 @@ const setupTelemetryListeners = (namespace, client, observability) => {
|
|
|
44
42
|
const now = new Date();
|
|
45
43
|
const timeSpent = now.getTime() - lastFocusEvent.getTime();
|
|
46
44
|
setTimeout(() => observability.event({
|
|
47
|
-
identityId: (0,
|
|
45
|
+
identityId: (0, common_1.getTelemetryIdentifier)(client),
|
|
48
46
|
name: `${namespace}.window.blur`,
|
|
49
47
|
properties: {
|
|
50
|
-
...app_observability_1.BASE_TELEMETRY_PROPERTIES,
|
|
51
48
|
href: window.location.href,
|
|
52
49
|
timeSpent,
|
|
53
50
|
},
|
|
@@ -57,10 +54,9 @@ const setupTelemetryListeners = (namespace, client, observability) => {
|
|
|
57
54
|
};
|
|
58
55
|
const unloadCallback = () => {
|
|
59
56
|
setTimeout(() => observability.event({
|
|
60
|
-
identityId: (0,
|
|
57
|
+
identityId: (0, common_1.getTelemetryIdentifier)(client),
|
|
61
58
|
name: `${namespace}.page.unload`,
|
|
62
59
|
properties: {
|
|
63
|
-
...app_observability_1.BASE_TELEMETRY_PROPERTIES,
|
|
64
60
|
href: window.location.href,
|
|
65
61
|
timeSpent: totalTime,
|
|
66
62
|
},
|
|
@@ -68,10 +64,9 @@ const setupTelemetryListeners = (namespace, client, observability) => {
|
|
|
68
64
|
};
|
|
69
65
|
const errorCallback = (event) => {
|
|
70
66
|
setTimeout(() => observability.event({
|
|
71
|
-
identityId: (0,
|
|
67
|
+
identityId: (0, common_1.getTelemetryIdentifier)(client),
|
|
72
68
|
name: `${namespace}.window.error`,
|
|
73
69
|
properties: {
|
|
74
|
-
...app_observability_1.BASE_TELEMETRY_PROPERTIES,
|
|
75
70
|
href: window.location.href,
|
|
76
71
|
message: event.message,
|
|
77
72
|
filename: event.filename,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-telemetry-listeners.js","sourceRoot":"","sources":["../../../../src/helpers/setup-telemetry-listeners.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;AAIF,
|
|
1
|
+
{"version":3,"file":"setup-telemetry-listeners.js","sourceRoot":"","sources":["../../../../src/helpers/setup-telemetry-listeners.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Client, type Config } from '@dxos/client';
|
|
2
|
+
import { type IPData } from './helpers';
|
|
2
3
|
import { type EventOptions, type PageOptions } from './segment';
|
|
3
4
|
import { type InitOptions } from './sentry';
|
|
4
5
|
export type ObservabilitySecrets = {
|
|
@@ -11,6 +12,7 @@ export type ObservabilitySecrets = {
|
|
|
11
12
|
DATADOG_APP_KEY: string | null;
|
|
12
13
|
};
|
|
13
14
|
export type Mode = 'basic' | 'full' | 'disabled';
|
|
15
|
+
export type TagScope = 'errors' | 'telemetry' | 'metrics' | 'all';
|
|
14
16
|
export type ObservabilityOptions = {
|
|
15
17
|
namespace: string;
|
|
16
18
|
config?: Config;
|
|
@@ -44,11 +46,10 @@ export declare class Observability {
|
|
|
44
46
|
close(): Promise<void>;
|
|
45
47
|
setMode(mode: Mode): void;
|
|
46
48
|
get mode(): Mode;
|
|
49
|
+
get group(): string | undefined;
|
|
47
50
|
get enabled(): boolean;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
*/
|
|
51
|
-
setTag(key: string, value: string): void;
|
|
51
|
+
setTag(key: string, value: string, scope?: TagScope): void;
|
|
52
|
+
addIPDataTelemetryTags: (ipData: IPData) => void;
|
|
52
53
|
setIdentityTags(client: Client): Promise<void>;
|
|
53
54
|
private _initMetrics;
|
|
54
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/observability.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,8 +22,6 @@ const sentry_1 = require("./sentry");
|
|
|
22
22
|
const SPACE_METRICS_MIN_INTERVAL = 1000 * 60;
|
|
23
23
|
// const DATADOG_IDLE_INTERVAL = 1000 * 60 * 5;
|
|
24
24
|
const DATADOG_IDLE_INTERVAL = 1000 * 60 * 1;
|
|
25
|
-
// TODO(nf): add allowlist for telemetry tags?
|
|
26
|
-
const ERROR_TAGS = ['identityKey', 'username', 'deviceKey', 'group'];
|
|
27
25
|
/*
|
|
28
26
|
* Observability provides a common interface for error logging, metrics, and telemetry.
|
|
29
27
|
* It currently provides these capabilities using Sentry, Datadog, and Segment.
|
|
@@ -36,6 +34,13 @@ class Observability {
|
|
|
36
34
|
// TODO(nf): accept upstream context?
|
|
37
35
|
this._ctx = new context_1.Context();
|
|
38
36
|
this._tags = new Map();
|
|
37
|
+
this.addIPDataTelemetryTags = (ipData) => {
|
|
38
|
+
this.setTag('city', ipData.city, 'telemetry');
|
|
39
|
+
this.setTag('region', ipData.region, 'telemetry');
|
|
40
|
+
this.setTag('country', ipData.country, 'telemetry');
|
|
41
|
+
ipData.latitude && this.setTag('latitude', ipData.latitude.toString(), 'telemetry');
|
|
42
|
+
ipData.longitude && this.setTag('longitude', ipData.longitude.toString(), 'telemetry');
|
|
43
|
+
};
|
|
39
44
|
this._namespace = namespace;
|
|
40
45
|
this._config = config;
|
|
41
46
|
this._mode = mode !== null && mode !== void 0 ? mode : 'disabled';
|
|
@@ -86,20 +91,23 @@ class Observability {
|
|
|
86
91
|
get mode() {
|
|
87
92
|
return this._mode;
|
|
88
93
|
}
|
|
94
|
+
get group() {
|
|
95
|
+
return this._group;
|
|
96
|
+
}
|
|
89
97
|
get enabled() {
|
|
90
98
|
return this._mode !== 'disabled';
|
|
91
99
|
}
|
|
92
100
|
//
|
|
93
101
|
// Tags
|
|
94
102
|
//
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
*/
|
|
98
|
-
setTag(key, value) {
|
|
99
|
-
if (this.enabled && ERROR_TAGS.includes(key)) {
|
|
103
|
+
setTag(key, value, scope) {
|
|
104
|
+
if (this.enabled && (scope === undefined || scope === 'all' || scope === 'errors')) {
|
|
100
105
|
(0, sentry_1.setTag)(key, value);
|
|
101
106
|
}
|
|
102
|
-
|
|
107
|
+
if (!scope) {
|
|
108
|
+
scope = 'all';
|
|
109
|
+
}
|
|
110
|
+
this._tags.set(key, { value, scope });
|
|
103
111
|
}
|
|
104
112
|
// TODO(wittjosiah): Improve privacy of telemetry identifiers. See `getTelemetryIdentifier`.
|
|
105
113
|
async setIdentityTags(client) {
|
|
@@ -136,7 +144,11 @@ class Observability {
|
|
|
136
144
|
if (this.enabled && this._secrets.DATADOG_API_KEY) {
|
|
137
145
|
this._metrics = new datadog_1.DatadogMetrics({
|
|
138
146
|
apiKey: this._secrets.DATADOG_API_KEY,
|
|
139
|
-
getTags: () => this._tags
|
|
147
|
+
getTags: () => Object.fromEntries(Array.from(this._tags)
|
|
148
|
+
.filter(([key, value]) => {
|
|
149
|
+
return value.scope === 'all' || value.scope === 'metrics';
|
|
150
|
+
})
|
|
151
|
+
.map(([key, value]) => [key, value.value])),
|
|
140
152
|
// TODO(nf): move/refactor from telementryContext, needed to read CORS proxy
|
|
141
153
|
config: this._config,
|
|
142
154
|
});
|
|
@@ -215,10 +227,7 @@ class Observability {
|
|
|
215
227
|
this.event({
|
|
216
228
|
identityId: (0, helpers_1.getTelemetryIdentifier)(client),
|
|
217
229
|
name: `${namespace}.space.update`,
|
|
218
|
-
properties:
|
|
219
|
-
...helpers_1.BASE_TELEMETRY_PROPERTIES,
|
|
220
|
-
...data,
|
|
221
|
-
},
|
|
230
|
+
properties: data,
|
|
222
231
|
});
|
|
223
232
|
}
|
|
224
233
|
});
|
|
@@ -279,7 +288,11 @@ class Observability {
|
|
|
279
288
|
this._telemetry = new segment_1.SegmentTelemetry({
|
|
280
289
|
apiKey: this._secrets.TELEMETRY_API_KEY,
|
|
281
290
|
batchSize: this._telemetryBatchSize,
|
|
282
|
-
getTags: () => this._tags
|
|
291
|
+
getTags: () => Object.fromEntries(Array.from(this._tags)
|
|
292
|
+
.filter(([key, value]) => {
|
|
293
|
+
return value.scope === 'all' || value.scope === 'telemetry';
|
|
294
|
+
})
|
|
295
|
+
.map(([key, value]) => [key, value.value])),
|
|
283
296
|
});
|
|
284
297
|
}
|
|
285
298
|
else {
|
|
@@ -329,8 +342,8 @@ class Observability {
|
|
|
329
342
|
}
|
|
330
343
|
// TODO(nf): is this different than passing as properties in options?
|
|
331
344
|
this._tags.forEach((v, k) => {
|
|
332
|
-
if (
|
|
333
|
-
(0, sentry_1.setTag)(k, v);
|
|
345
|
+
if (v.scope === 'all' || v.scope === 'errors') {
|
|
346
|
+
(0, sentry_1.setTag)(k, v.value);
|
|
334
347
|
}
|
|
335
348
|
});
|
|
336
349
|
}
|