@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,245 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import * as fs from "fs";
14
+ import { inject, injectable, singleton } from "tsyringe";
15
+ import { injectConfig, InternalContainerParameterEnum, moduleScoped } from "@pristine-ts/common";
16
+ import { traceRenderer } from "@pristine-ts/telemetry";
17
+ import { ObservabilityModuleKeyname } from "../observability.module.keyname";
18
+ import { ObservabilityConfigurationKeys } from "../observability.configuration-keys";
19
+ import { RequestSummary } from "../models/request-summary.model";
20
+ import { ObservabilityPaths } from "../paths/observability-paths";
21
+ import { TraceDeserializer } from "../serializers/trace-deserializer";
22
+ /**
23
+ * The read/write layer for captured traces. The `ObservabilityTracer` (a `Tracer`-
24
+ * tagged transport) calls `append` on every completed trace; the CLI's `trace` and
25
+ * `requests` commands call `find` / `recentRequests` / `recentTraceIds`. The REPL also
26
+ * reads `recentTraceIds` for its tab-completion.
27
+ *
28
+ * Writes both `traces/<eventId>.json` (the full tree) and an appended one-line
29
+ * `RequestSummary` in `requests.jsonl` (the fast index for `pristine requests`) as a
30
+ * single coupled operation. The summary additionally serves as the lookup table that
31
+ * resolves `requestId` / `traceId` back to the canonical `eventId` when they differ.
32
+ *
33
+ * Internally, each pristine process writes to its own per-process directory (keyed by
34
+ * the kernel instantiation id) so concurrent processes never race. That partition is
35
+ * invisible to callers — `find` and `recentRequests` walk every directory newest-first.
36
+ *
37
+ * Singleton so multiple appenders within the same process share the in-memory `pruned`
38
+ * latch.
39
+ */
40
+ let TraceStore = class TraceStore {
41
+ constructor(enabled, directory, retainedInstances, partitionId) {
42
+ this.enabled = enabled;
43
+ this.retainedInstances = retainedInstances;
44
+ this.partitionId = partitionId;
45
+ this.directoryEnsured = false;
46
+ this.pruned = false;
47
+ this.paths = new ObservabilityPaths(directory);
48
+ }
49
+ /**
50
+ * Persists a completed trace: writes `traces/<eventId>.json` (the full tree) and
51
+ * appends a `RequestSummary` to `requests.jsonl`. No-op when observability is
52
+ * disabled.
53
+ *
54
+ * The summary's optional `traceId` / `requestId` fields are written only when they
55
+ * differ from the canonical `eventId` (typically only `requestId` for HTTP requests
56
+ * with an `x-pristine-request-id` header that disagreed with the mapper's event id,
57
+ * and `traceId` for distributed-tracing scenarios). The common case is a one-id
58
+ * line — `{eventId, startedAt, durationMs, rootKeyname, ...http}`.
59
+ */
60
+ append(trace) {
61
+ if (this.enabled === false) {
62
+ return;
63
+ }
64
+ this.ensurePartitionDirectory();
65
+ const eventId = this.eventIdOf(trace);
66
+ const traceContent = traceRenderer.renderJson(trace);
67
+ const summary = this.buildSummary(trace, eventId);
68
+ const requestLine = JSON.stringify(summary) + "\n";
69
+ fs.writeFileSync(this.paths.traceFile(this.partitionId, eventId), traceContent);
70
+ fs.appendFileSync(this.paths.requestsFile(this.partitionId), requestLine);
71
+ }
72
+ /**
73
+ * Finds and rehydrates a trace by any of `eventId` / `traceId` / `requestId`, returning
74
+ * a `Trace` instance with its full span tree rebuilt (instance methods like
75
+ * `getDuration()` work directly). Searches partitions newest-first.
76
+ */
77
+ find(id) {
78
+ const serialized = this.findSerialized(id);
79
+ if (serialized === undefined) {
80
+ return undefined;
81
+ }
82
+ return { trace: TraceDeserializer.deserialize(serialized.trace), eventId: serialized.eventId };
83
+ }
84
+ /**
85
+ * Same as `find`, but returns the raw stored JSON. The escape hatch for callers that
86
+ * want to render the on-disk shape verbatim — e.g. `pristine trace --format json`.
87
+ */
88
+ findSerialized(id) {
89
+ for (const partition of this.partitionsNewestFirst()) {
90
+ // Try direct file lookup first — `id` IS the eventId in the common case.
91
+ const direct = this.tryLoadTrace(partition, id);
92
+ if (direct !== undefined) {
93
+ return { trace: direct, eventId: id };
94
+ }
95
+ // Else resolve via the summary index — `id` might be a divergent traceId/requestId.
96
+ const eventId = this.resolveEventIdFromSummaries(partition, id);
97
+ if (eventId !== undefined) {
98
+ const trace = this.tryLoadTrace(partition, eventId);
99
+ if (trace !== undefined) {
100
+ return { trace, eventId };
101
+ }
102
+ }
103
+ }
104
+ return undefined;
105
+ }
106
+ /**
107
+ * Recent request summaries across every partition, most-recent first, optionally
108
+ * capped to `limit`.
109
+ */
110
+ recentRequests(limit) {
111
+ const all = [];
112
+ for (const partition of this.partitionsNewestFirst()) {
113
+ all.push(...this.readSummaries(partition));
114
+ }
115
+ all.sort((a, b) => b.startedAt - a.startedAt);
116
+ return limit === undefined ? all : all.slice(0, limit);
117
+ }
118
+ /**
119
+ * The most recent event ids across all partitions — used by the REPL completer.
120
+ */
121
+ recentTraceIds(limit) {
122
+ return this.recentRequests(limit).map(summary => summary.eventId);
123
+ }
124
+ buildSummary(trace, eventId) {
125
+ var _a, _b, _c;
126
+ const context = (_a = trace.context) !== null && _a !== void 0 ? _a : {};
127
+ const summary = new RequestSummary(eventId, trace.startDate, trace.getDuration(), (_c = (_b = trace.rootSpan) === null || _b === void 0 ? void 0 : _b.keyname) !== null && _c !== void 0 ? _c : "");
128
+ // Only persist divergent ids — the common case is all three values equal.
129
+ if (trace.id !== eventId) {
130
+ summary.traceId = trace.id;
131
+ }
132
+ const requestId = context["request.id"];
133
+ if (typeof requestId === "string" && requestId !== eventId) {
134
+ summary.requestId = requestId;
135
+ }
136
+ summary.httpMethod = context["http.method"];
137
+ summary.httpPath = context["http.path"];
138
+ const status = context["http.statusCode"];
139
+ if (status !== undefined) {
140
+ const parsed = Number(status);
141
+ summary.httpStatus = Number.isNaN(parsed) ? undefined : parsed;
142
+ }
143
+ return summary;
144
+ }
145
+ /**
146
+ * The canonical id for a trace. Today the trace's own `id` is set from the kernel's
147
+ * event id at trace creation, so they're equal. A custom `context["event.id"]`
148
+ * override wins when present — that's the explicit hook for distributed-tracing setups
149
+ * where the trace id was overwritten from a propagated `traceparent`.
150
+ */
151
+ eventIdOf(trace) {
152
+ var _a;
153
+ const fromContext = (_a = trace.context) === null || _a === void 0 ? void 0 : _a["event.id"];
154
+ return typeof fromContext === "string" && fromContext.length > 0 ? fromContext : trace.id;
155
+ }
156
+ resolveEventIdFromSummaries(partition, id) {
157
+ for (const summary of this.readSummaries(partition)) {
158
+ if (summary.eventId === id || summary.traceId === id || summary.requestId === id) {
159
+ return summary.eventId;
160
+ }
161
+ }
162
+ return undefined;
163
+ }
164
+ tryLoadTrace(partition, eventId) {
165
+ try {
166
+ return JSON.parse(fs.readFileSync(this.paths.traceFile(partition, eventId), "utf8"));
167
+ }
168
+ catch (_a) {
169
+ return undefined;
170
+ }
171
+ }
172
+ readSummaries(partition) {
173
+ return this.readJsonl(this.paths.requestsFile(partition));
174
+ }
175
+ ensurePartitionDirectory() {
176
+ if (this.directoryEnsured) {
177
+ return;
178
+ }
179
+ fs.mkdirSync(this.paths.tracesDirectory(this.partitionId), { recursive: true });
180
+ this.directoryEnsured = true;
181
+ this.pruneOldPartitions();
182
+ }
183
+ /**
184
+ * Drops partition directories beyond the retained limit, ordered by `mtime`. Once
185
+ * per process. Best-effort: a failure to prune never blocks a write.
186
+ */
187
+ pruneOldPartitions() {
188
+ if (this.pruned) {
189
+ return;
190
+ }
191
+ this.pruned = true;
192
+ try {
193
+ const ordered = this.partitionsNewestFirst();
194
+ for (const stale of ordered.slice(Math.max(this.retainedInstances, 1))) {
195
+ fs.rmSync(this.paths.instanceDirectory(stale), { recursive: true, force: true });
196
+ }
197
+ }
198
+ catch (_a) {
199
+ // Best-effort.
200
+ }
201
+ }
202
+ partitionsNewestFirst() {
203
+ try {
204
+ return fs.readdirSync(this.paths.root, { withFileTypes: true })
205
+ .filter(entry => entry.isDirectory())
206
+ .map(entry => ({ name: entry.name, mtime: this.directoryMtime(entry.name) }))
207
+ .sort((a, b) => b.mtime - a.mtime)
208
+ .map(entry => entry.name);
209
+ }
210
+ catch (_a) {
211
+ return [];
212
+ }
213
+ }
214
+ directoryMtime(name) {
215
+ try {
216
+ return fs.statSync(this.paths.instanceDirectory(name)).mtimeMs;
217
+ }
218
+ catch (_a) {
219
+ return 0;
220
+ }
221
+ }
222
+ readJsonl(filePath) {
223
+ try {
224
+ return fs.readFileSync(filePath, "utf8")
225
+ .split("\n")
226
+ .filter(line => line.trim().length > 0)
227
+ .map(line => JSON.parse(line));
228
+ }
229
+ catch (_a) {
230
+ return [];
231
+ }
232
+ }
233
+ };
234
+ TraceStore = __decorate([
235
+ moduleScoped(ObservabilityModuleKeyname),
236
+ singleton(),
237
+ injectable(),
238
+ __param(0, injectConfig(ObservabilityConfigurationKeys.Enabled)),
239
+ __param(1, injectConfig(ObservabilityConfigurationKeys.Directory)),
240
+ __param(2, injectConfig(ObservabilityConfigurationKeys.RetainedInstances)),
241
+ __param(3, inject(InternalContainerParameterEnum.KernelInstantiationId)),
242
+ __metadata("design:paramtypes", [Boolean, String, Number, String])
243
+ ], TraceStore);
244
+ export { TraceStore };
245
+ //# 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,73 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ /**
4
+ * Follows a growing `.jsonl` file and emits each newly-appended complete line. The
5
+ * `logs --follow` command and the REPL use this for a `tail -f`-style live view.
6
+ *
7
+ * Watches the file's parent directory (watching a not-yet-created file directly is
8
+ * unreliable across platforms) and reads the byte delta on each change. Partial trailing
9
+ * lines are buffered until their terminating newline arrives.
10
+ *
11
+ * Not a DI service — a plain utility. Instantiate, `follow()`, and `stop()` when done.
12
+ */
13
+ export class LogTailer {
14
+ constructor(filePath) {
15
+ this.filePath = filePath;
16
+ this.offset = 0;
17
+ this.buffer = "";
18
+ }
19
+ /**
20
+ * Starts following. Existing content is skipped — only lines appended after this call
21
+ * are emitted. Call `stop()` to release the watch.
22
+ */
23
+ follow(onLine) {
24
+ this.offset = fs.existsSync(this.filePath) ? fs.statSync(this.filePath).size : 0;
25
+ const directory = path.dirname(this.filePath);
26
+ const filename = path.basename(this.filePath);
27
+ this.watcher = fs.watch(directory, (_eventType, changed) => {
28
+ if (changed !== null && changed !== filename) {
29
+ return;
30
+ }
31
+ this.drain(onLine);
32
+ });
33
+ }
34
+ /**
35
+ * Stops following and releases the filesystem watch.
36
+ */
37
+ stop() {
38
+ var _a;
39
+ (_a = this.watcher) === null || _a === void 0 ? void 0 : _a.close();
40
+ this.watcher = undefined;
41
+ }
42
+ drain(onLine) {
43
+ var _a;
44
+ if (fs.existsSync(this.filePath) === false) {
45
+ return;
46
+ }
47
+ const size = fs.statSync(this.filePath).size;
48
+ if (size <= this.offset) {
49
+ // Truncated or unchanged — reset to the new end so we don't replay stale bytes.
50
+ this.offset = size;
51
+ return;
52
+ }
53
+ const fd = fs.openSync(this.filePath, "r");
54
+ try {
55
+ const length = size - this.offset;
56
+ const chunk = Buffer.alloc(length);
57
+ fs.readSync(fd, chunk, 0, length, this.offset);
58
+ this.offset = size;
59
+ this.buffer += chunk.toString("utf8");
60
+ }
61
+ finally {
62
+ fs.closeSync(fd);
63
+ }
64
+ const lines = this.buffer.split("\n");
65
+ this.buffer = (_a = lines.pop()) !== null && _a !== void 0 ? _a : "";
66
+ for (const line of lines) {
67
+ if (line.length > 0) {
68
+ onLine(line);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ //# 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,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;;;;GASG;AACH,MAAM,OAAO,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"}
@@ -0,0 +1,2 @@
1
+ export * from "./log-tailer";
2
+ //# sourceMappingURL=tailers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailers.js","sourceRoot":"","sources":["../../../../src/tailers/tailers.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,62 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Readable } from "stream";
11
+ import { injectable, singleton } from "tsyringe";
12
+ import { moduleScoped, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
13
+ import { ObservabilityModuleKeyname } from "../observability.module.keyname";
14
+ import { TraceStore } from "../store/trace-store";
15
+ /**
16
+ * A `Tracer` transport that forwards every completed trace to `TraceStore`. Thin adapter
17
+ * — all file I/O, request-summary computation, retention, and per-process partitioning
18
+ * live in `TraceStore`.
19
+ *
20
+ * Crash-isolated: a write failure becomes a stderr line rather than propagating.
21
+ */
22
+ let ObservabilityTracer = class ObservabilityTracer {
23
+ constructor(traceStore) {
24
+ this.traceStore = traceStore;
25
+ this.traceEndedStream = new Readable({
26
+ objectMode: true,
27
+ read(_size) { return true; },
28
+ });
29
+ this.traceEndedStream.on("data", (trace) => {
30
+ try {
31
+ this.traceStore.append(trace);
32
+ }
33
+ catch (error) {
34
+ this.reportFailure(error);
35
+ }
36
+ });
37
+ this.traceEndedStream.on("error", (error) => {
38
+ this.reportFailure(error);
39
+ });
40
+ }
41
+ reportFailure(error) {
42
+ try {
43
+ // Stringification happens inside the guard — `error.name`/`error.message`/`String(error)`
44
+ // can all throw on pathological inputs (throwing getters, exotic `Symbol.toPrimitive`,
45
+ // etc.). The safety net must not become the new failure source.
46
+ const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
47
+ process.stderr.write(`[pristine][observability-tracer] ${message}\n`);
48
+ }
49
+ catch (_a) {
50
+ // If even stringifying or writing fails, there is nothing useful left to do.
51
+ }
52
+ }
53
+ };
54
+ ObservabilityTracer = __decorate([
55
+ moduleScoped(ObservabilityModuleKeyname),
56
+ singleton(),
57
+ tag(ServiceDefinitionTagEnum.Tracer),
58
+ injectable(),
59
+ __metadata("design:paramtypes", [TraceStore])
60
+ ], ObservabilityTracer);
61
+ export { ObservabilityTracer };
62
+ //# 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,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAC,YAAY,EAAE,wBAAwB,EAAE,GAAG,EAAQ,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAC,0BAA0B,EAAC,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAEhD;;;;;;GAMG;AAKI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAG9B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QACjD,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,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,mBAAmB;IAJ/B,YAAY,CAAC,0BAA0B,CAAC;IACxC,SAAS,EAAE;IACX,GAAG,CAAC,wBAAwB,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE;qCAI8B,UAAU;GAHxC,mBAAmB,CAiC/B"}
@@ -0,0 +1,2 @@
1
+ export * from "./observability.tracer";
2
+ //# sourceMappingURL=tracers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracers.js","sourceRoot":"","sources":["../../../../src/tracers/tracers.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}