@dxos/observability 0.4.3 → 0.4.4-main.03ed207

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.
Files changed (47) hide show
  1. package/dist/lib/browser/{chunk-V6THSHYS.mjs → chunk-GMA3VEXB.mjs} +32 -41
  2. package/dist/lib/browser/chunk-GMA3VEXB.mjs.map +7 -0
  3. package/dist/lib/browser/datadog/index.mjs +37 -4
  4. package/dist/lib/browser/datadog/index.mjs.map +4 -4
  5. package/dist/lib/browser/index.mjs +1 -4
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/observability-S4PVKC2P.mjs +7 -0
  8. package/dist/lib/browser/segment/index.mjs +77 -3
  9. package/dist/lib/browser/segment/index.mjs.map +4 -4
  10. package/dist/lib/node/{chunk-NIGBDV2L.cjs → chunk-OGELP3WQ.cjs} +41 -39
  11. package/dist/lib/node/chunk-OGELP3WQ.cjs.map +7 -0
  12. package/dist/lib/node/datadog/index.cjs +73 -3
  13. package/dist/lib/node/datadog/index.cjs.map +4 -4
  14. package/dist/lib/node/index.cjs +15 -18
  15. package/dist/lib/node/index.cjs.map +2 -2
  16. package/dist/lib/node/meta.json +1 -1
  17. package/dist/lib/node/{observability-KLYDIJPY.cjs → observability-53WZ5VOC.cjs} +6 -9
  18. package/dist/lib/node/observability-53WZ5VOC.cjs.map +7 -0
  19. package/dist/lib/node/segment/index.cjs +142 -2
  20. package/dist/lib/node/segment/index.cjs.map +4 -4
  21. package/dist/types/src/datadog/browser.d.ts +4 -0
  22. package/dist/types/src/datadog/browser.d.ts.map +1 -1
  23. package/dist/types/src/datadog/browser.js +8 -1
  24. package/dist/types/src/datadog/browser.js.map +1 -1
  25. package/dist/types/src/helpers/browser-observability.js +1 -1
  26. package/dist/types/src/helpers/browser-observability.js.map +1 -1
  27. package/dist/types/src/observability.d.ts +3 -1
  28. package/dist/types/src/observability.d.ts.map +1 -1
  29. package/dist/types/src/observability.js +45 -18
  30. package/dist/types/src/observability.js.map +1 -1
  31. package/package.json +15 -14
  32. package/src/datadog/browser.ts +7 -0
  33. package/src/helpers/browser-observability.ts +1 -1
  34. package/src/observability.ts +23 -22
  35. package/dist/lib/browser/chunk-6ZTMPKEG.mjs +0 -81
  36. package/dist/lib/browser/chunk-6ZTMPKEG.mjs.map +0 -7
  37. package/dist/lib/browser/chunk-HPGC4HC7.mjs +0 -83
  38. package/dist/lib/browser/chunk-HPGC4HC7.mjs.map +0 -7
  39. package/dist/lib/browser/chunk-V6THSHYS.mjs.map +0 -7
  40. package/dist/lib/browser/observability-5GM33EWR.mjs +0 -10
  41. package/dist/lib/node/chunk-BHF4PKAP.cjs +0 -170
  42. package/dist/lib/node/chunk-BHF4PKAP.cjs.map +0 -7
  43. package/dist/lib/node/chunk-NIGBDV2L.cjs.map +0 -7
  44. package/dist/lib/node/chunk-ZJRKFREX.cjs +0 -101
  45. package/dist/lib/node/chunk-ZJRKFREX.cjs.map +0 -7
  46. package/dist/lib/node/observability-KLYDIJPY.cjs.map +0 -7
  47. /package/dist/lib/browser/{observability-5GM33EWR.mjs.map → observability-S4PVKC2P.mjs.map} +0 -0
