@dxos/observability 0.3.11-main.0999ea0
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/LICENSE +8 -0
- package/README.md +26 -0
- package/dist/lib/browser/chunk-2J5YS65Q.mjs +81 -0
- package/dist/lib/browser/chunk-2J5YS65Q.mjs.map +7 -0
- package/dist/lib/browser/chunk-6KUJPLEH.mjs +293 -0
- package/dist/lib/browser/chunk-6KUJPLEH.mjs.map +7 -0
- package/dist/lib/browser/datadog/index.mjs +9 -0
- package/dist/lib/browser/datadog/index.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +557 -0
- package/dist/lib/browser/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -0
- package/dist/lib/browser/sentry/index.mjs +25 -0
- package/dist/lib/browser/sentry/index.mjs.map +7 -0
- package/dist/lib/node/chunk-FSAOBKO2.cjs +352 -0
- package/dist/lib/node/chunk-FSAOBKO2.cjs.map +7 -0
- package/dist/lib/node/chunk-VDBBIYH6.cjs +101 -0
- package/dist/lib/node/chunk-VDBBIYH6.cjs.map +7 -0
- package/dist/lib/node/datadog/index.cjs +31 -0
- package/dist/lib/node/datadog/index.cjs.map +7 -0
- package/dist/lib/node/index.cjs +630 -0
- package/dist/lib/node/index.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -0
- package/dist/lib/node/sentry/index.cjs +45 -0
- package/dist/lib/node/sentry/index.cjs.map +7 -0
- package/dist/types/src/cli-observability-secrets.json +7 -0
- package/dist/types/src/datadog/browser.d.ts +8 -0
- package/dist/types/src/datadog/browser.d.ts.map +1 -0
- package/dist/types/src/datadog/browser.js +22 -0
- package/dist/types/src/datadog/browser.js.map +1 -0
- package/dist/types/src/datadog/index.d.ts +3 -0
- package/dist/types/src/datadog/index.d.ts.map +1 -0
- package/dist/types/src/datadog/index.js +22 -0
- package/dist/types/src/datadog/index.js.map +1 -0
- package/dist/types/src/datadog/metrics.d.ts +16 -0
- package/dist/types/src/datadog/metrics.d.ts.map +1 -0
- package/dist/types/src/datadog/metrics.js +56 -0
- package/dist/types/src/datadog/metrics.js.map +1 -0
- package/dist/types/src/datadog/node.d.ts +7 -0
- package/dist/types/src/datadog/node.d.ts.map +1 -0
- package/dist/types/src/datadog/node.js +22 -0
- package/dist/types/src/datadog/node.js.map +1 -0
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/index.js +21 -0
- package/dist/types/src/index.js.map +1 -0
- package/dist/types/src/observability.d.ts +85 -0
- package/dist/types/src/observability.d.ts.map +1 -0
- package/dist/types/src/observability.js +352 -0
- package/dist/types/src/observability.js.map +1 -0
- package/dist/types/src/segment/browser.d.ts +9 -0
- package/dist/types/src/segment/browser.d.ts.map +1 -0
- package/dist/types/src/segment/browser.js +71 -0
- package/dist/types/src/segment/browser.js.map +1 -0
- package/dist/types/src/segment/index.d.ts +3 -0
- package/dist/types/src/segment/index.d.ts.map +1 -0
- package/dist/types/src/segment/index.js +22 -0
- package/dist/types/src/segment/index.js.map +1 -0
- package/dist/types/src/segment/node.d.ts +19 -0
- package/dist/types/src/segment/node.d.ts.map +1 -0
- package/dist/types/src/segment/node.js +88 -0
- package/dist/types/src/segment/node.js.map +1 -0
- package/dist/types/src/segment/types.d.ts +22 -0
- package/dist/types/src/segment/types.d.ts.map +1 -0
- package/dist/types/src/segment/types.js +6 -0
- package/dist/types/src/segment/types.js.map +1 -0
- package/dist/types/src/sentry/browser.d.ts +31 -0
- package/dist/types/src/sentry/browser.d.ts.map +1 -0
- package/dist/types/src/sentry/browser.js +112 -0
- package/dist/types/src/sentry/browser.js.map +1 -0
- package/dist/types/src/sentry/index.d.ts +4 -0
- package/dist/types/src/sentry/index.d.ts.map +1 -0
- package/dist/types/src/sentry/index.js +26 -0
- package/dist/types/src/sentry/index.js.map +1 -0
- package/dist/types/src/sentry/node.d.ts +32 -0
- package/dist/types/src/sentry/node.d.ts.map +1 -0
- package/dist/types/src/sentry/node.js +169 -0
- package/dist/types/src/sentry/node.js.map +1 -0
- package/dist/types/src/sentry/node.test.d.ts +2 -0
- package/dist/types/src/sentry/node.test.d.ts.map +1 -0
- package/dist/types/src/sentry/node.test.js +66 -0
- package/dist/types/src/sentry/node.test.js.map +1 -0
- package/dist/types/src/sentry/sentry.test.d.ts +2 -0
- package/dist/types/src/sentry/sentry.test.d.ts.map +1 -0
- package/dist/types/src/sentry/sentry.test.js +60 -0
- package/dist/types/src/sentry/sentry.test.js.map +1 -0
- package/dist/types/src/sentry/tracing.d.ts +5 -0
- package/dist/types/src/sentry/tracing.d.ts.map +1 -0
- package/dist/types/src/sentry/tracing.js +141 -0
- package/dist/types/src/sentry/tracing.js.map +1 -0
- package/dist/types/src/sentry/tracing.test.d.ts +2 -0
- package/dist/types/src/sentry/tracing.test.d.ts.map +1 -0
- package/dist/types/src/sentry/tracing.test.js +76 -0
- package/dist/types/src/sentry/tracing.test.js.map +1 -0
- package/dist/types/src/sentry/types.d.ts +18 -0
- package/dist/types/src/sentry/types.d.ts.map +1 -0
- package/dist/types/src/sentry/types.js +6 -0
- package/dist/types/src/sentry/types.js.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/index.js +21 -0
- package/dist/types/src/testing/index.js.map +1 -0
- package/dist/types/src/testing/testkit/browser.d.ts +2 -0
- package/dist/types/src/testing/testkit/browser.d.ts.map +1 -0
- package/dist/types/src/testing/testkit/browser.js +13 -0
- package/dist/types/src/testing/testkit/browser.js.map +1 -0
- package/dist/types/src/testing/testkit/index.d.ts +2 -0
- package/dist/types/src/testing/testkit/index.d.ts.map +1 -0
- package/dist/types/src/testing/testkit/index.js +12 -0
- package/dist/types/src/testing/testkit/index.js.map +1 -0
- package/dist/types/src/util.d.ts +19 -0
- package/dist/types/src/util.d.ts.map +1 -0
- package/dist/types/src/util.js +42 -0
- package/dist/types/src/util.js.map +1 -0
- package/package.json +94 -0
- package/src/cli-observability-secrets.json +7 -0
- package/src/datadog/browser.ts +21 -0
- package/src/datadog/index.ts +6 -0
- package/src/datadog/metrics.ts +49 -0
- package/src/datadog/node.ts +19 -0
- package/src/index.ts +5 -0
- package/src/observability.ts +442 -0
- package/src/segment/browser.ts +67 -0
- package/src/segment/index.ts +6 -0
- package/src/segment/node.ts +91 -0
- package/src/segment/types.ts +27 -0
- package/src/sentry/browser.ts +100 -0
- package/src/sentry/index.ts +9 -0
- package/src/sentry/node.test.ts +46 -0
- package/src/sentry/node.ts +153 -0
- package/src/sentry/sentry.test.ts +39 -0
- package/src/sentry/tracing.test.ts +62 -0
- package/src/sentry/tracing.ts +153 -0
- package/src/sentry/types.ts +22 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/testkit/browser.ts +8 -0
- package/src/testing/testkit/index.ts +7 -0
- package/src/testing/testkit/shims.d.ts +5 -0
- package/src/util.ts +49 -0
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DatadogMetrics
|
|
3
|
+
} from "./chunk-2J5YS65Q.mjs";
|
|
4
|
+
import {
|
|
5
|
+
captureException,
|
|
6
|
+
configureTracing,
|
|
7
|
+
enableSentryLogProcessor,
|
|
8
|
+
init,
|
|
9
|
+
setTag
|
|
10
|
+
} from "./chunk-6KUJPLEH.mjs";
|
|
11
|
+
|
|
12
|
+
// packages/sdk/observability/src/observability.ts
|
|
13
|
+
import { Event, scheduleTaskInterval } from "@dxos/async";
|
|
14
|
+
import { Context } from "@dxos/context";
|
|
15
|
+
import { invariant } from "@dxos/invariant";
|
|
16
|
+
import { log as log2 } from "@dxos/log";
|
|
17
|
+
import { ConnectionState } from "@dxos/network-manager";
|
|
18
|
+
import { DeviceKind, Platform } from "@dxos/protocols/proto/dxos/client/services";
|
|
19
|
+
import { isNode } from "@dxos/util";
|
|
20
|
+
|
|
21
|
+
// packages/sdk/observability/src/cli-observability-secrets.json
|
|
22
|
+
var cli_observability_secrets_default = {
|
|
23
|
+
SENTRY_DESTINATION: "https://2647916221e643869965e78469479aa4@o4504012000067584.ingest.sentry.io/4504012027265029",
|
|
24
|
+
TELEMETRY_API_KEY: "B00QG6PtJJrJ0VVFe0H5a6bcUUShKyZM",
|
|
25
|
+
IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
|
|
26
|
+
DATADOG_API_KEY: null,
|
|
27
|
+
DATADOG_APP_KEY: null
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// packages/sdk/observability/src/segment/browser.ts
|
|
31
|
+
import snippet from "@segment/snippet";
|
|
32
|
+
import { log } from "@dxos/log";
|
|
33
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/segment/browser.ts";
|
|
34
|
+
var SegmentTelemetry = class {
|
|
35
|
+
constructor({ apiKey, batchSize, getTags }) {
|
|
36
|
+
this._getTags = getTags;
|
|
37
|
+
try {
|
|
38
|
+
const contents = snippet.min({
|
|
39
|
+
apiKey,
|
|
40
|
+
page: false
|
|
41
|
+
});
|
|
42
|
+
const script = document.createElement("script");
|
|
43
|
+
script.innerHTML = contents;
|
|
44
|
+
document.body.append(script);
|
|
45
|
+
} catch (err) {
|
|
46
|
+
log.catch("Failed to initialize telemetry", err, {
|
|
47
|
+
F: __dxlog_file,
|
|
48
|
+
L: 27,
|
|
49
|
+
S: this,
|
|
50
|
+
C: (f, a) => f(...a)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
page({ identityId: userId, ...options } = {}) {
|
|
55
|
+
try {
|
|
56
|
+
window.analytics?.page({
|
|
57
|
+
context: Object.fromEntries(this._getTags().entries()),
|
|
58
|
+
...options,
|
|
59
|
+
userId
|
|
60
|
+
});
|
|
61
|
+
} catch (err) {
|
|
62
|
+
log.catch("Failed to track page", err, {
|
|
63
|
+
F: __dxlog_file,
|
|
64
|
+
L: 39,
|
|
65
|
+
S: this,
|
|
66
|
+
C: (f, a) => f(...a)
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
event({ identityId: userId, name: event, ...options }) {
|
|
71
|
+
try {
|
|
72
|
+
options.properties = {
|
|
73
|
+
...options.properties,
|
|
74
|
+
...Object.fromEntries(this._getTags().entries())
|
|
75
|
+
};
|
|
76
|
+
window.analytics?.track({
|
|
77
|
+
...options,
|
|
78
|
+
event
|
|
79
|
+
});
|
|
80
|
+
} catch (err) {
|
|
81
|
+
log.catch("Failed to track event", err, {
|
|
82
|
+
F: __dxlog_file,
|
|
83
|
+
L: 54,
|
|
84
|
+
S: this,
|
|
85
|
+
C: (f, a) => f(...a)
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async flush() {
|
|
90
|
+
try {
|
|
91
|
+
await window.analytics?.flush((err) => {
|
|
92
|
+
captureException(err);
|
|
93
|
+
});
|
|
94
|
+
} catch (err) {
|
|
95
|
+
log.catch("Failed to flush telemetry", err, {
|
|
96
|
+
F: __dxlog_file,
|
|
97
|
+
L: 64,
|
|
98
|
+
S: this,
|
|
99
|
+
C: (f, a) => f(...a)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// packages/sdk/observability/src/util.ts
|
|
106
|
+
var mapSpaces = (spaces, options = {
|
|
107
|
+
verbose: false,
|
|
108
|
+
truncateKeys: false
|
|
109
|
+
}) => {
|
|
110
|
+
return spaces.map((space) => {
|
|
111
|
+
const { open, ready } = space.internal.data.metrics ?? {};
|
|
112
|
+
const startup = open && ready && ready.getTime() - open.getTime();
|
|
113
|
+
const pipeline = space.internal.data.pipeline;
|
|
114
|
+
const startDataMutations = pipeline?.currentEpoch?.subject.assertion.timeframe.totalMessages() ?? 0;
|
|
115
|
+
const epoch = pipeline?.currentEpoch?.subject.assertion.number;
|
|
116
|
+
const currentDataMutations = pipeline?.currentDataTimeframe?.totalMessages() ?? 0;
|
|
117
|
+
const totalDataMutations = pipeline?.targetDataTimeframe?.totalMessages() ?? 0;
|
|
118
|
+
return {
|
|
119
|
+
// TODO(nf): truncate keys for DD?
|
|
120
|
+
key: space.key.truncate(),
|
|
121
|
+
open: space.isOpen,
|
|
122
|
+
name: space.properties.name,
|
|
123
|
+
members: space.members.get().length,
|
|
124
|
+
objects: space.db.query().objects.length,
|
|
125
|
+
startup,
|
|
126
|
+
epoch,
|
|
127
|
+
// appliedEpoch,
|
|
128
|
+
startDataMutations,
|
|
129
|
+
currentDataMutations,
|
|
130
|
+
totalDataMutations,
|
|
131
|
+
// TODO(burdon): Negative?
|
|
132
|
+
progress: (Math.min(Math.abs((currentDataMutations - startDataMutations) / (totalDataMutations - startDataMutations)), 1) * 100).toFixed(0)
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// packages/sdk/observability/src/observability.ts
|
|
138
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/observability.ts";
|
|
139
|
+
var SPACE_METRICS_MIN_INTERVAL = 1e3 * 60;
|
|
140
|
+
var DATADOG_IDLE_INTERVAL = 1e3 * 60 * 1;
|
|
141
|
+
var ERROR_TAGS = [
|
|
142
|
+
"identityKey",
|
|
143
|
+
"username",
|
|
144
|
+
"deviceKey",
|
|
145
|
+
"group"
|
|
146
|
+
];
|
|
147
|
+
var Observability = class {
|
|
148
|
+
// TODO(nf): make platform a required extension?
|
|
149
|
+
constructor({ namespace, config, secrets, group, mode, telemetry, errorLog, logProcessor }) {
|
|
150
|
+
this._mode = "disabled";
|
|
151
|
+
// TODO(nf): accept upstream context?
|
|
152
|
+
this._ctx = new Context();
|
|
153
|
+
this._tags = /* @__PURE__ */ new Map();
|
|
154
|
+
this._namespace = namespace;
|
|
155
|
+
this._config = config;
|
|
156
|
+
this._mode = mode ?? "disabled";
|
|
157
|
+
this._group = group;
|
|
158
|
+
this._secrets = this._loadSecrets(config, secrets);
|
|
159
|
+
this._telemetryBatchSize = telemetry?.batchSize ?? 30;
|
|
160
|
+
this._errorReportingOptions = errorLog?.sentryInitOptions;
|
|
161
|
+
this._errorLogProcessor = logProcessor ?? false;
|
|
162
|
+
if (this._group) {
|
|
163
|
+
this.setTag("group", this._group);
|
|
164
|
+
}
|
|
165
|
+
this.setTag("namespace", this._namespace);
|
|
166
|
+
if (this._mode === "full") {
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
_loadSecrets(config, secrets) {
|
|
170
|
+
if (isNode()) {
|
|
171
|
+
return cli_observability_secrets_default;
|
|
172
|
+
} else {
|
|
173
|
+
invariant(config, "runtime config is required", {
|
|
174
|
+
F: __dxlog_file2,
|
|
175
|
+
L: 117,
|
|
176
|
+
S: this,
|
|
177
|
+
A: [
|
|
178
|
+
"config",
|
|
179
|
+
"'runtime config is required'"
|
|
180
|
+
]
|
|
181
|
+
});
|
|
182
|
+
log2("config", {
|
|
183
|
+
rtc: this._secrets,
|
|
184
|
+
config
|
|
185
|
+
}, {
|
|
186
|
+
F: __dxlog_file2,
|
|
187
|
+
L: 118,
|
|
188
|
+
S: this,
|
|
189
|
+
C: (f, a) => f(...a)
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
DX_ENVIRONMENT: config.get("runtime.app.env.DX_ENVIRONMENT"),
|
|
193
|
+
DX_RELEASE: config.get("runtime.app.env.DX_RELEASE"),
|
|
194
|
+
SENTRY_DESTINATION: config.get("runtime.app.env.DX_SENTRY_DESTINATION"),
|
|
195
|
+
TELEMETRY_API_KEY: config.get("runtime.app.env.DX_TELEMETRY_API_KEY"),
|
|
196
|
+
IPDATA_API_KEY: config.get("runtime.app.env.DX_IPDATA_API_KEY"),
|
|
197
|
+
DATADOG_API_KEY: config.get("runtime.app.env.DX_DATADOG_API_KEY"),
|
|
198
|
+
DATADOG_APP_KEY: config.get("runtime.app.env.DX_DATADOG_APP_KEY"),
|
|
199
|
+
...secrets
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
initialize() {
|
|
204
|
+
this._initMetrics();
|
|
205
|
+
this._initTelemetry();
|
|
206
|
+
this._initErrorLogs();
|
|
207
|
+
}
|
|
208
|
+
async close() {
|
|
209
|
+
await this._ctx.dispose();
|
|
210
|
+
}
|
|
211
|
+
setMode(mode) {
|
|
212
|
+
this._mode = mode;
|
|
213
|
+
}
|
|
214
|
+
get mode() {
|
|
215
|
+
return this._mode;
|
|
216
|
+
}
|
|
217
|
+
get enabled() {
|
|
218
|
+
return this._mode !== "disabled";
|
|
219
|
+
}
|
|
220
|
+
//
|
|
221
|
+
// Tags
|
|
222
|
+
//
|
|
223
|
+
/**
|
|
224
|
+
* Set a tag for all observability services.
|
|
225
|
+
*/
|
|
226
|
+
setTag(key, value) {
|
|
227
|
+
if (this.enabled && ERROR_TAGS.includes(key)) {
|
|
228
|
+
setTag(key, value);
|
|
229
|
+
}
|
|
230
|
+
this._tags.set(key, value);
|
|
231
|
+
}
|
|
232
|
+
// TODO(nf): Combine with setDeviceTags.
|
|
233
|
+
async setIdentityTags(client) {
|
|
234
|
+
client.services.services.IdentityService.queryIdentity().subscribe((idqr) => {
|
|
235
|
+
if (!idqr?.identity?.identityKey) {
|
|
236
|
+
log2("empty response from identity service", {
|
|
237
|
+
idqr
|
|
238
|
+
}, {
|
|
239
|
+
F: __dxlog_file2,
|
|
240
|
+
L: 175,
|
|
241
|
+
S: this,
|
|
242
|
+
C: (f, a) => f(...a)
|
|
243
|
+
});
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
this.setTag("identityKey", idqr?.identity?.identityKey.truncate());
|
|
247
|
+
if (idqr?.identity?.profile?.displayName) {
|
|
248
|
+
this.setTag("username", idqr?.identity?.profile?.displayName);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
async setDeviceTags(client) {
|
|
253
|
+
client.services.services.DevicesService.queryDevices().subscribe((dqr) => {
|
|
254
|
+
if (!dqr || !dqr.devices || dqr.devices.length === 0) {
|
|
255
|
+
log2("empty response from device service", {
|
|
256
|
+
device: dqr
|
|
257
|
+
}, {
|
|
258
|
+
F: __dxlog_file2,
|
|
259
|
+
L: 191,
|
|
260
|
+
S: this,
|
|
261
|
+
C: (f, a) => f(...a)
|
|
262
|
+
});
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
invariant(dqr, "empty response from device service", {
|
|
266
|
+
F: __dxlog_file2,
|
|
267
|
+
L: 194,
|
|
268
|
+
S: this,
|
|
269
|
+
A: [
|
|
270
|
+
"dqr",
|
|
271
|
+
"'empty response from device service'"
|
|
272
|
+
]
|
|
273
|
+
});
|
|
274
|
+
const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);
|
|
275
|
+
if (!thisDevice) {
|
|
276
|
+
log2("no current device", {
|
|
277
|
+
device: dqr
|
|
278
|
+
}, {
|
|
279
|
+
F: __dxlog_file2,
|
|
280
|
+
L: 198,
|
|
281
|
+
S: this,
|
|
282
|
+
C: (f, a) => f(...a)
|
|
283
|
+
});
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
this.setTag("deviceKey", thisDevice.deviceKey.truncate());
|
|
287
|
+
if (thisDevice.profile?.label) {
|
|
288
|
+
this.setTag("deviceProfile", thisDevice.profile.label);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
//
|
|
293
|
+
// Metrics
|
|
294
|
+
//
|
|
295
|
+
_initMetrics() {
|
|
296
|
+
if (this.enabled && this._secrets.DATADOG_API_KEY) {
|
|
297
|
+
this._metrics = new DatadogMetrics({
|
|
298
|
+
apiKey: this._secrets.DATADOG_API_KEY,
|
|
299
|
+
getTags: () => this._tags,
|
|
300
|
+
// TODO(nf): move/refactor from telementryContext, needed to read CORS proxy
|
|
301
|
+
config: this._config
|
|
302
|
+
});
|
|
303
|
+
} else {
|
|
304
|
+
log2("datadog disabled", void 0, {
|
|
305
|
+
F: __dxlog_file2,
|
|
306
|
+
L: 221,
|
|
307
|
+
S: this,
|
|
308
|
+
C: (f, a) => f(...a)
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Gauge metric.
|
|
314
|
+
*
|
|
315
|
+
* The default implementation uses Datadog.
|
|
316
|
+
*/
|
|
317
|
+
gauge(name, value, extraTags) {
|
|
318
|
+
this._metrics?.gauge(name, value, extraTags);
|
|
319
|
+
}
|
|
320
|
+
// TODO(nf): Refactor into ObservabilityExtensions.
|
|
321
|
+
startNetworkMetrics(client) {
|
|
322
|
+
const updateSignalMetrics = new Event();
|
|
323
|
+
updateSignalMetrics.on(this._ctx, async (networkStatus) => {
|
|
324
|
+
log2("send signal metrics", void 0, {
|
|
325
|
+
F: __dxlog_file2,
|
|
326
|
+
L: 241,
|
|
327
|
+
S: this,
|
|
328
|
+
C: (f, a) => f(...a)
|
|
329
|
+
});
|
|
330
|
+
networkStatus.signaling.forEach(({ server, state }) => {
|
|
331
|
+
this.gauge("dxos.client.network.signal.connectionState", state, {
|
|
332
|
+
server
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
let swarmCount = 0;
|
|
336
|
+
const connectionStates = /* @__PURE__ */ new Map();
|
|
337
|
+
for (const state in ConnectionState) {
|
|
338
|
+
connectionStates.set(state, 0);
|
|
339
|
+
}
|
|
340
|
+
let totalReadBufferSize = 0;
|
|
341
|
+
let totalWriteBufferSize = 0;
|
|
342
|
+
let totalChannelBufferSize = 0;
|
|
343
|
+
networkStatus.connectionInfo?.forEach((connectionInfo) => {
|
|
344
|
+
swarmCount++;
|
|
345
|
+
for (const conn of connectionInfo.connections ?? []) {
|
|
346
|
+
connectionStates.set(conn.state, (connectionStates.get(conn.state) ?? 0) + 1);
|
|
347
|
+
totalReadBufferSize += conn.readBufferSize ?? 0;
|
|
348
|
+
totalWriteBufferSize += conn.writeBufferSize ?? 0;
|
|
349
|
+
for (const stream of conn.streams ?? []) {
|
|
350
|
+
totalChannelBufferSize += stream.writeBufferSize ?? 0;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
this.gauge("dxos.client.network.swarm.count", swarmCount);
|
|
354
|
+
for (const state in ConnectionState) {
|
|
355
|
+
this.gauge("dxos.client.network.connection.count", connectionStates.get(state) ?? 0, {
|
|
356
|
+
state
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
this.gauge("dxox.client.network.totalReadBufferSize", totalReadBufferSize);
|
|
360
|
+
this.gauge("dxos.client.network.totalWriteBufferSize", totalWriteBufferSize);
|
|
361
|
+
this.gauge("dxos.client.network.totalChannelBufferSize", totalChannelBufferSize);
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
client.services.services.NetworkService?.queryStatus().subscribe((networkStatus) => {
|
|
365
|
+
updateSignalMetrics.emit(networkStatus);
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
startSpacesMetrics(client) {
|
|
369
|
+
let spaces = client.spaces.get();
|
|
370
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
371
|
+
this._ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
|
|
372
|
+
const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
|
|
373
|
+
updateSpaceMetrics.on(this._ctx, async (space) => {
|
|
374
|
+
log2("send space update", void 0, {
|
|
375
|
+
F: __dxlog_file2,
|
|
376
|
+
L: 293,
|
|
377
|
+
S: this,
|
|
378
|
+
C: (f, a) => f(...a)
|
|
379
|
+
});
|
|
380
|
+
for (const sp of mapSpaces(spaces, {
|
|
381
|
+
truncateKeys: true
|
|
382
|
+
})) {
|
|
383
|
+
this.gauge("dxos.client.space.members", sp.members, {
|
|
384
|
+
key: sp.key
|
|
385
|
+
});
|
|
386
|
+
this.gauge("dxos.client.space.objects", sp.objects, {
|
|
387
|
+
key: sp.key
|
|
388
|
+
});
|
|
389
|
+
this.gauge("dxos.client.space.epoch", sp.epoch, {
|
|
390
|
+
key: sp.key
|
|
391
|
+
});
|
|
392
|
+
this.gauge("dxos.client.space.currentDataMutations", sp.currentDataMutations, {
|
|
393
|
+
key: sp.key
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
const subscribeToSpaceUpdate = (space) => space.pipeline.subscribe({
|
|
398
|
+
next: () => {
|
|
399
|
+
updateSpaceMetrics.emit();
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
spaces.forEach((space) => {
|
|
403
|
+
subscriptions.set(space.key.toHex(), subscribeToSpaceUpdate(space));
|
|
404
|
+
});
|
|
405
|
+
client.spaces.subscribe({
|
|
406
|
+
next: async () => {
|
|
407
|
+
spaces = client.spaces.get();
|
|
408
|
+
spaces.filter((space) => !subscriptions.has(space.key.toHex())).forEach((space) => {
|
|
409
|
+
subscriptions.set(space.key.toHex(), subscribeToSpaceUpdate(space));
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
scheduleTaskInterval(this._ctx, async () => updateSpaceMetrics.emit(), DATADOG_IDLE_INTERVAL);
|
|
414
|
+
}
|
|
415
|
+
async startRuntimeMetrics(client, frequency = DATADOG_IDLE_INTERVAL) {
|
|
416
|
+
const platform = await client.services.services.SystemService?.getPlatform();
|
|
417
|
+
invariant(platform, "platform is required", {
|
|
418
|
+
F: __dxlog_file2,
|
|
419
|
+
L: 330,
|
|
420
|
+
S: this,
|
|
421
|
+
A: [
|
|
422
|
+
"platform",
|
|
423
|
+
"'platform is required'"
|
|
424
|
+
]
|
|
425
|
+
});
|
|
426
|
+
this.setTag("platform_type", Platform.PLATFORM_TYPE[platform.type].toLowerCase());
|
|
427
|
+
if (this._mode === "full") {
|
|
428
|
+
if (platform.platform) {
|
|
429
|
+
this.setTag("platform", platform.platform);
|
|
430
|
+
}
|
|
431
|
+
if (platform.arch) {
|
|
432
|
+
this.setTag("arch", platform.arch);
|
|
433
|
+
}
|
|
434
|
+
if (platform.runtime) {
|
|
435
|
+
this.setTag("runtime", platform.runtime);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
scheduleTaskInterval(this._ctx, async () => {
|
|
439
|
+
log2("platform", void 0, {
|
|
440
|
+
F: __dxlog_file2,
|
|
441
|
+
L: 348,
|
|
442
|
+
S: this,
|
|
443
|
+
C: (f, a) => f(...a)
|
|
444
|
+
});
|
|
445
|
+
client.services.services.SystemService?.getPlatform().then((platform2) => {
|
|
446
|
+
log2("platform", {
|
|
447
|
+
platform: platform2
|
|
448
|
+
}, {
|
|
449
|
+
F: __dxlog_file2,
|
|
450
|
+
L: 351,
|
|
451
|
+
S: this,
|
|
452
|
+
C: (f, a) => f(...a)
|
|
453
|
+
});
|
|
454
|
+
if (platform2.memory) {
|
|
455
|
+
this.gauge("dxos.client.runtime.rss", platform2.memory.rss);
|
|
456
|
+
this.gauge("dxos.client.runtime.heapTotal", platform2.memory.heapTotal);
|
|
457
|
+
this.gauge("dxos.client.runtime.heapUsed", platform2.memory.heapUsed);
|
|
458
|
+
}
|
|
459
|
+
}).catch((error) => log2("platform error", {
|
|
460
|
+
error
|
|
461
|
+
}, {
|
|
462
|
+
F: __dxlog_file2,
|
|
463
|
+
L: 358,
|
|
464
|
+
S: this,
|
|
465
|
+
C: (f, a) => f(...a)
|
|
466
|
+
}));
|
|
467
|
+
}, frequency);
|
|
468
|
+
}
|
|
469
|
+
//
|
|
470
|
+
// Telemetry
|
|
471
|
+
//
|
|
472
|
+
_initTelemetry() {
|
|
473
|
+
if (this._secrets.TELEMETRY_API_KEY && this._mode !== "disabled") {
|
|
474
|
+
this._telemetry = new SegmentTelemetry({
|
|
475
|
+
apiKey: this._secrets.TELEMETRY_API_KEY,
|
|
476
|
+
batchSize: this._telemetryBatchSize,
|
|
477
|
+
getTags: () => this._tags
|
|
478
|
+
});
|
|
479
|
+
} else {
|
|
480
|
+
log2("segment disabled", void 0, {
|
|
481
|
+
F: __dxlog_file2,
|
|
482
|
+
L: 376,
|
|
483
|
+
S: this,
|
|
484
|
+
C: (f, a) => f(...a)
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* A telemetry event.
|
|
490
|
+
*
|
|
491
|
+
* The default implementation uses Segment.
|
|
492
|
+
*/
|
|
493
|
+
event(options) {
|
|
494
|
+
this._telemetry?.event(options);
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* A telemetry page view.
|
|
498
|
+
*
|
|
499
|
+
* The default implementation uses Segment.
|
|
500
|
+
*/
|
|
501
|
+
page(options) {
|
|
502
|
+
this._telemetry?.page(options);
|
|
503
|
+
}
|
|
504
|
+
//
|
|
505
|
+
// Error Logs
|
|
506
|
+
//
|
|
507
|
+
_initErrorLogs() {
|
|
508
|
+
if (this._secrets.SENTRY_DESTINATION && this._mode !== "disabled") {
|
|
509
|
+
log2.info("Initializing Sentry", {
|
|
510
|
+
dest: this._secrets.SENTRY_DESTINATION,
|
|
511
|
+
options: this._errorReportingOptions
|
|
512
|
+
}, {
|
|
513
|
+
F: __dxlog_file2,
|
|
514
|
+
L: 405,
|
|
515
|
+
S: this,
|
|
516
|
+
C: (f, a) => f(...a)
|
|
517
|
+
});
|
|
518
|
+
init({
|
|
519
|
+
...this._errorReportingOptions,
|
|
520
|
+
destination: this._secrets.SENTRY_DESTINATION,
|
|
521
|
+
scrubFilenames: this._mode !== "full"
|
|
522
|
+
});
|
|
523
|
+
if (this._errorReportingOptions?.tracing) {
|
|
524
|
+
configureTracing();
|
|
525
|
+
}
|
|
526
|
+
if (this._errorLogProcessor) {
|
|
527
|
+
enableSentryLogProcessor();
|
|
528
|
+
}
|
|
529
|
+
this._tags.forEach((v, k) => {
|
|
530
|
+
if (ERROR_TAGS.includes(k)) {
|
|
531
|
+
setTag(k, v);
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
} else {
|
|
535
|
+
log2("sentry disabled", void 0, {
|
|
536
|
+
F: __dxlog_file2,
|
|
537
|
+
L: 428,
|
|
538
|
+
S: this,
|
|
539
|
+
C: (f, a) => f(...a)
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Manually capture an exception.
|
|
545
|
+
*
|
|
546
|
+
* The default implementation uses Sentry.
|
|
547
|
+
*/
|
|
548
|
+
captureException(err) {
|
|
549
|
+
if (this.enabled) {
|
|
550
|
+
captureException(err);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
export {
|
|
555
|
+
Observability
|
|
556
|
+
};
|
|
557
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/observability.ts", "../../../src/cli-observability-secrets.json", "../../../src/segment/browser.ts", "../../../src/util.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Event, scheduleTaskInterval } from '@dxos/async';\nimport { type Client, type Config } from '@dxos/client';\nimport { type Space } from '@dxos/client-protocol';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ConnectionState } from '@dxos/network-manager';\nimport { DeviceKind, type NetworkStatus, Platform } from '@dxos/protocols/proto/dxos/client/services';\nimport { isNode } from '@dxos/util';\n\nimport buildSecrets from './cli-observability-secrets.json';\nimport { DatadogMetrics } from './datadog';\nimport { SegmentTelemetry, type EventOptions, type PageOptions } from './segment';\nimport {\n captureException as sentryCaptureException,\n enableSentryLogProcessor,\n configureTracing as sentryConfigureTracing,\n init as sentryInit,\n type InitOptions,\n setTag as sentrySetTag,\n} from './sentry';\nimport { mapSpaces } from './util';\n\nconst SPACE_METRICS_MIN_INTERVAL = 1000 * 60;\n// const DATADOG_IDLE_INTERVAL = 1000 * 60 * 5;\nconst DATADOG_IDLE_INTERVAL = 1000 * 60 * 1;\n\n// TODO(nf): add allowlist for telemetry tags?\nconst ERROR_TAGS = ['identityKey', 'username', 'deviceKey', 'group'];\n\n// Secrets? EnvironmentConfig?\n\nexport type ObservabilitySecrets = {\n DX_ENVIRONMENT: string | null;\n DX_RELEASE: string | null;\n SENTRY_DESTINATION: string | null;\n TELEMETRY_API_KEY: string | null;\n IPDATA_API_KEY: string | null;\n DATADOG_API_KEY: string | null;\n DATADOG_APP_KEY: string | null;\n};\n\nexport type Mode = 'basic' | 'full' | 'disabled';\n\nexport type ObservabilityOptions = {\n /// The webapp (e.g. 'composer.dxos.org'), 'cli', or 'agent'.\n namespace: string;\n // TODO(nf): make platform a required extension?\n // platform: Platform;\n config?: Config;\n secrets?: Record<string, string>;\n group?: string;\n mode?: Mode;\n\n telemetry?: {\n batchSize?: number;\n };\n\n errorLog?: {\n sentryInitOptions?: InitOptions;\n };\n logProcessor?: boolean;\n};\n\n/*\n * Observability provides a common interface for error logging, metrics, and telemetry.\n * It currently provides these capabilities using Sentry, Datadog, and Segment.\n */\nexport class Observability {\n // TODO(wittjosiah): Generic metrics interface.\n private _metrics?: DatadogMetrics;\n // TODO(wittjosiah): Generic telemetry interface.\n private _telemetryBatchSize: number;\n private _telemetry?: SegmentTelemetry;\n // TODO(wittjosiah): Generic error logging interface.\n private _errorReportingOptions?: InitOptions;\n private _errorLogProcessor: boolean;\n\n private _secrets: ObservabilitySecrets;\n private _namespace: string;\n private _config?: Config;\n private _mode: Mode = 'disabled';\n private _group?: string;\n // TODO(nf): accept upstream context?\n private _ctx = new Context();\n private _tags = new Map<string, string>();\n\n // TODO(nf): make platform a required extension?\n constructor({ namespace, config, secrets, group, mode, telemetry, errorLog, logProcessor }: ObservabilityOptions) {\n this._namespace = namespace;\n this._config = config;\n this._mode = mode ?? 'disabled';\n this._group = group;\n this._secrets = this._loadSecrets(config, secrets);\n this._telemetryBatchSize = telemetry?.batchSize ?? 30;\n this._errorReportingOptions = errorLog?.sentryInitOptions;\n this._errorLogProcessor = logProcessor ?? false;\n\n if (this._group) {\n this.setTag('group', this._group);\n }\n this.setTag('namespace', this._namespace);\n\n if (this._mode === 'full') {\n // TODO(nf): set group and hostname?\n }\n }\n\n private _loadSecrets(config: Config | undefined, secrets?: Record<string, string>) {\n if (isNode()) {\n return buildSecrets as ObservabilitySecrets;\n } else {\n invariant(config, 'runtime config is required');\n log('config', { rtc: this._secrets, config });\n return {\n DX_ENVIRONMENT: config.get('runtime.app.env.DX_ENVIRONMENT'),\n DX_RELEASE: config.get('runtime.app.env.DX_RELEASE'),\n SENTRY_DESTINATION: config.get('runtime.app.env.DX_SENTRY_DESTINATION'),\n TELEMETRY_API_KEY: config.get('runtime.app.env.DX_TELEMETRY_API_KEY'),\n IPDATA_API_KEY: config.get('runtime.app.env.DX_IPDATA_API_KEY'),\n DATADOG_API_KEY: config.get('runtime.app.env.DX_DATADOG_API_KEY'),\n DATADOG_APP_KEY: config.get('runtime.app.env.DX_DATADOG_APP_KEY'),\n ...secrets,\n };\n }\n }\n\n initialize() {\n this._initMetrics();\n this._initTelemetry();\n this._initErrorLogs();\n }\n\n async close() {\n await this._ctx.dispose();\n\n // TODO(wittjosiah): Remove telemetry, etc. scripts.\n }\n\n setMode(mode: Mode) {\n this._mode = mode;\n }\n\n get mode() {\n return this._mode;\n }\n\n get enabled() {\n return this._mode !== 'disabled';\n }\n\n //\n // Tags\n //\n\n /**\n * Set a tag for all observability services.\n */\n setTag(key: string, value: string) {\n if (this.enabled && ERROR_TAGS.includes(key)) {\n sentrySetTag(key, value);\n }\n\n this._tags.set(key, value);\n }\n\n // TODO(nf): Combine with setDeviceTags.\n async setIdentityTags(client: Client) {\n client.services.services.IdentityService!.queryIdentity().subscribe((idqr) => {\n if (!idqr?.identity?.identityKey) {\n log('empty response from identity service', { idqr });\n return;\n }\n\n // TODO(nf): check mode\n // TODO(nf): cardinality\n this.setTag('identityKey', idqr?.identity?.identityKey.truncate());\n if (idqr?.identity?.profile?.displayName) {\n this.setTag('username', idqr?.identity?.profile?.displayName);\n }\n });\n }\n\n async setDeviceTags(client: Client) {\n client.services.services.DevicesService!.queryDevices().subscribe((dqr) => {\n if (!dqr || !dqr.devices || dqr.devices.length === 0) {\n log('empty response from device service', { device: dqr });\n return;\n }\n invariant(dqr, 'empty response from device service');\n\n const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);\n if (!thisDevice) {\n log('no current device', { device: dqr });\n return;\n }\n this.setTag('deviceKey', thisDevice.deviceKey.truncate());\n if (thisDevice.profile?.label) {\n this.setTag('deviceProfile', thisDevice.profile.label);\n }\n });\n }\n\n //\n // Metrics\n //\n\n private _initMetrics() {\n if (this.enabled && this._secrets.DATADOG_API_KEY) {\n this._metrics = new DatadogMetrics({\n apiKey: this._secrets.DATADOG_API_KEY,\n getTags: () => this._tags,\n // TODO(nf): move/refactor from telementryContext, needed to read CORS proxy\n config: this._config!,\n });\n } else {\n log('datadog disabled');\n }\n }\n\n /**\n * Gauge metric.\n *\n * The default implementation uses Datadog.\n */\n gauge(name: string, value: number | any, extraTags?: any) {\n this._metrics?.gauge(name, value, extraTags);\n }\n\n // TODO(nf): Refactor into ObservabilityExtensions.\n\n startNetworkMetrics(client: Client) {\n const updateSignalMetrics = new Event<NetworkStatus>();\n\n // const lcsh = (csp as LocalClientServices).host;\n updateSignalMetrics.on(this._ctx, async (networkStatus) => {\n log('send signal metrics');\n (networkStatus.signaling as NetworkStatus.Signal[]).forEach(({ server, state }) => {\n this.gauge('dxos.client.network.signal.connectionState', state, { server });\n });\n\n let swarmCount = 0;\n const connectionStates = new Map<string, number>();\n for (const state in ConnectionState) {\n connectionStates.set(state, 0);\n }\n\n let totalReadBufferSize = 0;\n let totalWriteBufferSize = 0;\n let totalChannelBufferSize = 0;\n\n networkStatus.connectionInfo?.forEach((connectionInfo) => {\n swarmCount++;\n\n for (const conn of connectionInfo.connections ?? []) {\n connectionStates.set(conn.state, (connectionStates.get(conn.state) ?? 0) + 1);\n totalReadBufferSize += conn.readBufferSize ?? 0;\n totalWriteBufferSize += conn.writeBufferSize ?? 0;\n\n for (const stream of conn.streams ?? []) {\n totalChannelBufferSize += stream.writeBufferSize ?? 0;\n }\n }\n\n this.gauge('dxos.client.network.swarm.count', swarmCount);\n for (const state in ConnectionState) {\n this.gauge('dxos.client.network.connection.count', connectionStates.get(state) ?? 0, { state });\n }\n this.gauge('dxox.client.network.totalReadBufferSize', totalReadBufferSize);\n this.gauge('dxos.client.network.totalWriteBufferSize', totalWriteBufferSize);\n this.gauge('dxos.client.network.totalChannelBufferSize', totalChannelBufferSize);\n });\n });\n\n client.services.services.NetworkService?.queryStatus().subscribe((networkStatus) => {\n updateSignalMetrics.emit(networkStatus);\n });\n\n // scheduleTaskInterval(ctx, async () => updateSignalMetrics.emit(), DATADOG_IDLE_INTERVAL);\n }\n\n startSpacesMetrics(client: Client) {\n let spaces = client.spaces.get();\n const subscriptions = new Map<string, { unsubscribe: () => void }>();\n this._ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));\n\n const updateSpaceMetrics = new Event<Space>().debounce(SPACE_METRICS_MIN_INTERVAL);\n updateSpaceMetrics.on(this._ctx, async (space) => {\n log('send space update');\n for (const sp of mapSpaces(spaces, { truncateKeys: true })) {\n this.gauge('dxos.client.space.members', sp.members, { key: sp.key });\n this.gauge('dxos.client.space.objects', sp.objects, { key: sp.key });\n this.gauge('dxos.client.space.epoch', sp.epoch, { key: sp.key });\n this.gauge('dxos.client.space.currentDataMutations', sp.currentDataMutations, { key: sp.key });\n }\n });\n\n const subscribeToSpaceUpdate = (space: Space) =>\n space.pipeline.subscribe({\n next: () => {\n updateSpaceMetrics.emit();\n },\n });\n\n spaces.forEach((space) => {\n subscriptions.set(space.key.toHex(), subscribeToSpaceUpdate(space));\n });\n\n client.spaces.subscribe({\n next: async () => {\n spaces = client.spaces.get();\n // spaces = await this.getSpaces(this._agent.client);\n spaces\n .filter((space) => !subscriptions.has(space.key.toHex()))\n .forEach((space) => {\n subscriptions.set(space.key.toHex(), subscribeToSpaceUpdate(space));\n });\n },\n });\n\n scheduleTaskInterval(this._ctx, async () => updateSpaceMetrics.emit(), DATADOG_IDLE_INTERVAL);\n }\n\n async startRuntimeMetrics(client: Client, frequency: number = DATADOG_IDLE_INTERVAL) {\n const platform = await client.services.services.SystemService?.getPlatform();\n invariant(platform, 'platform is required');\n\n this.setTag('platform_type', Platform.PLATFORM_TYPE[platform.type as number].toLowerCase());\n if (this._mode === 'full') {\n // platform[foo] does not work?\n if (platform.platform) {\n this.setTag('platform', platform.platform);\n }\n if (platform.arch) {\n this.setTag('arch', platform.arch);\n }\n if (platform.runtime) {\n this.setTag('runtime', platform.runtime);\n }\n }\n scheduleTaskInterval(\n this._ctx,\n async () => {\n log('platform');\n client.services.services.SystemService?.getPlatform()\n .then((platform) => {\n log('platform', { platform });\n if (platform.memory) {\n this.gauge('dxos.client.runtime.rss', platform.memory.rss);\n this.gauge('dxos.client.runtime.heapTotal', platform.memory.heapTotal);\n this.gauge('dxos.client.runtime.heapUsed', platform.memory.heapUsed);\n }\n })\n .catch((error) => log('platform error', { error }));\n },\n frequency,\n );\n }\n\n //\n // Telemetry\n //\n\n private _initTelemetry() {\n if (this._secrets.TELEMETRY_API_KEY && this._mode !== 'disabled') {\n this._telemetry = new SegmentTelemetry({\n apiKey: this._secrets.TELEMETRY_API_KEY,\n batchSize: this._telemetryBatchSize,\n getTags: () => this._tags,\n });\n } else {\n log('segment disabled');\n }\n }\n\n /**\n * A telemetry event.\n *\n * The default implementation uses Segment.\n */\n event(options: EventOptions) {\n this._telemetry?.event(options);\n }\n\n /**\n * A telemetry page view.\n *\n * The default implementation uses Segment.\n */\n page(options: PageOptions) {\n this._telemetry?.page(options);\n }\n\n //\n // Error Logs\n //\n\n private _initErrorLogs() {\n if (this._secrets.SENTRY_DESTINATION && this._mode !== 'disabled') {\n // TODO(nf): refactor package into this one?\n log.info('Initializing Sentry', {\n dest: this._secrets.SENTRY_DESTINATION,\n options: this._errorReportingOptions,\n });\n sentryInit({\n ...this._errorReportingOptions,\n destination: this._secrets.SENTRY_DESTINATION,\n scrubFilenames: this._mode !== 'full',\n });\n if (this._errorReportingOptions?.tracing) {\n sentryConfigureTracing();\n }\n // TODO(nf): set platform at instantiation? needed for node.\n if (this._errorLogProcessor) {\n enableSentryLogProcessor();\n }\n // TODO(nf): is this different than passing as properties in options?\n this._tags.forEach((v, k) => {\n if (ERROR_TAGS.includes(k)) {\n sentrySetTag(k, v);\n }\n });\n } else {\n log('sentry disabled');\n }\n }\n\n /**\n * Manually capture an exception.\n *\n * The default implementation uses Sentry.\n */\n captureException(err: any) {\n if (this.enabled) {\n sentryCaptureException(err);\n }\n }\n}\n", "{\n \"SENTRY_DESTINATION\": \"https://2647916221e643869965e78469479aa4@o4504012000067584.ingest.sentry.io/4504012027265029\",\n \"TELEMETRY_API_KEY\": \"B00QG6PtJJrJ0VVFe0H5a6bcUUShKyZM\",\n \"IPDATA_API_KEY\": \"73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786\",\n \"DATADOG_API_KEY\": null,\n \"DATADOG_APP_KEY\": null\n}", "//\n// Copyright 2022 DXOS.org\n//\n\nimport snippet from '@segment/snippet';\n\nimport { log } from '@dxos/log';\n\nimport type { EventOptions, SegmentTelemetryOptions, PageOptions } from './types';\nimport { captureException } from '../sentry';\n\nexport class SegmentTelemetry {\n private _getTags: () => Map<string, string>;\n\n constructor({ apiKey, batchSize, getTags }: SegmentTelemetryOptions) {\n this._getTags = getTags;\n try {\n const contents = snippet.min({\n apiKey,\n page: false,\n });\n\n const script = document.createElement('script');\n script.innerHTML = contents;\n document.body.append(script);\n } catch (err) {\n log.catch('Failed to initialize telemetry', err);\n }\n }\n\n page({ identityId: userId, ...options }: PageOptions = {}) {\n try {\n (window as any).analytics?.page({\n context: Object.fromEntries(this._getTags().entries()),\n ...options,\n userId,\n });\n } catch (err) {\n log.catch('Failed to track page', err);\n }\n }\n\n event({ identityId: userId, name: event, ...options }: EventOptions) {\n try {\n options.properties = {\n ...options.properties,\n ...Object.fromEntries(this._getTags().entries()),\n };\n (window as any).analytics?.track({\n ...options,\n event,\n });\n } catch (err) {\n log.catch('Failed to track event', err);\n }\n }\n\n async flush() {\n try {\n await (window as any).analytics?.flush((err: any) => {\n captureException(err);\n });\n } catch (err) {\n log.catch('Failed to flush telemetry', err);\n }\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Space } from '@dxos/client-protocol';\n\nexport type MapSpacesOptions = {\n verbose?: boolean;\n truncateKeys?: boolean;\n};\n\nexport const mapSpaces = (spaces: Space[], options: MapSpacesOptions = { verbose: false, truncateKeys: false }) => {\n return spaces.map((space) => {\n // TODO(burdon): Factor out.\n // TODO(burdon): Agent needs to restart before `ready` is available.\n const { open, ready } = space.internal.data.metrics ?? {};\n const startup = open && ready && ready.getTime() - open.getTime();\n\n // TODO(burdon): Get feeds from client-services if verbose (factor out from devtools/diagnostics).\n // const host = client.services.services.DevtoolsHost!;\n const pipeline = space.internal.data.pipeline;\n const startDataMutations = pipeline?.currentEpoch?.subject.assertion.timeframe.totalMessages() ?? 0;\n const epoch = pipeline?.currentEpoch?.subject.assertion.number;\n // const appliedEpoch = pipeline?.appliedEpoch?.subject.assertion.number;\n const currentDataMutations = pipeline?.currentDataTimeframe?.totalMessages() ?? 0;\n const totalDataMutations = pipeline?.targetDataTimeframe?.totalMessages() ?? 0;\n\n return {\n // TODO(nf): truncate keys for DD?\n key: space.key.truncate(),\n open: space.isOpen,\n name: space.properties.name,\n members: space.members.get().length,\n objects: space.db.query().objects.length,\n startup,\n epoch,\n // appliedEpoch,\n startDataMutations,\n currentDataMutations,\n totalDataMutations,\n\n // TODO(burdon): Negative?\n progress: (\n Math.min(Math.abs((currentDataMutations - startDataMutations) / (totalDataMutations - startDataMutations)), 1) *\n 100\n ).toFixed(0),\n };\n });\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Event", "scheduleTaskInterval", "Context", "invariant", "log", "ConnectionState", "DeviceKind", "Platform", "isNode", "snippet", "log", "SegmentTelemetry", "constructor", "apiKey", "batchSize", "getTags", "_getTags", "contents", "snippet", "min", "page", "script", "document", "createElement", "innerHTML", "body", "append", "err", "log", "catch", "identityId", "userId", "options", "window", "analytics", "context", "Object", "fromEntries", "entries", "event", "name", "properties", "track", "flush", "captureException", "mapSpaces", "spaces", "options", "verbose", "truncateKeys", "map", "space", "open", "ready", "internal", "data", "metrics", "startup", "getTime", "pipeline", "startDataMutations", "currentEpoch", "subject", "assertion", "timeframe", "totalMessages", "epoch", "number", "currentDataMutations", "currentDataTimeframe", "totalDataMutations", "targetDataTimeframe", "key", "truncate", "isOpen", "name", "properties", "members", "get", "length", "objects", "db", "query", "progress", "Math", "min", "abs", "toFixed", "SPACE_METRICS_MIN_INTERVAL", "DATADOG_IDLE_INTERVAL", "ERROR_TAGS", "Observability", "constructor", "namespace", "config", "secrets", "group", "mode", "telemetry", "errorLog", "logProcessor", "_mode", "_ctx", "Context", "_tags", "Map", "_namespace", "_config", "_group", "_secrets", "_loadSecrets", "_telemetryBatchSize", "batchSize", "_errorReportingOptions", "sentryInitOptions", "_errorLogProcessor", "setTag", "isNode", "buildSecrets", "invariant", "log", "rtc", "DX_ENVIRONMENT", "get", "DX_RELEASE", "SENTRY_DESTINATION", "TELEMETRY_API_KEY", "IPDATA_API_KEY", "DATADOG_API_KEY", "DATADOG_APP_KEY", "initialize", "_initMetrics", "_initTelemetry", "_initErrorLogs", "close", "dispose", "setMode", "enabled", "key", "value", "includes", "sentrySetTag", "set", "setIdentityTags", "client", "services", "IdentityService", "queryIdentity", "subscribe", "idqr", "identity", "identityKey", "truncate", "profile", "displayName", "setDeviceTags", "DevicesService", "queryDevices", "dqr", "devices", "length", "device", "thisDevice", "find", "kind", "DeviceKind", "CURRENT", "deviceKey", "label", "_metrics", "DatadogMetrics", "apiKey", "getTags", "gauge", "name", "extraTags", "startNetworkMetrics", "updateSignalMetrics", "Event", "on", "networkStatus", "signaling", "forEach", "server", "state", "swarmCount", "connectionStates", "ConnectionState", "totalReadBufferSize", "totalWriteBufferSize", "totalChannelBufferSize", "connectionInfo", "conn", "connections", "readBufferSize", "writeBufferSize", "stream", "streams", "NetworkService", "queryStatus", "emit", "startSpacesMetrics", "spaces", "subscriptions", "onDispose", "subscription", "unsubscribe", "updateSpaceMetrics", "debounce", "space", "sp", "mapSpaces", "truncateKeys", "members", "objects", "epoch", "currentDataMutations", "subscribeToSpaceUpdate", "pipeline", "next", "toHex", "filter", "has", "scheduleTaskInterval", "startRuntimeMetrics", "frequency", "platform", "SystemService", "getPlatform", "Platform", "PLATFORM_TYPE", "type", "toLowerCase", "arch", "runtime", "then", "memory", "rss", "heapTotal", "heapUsed", "catch", "error", "_telemetry", "SegmentTelemetry", "event", "options", "page", "info", "dest", "sentryInit", "destination", "scrubFilenames", "tracing", "sentryConfigureTracing", "enableSentryLogProcessor", "v", "k", "captureException", "err", "sentryCaptureException"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"packages/sdk/observability/src/datadog/browser.ts":{"bytes":2364,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/observability/src/datadog/metrics.ts":{"bytes":4719,"imports":[{"path":"datadog-metrics","kind":"import-statement","external":true},{"path":"debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/observability/src/datadog/browser.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/sdk/observability/src/datadog/index.ts":{"bytes":553,"imports":[{"path":"packages/sdk/observability/src/datadog/browser.ts","kind":"import-statement","original":"./node"},{"path":"packages/sdk/observability/src/datadog/metrics.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"},"packages/sdk/observability/src/cli-observability-secrets.json":{"bytes":315,"imports":[]},"packages/sdk/observability/src/sentry/tracing.ts":{"bytes":17365,"imports":[{"path":"@sentry/browser","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/observability/src/sentry/browser.ts":{"bytes":11844,"imports":[{"path":"@sentry/browser","kind":"import-statement","external":true},{"path":"@sentry/integrations","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/observability/src/sentry/tracing.ts","kind":"import-statement","original":"./tracing"},{"path":"@sentry/browser","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/observability/src/sentry/types.ts":{"bytes":1037,"imports":[],"format":"esm"},"packages/sdk/observability/src/sentry/index.ts":{"bytes":908,"imports":[{"path":"packages/sdk/observability/src/sentry/browser.ts","kind":"import-statement","original":"./node"},{"path":"packages/sdk/observability/src/sentry/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/sdk/observability/src/sentry/tracing.ts","kind":"import-statement","original":"./tracing"}],"format":"esm"},"packages/sdk/observability/src/segment/browser.ts":{"bytes":6769,"imports":[{"path":"@segment/snippet","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/observability/src/sentry/index.ts","kind":"import-statement","original":"../sentry"}],"format":"esm"},"packages/sdk/observability/src/segment/types.ts":{"bytes":1034,"imports":[],"format":"esm"},"packages/sdk/observability/src/segment/index.ts":{"bytes":547,"imports":[{"path":"packages/sdk/observability/src/segment/browser.ts","kind":"import-statement","original":"./node"},{"path":"packages/sdk/observability/src/segment/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/sdk/observability/src/util.ts":{"bytes":6449,"imports":[],"format":"esm"},"packages/sdk/observability/src/observability.ts":{"bytes":49999,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/network-manager","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/observability/src/cli-observability-secrets.json","kind":"import-statement","original":"./cli-observability-secrets.json"},{"path":"packages/sdk/observability/src/datadog/index.ts","kind":"import-statement","original":"./datadog"},{"path":"packages/sdk/observability/src/segment/index.ts","kind":"import-statement","original":"./segment"},{"path":"packages/sdk/observability/src/sentry/index.ts","kind":"import-statement","original":"./sentry"},{"path":"packages/sdk/observability/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/sdk/observability/src/index.ts":{"bytes":483,"imports":[{"path":"packages/sdk/observability/src/observability.ts","kind":"import-statement","original":"./observability"}],"format":"esm"}},"outputs":{"packages/sdk/observability/dist/lib/browser/datadog/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/sdk/observability/dist/lib/browser/datadog/index.mjs":{"imports":[{"path":"packages/sdk/observability/dist/lib/browser/chunk-2J5YS65Q.mjs","kind":"import-statement"}],"exports":["DatadogMetrics","defaultOptions"],"entryPoint":"packages/sdk/observability/src/datadog/index.ts","inputs":{},"bytes":158},"packages/sdk/observability/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":30482},"packages/sdk/observability/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/sdk/observability/dist/lib/browser/chunk-2J5YS65Q.mjs","kind":"import-statement"},{"path":"packages/sdk/observability/dist/lib/browser/chunk-6KUJPLEH.mjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/network-manager","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@segment/snippet","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["Observability"],"entryPoint":"packages/sdk/observability/src/index.ts","inputs":{"packages/sdk/observability/src/observability.ts":{"bytesInOutput":12666},"packages/sdk/observability/src/cli-observability-secrets.json":{"bytesInOutput":347},"packages/sdk/observability/src/segment/browser.ts":{"bytesInOutput":1798},"packages/sdk/observability/src/segment/index.ts":{"bytesInOutput":0},"packages/sdk/observability/src/util.ts":{"bytesInOutput":1212},"packages/sdk/observability/src/index.ts":{"bytesInOutput":0}},"bytes":16535},"packages/sdk/observability/dist/lib/browser/chunk-2J5YS65Q.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":3352},"packages/sdk/observability/dist/lib/browser/chunk-2J5YS65Q.mjs":{"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"datadog-metrics","kind":"import-statement","external":true},{"path":"debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["DatadogMetrics","defaultOptions"],"inputs":{"packages/sdk/observability/src/datadog/browser.ts":{"bytesInOutput":745},"packages/sdk/observability/src/datadog/index.ts":{"bytesInOutput":0},"packages/sdk/observability/src/datadog/metrics.ts":{"bytesInOutput":1173}},"bytes":2117},"packages/sdk/observability/dist/lib/browser/sentry/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/sdk/observability/dist/lib/browser/sentry/index.mjs":{"imports":[{"path":"packages/sdk/observability/dist/lib/browser/chunk-6KUJPLEH.mjs","kind":"import-statement"}],"exports":["SENTRY_PROCESSOR","addBreadcrumb","captureException","configureTracing","enableSentryLogProcessor","finish","init","setTag","setTags","setUser"],"entryPoint":"packages/sdk/observability/src/sentry/index.ts","inputs":{},"bytes":396},"packages/sdk/observability/dist/lib/browser/chunk-6KUJPLEH.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":13495},"packages/sdk/observability/dist/lib/browser/chunk-6KUJPLEH.mjs":{"imports":[{"path":"@sentry/browser","kind":"import-statement","external":true},{"path":"@sentry/integrations","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@sentry/browser","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@sentry/browser","kind":"import-statement","external":true}],"exports":["SENTRY_PROCESSOR","addBreadcrumb","captureException","configureTracing","enableSentryLogProcessor","finish","init","setTag","setTags","setUser"],"inputs":{"packages/sdk/observability/src/sentry/browser.ts":{"bytesInOutput":2872},"packages/sdk/observability/src/sentry/tracing.ts":{"bytesInOutput":4592},"packages/sdk/observability/src/sentry/index.ts":{"bytesInOutput":0}},"bytes":7844}}}
|