@pristine-ts/telemetry 2.0.7 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/managers/tracing.manager.js +17 -1
- package/dist/lib/cjs/managers/tracing.manager.js.map +1 -1
- package/dist/lib/cjs/telemetry.configuration-keys.js +0 -4
- package/dist/lib/cjs/telemetry.configuration-keys.js.map +1 -1
- package/dist/lib/cjs/telemetry.module.js +0 -51
- package/dist/lib/cjs/telemetry.module.js.map +1 -1
- package/dist/lib/cjs/tracers/console.tracer.js +5 -2
- package/dist/lib/cjs/tracers/console.tracer.js.map +1 -1
- package/dist/lib/cjs/tracers/tracers.js +0 -1
- package/dist/lib/cjs/tracers/tracers.js.map +1 -1
- package/dist/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/lib/cjs/utils/trace-renderer.js +8 -3
- package/dist/lib/cjs/utils/trace-renderer.js.map +1 -1
- package/dist/lib/esm/managers/tracing.manager.js +17 -1
- package/dist/lib/esm/managers/tracing.manager.js.map +1 -1
- package/dist/lib/esm/telemetry.configuration-keys.js +0 -4
- package/dist/lib/esm/telemetry.configuration-keys.js.map +1 -1
- package/dist/lib/esm/telemetry.module.js +0 -51
- package/dist/lib/esm/telemetry.module.js.map +1 -1
- package/dist/lib/esm/tracers/console.tracer.js +5 -2
- package/dist/lib/esm/tracers/console.tracer.js.map +1 -1
- package/dist/lib/esm/tracers/tracers.js +0 -1
- package/dist/lib/esm/tracers/tracers.js.map +1 -1
- package/dist/lib/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/lib/esm/utils/trace-renderer.js +8 -3
- package/dist/lib/esm/utils/trace-renderer.js.map +1 -1
- package/dist/types/managers/tracing.manager.d.ts +13 -1
- package/dist/types/telemetry.configuration-keys.d.ts +0 -8
- package/dist/types/tracers/tracers.d.ts +0 -1
- package/dist/types/utils/trace-renderer.d.ts +3 -3
- package/package.json +4 -4
- package/dist/lib/cjs/tracers/file.tracer.js +0 -161
- package/dist/lib/cjs/tracers/file.tracer.js.map +0 -1
- package/dist/lib/esm/tracers/file.tracer.js +0 -125
- package/dist/lib/esm/tracers/file.tracer.js.map +0 -1
- package/dist/types/tracers/file.tracer.d.ts +0 -34
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Trace } from "../models/trace.model";
|
|
2
2
|
/**
|
|
3
|
-
* Pure-function renderers for `Trace` objects. Used by
|
|
4
|
-
* stdout) and
|
|
5
|
-
* of destination. All methods are stateless — instantiate once and reuse, or use the
|
|
3
|
+
* Pure-function renderers for `Trace` objects. Used by `ConsoleTracer` (writes to
|
|
4
|
+
* stdout) and the observability tracer (persists to the store) so the visual output is
|
|
5
|
+
* identical regardless of destination. All methods are stateless — instantiate once and reuse, or use the
|
|
6
6
|
* exported singleton `traceRenderer` if you don't care.
|
|
7
7
|
*/
|
|
8
8
|
export declare class TraceRenderer {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pristine-ts/telemetry",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.8",
|
|
4
4
|
"description": "",
|
|
5
5
|
"module": "dist/lib/esm/telemetry.module.js",
|
|
6
6
|
"main": "dist/lib/cjs/telemetry.module.js",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"test:cov": "jest --coverage"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@pristine-ts/common": "^2.0.
|
|
16
|
-
"@pristine-ts/logging": "^2.0.
|
|
15
|
+
"@pristine-ts/common": "^2.0.8",
|
|
16
|
+
"@pristine-ts/logging": "^2.0.8",
|
|
17
17
|
"uuid": "^9.0.1"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"src/*.{js,ts}"
|
|
62
62
|
]
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "c760fc252d427fec8d98dfadf06e36db232bc8c9",
|
|
65
65
|
"repository": {
|
|
66
66
|
"type": "git",
|
|
67
67
|
"url": "https://github.com/magieno/pristine-ts.git",
|
|
@@ -1,161 +0,0 @@
|
|
|
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.FileTracer = void 0;
|
|
49
|
-
const fs = __importStar(require("fs"));
|
|
50
|
-
const path = __importStar(require("path"));
|
|
51
|
-
const stream_1 = require("stream");
|
|
52
|
-
const tsyringe_1 = require("tsyringe");
|
|
53
|
-
const common_1 = require("@pristine-ts/common");
|
|
54
|
-
const console_tracer_output_mode_enum_1 = require("../enums/console-tracer-output-mode.enum");
|
|
55
|
-
const telemetry_configuration_keys_1 = require("../telemetry.configuration-keys");
|
|
56
|
-
const telemetry_module_keyname_1 = require("../telemetry.module.keyname");
|
|
57
|
-
const trace_renderer_1 = require("../utils/trace-renderer");
|
|
58
|
-
/**
|
|
59
|
-
* `FileTracer` writes one file per completed trace to a configured directory. Files are
|
|
60
|
-
* named after the trace's id (= eventId throughout Pristine), so locating a request's
|
|
61
|
-
* trace is `cat traces/<eventId>.json`.
|
|
62
|
-
*
|
|
63
|
-
* Off by default. Enable via `pristine.telemetry.file-tracer.activated = true`.
|
|
64
|
-
*
|
|
65
|
-
* Configuration:
|
|
66
|
-
* - `file-tracer.directory` — defaults to `./traces`
|
|
67
|
-
* - `file-tracer.filename-pattern` — defaults to `<traceId>.json`. Placeholders:
|
|
68
|
-
* `<traceId>`, `<date>` (UTC YYYY-MM-DD), `<timestamp>` (ms epoch).
|
|
69
|
-
* - `file-tracer.output-mode` — `json` (default), `tree`, or `flat`.
|
|
70
|
-
*
|
|
71
|
-
* Crash-isolated: a write failure (read-only fs, missing permissions, etc.) becomes a
|
|
72
|
-
* stderr line, never an unhandled error. The framework continues and the next trace is
|
|
73
|
-
* attempted independently.
|
|
74
|
-
*/
|
|
75
|
-
let FileTracer = class FileTracer {
|
|
76
|
-
constructor(activated, outputMode, directory, filenamePattern, logHandler) {
|
|
77
|
-
this.activated = activated;
|
|
78
|
-
this.outputMode = outputMode;
|
|
79
|
-
this.directory = directory;
|
|
80
|
-
this.filenamePattern = filenamePattern;
|
|
81
|
-
this.logHandler = logHandler;
|
|
82
|
-
this.traceEndedStream = new stream_1.Readable({
|
|
83
|
-
objectMode: true,
|
|
84
|
-
read(_size) { return true; },
|
|
85
|
-
});
|
|
86
|
-
this.traceEndedStream.on("data", (trace) => {
|
|
87
|
-
try {
|
|
88
|
-
this.handleTraceEnded(trace);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
this.reportFailure(error);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
this.traceEndedStream.on("error", (error) => {
|
|
95
|
-
this.reportFailure(error);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
handleTraceEnded(trace) {
|
|
99
|
-
if (this.activated === false) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const content = this.renderTrace(trace);
|
|
103
|
-
const filename = this.expandFilenamePattern(trace);
|
|
104
|
-
const absoluteDir = path.resolve(process.cwd(), this.directory);
|
|
105
|
-
const absoluteFile = path.join(absoluteDir, filename);
|
|
106
|
-
// Make sure the file's parent directory exists. We mkdir on the file's parent rather
|
|
107
|
-
// than just `absoluteDir` because filename-pattern can introduce subdirectories
|
|
108
|
-
// (e.g. `<date>/<traceId>.json` partitions traces into per-day folders). `recursive:
|
|
109
|
-
// true` is a no-op if the path already exists.
|
|
110
|
-
fs.mkdirSync(path.dirname(absoluteFile), { recursive: true });
|
|
111
|
-
// Write the file. We use `writeFileSync` rather than the async equivalent because the
|
|
112
|
-
// tracer pipeline is synchronous (the framework `.push()`es into the stream and moves
|
|
113
|
-
// on), and a write that returns a Promise would silently leak rejections. The write
|
|
114
|
-
// is small (one trace's worth of JSON, typically <50KB), so the sync cost is bounded.
|
|
115
|
-
fs.writeFileSync(absoluteFile, content);
|
|
116
|
-
}
|
|
117
|
-
renderTrace(trace) {
|
|
118
|
-
switch (this.outputMode) {
|
|
119
|
-
case console_tracer_output_mode_enum_1.ConsoleTracerOutputModeEnum.Tree:
|
|
120
|
-
return trace_renderer_1.traceRenderer.renderTree(trace);
|
|
121
|
-
case console_tracer_output_mode_enum_1.ConsoleTracerOutputModeEnum.Flat:
|
|
122
|
-
return trace_renderer_1.traceRenderer.renderFlat(trace);
|
|
123
|
-
case console_tracer_output_mode_enum_1.ConsoleTracerOutputModeEnum.Json:
|
|
124
|
-
default:
|
|
125
|
-
return trace_renderer_1.traceRenderer.renderJson(trace);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
expandFilenamePattern(trace) {
|
|
129
|
-
var _a, _b;
|
|
130
|
-
const date = new Date((_a = trace.endDate) !== null && _a !== void 0 ? _a : Date.now());
|
|
131
|
-
const isoDate = date.toISOString().slice(0, 10); // YYYY-MM-DD
|
|
132
|
-
const timestamp = String((_b = trace.endDate) !== null && _b !== void 0 ? _b : Date.now());
|
|
133
|
-
return this.filenamePattern
|
|
134
|
-
.replace(/<traceId>/g, trace.id)
|
|
135
|
-
.replace(/<date>/g, isoDate)
|
|
136
|
-
.replace(/<timestamp>/g, timestamp);
|
|
137
|
-
}
|
|
138
|
-
reportFailure(error) {
|
|
139
|
-
const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
140
|
-
try {
|
|
141
|
-
process.stderr.write(`[pristine][tracer:FileTracer] ${message}\n`);
|
|
142
|
-
}
|
|
143
|
-
catch (_a) {
|
|
144
|
-
// If stderr is unwritable too, there's nothing useful left to do.
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
exports.FileTracer = FileTracer;
|
|
149
|
-
exports.FileTracer = FileTracer = __decorate([
|
|
150
|
-
(0, common_1.moduleScoped)(telemetry_module_keyname_1.TelemetryModuleKeyname),
|
|
151
|
-
(0, tsyringe_1.singleton)(),
|
|
152
|
-
(0, common_1.tag)(common_1.ServiceDefinitionTagEnum.Tracer),
|
|
153
|
-
(0, tsyringe_1.injectable)(),
|
|
154
|
-
__param(0, (0, common_1.injectConfig)(telemetry_configuration_keys_1.TelemetryConfigurationKeys.FileTracerActivated)),
|
|
155
|
-
__param(1, (0, common_1.injectConfig)(telemetry_configuration_keys_1.TelemetryConfigurationKeys.FileTracerOutputMode)),
|
|
156
|
-
__param(2, (0, common_1.injectConfig)(telemetry_configuration_keys_1.TelemetryConfigurationKeys.FileTracerDirectory)),
|
|
157
|
-
__param(3, (0, common_1.injectConfig)(telemetry_configuration_keys_1.TelemetryConfigurationKeys.FileTracerFilenamePattern)),
|
|
158
|
-
__param(4, (0, tsyringe_1.inject)("LogHandlerInterface")),
|
|
159
|
-
__metadata("design:paramtypes", [Boolean, String, String, String, Object])
|
|
160
|
-
], FileTracer);
|
|
161
|
-
//# sourceMappingURL=file.tracer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file.tracer.js","sourceRoot":"","sources":["../../../../src/tracers/file.tracer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,mCAAgC;AAChC,uCAAuD;AACvD,gDAA8F;AAI9F,8FAAqF;AACrF,kFAA2E;AAC3E,0EAAmE;AACnE,4DAAsD;AAEtD;;;;;;;;;;;;;;;;GAgBG;AAKI,IAAM,UAAU,GAAhB,MAAM,UAAU;IAGrB,YACiF,SAAkB,EACjB,UAAuC,EACxC,SAAiB,EACX,eAAuB,EAC5D,UAA+B;QAJA,cAAS,GAAT,SAAS,CAAS;QACjB,eAAU,GAAV,UAAU,CAA6B;QACxC,cAAS,GAAT,SAAS,CAAQ;QACX,oBAAe,GAAf,eAAe,CAAQ;QAC5D,eAAU,GAAV,UAAU,CAAqB;QAE/E,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,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/B,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,gBAAgB,CAAC,KAAY;QACnC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEtD,qFAAqF;QACrF,gFAAgF;QAChF,qFAAqF;QACrF,+CAA+C;QAC/C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;QAE5D,sFAAsF;QACtF,sFAAsF;QACtF,oFAAoF;QACpF,sFAAsF;QACtF,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,KAAY;QAC9B,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,KAAK,6DAA2B,CAAC,IAAI;gBACnC,OAAO,8BAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzC,KAAK,6DAA2B,CAAC,IAAI;gBACnC,OAAO,8BAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzC,KAAK,6DAA2B,CAAC,IAAI,CAAC;YACtC;gBACE,OAAO,8BAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAAY;;QACxC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAA,KAAK,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAG,aAAa;QAChE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAA,KAAK,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAC,eAAe;aACxB,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;aAC/B,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;aAC3B,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,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;QAC3F,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,OAAO,IAAI,CAAC,CAAC;QACrE,CAAC;QAAC,WAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;CACF,CAAA;AAlFY,gCAAU;qBAAV,UAAU;IAJtB,IAAA,qBAAY,EAAC,iDAAsB,CAAC;IACpC,IAAA,oBAAS,GAAE;IACX,IAAA,YAAG,EAAC,iCAAwB,CAAC,MAAM,CAAC;IACpC,IAAA,qBAAU,GAAE;IAKR,WAAA,IAAA,qBAAY,EAAC,yDAA0B,CAAC,mBAAmB,CAAC,CAAA;IAC5D,WAAA,IAAA,qBAAY,EAAC,yDAA0B,CAAC,oBAAoB,CAAC,CAAA;IAC7D,WAAA,IAAA,qBAAY,EAAC,yDAA0B,CAAC,mBAAmB,CAAC,CAAA;IAC5D,WAAA,IAAA,qBAAY,EAAC,yDAA0B,CAAC,yBAAyB,CAAC,CAAA;IAClE,WAAA,IAAA,iBAAM,EAAC,qBAAqB,CAAC,CAAA;;GARrB,UAAU,CAkFtB"}
|
|
@@ -1,125 +0,0 @@
|
|
|
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 * as path from "path";
|
|
15
|
-
import { Readable } from "stream";
|
|
16
|
-
import { inject, injectable, singleton } from "tsyringe";
|
|
17
|
-
import { injectConfig, moduleScoped, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
|
|
18
|
-
import { ConsoleTracerOutputModeEnum } from "../enums/console-tracer-output-mode.enum";
|
|
19
|
-
import { TelemetryConfigurationKeys } from "../telemetry.configuration-keys";
|
|
20
|
-
import { TelemetryModuleKeyname } from "../telemetry.module.keyname";
|
|
21
|
-
import { traceRenderer } from "../utils/trace-renderer";
|
|
22
|
-
/**
|
|
23
|
-
* `FileTracer` writes one file per completed trace to a configured directory. Files are
|
|
24
|
-
* named after the trace's id (= eventId throughout Pristine), so locating a request's
|
|
25
|
-
* trace is `cat traces/<eventId>.json`.
|
|
26
|
-
*
|
|
27
|
-
* Off by default. Enable via `pristine.telemetry.file-tracer.activated = true`.
|
|
28
|
-
*
|
|
29
|
-
* Configuration:
|
|
30
|
-
* - `file-tracer.directory` — defaults to `./traces`
|
|
31
|
-
* - `file-tracer.filename-pattern` — defaults to `<traceId>.json`. Placeholders:
|
|
32
|
-
* `<traceId>`, `<date>` (UTC YYYY-MM-DD), `<timestamp>` (ms epoch).
|
|
33
|
-
* - `file-tracer.output-mode` — `json` (default), `tree`, or `flat`.
|
|
34
|
-
*
|
|
35
|
-
* Crash-isolated: a write failure (read-only fs, missing permissions, etc.) becomes a
|
|
36
|
-
* stderr line, never an unhandled error. The framework continues and the next trace is
|
|
37
|
-
* attempted independently.
|
|
38
|
-
*/
|
|
39
|
-
let FileTracer = class FileTracer {
|
|
40
|
-
constructor(activated, outputMode, directory, filenamePattern, logHandler) {
|
|
41
|
-
this.activated = activated;
|
|
42
|
-
this.outputMode = outputMode;
|
|
43
|
-
this.directory = directory;
|
|
44
|
-
this.filenamePattern = filenamePattern;
|
|
45
|
-
this.logHandler = logHandler;
|
|
46
|
-
this.traceEndedStream = new Readable({
|
|
47
|
-
objectMode: true,
|
|
48
|
-
read(_size) { return true; },
|
|
49
|
-
});
|
|
50
|
-
this.traceEndedStream.on("data", (trace) => {
|
|
51
|
-
try {
|
|
52
|
-
this.handleTraceEnded(trace);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
this.reportFailure(error);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
this.traceEndedStream.on("error", (error) => {
|
|
59
|
-
this.reportFailure(error);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
handleTraceEnded(trace) {
|
|
63
|
-
if (this.activated === false) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const content = this.renderTrace(trace);
|
|
67
|
-
const filename = this.expandFilenamePattern(trace);
|
|
68
|
-
const absoluteDir = path.resolve(process.cwd(), this.directory);
|
|
69
|
-
const absoluteFile = path.join(absoluteDir, filename);
|
|
70
|
-
// Make sure the file's parent directory exists. We mkdir on the file's parent rather
|
|
71
|
-
// than just `absoluteDir` because filename-pattern can introduce subdirectories
|
|
72
|
-
// (e.g. `<date>/<traceId>.json` partitions traces into per-day folders). `recursive:
|
|
73
|
-
// true` is a no-op if the path already exists.
|
|
74
|
-
fs.mkdirSync(path.dirname(absoluteFile), { recursive: true });
|
|
75
|
-
// Write the file. We use `writeFileSync` rather than the async equivalent because the
|
|
76
|
-
// tracer pipeline is synchronous (the framework `.push()`es into the stream and moves
|
|
77
|
-
// on), and a write that returns a Promise would silently leak rejections. The write
|
|
78
|
-
// is small (one trace's worth of JSON, typically <50KB), so the sync cost is bounded.
|
|
79
|
-
fs.writeFileSync(absoluteFile, content);
|
|
80
|
-
}
|
|
81
|
-
renderTrace(trace) {
|
|
82
|
-
switch (this.outputMode) {
|
|
83
|
-
case ConsoleTracerOutputModeEnum.Tree:
|
|
84
|
-
return traceRenderer.renderTree(trace);
|
|
85
|
-
case ConsoleTracerOutputModeEnum.Flat:
|
|
86
|
-
return traceRenderer.renderFlat(trace);
|
|
87
|
-
case ConsoleTracerOutputModeEnum.Json:
|
|
88
|
-
default:
|
|
89
|
-
return traceRenderer.renderJson(trace);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
expandFilenamePattern(trace) {
|
|
93
|
-
var _a, _b;
|
|
94
|
-
const date = new Date((_a = trace.endDate) !== null && _a !== void 0 ? _a : Date.now());
|
|
95
|
-
const isoDate = date.toISOString().slice(0, 10); // YYYY-MM-DD
|
|
96
|
-
const timestamp = String((_b = trace.endDate) !== null && _b !== void 0 ? _b : Date.now());
|
|
97
|
-
return this.filenamePattern
|
|
98
|
-
.replace(/<traceId>/g, trace.id)
|
|
99
|
-
.replace(/<date>/g, isoDate)
|
|
100
|
-
.replace(/<timestamp>/g, timestamp);
|
|
101
|
-
}
|
|
102
|
-
reportFailure(error) {
|
|
103
|
-
const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
104
|
-
try {
|
|
105
|
-
process.stderr.write(`[pristine][tracer:FileTracer] ${message}\n`);
|
|
106
|
-
}
|
|
107
|
-
catch (_a) {
|
|
108
|
-
// If stderr is unwritable too, there's nothing useful left to do.
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
FileTracer = __decorate([
|
|
113
|
-
moduleScoped(TelemetryModuleKeyname),
|
|
114
|
-
singleton(),
|
|
115
|
-
tag(ServiceDefinitionTagEnum.Tracer),
|
|
116
|
-
injectable(),
|
|
117
|
-
__param(0, injectConfig(TelemetryConfigurationKeys.FileTracerActivated)),
|
|
118
|
-
__param(1, injectConfig(TelemetryConfigurationKeys.FileTracerOutputMode)),
|
|
119
|
-
__param(2, injectConfig(TelemetryConfigurationKeys.FileTracerDirectory)),
|
|
120
|
-
__param(3, injectConfig(TelemetryConfigurationKeys.FileTracerFilenamePattern)),
|
|
121
|
-
__param(4, inject("LogHandlerInterface")),
|
|
122
|
-
__metadata("design:paramtypes", [Boolean, String, String, String, Object])
|
|
123
|
-
], FileTracer);
|
|
124
|
-
export { FileTracer };
|
|
125
|
-
//# sourceMappingURL=file.tracer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file.tracer.js","sourceRoot":"","sources":["../../../../src/tracers/file.tracer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { Readable } from "stream";
|
|
2
|
-
import { LogHandlerInterface } from "@pristine-ts/logging";
|
|
3
|
-
import { TracerInterface } from "../interfaces/tracer.interface";
|
|
4
|
-
import { ConsoleTracerOutputModeEnum } from "../enums/console-tracer-output-mode.enum";
|
|
5
|
-
/**
|
|
6
|
-
* `FileTracer` writes one file per completed trace to a configured directory. Files are
|
|
7
|
-
* named after the trace's id (= eventId throughout Pristine), so locating a request's
|
|
8
|
-
* trace is `cat traces/<eventId>.json`.
|
|
9
|
-
*
|
|
10
|
-
* Off by default. Enable via `pristine.telemetry.file-tracer.activated = true`.
|
|
11
|
-
*
|
|
12
|
-
* Configuration:
|
|
13
|
-
* - `file-tracer.directory` — defaults to `./traces`
|
|
14
|
-
* - `file-tracer.filename-pattern` — defaults to `<traceId>.json`. Placeholders:
|
|
15
|
-
* `<traceId>`, `<date>` (UTC YYYY-MM-DD), `<timestamp>` (ms epoch).
|
|
16
|
-
* - `file-tracer.output-mode` — `json` (default), `tree`, or `flat`.
|
|
17
|
-
*
|
|
18
|
-
* Crash-isolated: a write failure (read-only fs, missing permissions, etc.) becomes a
|
|
19
|
-
* stderr line, never an unhandled error. The framework continues and the next trace is
|
|
20
|
-
* attempted independently.
|
|
21
|
-
*/
|
|
22
|
-
export declare class FileTracer implements TracerInterface {
|
|
23
|
-
private readonly activated;
|
|
24
|
-
private readonly outputMode;
|
|
25
|
-
private readonly directory;
|
|
26
|
-
private readonly filenamePattern;
|
|
27
|
-
private readonly logHandler;
|
|
28
|
-
traceEndedStream: Readable;
|
|
29
|
-
constructor(activated: boolean, outputMode: ConsoleTracerOutputModeEnum, directory: string, filenamePattern: string, logHandler: LogHandlerInterface);
|
|
30
|
-
private handleTraceEnded;
|
|
31
|
-
private renderTrace;
|
|
32
|
-
private expandFilenamePattern;
|
|
33
|
-
private reportFailure;
|
|
34
|
-
}
|