@@ -1,7 +1,81 @@
1
1
  import {
2
- SegmentTelemetry
3
- } from "../chunk-HPGC4HC7.mjs";
4
- import "../chunk-6KUJPLEH.mjs";
2
+ captureException
3
+ } from "../chunk-6KUJPLEH.mjs";
4
+
5
+ // packages/sdk/observability/src/segment/browser.ts
6
+ import snippet from "@segment/snippet";
7
+ import { log } from "@dxos/log";
8
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/segment/browser.ts";
9
+ var SegmentTelemetry = class {
10
+ constructor({ apiKey, batchSize, getTags }) {
11
+ this._getTags = getTags;
12
+ try {
13
+ const contents = snippet.min({
14
+ apiKey,
15
+ page: false
16
+ });
17
+ const script = document.createElement("script");
18
+ script.innerHTML = contents;
19
+ document.body.append(script);
20
+ } catch (err) {
21
+ log.catch("Failed to initialize telemetry", err, {
22
+ F: __dxlog_file,
23
+ L: 27,
24
+ S: this,
25
+ C: (f, a) => f(...a)
26
+ });
27
+ }
28
+ }
29
+ page({ identityId: userId, ...options } = {}) {
30
+ try {
31
+ window.analytics?.page({
32
+ context: this._getTags(),
33
+ ...options,
34
+ userId
35
+ });
36
+ } catch (err) {
37
+ log.catch("Failed to track page", err, {
38
+ F: __dxlog_file,
39
+ L: 39,
40
+ S: this,
41
+ C: (f, a) => f(...a)
42
+ });
43
+ }
44
+ }
45
+ event({ identityId: userId, name: event, ...options }) {
46
+ try {
47
+ options.properties = {
48
+ ...options.properties,
49
+ ...this._getTags()
50
+ };
51
+ window.analytics?.track({
52
+ ...options,
53
+ event
54
+ });
55
+ } catch (err) {
56
+ log.catch("Failed to track event", err, {
57
+ F: __dxlog_file,
58
+ L: 54,
59
+ S: this,
60
+ C: (f, a) => f(...a)
61
+ });
62
+ }
63
+ }
64
+ async flush() {
65
+ try {
66
+ await window.analytics?.flush((err) => {
67
+ captureException(err);
68
+ });
69
+ } catch (err) {
70
+ log.catch("Failed to flush telemetry", err, {
71
+ F: __dxlog_file,
72
+ L: 64,
73
+ S: this,
74
+ C: (f, a) => f(...a)
75
+ });
76
+ }
77
+ }
78
+ };
5
79
  export {
6
80
  SegmentTelemetry
7
81
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
3
+ "sources": ["../../../../src/segment/browser.ts"],
4
+ "sourcesContent": ["//\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: () => { [key: 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: this._getTags(),\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 ...this._getTags(),\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"],
5
+ "mappings": ";;;;;AAIA,OAAOA,aAAa;AAEpB,SAASC,WAAW;;AAKb,IAAMC,mBAAN,MAAMA;EAGXC,YAAY,EAAEC,QAAQC,WAAWC,QAAO,GAA6B;AACnE,SAAKC,WAAWD;AAChB,QAAI;AACF,YAAME,WAAWC,QAAQC,IAAI;QAC3BN;QACAO,MAAM;MACR,CAAA;AAEA,YAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,aAAOG,YAAYP;AACnBK,eAASG,KAAKC,OAAOL,MAAAA;IACvB,SAASM,KAAK;AACZC,UAAIC,MAAM,kCAAkCF,KAAAA;;;;;;IAC9C;EACF;EAEAP,KAAK,EAAEU,YAAYC,QAAQ,GAAGC,QAAAA,IAAyB,CAAC,GAAG;AACzD,QAAI;AACDC,aAAeC,WAAWd,KAAK;QAC9Be,SAAS,KAAKnB,SAAQ;QACtB,GAAGgB;QACHD;MACF,CAAA;IACF,SAASJ,KAAK;AACZC,UAAIC,MAAM,wBAAwBF,KAAAA;;;;;;IACpC;EACF;EAEAS,MAAM,EAAEN,YAAYC,QAAQM,MAAMD,OAAO,GAAGJ,QAAAA,GAAyB;AACnE,QAAI;AACFA,cAAQM,aAAa;QACnB,GAAGN,QAAQM;QACX,GAAG,KAAKtB,SAAQ;MAClB;AACCiB,aAAeC,WAAWK,MAAM;QAC/B,GAAGP;QACHI;MACF,CAAA;IACF,SAAST,KAAK;AACZC,UAAIC,MAAM,yBAAyBF,KAAAA;;;;;;IACrC;EACF;EAEA,MAAMa,QAAQ;AACZ,QAAI;AACF,YAAOP,OAAeC,WAAWM,MAAM,CAACb,QAAAA;AACtCc,yBAAiBd,GAAAA;MACnB,CAAA;IACF,SAASA,KAAK;AACZC,UAAIC,MAAM,6BAA6BF,KAAAA;;;;;;IACzC;EACF;AACF;",
6
+ "names": ["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", "event", "name", "properties", "track", "flush", "captureException"]
7
7
  }
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_NIGBDV2L_exports = {};
30
- __export(chunk_NIGBDV2L_exports, {
29
+ var chunk_OGELP3WQ_exports = {};
30
+ __export(chunk_OGELP3WQ_exports, {
31
31
  OBSERVABILITY_DISABLED_KEY: () => OBSERVABILITY_DISABLED_KEY,
32
32
  OBSERVABILITY_GROUP_KEY: () => OBSERVABILITY_GROUP_KEY,
33
33
  Observability: () => Observability,
@@ -43,10 +43,7 @@ __export(chunk_NIGBDV2L_exports, {
43
43
  storeObservabilityDisabled: () => storeObservabilityDisabled,
44
44
  storeObservabilityGroup: () => storeObservabilityGroup
45
45
  });
46
- module.exports = __toCommonJS(chunk_NIGBDV2L_exports);
47
- var import_chunk_ZJRKFREX = require("./chunk-ZJRKFREX.cjs");
48
- var import_chunk_BHF4PKAP = require("./chunk-BHF4PKAP.cjs");
49
- var import_chunk_FSAOBKO2 = require("./chunk-FSAOBKO2.cjs");
46
+ module.exports = __toCommonJS(chunk_OGELP3WQ_exports);
50
47
  var import_async = require("@dxos/async");
51
48
  var import_context = require("@dxos/context");
52
49
  var import_invariant = require("@dxos/invariant");
@@ -134,7 +131,7 @@ var initializeAppObservability = async ({ namespace, config, mode = "basic", tra
134
131
  const release = `${namespace}@${config.get("runtime.app.build.version")}`;
135
132
  const environment = config.get("runtime.app.env.DX_ENVIRONMENT");
136
133
  const observabilityDisabled = await isObservabilityDisabled(namespace);
137
- const { Observability: Observability2 } = await import("./observability-KLYDIJPY.cjs");
134
+ const { Observability: Observability2 } = await import("./observability-53WZ5VOC.cjs");
138
135
  const observability = new Observability2({
139
136
  namespace,
140
137
  group,
@@ -181,7 +178,7 @@ var initializeAppObservability = async ({ namespace, config, mode = "basic", tra
181
178
  }).catch((err) => observability.captureException(err));
182
179
  }
183
180
  };
184
- observability.initialize();
181
+ await observability.initialize();
185
182
  const ipData = await getIPData(config);
186
183
  ipData && observability.addIPDataTelemetryTags(ipData);
187
184
  if (typeof navigator !== "undefined" && navigator.storage?.estimate) {
@@ -458,7 +455,7 @@ var Observability = class {
458
455
  config
459
456
  }, {
460
457
  F: __dxlog_file3,
461
- L: 128,
458
+ L: 123,
462
459
  S: this,
463
460
  C: (f, a) => f(...a)
464
461
  });
@@ -474,10 +471,10 @@ var Observability = class {
474
471
  };
475
472
  }
476
473
  }
477
- initialize() {
478
- this._initMetrics();
479
- this._initTelemetry();
480
- this._initErrorLogs();
474
+ async initialize() {
475
+ await this._initMetrics();
476
+ await this._initTelemetry();
477
+ await this._initErrorLogs();
481
478
  }
482
479
  async close() {
483
480
  await this._ctx.dispose();
@@ -499,7 +496,7 @@ var Observability = class {
499
496
  //
500
497
  setTag(key, value, scope) {
501
498
  if (this.enabled && (scope === void 0 || scope === "all" || scope === "errors")) {
502
- (0, import_chunk_FSAOBKO2.setTag)(key, value);
499
+ this._setTag?.(key, value);
503
500
  }
504
501
  if (!scope) {
505
502
  scope = "all";
@@ -520,7 +517,7 @@ var Observability = class {
520
517
  idqr
521
518
  }, {
522
519
  F: __dxlog_file3,
523
- L: 200,
520
+ L: 195,
524
521
  S: this,
525
522
  C: (f, a) => f(...a)
526
523
  });
@@ -534,7 +531,7 @@ var Observability = class {
534
531
  device: dqr
535
532
  }, {
536
533
  F: __dxlog_file3,
537
- L: 209,
534
+ L: 204,
538
535
  S: this,
539
536
  C: (f, a) => f(...a)
540
537
  });
@@ -542,7 +539,7 @@ var Observability = class {
542
539
  }
543
540
  (0, import_invariant.invariant)(dqr, "empty response from device service", {
544
541
  F: __dxlog_file3,
545
- L: 212,
542
+ L: 207,
546
543
  S: this,
547
544
  A: [
548
545
  "dqr",
@@ -555,7 +552,7 @@ var Observability = class {
555
552
  device: dqr
556
553
  }, {
557
554
  F: __dxlog_file3,
558
- L: 216,
555
+ L: 211,
559
556
  S: this,
560
557
  C: (f, a) => f(...a)
561
558
  });
@@ -570,9 +567,10 @@ var Observability = class {
570
567
  //
571
568
  // Metrics
572
569
  //
573
- _initMetrics() {
570
+ async _initMetrics() {
574
571
  if (this.enabled && this._secrets.DATADOG_API_KEY) {
575
- this._metrics = new import_chunk_ZJRKFREX.DatadogMetrics({
572
+ const { DatadogMetrics } = await import("./datadog/index.cjs");
573
+ this._metrics = new DatadogMetrics({
576
574
  apiKey: this._secrets.DATADOG_API_KEY,
577
575
  getTags: () => Object.fromEntries(Array.from(this._tags).filter(([key, value]) => {
578
576
  return value.scope === "all" || value.scope === "metrics";
@@ -586,7 +584,7 @@ var Observability = class {
586
584
  } else {
587
585
  (0, import_log.log)("datadog disabled", void 0, {
588
586
  F: __dxlog_file3,
589
- L: 246,
587
+ L: 242,
590
588
  S: this,
591
589
  C: (f, a) => f(...a)
592
590
  });
@@ -606,7 +604,7 @@ var Observability = class {
606
604
  updateSignalMetrics.on(this._ctx, async (networkStatus) => {
607
605
  (0, import_log.log)("send signal metrics", void 0, {
608
606
  F: __dxlog_file3,
609
- L: 266,
607
+ L: 262,
610
608
  S: this,
611
609
  C: (f, a) => f(...a)
612
610
  });
@@ -656,7 +654,7 @@ var Observability = class {
656
654
  updateSpaceMetrics.on(this._ctx, async () => {
657
655
  (0, import_log.log)("send space update", void 0, {
658
656
  F: __dxlog_file3,
659
- L: 318,
657
+ L: 314,
660
658
  S: this,
661
659
  C: (f, a) => f(...a)
662
660
  });
@@ -703,7 +701,7 @@ var Observability = class {
703
701
  const platform = await client.services.services.SystemService?.getPlatform();
704
702
  (0, import_invariant.invariant)(platform, "platform is required", {
705
703
  F: __dxlog_file3,
706
- L: 361,
704
+ L: 357,
707
705
  S: this,
708
706
  A: [
709
707
  "platform",
@@ -725,7 +723,7 @@ var Observability = class {
725
723
  (0, import_async.scheduleTaskInterval)(this._ctx, async () => {
726
724
  (0, import_log.log)("platform", void 0, {
727
725
  F: __dxlog_file3,
728
- L: 379,
726
+ L: 375,
729
727
  S: this,
730
728
  C: (f, a) => f(...a)
731
729
  });
@@ -734,7 +732,7 @@ var Observability = class {
734
732
  platform: platform2
735
733
  }, {
736
734
  F: __dxlog_file3,
737
- L: 382,
735
+ L: 378,
738
736
  S: this,
739
737
  C: (f, a) => f(...a)
740
738
  });
@@ -747,7 +745,7 @@ var Observability = class {
747
745
  error
748
746
  }, {
749
747
  F: __dxlog_file3,
750
- L: 389,
748
+ L: 385,
751
749
  S: this,
752
750
  C: (f, a) => f(...a)
753
751
  }));
@@ -756,9 +754,10 @@ var Observability = class {
756
754
  //
757
755
  // Telemetry
758
756
  //
759
- _initTelemetry() {
757
+ async _initTelemetry() {
760
758
  if (this._secrets.TELEMETRY_API_KEY && this._mode !== "disabled") {
761
- this._telemetry = new import_chunk_BHF4PKAP.SegmentTelemetry({
759
+ const { SegmentTelemetry } = await import("./segment/index.cjs");
760
+ this._telemetry = new SegmentTelemetry({
762
761
  apiKey: this._secrets.TELEMETRY_API_KEY,
763
762
  batchSize: this._telemetryBatchSize,
764
763
  getTags: () => Object.fromEntries(Array.from(this._tags).filter(([key, value]) => {
@@ -771,7 +770,7 @@ var Observability = class {
771
770
  } else {
772
771
  (0, import_log.log)("segment disabled", void 0, {
773
772
  F: __dxlog_file3,
774
- L: 414,
773
+ L: 411,
775
774
  S: this,
776
775
  C: (f, a) => f(...a)
777
776
  });
@@ -796,37 +795,40 @@ var Observability = class {
796
795
  //
797
796
  // Error Logs
798
797
  //
799
- _initErrorLogs() {
798
+ async _initErrorLogs() {
800
799
  if (this._secrets.SENTRY_DESTINATION && this._mode !== "disabled") {
800
+ const { captureException, enableSentryLogProcessor, configureTracing, init, setTag } = await import("./sentry/index.cjs");
801
+ this._captureException = captureException;
802
+ this._setTag = setTag;
801
803
  import_log.log.info("Initializing Sentry", {
802
804
  dest: this._secrets.SENTRY_DESTINATION,
803
805
  options: this._errorReportingOptions
804
806
  }, {
805
807
  F: __dxlog_file3,
806
- L: 443,
808
+ L: 444,
807
809
  S: this,
808
810
  C: (f, a) => f(...a)
809
811
  });
810
- (0, import_chunk_FSAOBKO2.init)({
812
+ init({
811
813
  ...this._errorReportingOptions,
812
814
  destination: this._secrets.SENTRY_DESTINATION,
813
815
  scrubFilenames: this._mode !== "full"
814
816
  });
815
817
  if (this._errorReportingOptions?.tracing) {
816
- (0, import_chunk_FSAOBKO2.configureTracing)();
818
+ configureTracing();
817
819
  }
818
820
  if (this._errorLogProcessor) {
819
- (0, import_chunk_FSAOBKO2.enableSentryLogProcessor)();
821
+ enableSentryLogProcessor();
820
822
  }
821
823
  this._tags.forEach((v, k) => {
822
824
  if (v.scope === "all" || v.scope === "errors") {
823
- (0, import_chunk_FSAOBKO2.setTag)(k, v.value);
825
+ setTag(k, v.value);
824
826
  }
825
827
  });
826
828
  } else {
827
829
  (0, import_log.log)("sentry disabled", void 0, {
828
830
  F: __dxlog_file3,
829
- L: 466,
831
+ L: 467,
830
832
  S: this,
831
833
  C: (f, a) => f(...a)
832
834
  });
@@ -839,7 +841,7 @@ var Observability = class {
839
841
  */
840
842
  captureException(err) {
841
843
  if (this.enabled) {
842
- (0, import_chunk_FSAOBKO2.captureException)(err);
844
+ this._captureException?.(err);
843
845
  }
844
846
  }
845
847
  };
@@ -860,4 +862,4 @@ var Observability = class {
860
862
  storeObservabilityDisabled,
861
863
  storeObservabilityGroup
862
864
  });
863
- //# sourceMappingURL=chunk-NIGBDV2L.cjs.map
865
+ //# sourceMappingURL=chunk-OGELP3WQ.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/observability.ts", "../../../src/cli-observability-secrets.json", "../../../src/helpers/browser-observability.ts", "../../../src/helpers/common.ts", "../../../src/helpers/node-observability.ts", "../../../src/helpers/map-spaces.ts", "../../../src/helpers/setup-telemetry-listeners.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 { type DatadogMetrics } from './datadog';\nimport { type IPData, getTelemetryIdentifier, mapSpaces } from './helpers';\nimport { type SegmentTelemetry, type EventOptions, type PageOptions } from './segment';\nimport { type InitOptions, type captureException as SentryCaptureException } from './sentry';\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// 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';\nexport type TagScope = 'errors' | 'telemetry' | 'metrics' | 'all';\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 logProcessor?: boolean;\n };\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 private _captureException?: typeof SentryCaptureException;\n private _setTag?: (key: string, value: string) => void;\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, { value: string; scope: TagScope }>();\n\n // TODO(nf): make platform a required extension?\n constructor({ namespace, config, secrets, group, mode, telemetry, errorLog }: 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 = errorLog?.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 const mergedSecrets = {\n ...(buildSecrets as ObservabilitySecrets),\n ...secrets,\n };\n\n process.env.DX_ENVIRONMENT && (mergedSecrets.DX_ENVIRONMENT = process.env.DX_ENVIRONMENT);\n process.env.DX_RELEASE && (mergedSecrets.DX_RELEASE = process.env.DX_RELEASE);\n process.env.SENTRY_DESTINATION && (mergedSecrets.SENTRY_DESTINATION = process.env.SENTRY_DESTINATION);\n process.env.TELEMETRY_API_KEY && (mergedSecrets.TELEMETRY_API_KEY = process.env.TELEMETRY_API_KEY);\n process.env.IPDATA_API_KEY && (mergedSecrets.IPDATA_API_KEY = process.env.IPDATA_API_KEY);\n process.env.DATADOG_API_KEY && (mergedSecrets.DATADOG_API_KEY = process.env.DATADOG_API_KEY);\n process.env.DATADOG_APP_KEY && (mergedSecrets.DATADOG_APP_KEY = process.env.DATADOG_APP_KEY);\n\n return mergedSecrets;\n } else {\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 async initialize() {\n await this._initMetrics();\n await this._initTelemetry();\n await 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 group() {\n return this._group;\n }\n\n get enabled() {\n return this._mode !== 'disabled';\n }\n\n //\n // Tags\n //\n\n setTag(key: string, value: string, scope?: TagScope) {\n if (this.enabled && (scope === undefined || scope === 'all' || scope === 'errors')) {\n this._setTag?.(key, value);\n }\n if (!scope) {\n scope = 'all';\n }\n this._tags.set(key, { value, scope });\n }\n\n getTag(key: string) {\n return this._tags.get(key);\n }\n\n addIPDataTelemetryTags = (ipData: IPData) => {\n this.setTag('city', ipData.city, 'telemetry');\n this.setTag('region', ipData.region, 'telemetry');\n this.setTag('country', ipData.country, 'telemetry');\n ipData.latitude && this.setTag('latitude', ipData.latitude.toString(), 'telemetry');\n ipData.longitude && this.setTag('longitude', ipData.longitude.toString(), 'telemetry');\n };\n\n // TODO(wittjosiah): Improve privacy of telemetry identifiers. See `getTelemetryIdentifier`.\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 this.setTag('identityKey', idqr.identity.identityKey.truncate());\n });\n\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 async _initMetrics() {\n if (this.enabled && this._secrets.DATADOG_API_KEY) {\n const { DatadogMetrics } = await import('./datadog');\n this._metrics = new DatadogMetrics({\n apiKey: this._secrets.DATADOG_API_KEY,\n getTags: () =>\n Object.fromEntries(\n Array.from(this._tags)\n .filter(([key, value]) => {\n return value.scope === 'all' || value.scope === 'metrics';\n })\n .map(([key, value]) => [key, value.value]),\n ),\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, namespace: string) {\n const 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 () => {\n log('send space update');\n for (const data of mapSpaces(spaces, { truncateKeys: true })) {\n // Metrics\n this.gauge('dxos.client.space.members', data.members, { key: data.key });\n this.gauge('dxos.client.space.objects', data.objects, { key: data.key });\n this.gauge('dxos.client.space.epoch', data.epoch, { key: data.key });\n this.gauge('dxos.client.space.currentDataMutations', data.currentDataMutations, { key: data.key });\n\n // Telemetry\n this.event({\n identityId: getTelemetryIdentifier(client),\n name: `${namespace}.space.update`,\n properties: data,\n });\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 (spaces) => {\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 async _initTelemetry() {\n if (this._secrets.TELEMETRY_API_KEY && this._mode !== 'disabled') {\n const { SegmentTelemetry } = await import('./segment');\n this._telemetry = new SegmentTelemetry({\n apiKey: this._secrets.TELEMETRY_API_KEY,\n batchSize: this._telemetryBatchSize,\n getTags: () =>\n Object.fromEntries(\n Array.from(this._tags)\n .filter(([key, value]) => {\n return value.scope === 'all' || value.scope === 'telemetry';\n })\n .map(([key, value]) => [key, value.value]),\n ),\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 async _initErrorLogs() {\n if (this._secrets.SENTRY_DESTINATION && this._mode !== 'disabled') {\n const { captureException, enableSentryLogProcessor, configureTracing, init, setTag } = await import('./sentry');\n this._captureException = captureException;\n this._setTag = setTag;\n\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 init({\n ...this._errorReportingOptions,\n destination: this._secrets.SENTRY_DESTINATION,\n scrubFilenames: this._mode !== 'full',\n });\n if (this._errorReportingOptions?.tracing) {\n configureTracing();\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 (v.scope === 'all' || v.scope === 'errors') {\n setTag(k, v.value);\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 this._captureException?.(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\n// NOTE: localStorage is not available in web workers.\nimport * as localForage from 'localforage';\n\n// import { type Platform } from '@dxos/client-services';\n// import { type InitOptions as TelemetryInitOptions } from '@dxos/telemetry';\n\nimport type { Config } from '@dxos/client';\nimport { log } from '@dxos/log';\n\nimport type { IPData } from './common';\nimport type { Mode, Observability } from '../observability';\n\nexport const OBSERVABILITY_DISABLED_KEY = 'observability-disabled';\nexport const OBSERVABILITY_GROUP_KEY = 'observability-group';\n\nexport const isObservabilityDisabled = async (namespace: string): Promise<boolean> => {\n try {\n return (await localForage.getItem(`${namespace}:${OBSERVABILITY_DISABLED_KEY}`)) === 'true';\n } catch (err) {\n log.catch('Failed to check if observability is disabled, assuming it is', err);\n return true;\n }\n};\n\nexport const storeObservabilityDisabled = async (namespace: string, value: boolean) => {\n try {\n await localForage.setItem(`${namespace}:${OBSERVABILITY_DISABLED_KEY}`, String(value));\n } catch (err) {\n log.catch('Failed to store observability disabled', err);\n }\n};\n\nexport const getObservabilityGroup = async (namespace: string): Promise<string | undefined> => {\n try {\n return (await localForage.getItem(`${namespace}:${OBSERVABILITY_GROUP_KEY}`)) ?? undefined;\n } catch (err) {\n log.catch('Failed to get observability group', err);\n }\n};\n\nexport const storeObservabilityGroup = async (namespace: string, value: string) => {\n try {\n await localForage.setItem(`${namespace}:${OBSERVABILITY_GROUP_KEY}`, value);\n } catch (err) {\n log.catch('Failed to store observability group', err);\n }\n};\n\nexport type AppObservabilityOptions = {\n namespace: string;\n config: Config;\n mode?: Mode;\n tracingEnable?: boolean;\n replayEnable?: boolean;\n // TODO(nf): options for providers?\n};\n\n// TODO(wittjosiah): Store preference for disabling observability.\n// At minimum should be stored locally (i.e., localstorage), possibly in halo preference.\n// Needs to be hooked up to settings page for user visibility.\nexport const initializeAppObservability = async ({\n namespace,\n config,\n mode = 'basic',\n tracingEnable = true,\n replayEnable = true,\n}: AppObservabilityOptions): Promise<Observability> => {\n log('initializeAppObservability', { config });\n\n /*\n const platform = (await client.services.services.SystemService?.getPlatform()) as Platform;\n if (!platform) {\n log.error('failed to get platform, could not initialize observability');\n return undefined;\n }\n */\n\n const group = (await getObservabilityGroup(namespace)) ?? undefined;\n const release = `${namespace}@${config.get('runtime.app.build.version')}`;\n const environment = config.get('runtime.app.env.DX_ENVIRONMENT');\n\n const observabilityDisabled = await isObservabilityDisabled(namespace);\n\n const { Observability } = await import('../observability');\n\n // TODO(nf): configure mode\n const observability = new Observability({\n namespace,\n group,\n mode,\n config,\n errorLog: {\n sentryInitOptions: {\n environment,\n release,\n tracing: tracingEnable,\n replay: replayEnable,\n // TODO(wittjosiah): Configure these.\n sampleRate: 1.0,\n replaySampleRate: 0.1,\n replaySampleRateOnError: 1.0,\n },\n },\n });\n\n // global kill switch\n if (observabilityDisabled) {\n observability.setMode('disabled');\n log.info('observability disabled');\n return observability;\n }\n\n try {\n const getIPData = async (config: Config): Promise<IPData | void> => {\n const IP_DATA_CACHE_TIMEOUT = 6 * 60 * 60 * 1000; // 6 hours\n type CachedIPData = {\n data: IPData;\n timestamp: number;\n };\n\n // Check cache first.\n const cachedData: null | CachedIPData = await localForage.getItem('dxos:observability:ipdata');\n if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {\n return cachedData.data;\n }\n\n // Fetch data if not cached.\n const IPDATA_API_KEY = config.get('runtime.app.env.DX_IPDATA_API_KEY');\n if (IPDATA_API_KEY) {\n return fetch(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`)\n .then((res) => res.json())\n .then((data) => {\n // Cache data.\n localForage\n .setItem('dxos:observability:ipdata', {\n data,\n timestamp: Date.now(),\n })\n .catch((err) => observability.captureException(err));\n\n return data;\n })\n .catch((err) => observability.captureException(err));\n }\n };\n\n // TODO(nf): plugin state?\n\n // TODO(nf): should provide capability to init Sentry earlier in booting process to capture errors during initialization.\n\n await observability.initialize();\n\n const ipData = await getIPData(config);\n\n ipData && observability.addIPDataTelemetryTags(ipData);\n\n if (typeof navigator !== 'undefined' && navigator.storage?.estimate) {\n setInterval(async () => {\n try {\n const storageEstimate = await navigator.storage.estimate();\n storageEstimate.usage && observability.setTag('storageUsage', storageEstimate.usage.toString(), 'telemetry');\n storageEstimate.quota && observability.setTag('storageQuota', storageEstimate.quota.toString(), 'telemetry');\n } catch (error) {\n log.warn('Failed to run estimate()', error);\n }\n }, 10e3);\n }\n } catch (err: any) {\n log.error('Failed to initialize app observability', err);\n }\n\n return observability;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport type { Client } from '@dxos/client';\n\n// TODO(wittjosiah): Improve privacy of telemetry identifiers.\n// - Identifier should be generated client-side with no attachment to identity.\n// - Identifier can then be reset by user.\n// - Identifier can be synced via HALO to allow for correlation of events bewteen devices.\n// - Identifier should also be stored outside of HALO such that it is available immediately on startup.\nexport const getTelemetryIdentifier = (client: Client) => {\n if (!client?.initialized) {\n return undefined;\n }\n\n const identity = client.halo.identity.get();\n if (identity) {\n return identity.identityKey.truncate();\n }\n\n return undefined;\n};\n\nexport type IPData = { city: string; region: string; country: string; latitude: number; longitude: number };\n", "//\n// Copyright 2022 DXOS.org\n//\nimport yaml from 'js-yaml';\nimport { existsSync, statSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { v4 as uuid, validate as validateUuid } from 'uuid';\n\nimport type { Config } from '@dxos/client';\nimport { log } from '@dxos/log';\n\nimport { Observability, type Mode } from '../observability';\n\n/**\n * Print observability banner once per installation.\n */\nexport const showObservabilityBanner = async (configDir: string, bannercb: (input: string) => void) => {\n const path = join(configDir, '.observability-banner-printed');\n if (existsSync(path)) {\n return;\n }\n bannercb(\n // eslint-disable-next-line no-multi-str\n 'Basic observability data will be sent to the DXOS team in order to improve the product. This includes \\\n performance metrics, error logs, and usage data. No personally identifiable information, other than your \\\n public key, is included with this data and no private data ever leaves your devices. To disable sending \\\n observability data, set the environment variable DX_DISABLE_OBSERVABILITY=true.',\n );\n\n await writeFile(path, '', 'utf-8');\n};\n\nexport const getObservabilityState = async (configDir: string): Promise<PersistentObservabilityState> => {\n // check whether configDir exists and if it's a directory\n\n if (existsSync(configDir)) {\n if (!statSync(configDir).isDirectory()) {\n throw new Error(`Config directory ${configDir} exists but is not a directory`);\n }\n } else {\n await mkdir(configDir, { recursive: true });\n }\n\n const idPath = join(configDir, 'observability.yml');\n if (existsSync(idPath)) {\n const context = await readFile(idPath, 'utf-8');\n return validate(context) ?? initializeState(idPath);\n }\n\n return initializeState(idPath);\n};\n\nexport type TelemetryContext = {\n mode: Mode;\n installationId?: string;\n group?: string;\n timezone: string;\n runtime: string;\n os: string;\n arch: string;\n ci: boolean;\n [key: string]: any;\n};\n\nexport type PersistentObservabilityState = {\n installationId: string;\n group?: string;\n mode: Mode;\n};\n\n// create initial state and write to file, using environment variables to override defaults.\nconst initializeState = async (idPath: string): Promise<PersistentObservabilityState> => {\n // TODO(nf): read initial values from config or seed file\n const observabilityState = {\n installationId: uuid(),\n group: process.env.DX_OBSERVABILITY_GROUP ?? undefined,\n mode: (process.env.DX_DISABLE_OBSERVABILITY ? 'disabled' : process.env.DX_OBSERVABILITY_MODE ?? 'basic') as Mode,\n };\n\n await writeFile(\n idPath,\n '# This file is automatically generated by the @dxos/cli.\\n' + yaml.dump(observabilityState),\n 'utf-8',\n );\n\n return observabilityState;\n};\n\nconst validate = (contextString: string) => {\n const context = yaml.load(contextString) as PersistentObservabilityState;\n if (Boolean(context.installationId) && validateUuid(context.installationId!)) {\n return {\n ...context,\n mode: process.env.DX_DISABLE_OBSERVABILITY ? 'disabled' : context.mode ?? 'basic',\n };\n }\n};\n\nexport type NodeObservabilityOptions = {\n installationId: string;\n group?: string;\n namespace: string;\n config: Config;\n mode?: Mode;\n tracingEnable?: boolean;\n replayEnable?: boolean;\n // TODO(nf): options for providers?\n};\n\nexport const initializeNodeObservability = async ({\n namespace,\n config,\n installationId,\n group,\n mode = 'basic',\n tracingEnable = true,\n replayEnable = true,\n}: NodeObservabilityOptions): Promise<Observability> => {\n log('initializeCliObservability', { config });\n\n const release = `${namespace}@${config.get('runtime.app.build.version')}`;\n const environment = config.get('runtime.app.env.DX_ENVIRONMENT');\n\n const observability = new Observability({\n namespace,\n group,\n mode,\n errorLog: {\n sentryInitOptions: {\n environment,\n release,\n // TODO(wittjosiah): Configure this.\n sampleRate: 1.0,\n },\n logProcessor: true,\n },\n });\n\n observability.setTag('installationId', installationId);\n\n const IPDATA_API_KEY = config.get('runtime.app.env.DX_IPDATA_API_KEY');\n try {\n const res = await fetch(`https://api.ipdata.co/?api-key=${IPDATA_API_KEY}`);\n const ipData = await res.json();\n ipData && observability.addIPDataTelemetryTags(ipData);\n } catch (err) {\n observability?.captureException(err);\n }\n return observability;\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 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", "//\n// Copyright 2022 DXOS.org\n//\n\nimport type { Client } from '@dxos/client';\n\nimport { getTelemetryIdentifier } from './common';\nimport type { Observability } from '../observability';\n\nlet lastFocusEvent = new Date();\nlet totalTime = 0;\n\nexport const setupTelemetryListeners = (namespace: string, client: Client, observability: Observability) => {\n const clickCallback = (event: any) => {\n setTimeout(() =>\n observability.event({\n identityId: getTelemetryIdentifier(client),\n name: `${namespace}.window.click`,\n properties: {\n href: window.location.href,\n id: (event.target as HTMLElement)?.id,\n path: (event.path as HTMLElement[])\n ?.filter((el) => Boolean(el.tagName))\n .map((el) => `${el.tagName.toLowerCase()}${el.id ? `#${el.id}` : ''}`)\n .reverse()\n .join('>'),\n },\n }),\n );\n };\n\n const focusCallback = () => {\n const now = new Date();\n setTimeout(() =>\n observability.event({\n identityId: getTelemetryIdentifier(client),\n name: `${namespace}.window.focus`,\n properties: {\n href: window.location.href,\n timeAway: now.getTime() - lastFocusEvent.getTime(),\n },\n }),\n );\n lastFocusEvent = now;\n };\n\n const blurCallback = () => {\n const now = new Date();\n const timeSpent = now.getTime() - lastFocusEvent.getTime();\n setTimeout(() =>\n observability.event({\n identityId: getTelemetryIdentifier(client),\n name: `${namespace}.window.blur`,\n properties: {\n href: window.location.href,\n timeSpent,\n },\n }),\n );\n lastFocusEvent = now;\n totalTime = totalTime + timeSpent;\n };\n\n const unloadCallback = () => {\n setTimeout(() =>\n observability.event({\n identityId: getTelemetryIdentifier(client),\n name: `${namespace}.page.unload`,\n properties: {\n href: window.location.href,\n timeSpent: totalTime,\n },\n }),\n );\n };\n\n const errorCallback = (event: ErrorEvent) => {\n setTimeout(() =>\n observability.event({\n identityId: getTelemetryIdentifier(client),\n name: `${namespace}.window.error`,\n properties: {\n href: window.location.href,\n message: event.message,\n filename: event.filename,\n stack: (event.error as Error).stack,\n },\n }),\n );\n };\n\n window.addEventListener('click', clickCallback, true);\n window.addEventListener('focus', focusCallback);\n window.addEventListener('blur', blurCallback);\n window.addEventListener('beforeunload', unloadCallback);\n window.addEventListener('error', errorCallback);\n\n return () => {\n window.removeEventListener('click', clickCallback, true);\n window.removeEventListener('focus', focusCallback);\n window.removeEventListener('blur', blurCallback);\n window.removeEventListener('beforeunload', unloadCallback);\n window.removeEventListener('error', errorCallback);\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_log", "OBSERVABILITY_DISABLED_KEY", "OBSERVABILITY_GROUP_KEY", "isObservabilityDisabled", "namespace", "getItem", "err", "log", "catch", "storeObservabilityDisabled", "value", "setItem", "String", "getObservabilityGroup", "undefined", "storeObservabilityGroup", "initializeAppObservability", "config", "mode", "tracingEnable", "replayEnable", "group", "release", "get", "environment", "observabilityDisabled", "Observability", "observability", "errorLog", "sentryInitOptions", "tracing", "replay", "sampleRate", "replaySampleRate", "replaySampleRateOnError", "setMode", "info", "getIPData", "IP_DATA_CACHE_TIMEOUT", "cachedData", "timestamp", "Date", "now", "data", "IPDATA_API_KEY", "fetch", "then", "res", "json", "captureException", "initialize", "ipData", "addIPDataTelemetryTags", "navigator", "storage", "estimate", "setInterval", "storageEstimate", "usage", "setTag", "toString", "quota", "error", "warn", "getTelemetryIdentifier", "client", "initialized", "identity", "halo", "identityKey", "truncate", "showObservabilityBanner", "configDir", "bannercb", "path", "join", "existsSync", "writeFile", "getObservabilityState", "statSync", "isDirectory", "Error", "mkdir", "recursive", "idPath", "context", "readFile", "validate", "initializeState", "observabilityState", "installationId", "uuid", "process", "env", "DX_OBSERVABILITY_GROUP", "DX_DISABLE_OBSERVABILITY", "DX_OBSERVABILITY_MODE", "yaml", "dump", "contextString", "load", "Boolean", "validateUuid", "initializeNodeObservability", "logProcessor", "mapSpaces", "spaces", "options", "verbose", "truncateKeys", "map", "space", "open", "ready", "internal", "metrics", "startup", "getTime", "pipeline", "startDataMutations", "currentEpoch", "subject", "assertion", "timeframe", "totalMessages", "epoch", "number", "currentDataMutations", "currentDataTimeframe", "totalDataMutations", "targetDataTimeframe", "key", "isOpen", "members", "length", "objects", "db", "query", "progress", "Math", "min", "abs", "toFixed", "lastFocusEvent", "totalTime", "setupTelemetryListeners", "clickCallback", "event", "setTimeout", "identityId", "name", "properties", "href", "window", "location", "id", "target", "filter", "el", "tagName", "toLowerCase", "reverse", "focusCallback", "timeAway", "blurCallback", "timeSpent", "unloadCallback", "errorCallback", "message", "filename", "stack", "addEventListener", "removeEventListener", "SPACE_METRICS_MIN_INTERVAL", "DATADOG_IDLE_INTERVAL", "constructor", "secrets", "telemetry", "_mode", "Context", "_tags", "Map", "city", "region", "country", "latitude", "longitude", "_namespace", "_config", "_group", "_secrets", "_loadSecrets", "_telemetryBatchSize", "batchSize", "_errorReportingOptions", "_errorLogProcessor", "isNode", "mergedSecrets", "buildSecrets", "DX_ENVIRONMENT", "DX_RELEASE", "SENTRY_DESTINATION", "TELEMETRY_API_KEY", "DATADOG_API_KEY", "DATADOG_APP_KEY", "rtc", "_initMetrics", "_initTelemetry", "_initErrorLogs", "close", "_ctx", "dispose", "enabled", "scope", "_setTag", "set", "getTag", "setIdentityTags", "services", "IdentityService", "queryIdentity", "subscribe", "idqr", "DevicesService", "queryDevices", "dqr", "devices", "device", "invariant", "thisDevice", "find", "kind", "DeviceKind", "CURRENT", "deviceKey", "profile", "label", "DatadogMetrics", "_metrics", "apiKey", "getTags", "Object", "fromEntries", "Array", "from", "gauge", "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", "subscriptions", "onDispose", "subscription", "unsubscribe", "updateSpaceMetrics", "debounce", "subscribeToSpaceUpdate", "next", "toHex", "has", "scheduleTaskInterval", "startRuntimeMetrics", "frequency", "platform", "SystemService", "getPlatform", "Platform", "PLATFORM_TYPE", "type", "arch", "runtime", "memory", "rss", "heapTotal", "heapUsed", "SegmentTelemetry", "_telemetry", "page", "enableSentryLogProcessor", "configureTracing", "init", "_captureException", "dest", "destination", "scrubFilenames", "v", "k"]
7
+ }
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,14 +17,82 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
  var datadog_exports = {};
20
30
  __export(datadog_exports, {
21
- DatadogMetrics: () => import_chunk_ZJRKFREX.DatadogMetrics,
22
- defaultOptions: () => import_chunk_ZJRKFREX.defaultOptions
31
+ DatadogMetrics: () => DatadogMetrics,
32
+ defaultOptions: () => defaultOptions
23
33
  });
24
34
  module.exports = __toCommonJS(datadog_exports);
25
- var import_chunk_ZJRKFREX = require("../chunk-ZJRKFREX.cjs");
35
+ var import_node_os = __toESM(require("node:os"));
36
+ var import_log = require("@dxos/log");
37
+ var Datadog = __toESM(require("datadog-metrics"));
38
+ var import_debug = __toESM(require("debug"));
39
+ var import_invariant = require("@dxos/invariant");
40
+ var import_log2 = require("@dxos/log");
41
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/datadog/node.ts";
42
+ var defaultOptions = ({ apiKey, host }) => {
43
+ return {
44
+ apiKey,
45
+ host: host ?? import_node_os.default.hostname(),
46
+ onError: (err) => {
47
+ import_log.log.info("Datadog error", {
48
+ err
49
+ }, {
50
+ F: __dxlog_file,
51
+ L: 16,
52
+ S: void 0,
53
+ C: (f, a) => f(...a)
54
+ });
55
+ }
56
+ };
57
+ };
58
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/datadog/metrics.ts";
59
+ import_debug.default.enable("metrics");
60
+ var DatadogMetrics = class {
61
+ constructor(options) {
62
+ this._getTags = options.getTags;
63
+ this._datadogmetrics = Datadog;
64
+ this._datadogmetrics.init(defaultOptions(options));
65
+ }
66
+ gauge(name, value, tags) {
67
+ (0, import_invariant.invariant)(this._datadogmetrics, "Datadog not initialized", {
68
+ F: __dxlog_file2,
69
+ L: 38,
70
+ S: this,
71
+ A: [
72
+ "this._datadogmetrics",
73
+ "'Datadog not initialized'"
74
+ ]
75
+ });
76
+ const mergedTags = Object.entries({
77
+ ...this._getTags(),
78
+ ...tags
79
+ }).map(([key, value2]) => `${key}:${value2}`);
80
+ (0, import_log2.log)("datadog gauge", {
81
+ name,
82
+ value,
83
+ tags: mergedTags
84
+ }, {
85
+ F: __dxlog_file2,
86
+ L: 40,
87
+ S: this,
88
+ C: (f, a) => f(...a)
89
+ });
90
+ this._datadogmetrics.gauge(name, value, mergedTags);
91
+ }
92
+ flush() {
93
+ this._datadogmetrics.flush();
94
+ }
95
+ };
26
96
  // Annotate the CommonJS export names for ESM import in node:
27
97
  0 && (module.exports = {
28
98
  DatadogMetrics,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["index.cjs"],
4
- "sourcesContent": ["import {\n DatadogMetrics,\n defaultOptions\n} from \"../chunk-ZJRKFREX.cjs\";\nexport {\n DatadogMetrics,\n defaultOptions\n};\n//# sourceMappingURL=index.cjs.map\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAGO;",
6
- "names": []
3
+ "sources": ["../../../../src/datadog/node.ts", "../../../../src/datadog/metrics.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport os from 'node:os';\n\nimport { log } from '@dxos/log';\n\nimport { type DatadogOptions } from './metrics';\n\nexport const defaultOptions = ({ apiKey, host }: DatadogOptions) => {\n return {\n apiKey,\n host: host ?? os.hostname(),\n onError: (err: any) => {\n log.info('Datadog error', { err });\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Datadog from 'datadog-metrics';\nimport debug from 'debug';\n\nimport { type Config } from '@dxos/client';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { defaultOptions } from './node';\n// import { tags as globalTags } from '../tags';\n\nexport type DatadogOptions = {\n apiKey: string;\n host?: string;\n site?: String;\n getTags: () => { [key: string]: string };\n // needed to read CORS proxy\n config: Config;\n};\n\ndebug.enable('metrics');\n\nexport class DatadogMetrics {\n private _datadogmetrics?: any;\n private _getTags: () => { [key: string]: string };\n\n constructor(options: DatadogOptions) {\n this._getTags = options.getTags;\n this._datadogmetrics = Datadog;\n\n this._datadogmetrics.init(defaultOptions(options));\n }\n\n gauge(name: string, value: number, tags?: any) {\n invariant(this._datadogmetrics, 'Datadog not initialized');\n const mergedTags = Object.entries({ ...this._getTags(), ...tags }).map(([key, value]) => `${key}:${value}`);\n log('datadog gauge', { name, value, tags: mergedTags });\n this._datadogmetrics.gauge(name, value, mergedTags);\n }\n\n flush() {\n this._datadogmetrics.flush();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,qBAAe;AAEf,iBAAoB;ACFpB,cAAyB;AACzB,mBAAkB;AAGlB,uBAA0B;AAC1B,IAAAA,cAAoB;;ADCb,IAAMC,iBAAiB,CAAC,EAAEC,QAAQC,KAAI,MAAkB;AAC7D,SAAO;IACLD;IACAC,MAAMA,QAAQC,eAAAA,QAAGC,SAAQ;IACzBC,SAAS,CAACC,QAAAA;AACRC,qBAAIC,KAAK,iBAAiB;QAAEF;MAAI,GAAA;;;;;;IAClC;EACF;AACF;;ACKAG,aAAAA,QAAMC,OAAO,SAAA;AAEN,IAAMC,iBAAN,MAAMA;EAIXC,YAAYC,SAAyB;AACnC,SAAKC,WAAWD,QAAQE;AACxB,SAAKC,kBAAkBC;AAEvB,SAAKD,gBAAgBE,KAAKlB,eAAea,OAAAA,CAAAA;EAC3C;EAEAM,MAAMC,MAAcC,OAAeC,MAAY;AAC7CC,oCAAU,KAAKP,iBAAiB,2BAAA;;;;;;;;;AAChC,UAAMQ,aAAaC,OAAOC,QAAQ;MAAE,GAAG,KAAKZ,SAAQ;MAAI,GAAGQ;IAAK,CAAA,EAAGK,IAAI,CAAC,CAACC,KAAKP,MAAAA,MAAW,GAAGO,GAAAA,IAAOP,MAAAA,EAAO;AAC1Gd,oBAAAA,KAAI,iBAAiB;MAAEa;MAAMC;MAAOC,MAAME;IAAW,GAAA;;;;;;AACrD,SAAKR,gBAAgBG,MAAMC,MAAMC,OAAOG,UAAAA;EAC1C;EAEAK,QAAQ;AACN,SAAKb,gBAAgBa,MAAK;EAC5B;AACF;",
6
+ "names": ["import_log", "defaultOptions", "apiKey", "host", "os", "hostname", "onError", "err", "log", "info", "debug", "enable", "DatadogMetrics", "constructor", "options", "_getTags", "getTags", "_datadogmetrics", "Datadog", "init", "gauge", "name", "value", "tags", "invariant", "mergedTags", "Object", "entries", "map", "key", "flush"]
7
7
  }