@pristine-ts/observability 2.0.16

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 (179) hide show
  1. package/LICENSE +201 -0
  2. package/dist/lib/cjs/interfaces/interfaces.js +19 -0
  3. package/dist/lib/cjs/interfaces/interfaces.js.map +1 -0
  4. package/dist/lib/cjs/interfaces/serialized-span.interface.js +3 -0
  5. package/dist/lib/cjs/interfaces/serialized-span.interface.js.map +1 -0
  6. package/dist/lib/cjs/interfaces/serialized-trace.interface.js +3 -0
  7. package/dist/lib/cjs/interfaces/serialized-trace.interface.js.map +1 -0
  8. package/dist/lib/cjs/loggers/loggers.js +18 -0
  9. package/dist/lib/cjs/loggers/loggers.js.map +1 -0
  10. package/dist/lib/cjs/loggers/observability.logger.js +73 -0
  11. package/dist/lib/cjs/loggers/observability.logger.js.map +1 -0
  12. package/dist/lib/cjs/models/models.js +18 -0
  13. package/dist/lib/cjs/models/models.js.map +1 -0
  14. package/dist/lib/cjs/models/request-summary.model.js +19 -0
  15. package/dist/lib/cjs/models/request-summary.model.js.map +1 -0
  16. package/dist/lib/cjs/models/run-metadata.model.js +18 -0
  17. package/dist/lib/cjs/models/run-metadata.model.js.map +1 -0
  18. package/dist/lib/cjs/observability-configuration.js +49 -0
  19. package/dist/lib/cjs/observability-configuration.js.map +1 -0
  20. package/dist/lib/cjs/observability.configuration-keys.js +21 -0
  21. package/dist/lib/cjs/observability.configuration-keys.js.map +1 -0
  22. package/dist/lib/cjs/observability.module.js +98 -0
  23. package/dist/lib/cjs/observability.module.js.map +1 -0
  24. package/dist/lib/cjs/observability.module.keyname.js +5 -0
  25. package/dist/lib/cjs/observability.module.keyname.js.map +1 -0
  26. package/dist/lib/cjs/paths/observability-paths.js +78 -0
  27. package/dist/lib/cjs/paths/observability-paths.js.map +1 -0
  28. package/dist/lib/cjs/paths/paths.js +18 -0
  29. package/dist/lib/cjs/paths/paths.js.map +1 -0
  30. package/dist/lib/cjs/serializers/serialized-span.interface.js +3 -0
  31. package/dist/lib/cjs/serializers/serialized-span.interface.js.map +1 -0
  32. package/dist/lib/cjs/serializers/serialized-trace.interface.js +3 -0
  33. package/dist/lib/cjs/serializers/serialized-trace.interface.js.map +1 -0
  34. package/dist/lib/cjs/serializers/serializers.js +19 -0
  35. package/dist/lib/cjs/serializers/serializers.js.map +1 -0
  36. package/dist/lib/cjs/serializers/span-deserializer.js +26 -0
  37. package/dist/lib/cjs/serializers/span-deserializer.js.map +1 -0
  38. package/dist/lib/cjs/serializers/trace-deserializer.js +24 -0
  39. package/dist/lib/cjs/serializers/trace-deserializer.js.map +1 -0
  40. package/dist/lib/cjs/store/log-store.js +249 -0
  41. package/dist/lib/cjs/store/log-store.js.map +1 -0
  42. package/dist/lib/cjs/store/log-tailer.js +110 -0
  43. package/dist/lib/cjs/store/log-tailer.js.map +1 -0
  44. package/dist/lib/cjs/store/observability-paths.js +78 -0
  45. package/dist/lib/cjs/store/observability-paths.js.map +1 -0
  46. package/dist/lib/cjs/store/observability-run-manager.js +346 -0
  47. package/dist/lib/cjs/store/observability-run-manager.js.map +1 -0
  48. package/dist/lib/cjs/store/observability-store-reader.js +174 -0
  49. package/dist/lib/cjs/store/observability-store-reader.js.map +1 -0
  50. package/dist/lib/cjs/store/serializers/serialized-span.interface.js +3 -0
  51. package/dist/lib/cjs/store/serializers/serialized-span.interface.js.map +1 -0
  52. package/dist/lib/cjs/store/serializers/serialized-trace.interface.js +3 -0
  53. package/dist/lib/cjs/store/serializers/serialized-trace.interface.js.map +1 -0
  54. package/dist/lib/cjs/store/serializers/span-deserializer.js +26 -0
  55. package/dist/lib/cjs/store/serializers/span-deserializer.js.map +1 -0
  56. package/dist/lib/cjs/store/serializers/trace-deserializer.js +24 -0
  57. package/dist/lib/cjs/store/serializers/trace-deserializer.js.map +1 -0
  58. package/dist/lib/cjs/store/store.js +19 -0
  59. package/dist/lib/cjs/store/store.js.map +1 -0
  60. package/dist/lib/cjs/store/trace-deserializer.js +41 -0
  61. package/dist/lib/cjs/store/trace-deserializer.js.map +1 -0
  62. package/dist/lib/cjs/store/trace-store.js +281 -0
  63. package/dist/lib/cjs/store/trace-store.js.map +1 -0
  64. package/dist/lib/cjs/tailers/log-tailer.js +110 -0
  65. package/dist/lib/cjs/tailers/log-tailer.js.map +1 -0
  66. package/dist/lib/cjs/tailers/tailers.js +18 -0
  67. package/dist/lib/cjs/tailers/tailers.js.map +1 -0
  68. package/dist/lib/cjs/tracers/observability.tracer.js +65 -0
  69. package/dist/lib/cjs/tracers/observability.tracer.js.map +1 -0
  70. package/dist/lib/cjs/tracers/tracers.js +18 -0
  71. package/dist/lib/cjs/tracers/tracers.js.map +1 -0
  72. package/dist/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  73. package/dist/lib/esm/interfaces/interfaces.js +3 -0
  74. package/dist/lib/esm/interfaces/interfaces.js.map +1 -0
  75. package/dist/lib/esm/interfaces/serialized-span.interface.js +2 -0
  76. package/dist/lib/esm/interfaces/serialized-span.interface.js.map +1 -0
  77. package/dist/lib/esm/interfaces/serialized-trace.interface.js +2 -0
  78. package/dist/lib/esm/interfaces/serialized-trace.interface.js.map +1 -0
  79. package/dist/lib/esm/loggers/loggers.js +2 -0
  80. package/dist/lib/esm/loggers/loggers.js.map +1 -0
  81. package/dist/lib/esm/loggers/observability.logger.js +70 -0
  82. package/dist/lib/esm/loggers/observability.logger.js.map +1 -0
  83. package/dist/lib/esm/models/models.js +2 -0
  84. package/dist/lib/esm/models/models.js.map +1 -0
  85. package/dist/lib/esm/models/request-summary.model.js +15 -0
  86. package/dist/lib/esm/models/request-summary.model.js.map +1 -0
  87. package/dist/lib/esm/models/run-metadata.model.js +14 -0
  88. package/dist/lib/esm/models/run-metadata.model.js.map +1 -0
  89. package/dist/lib/esm/observability-configuration.js +46 -0
  90. package/dist/lib/esm/observability-configuration.js.map +1 -0
  91. package/dist/lib/esm/observability.configuration-keys.js +18 -0
  92. package/dist/lib/esm/observability.configuration-keys.js.map +1 -0
  93. package/dist/lib/esm/observability.module.js +81 -0
  94. package/dist/lib/esm/observability.module.js.map +1 -0
  95. package/dist/lib/esm/observability.module.keyname.js +2 -0
  96. package/dist/lib/esm/observability.module.keyname.js.map +1 -0
  97. package/dist/lib/esm/paths/observability-paths.js +41 -0
  98. package/dist/lib/esm/paths/observability-paths.js.map +1 -0
  99. package/dist/lib/esm/paths/paths.js +2 -0
  100. package/dist/lib/esm/paths/paths.js.map +1 -0
  101. package/dist/lib/esm/serializers/serialized-span.interface.js +2 -0
  102. package/dist/lib/esm/serializers/serialized-span.interface.js.map +1 -0
  103. package/dist/lib/esm/serializers/serialized-trace.interface.js +2 -0
  104. package/dist/lib/esm/serializers/serialized-trace.interface.js.map +1 -0
  105. package/dist/lib/esm/serializers/serializers.js +3 -0
  106. package/dist/lib/esm/serializers/serializers.js.map +1 -0
  107. package/dist/lib/esm/serializers/span-deserializer.js +22 -0
  108. package/dist/lib/esm/serializers/span-deserializer.js.map +1 -0
  109. package/dist/lib/esm/serializers/trace-deserializer.js +20 -0
  110. package/dist/lib/esm/serializers/trace-deserializer.js.map +1 -0
  111. package/dist/lib/esm/store/log-store.js +213 -0
  112. package/dist/lib/esm/store/log-store.js.map +1 -0
  113. package/dist/lib/esm/store/log-tailer.js +73 -0
  114. package/dist/lib/esm/store/log-tailer.js.map +1 -0
  115. package/dist/lib/esm/store/observability-paths.js +41 -0
  116. package/dist/lib/esm/store/observability-paths.js.map +1 -0
  117. package/dist/lib/esm/store/observability-run-manager.js +310 -0
  118. package/dist/lib/esm/store/observability-run-manager.js.map +1 -0
  119. package/dist/lib/esm/store/observability-store-reader.js +138 -0
  120. package/dist/lib/esm/store/observability-store-reader.js.map +1 -0
  121. package/dist/lib/esm/store/serializers/serialized-span.interface.js +2 -0
  122. package/dist/lib/esm/store/serializers/serialized-span.interface.js.map +1 -0
  123. package/dist/lib/esm/store/serializers/serialized-trace.interface.js +2 -0
  124. package/dist/lib/esm/store/serializers/serialized-trace.interface.js.map +1 -0
  125. package/dist/lib/esm/store/serializers/span-deserializer.js +22 -0
  126. package/dist/lib/esm/store/serializers/span-deserializer.js.map +1 -0
  127. package/dist/lib/esm/store/serializers/trace-deserializer.js +20 -0
  128. package/dist/lib/esm/store/serializers/trace-deserializer.js.map +1 -0
  129. package/dist/lib/esm/store/store.js +3 -0
  130. package/dist/lib/esm/store/store.js.map +1 -0
  131. package/dist/lib/esm/store/trace-deserializer.js +37 -0
  132. package/dist/lib/esm/store/trace-deserializer.js.map +1 -0
  133. package/dist/lib/esm/store/trace-store.js +245 -0
  134. package/dist/lib/esm/store/trace-store.js.map +1 -0
  135. package/dist/lib/esm/tailers/log-tailer.js +73 -0
  136. package/dist/lib/esm/tailers/log-tailer.js.map +1 -0
  137. package/dist/lib/esm/tailers/tailers.js +2 -0
  138. package/dist/lib/esm/tailers/tailers.js.map +1 -0
  139. package/dist/lib/esm/tracers/observability.tracer.js +62 -0
  140. package/dist/lib/esm/tracers/observability.tracer.js.map +1 -0
  141. package/dist/lib/esm/tracers/tracers.js +2 -0
  142. package/dist/lib/esm/tracers/tracers.js.map +1 -0
  143. package/dist/lib/esm/tsconfig.tsbuildinfo +1 -0
  144. package/dist/types/interfaces/interfaces.d.ts +2 -0
  145. package/dist/types/interfaces/serialized-span.interface.d.ts +14 -0
  146. package/dist/types/interfaces/serialized-trace.interface.d.ts +14 -0
  147. package/dist/types/loggers/loggers.d.ts +1 -0
  148. package/dist/types/loggers/observability.logger.d.ts +20 -0
  149. package/dist/types/models/models.d.ts +1 -0
  150. package/dist/types/models/request-summary.model.d.ts +52 -0
  151. package/dist/types/models/run-metadata.model.d.ts +28 -0
  152. package/dist/types/observability-configuration.d.ts +32 -0
  153. package/dist/types/observability.configuration-keys.d.ts +32 -0
  154. package/dist/types/observability.module.d.ts +28 -0
  155. package/dist/types/observability.module.keyname.d.ts +1 -0
  156. package/dist/types/paths/observability-paths.d.ts +30 -0
  157. package/dist/types/paths/paths.d.ts +1 -0
  158. package/dist/types/serializers/serialized-span.interface.d.ts +14 -0
  159. package/dist/types/serializers/serialized-trace.interface.d.ts +14 -0
  160. package/dist/types/serializers/serializers.d.ts +2 -0
  161. package/dist/types/serializers/span-deserializer.d.ts +11 -0
  162. package/dist/types/serializers/trace-deserializer.d.ts +9 -0
  163. package/dist/types/store/log-store.d.ts +79 -0
  164. package/dist/types/store/log-tailer.d.ts +27 -0
  165. package/dist/types/store/observability-paths.d.ts +30 -0
  166. package/dist/types/store/observability-run-manager.d.ts +96 -0
  167. package/dist/types/store/observability-store-reader.d.ts +55 -0
  168. package/dist/types/store/serializers/serialized-span.interface.d.ts +14 -0
  169. package/dist/types/store/serializers/serialized-trace.interface.d.ts +14 -0
  170. package/dist/types/store/serializers/span-deserializer.d.ts +11 -0
  171. package/dist/types/store/serializers/trace-deserializer.d.ts +9 -0
  172. package/dist/types/store/store.d.ts +2 -0
  173. package/dist/types/store/trace-deserializer.d.ts +41 -0
  174. package/dist/types/store/trace-store.d.ts +88 -0
  175. package/dist/types/tailers/log-tailer.d.ts +27 -0
  176. package/dist/types/tailers/tailers.d.ts +1 -0
  177. package/dist/types/tracers/observability.tracer.d.ts +16 -0
  178. package/dist/types/tracers/tracers.d.ts +1 -0
  179. package/package.json +60 -0
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TraceDeserializer = void 0;
4
+ const common_1 = require("@pristine-ts/common");
5
+ /**
6
+ * Rehydrates a stored trace JSON (the shape written by `ObservabilityTracer`) back into
7
+ * `Trace`/`Span` instances, so `traceRenderer.renderTree`/`renderFlat` — which call
8
+ * instance methods like `getDuration()` — work unchanged on stored traces.
9
+ *
10
+ * Stateless; instantiate once and reuse, or use the static `deserialize`.
11
+ */
12
+ class TraceDeserializer {
13
+ /**
14
+ * Rebuilds a `Trace` (with its full span tree) from the stored plain object.
15
+ */
16
+ static deserialize(serialized) {
17
+ var _a;
18
+ const trace = new common_1.Trace(serialized.id, (_a = serialized.context) !== null && _a !== void 0 ? _a : {});
19
+ trace.startDate = serialized.startDate;
20
+ trace.endDate = serialized.endDate;
21
+ trace.hasEnded = serialized.endDate !== undefined;
22
+ if (serialized.rootSpan !== undefined) {
23
+ trace.rootSpan = TraceDeserializer.deserializeSpan(serialized.rootSpan, trace);
24
+ }
25
+ return trace;
26
+ }
27
+ static deserializeSpan(serialized, trace) {
28
+ var _a, _b;
29
+ const span = new common_1.Span(serialized.keyname, serialized.id, (_a = serialized.context) !== null && _a !== void 0 ? _a : {});
30
+ span.trace = trace;
31
+ span.startDate = serialized.startDate;
32
+ span.endDate = serialized.endDate;
33
+ span.inProgress = serialized.endDate === undefined;
34
+ for (const child of (_b = serialized.children) !== null && _b !== void 0 ? _b : []) {
35
+ span.addChild(TraceDeserializer.deserializeSpan(child, trace));
36
+ }
37
+ return span;
38
+ }
39
+ }
40
+ exports.TraceDeserializer = TraceDeserializer;
41
+ //# sourceMappingURL=trace-deserializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-deserializer.js","sourceRoot":"","sources":["../../../../src/store/trace-deserializer.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAyBhD;;;;;;GAMG;AACH,MAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,UAA2B;;QAC5C,MAAM,KAAK,GAAG,IAAI,cAAK,CAAC,UAAU,CAAC,EAAE,EAAE,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC;QAElD,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,UAA0B,EAAE,KAAY;;QACrE,MAAM,IAAI,GAAG,IAAI,aAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC;QAEnD,KAAK,MAAM,KAAK,IAAI,MAAA,UAAU,CAAC,QAAQ,mCAAI,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA9BD,8CA8BC"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.TraceStore = void 0;
49
+ const fs = __importStar(require("fs"));
50
+ const tsyringe_1 = require("tsyringe");
51
+ const common_1 = require("@pristine-ts/common");
52
+ const telemetry_1 = require("@pristine-ts/telemetry");
53
+ const observability_module_keyname_1 = require("../observability.module.keyname");
54
+ const observability_configuration_keys_1 = require("../observability.configuration-keys");
55
+ const request_summary_model_1 = require("../models/request-summary.model");
56
+ const observability_paths_1 = require("../paths/observability-paths");
57
+ const trace_deserializer_1 = require("../serializers/trace-deserializer");
58
+ /**
59
+ * The read/write layer for captured traces. The `ObservabilityTracer` (a `Tracer`-
60
+ * tagged transport) calls `append` on every completed trace; the CLI's `trace` and
61
+ * `requests` commands call `find` / `recentRequests` / `recentTraceIds`. The REPL also
62
+ * reads `recentTraceIds` for its tab-completion.
63
+ *
64
+ * Writes both `traces/<eventId>.json` (the full tree) and an appended one-line
65
+ * `RequestSummary` in `requests.jsonl` (the fast index for `pristine requests`) as a
66
+ * single coupled operation. The summary additionally serves as the lookup table that
67
+ * resolves `requestId` / `traceId` back to the canonical `eventId` when they differ.
68
+ *
69
+ * Internally, each pristine process writes to its own per-process directory (keyed by
70
+ * the kernel instantiation id) so concurrent processes never race. That partition is
71
+ * invisible to callers — `find` and `recentRequests` walk every directory newest-first.
72
+ *
73
+ * Singleton so multiple appenders within the same process share the in-memory `pruned`
74
+ * latch.
75
+ */
76
+ let TraceStore = class TraceStore {
77
+ constructor(enabled, directory, retainedInstances, partitionId) {
78
+ this.enabled = enabled;
79
+ this.retainedInstances = retainedInstances;
80
+ this.partitionId = partitionId;
81
+ this.directoryEnsured = false;
82
+ this.pruned = false;
83
+ this.paths = new observability_paths_1.ObservabilityPaths(directory);
84
+ }
85
+ /**
86
+ * Persists a completed trace: writes `traces/<eventId>.json` (the full tree) and
87
+ * appends a `RequestSummary` to `requests.jsonl`. No-op when observability is
88
+ * disabled.
89
+ *
90
+ * The summary's optional `traceId` / `requestId` fields are written only when they
91
+ * differ from the canonical `eventId` (typically only `requestId` for HTTP requests
92
+ * with an `x-pristine-request-id` header that disagreed with the mapper's event id,
93
+ * and `traceId` for distributed-tracing scenarios). The common case is a one-id
94
+ * line — `{eventId, startedAt, durationMs, rootKeyname, ...http}`.
95
+ */
96
+ append(trace) {
97
+ if (this.enabled === false) {
98
+ return;
99
+ }
100
+ this.ensurePartitionDirectory();
101
+ const eventId = this.eventIdOf(trace);
102
+ const traceContent = telemetry_1.traceRenderer.renderJson(trace);
103
+ const summary = this.buildSummary(trace, eventId);
104
+ const requestLine = JSON.stringify(summary) + "\n";
105
+ fs.writeFileSync(this.paths.traceFile(this.partitionId, eventId), traceContent);
106
+ fs.appendFileSync(this.paths.requestsFile(this.partitionId), requestLine);
107
+ }
108
+ /**
109
+ * Finds and rehydrates a trace by any of `eventId` / `traceId` / `requestId`, returning
110
+ * a `Trace` instance with its full span tree rebuilt (instance methods like
111
+ * `getDuration()` work directly). Searches partitions newest-first.
112
+ */
113
+ find(id) {
114
+ const serialized = this.findSerialized(id);
115
+ if (serialized === undefined) {
116
+ return undefined;
117
+ }
118
+ return { trace: trace_deserializer_1.TraceDeserializer.deserialize(serialized.trace), eventId: serialized.eventId };
119
+ }
120
+ /**
121
+ * Same as `find`, but returns the raw stored JSON. The escape hatch for callers that
122
+ * want to render the on-disk shape verbatim — e.g. `pristine trace --format json`.
123
+ */
124
+ findSerialized(id) {
125
+ for (const partition of this.partitionsNewestFirst()) {
126
+ // Try direct file lookup first — `id` IS the eventId in the common case.
127
+ const direct = this.tryLoadTrace(partition, id);
128
+ if (direct !== undefined) {
129
+ return { trace: direct, eventId: id };
130
+ }
131
+ // Else resolve via the summary index — `id` might be a divergent traceId/requestId.
132
+ const eventId = this.resolveEventIdFromSummaries(partition, id);
133
+ if (eventId !== undefined) {
134
+ const trace = this.tryLoadTrace(partition, eventId);
135
+ if (trace !== undefined) {
136
+ return { trace, eventId };
137
+ }
138
+ }
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * Recent request summaries across every partition, most-recent first, optionally
144
+ * capped to `limit`.
145
+ */
146
+ recentRequests(limit) {
147
+ const all = [];
148
+ for (const partition of this.partitionsNewestFirst()) {
149
+ all.push(...this.readSummaries(partition));
150
+ }
151
+ all.sort((a, b) => b.startedAt - a.startedAt);
152
+ return limit === undefined ? all : all.slice(0, limit);
153
+ }
154
+ /**
155
+ * The most recent event ids across all partitions — used by the REPL completer.
156
+ */
157
+ recentTraceIds(limit) {
158
+ return this.recentRequests(limit).map(summary => summary.eventId);
159
+ }
160
+ buildSummary(trace, eventId) {
161
+ var _a, _b, _c;
162
+ const context = (_a = trace.context) !== null && _a !== void 0 ? _a : {};
163
+ const summary = new request_summary_model_1.RequestSummary(eventId, trace.startDate, trace.getDuration(), (_c = (_b = trace.rootSpan) === null || _b === void 0 ? void 0 : _b.keyname) !== null && _c !== void 0 ? _c : "");
164
+ // Only persist divergent ids — the common case is all three values equal.
165
+ if (trace.id !== eventId) {
166
+ summary.traceId = trace.id;
167
+ }
168
+ const requestId = context["request.id"];
169
+ if (typeof requestId === "string" && requestId !== eventId) {
170
+ summary.requestId = requestId;
171
+ }
172
+ summary.httpMethod = context["http.method"];
173
+ summary.httpPath = context["http.path"];
174
+ const status = context["http.statusCode"];
175
+ if (status !== undefined) {
176
+ const parsed = Number(status);
177
+ summary.httpStatus = Number.isNaN(parsed) ? undefined : parsed;
178
+ }
179
+ return summary;
180
+ }
181
+ /**
182
+ * The canonical id for a trace. Today the trace's own `id` is set from the kernel's
183
+ * event id at trace creation, so they're equal. A custom `context["event.id"]`
184
+ * override wins when present — that's the explicit hook for distributed-tracing setups
185
+ * where the trace id was overwritten from a propagated `traceparent`.
186
+ */
187
+ eventIdOf(trace) {
188
+ var _a;
189
+ const fromContext = (_a = trace.context) === null || _a === void 0 ? void 0 : _a["event.id"];
190
+ return typeof fromContext === "string" && fromContext.length > 0 ? fromContext : trace.id;
191
+ }
192
+ resolveEventIdFromSummaries(partition, id) {
193
+ for (const summary of this.readSummaries(partition)) {
194
+ if (summary.eventId === id || summary.traceId === id || summary.requestId === id) {
195
+ return summary.eventId;
196
+ }
197
+ }
198
+ return undefined;
199
+ }
200
+ tryLoadTrace(partition, eventId) {
201
+ try {
202
+ return JSON.parse(fs.readFileSync(this.paths.traceFile(partition, eventId), "utf8"));
203
+ }
204
+ catch (_a) {
205
+ return undefined;
206
+ }
207
+ }
208
+ readSummaries(partition) {
209
+ return this.readJsonl(this.paths.requestsFile(partition));
210
+ }
211
+ ensurePartitionDirectory() {
212
+ if (this.directoryEnsured) {
213
+ return;
214
+ }
215
+ fs.mkdirSync(this.paths.tracesDirectory(this.partitionId), { recursive: true });
216
+ this.directoryEnsured = true;
217
+ this.pruneOldPartitions();
218
+ }
219
+ /**
220
+ * Drops partition directories beyond the retained limit, ordered by `mtime`. Once
221
+ * per process. Best-effort: a failure to prune never blocks a write.
222
+ */
223
+ pruneOldPartitions() {
224
+ if (this.pruned) {
225
+ return;
226
+ }
227
+ this.pruned = true;
228
+ try {
229
+ const ordered = this.partitionsNewestFirst();
230
+ for (const stale of ordered.slice(Math.max(this.retainedInstances, 1))) {
231
+ fs.rmSync(this.paths.instanceDirectory(stale), { recursive: true, force: true });
232
+ }
233
+ }
234
+ catch (_a) {
235
+ // Best-effort.
236
+ }
237
+ }
238
+ partitionsNewestFirst() {
239
+ try {
240
+ return fs.readdirSync(this.paths.root, { withFileTypes: true })
241
+ .filter(entry => entry.isDirectory())
242
+ .map(entry => ({ name: entry.name, mtime: this.directoryMtime(entry.name) }))
243
+ .sort((a, b) => b.mtime - a.mtime)
244
+ .map(entry => entry.name);
245
+ }
246
+ catch (_a) {
247
+ return [];
248
+ }
249
+ }
250
+ directoryMtime(name) {
251
+ try {
252
+ return fs.statSync(this.paths.instanceDirectory(name)).mtimeMs;
253
+ }
254
+ catch (_a) {
255
+ return 0;
256
+ }
257
+ }
258
+ readJsonl(filePath) {
259
+ try {
260
+ return fs.readFileSync(filePath, "utf8")
261
+ .split("\n")
262
+ .filter(line => line.trim().length > 0)
263
+ .map(line => JSON.parse(line));
264
+ }
265
+ catch (_a) {
266
+ return [];
267
+ }
268
+ }
269
+ };
270
+ exports.TraceStore = TraceStore;
271
+ exports.TraceStore = TraceStore = __decorate([
272
+ (0, common_1.moduleScoped)(observability_module_keyname_1.ObservabilityModuleKeyname),
273
+ (0, tsyringe_1.singleton)(),
274
+ (0, tsyringe_1.injectable)(),
275
+ __param(0, (0, common_1.injectConfig)(observability_configuration_keys_1.ObservabilityConfigurationKeys.Enabled)),
276
+ __param(1, (0, common_1.injectConfig)(observability_configuration_keys_1.ObservabilityConfigurationKeys.Directory)),
277
+ __param(2, (0, common_1.injectConfig)(observability_configuration_keys_1.ObservabilityConfigurationKeys.RetainedInstances)),
278
+ __param(3, (0, tsyringe_1.inject)(common_1.InternalContainerParameterEnum.KernelInstantiationId)),
279
+ __metadata("design:paramtypes", [Boolean, String, Number, String])
280
+ ], TraceStore);
281
+ //# sourceMappingURL=trace-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-store.js","sourceRoot":"","sources":["../../../../src/store/trace-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LogTailer = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Follows a growing `.jsonl` file and emits each newly-appended complete line. The
41
+ * `logs --follow` command and the REPL use this for a `tail -f`-style live view.
42
+ *
43
+ * Watches the file's parent directory (watching a not-yet-created file directly is
44
+ * unreliable across platforms) and reads the byte delta on each change. Partial trailing
45
+ * lines are buffered until their terminating newline arrives.
46
+ *
47
+ * Not a DI service — a plain utility. Instantiate, `follow()`, and `stop()` when done.
48
+ */
49
+ class LogTailer {
50
+ constructor(filePath) {
51
+ this.filePath = filePath;
52
+ this.offset = 0;
53
+ this.buffer = "";
54
+ }
55
+ /**
56
+ * Starts following. Existing content is skipped — only lines appended after this call
57
+ * are emitted. Call `stop()` to release the watch.
58
+ */
59
+ follow(onLine) {
60
+ this.offset = fs.existsSync(this.filePath) ? fs.statSync(this.filePath).size : 0;
61
+ const directory = path.dirname(this.filePath);
62
+ const filename = path.basename(this.filePath);
63
+ this.watcher = fs.watch(directory, (_eventType, changed) => {
64
+ if (changed !== null && changed !== filename) {
65
+ return;
66
+ }
67
+ this.drain(onLine);
68
+ });
69
+ }
70
+ /**
71
+ * Stops following and releases the filesystem watch.
72
+ */
73
+ stop() {
74
+ var _a;
75
+ (_a = this.watcher) === null || _a === void 0 ? void 0 : _a.close();
76
+ this.watcher = undefined;
77
+ }
78
+ drain(onLine) {
79
+ var _a;
80
+ if (fs.existsSync(this.filePath) === false) {
81
+ return;
82
+ }
83
+ const size = fs.statSync(this.filePath).size;
84
+ if (size <= this.offset) {
85
+ // Truncated or unchanged — reset to the new end so we don't replay stale bytes.
86
+ this.offset = size;
87
+ return;
88
+ }
89
+ const fd = fs.openSync(this.filePath, "r");
90
+ try {
91
+ const length = size - this.offset;
92
+ const chunk = Buffer.alloc(length);
93
+ fs.readSync(fd, chunk, 0, length, this.offset);
94
+ this.offset = size;
95
+ this.buffer += chunk.toString("utf8");
96
+ }
97
+ finally {
98
+ fs.closeSync(fd);
99
+ }
100
+ const lines = this.buffer.split("\n");
101
+ this.buffer = (_a = lines.pop()) !== null && _a !== void 0 ? _a : "";
102
+ for (const line of lines) {
103
+ if (line.length > 0) {
104
+ onLine(line);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ exports.LogTailer = LogTailer;
110
+ //# sourceMappingURL=log-tailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tailer.js","sourceRoot":"","sources":["../../../../src/tailers/log-tailer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B;;;;;;;;;GASG;AACH,MAAa,SAAS;IAKpB,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QAHrC,WAAM,GAAG,CAAC,CAAC;QACX,WAAM,GAAG,EAAE,CAAC;IAGpB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAA8B;QACnC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;YACzD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;;QACF,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,MAA8B;;QAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,gFAAgF;YAChF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAA,KAAK,CAAC,GAAG,EAAE,mCAAI,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAjED,8BAiEC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./log-tailer"), exports);
18
+ //# sourceMappingURL=tailers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailers.js","sourceRoot":"","sources":["../../../../src/tailers/tailers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ObservabilityTracer = void 0;
13
+ const stream_1 = require("stream");
14
+ const tsyringe_1 = require("tsyringe");
15
+ const common_1 = require("@pristine-ts/common");
16
+ const observability_module_keyname_1 = require("../observability.module.keyname");
17
+ const trace_store_1 = require("../store/trace-store");
18
+ /**
19
+ * A `Tracer` transport that forwards every completed trace to `TraceStore`. Thin adapter
20
+ * — all file I/O, request-summary computation, retention, and per-process partitioning
21
+ * live in `TraceStore`.
22
+ *
23
+ * Crash-isolated: a write failure becomes a stderr line rather than propagating.
24
+ */
25
+ let ObservabilityTracer = class ObservabilityTracer {
26
+ constructor(traceStore) {
27
+ this.traceStore = traceStore;
28
+ this.traceEndedStream = new stream_1.Readable({
29
+ objectMode: true,
30
+ read(_size) { return true; },
31
+ });
32
+ this.traceEndedStream.on("data", (trace) => {
33
+ try {
34
+ this.traceStore.append(trace);
35
+ }
36
+ catch (error) {
37
+ this.reportFailure(error);
38
+ }
39
+ });
40
+ this.traceEndedStream.on("error", (error) => {
41
+ this.reportFailure(error);
42
+ });
43
+ }
44
+ reportFailure(error) {
45
+ try {
46
+ // Stringification happens inside the guard — `error.name`/`error.message`/`String(error)`
47
+ // can all throw on pathological inputs (throwing getters, exotic `Symbol.toPrimitive`,
48
+ // etc.). The safety net must not become the new failure source.
49
+ const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
50
+ process.stderr.write(`[pristine][observability-tracer] ${message}\n`);
51
+ }
52
+ catch (_a) {
53
+ // If even stringifying or writing fails, there is nothing useful left to do.
54
+ }
55
+ }
56
+ };
57
+ exports.ObservabilityTracer = ObservabilityTracer;
58
+ exports.ObservabilityTracer = ObservabilityTracer = __decorate([
59
+ (0, common_1.moduleScoped)(observability_module_keyname_1.ObservabilityModuleKeyname),
60
+ (0, tsyringe_1.singleton)(),
61
+ (0, common_1.tag)(common_1.ServiceDefinitionTagEnum.Tracer),
62
+ (0, tsyringe_1.injectable)(),
63
+ __metadata("design:paramtypes", [trace_store_1.TraceStore])
64
+ ], ObservabilityTracer);
65
+ //# sourceMappingURL=observability.tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.tracer.js","sourceRoot":"","sources":["../../../../src/tracers/observability.tracer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAgC;AAChC,uCAA+C;AAC/C,gDAAuF;AAEvF,kFAA2E;AAC3E,sDAAgD;AAEhD;;;;;;GAMG;AAKI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAG9B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QACjD,IAAI,CAAC,gBAAgB,GAAG,IAAI,iBAAQ,CAAC;YACnC,UAAU,EAAE,IAAI;YAChB,IAAI,CAAC,KAAa,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAY,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,IAAI,CAAC;YACH,0FAA0F;YAC1F,uFAAuF;YACvF,gEAAgE;YAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,OAAO,IAAI,CAAC,CAAC;QACxE,CAAC;QAAC,WAAM,CAAC;YACP,6EAA6E;QAC/E,CAAC;IACH,CAAC;CACF,CAAA;AAjCY,kDAAmB;8BAAnB,mBAAmB;IAJ/B,IAAA,qBAAY,EAAC,yDAA0B,CAAC;IACxC,IAAA,oBAAS,GAAE;IACX,IAAA,YAAG,EAAC,iCAAwB,CAAC,MAAM,CAAC;IACpC,IAAA,qBAAU,GAAE;qCAI8B,wBAAU;GAHxC,mBAAmB,CAiC/B"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./observability.tracer"), exports);
18
+ //# sourceMappingURL=tracers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracers.js","sourceRoot":"","sources":["../../../../src/tracers/tracers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC"}