1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.transformLogProgress = void 0;
|
4 | const stream_1 = require("stream");
|
5 | const util_1 = require("util");
|
6 | const js_lib_1 = require("@naturalcycles/js-lib");
|
7 | const time_lib_1 = require("@naturalcycles/time-lib");
|
8 | const colors_1 = require("../../colors");
|
9 | const inspectOpt = {
|
10 | colors: true,
|
11 | breakLength: 300,
|
12 | };
|
13 |
|
14 |
|
15 |
|
16 | function transformLogProgress(opt = {}) {
|
17 | const { metric = 'progress', heapTotal: logHeapTotal = false, heapUsed: logHeapUsed = true, rss: logRss = true, peakRSS: logPeakRSS = false, logRPS = true, logEvery = 1000, extra, } = opt;
|
18 | const logProgress = opt.logProgress !== false && logEvery !== 0;
|
19 | const logEvery10 = logEvery * 10;
|
20 | const started = Date.now();
|
21 | let lastSecondStarted = Date.now();
|
22 | const sma = new js_lib_1.SimpleMovingAverage(10);
|
23 | let processedLastSecond = 0;
|
24 | let progress = 0;
|
25 | let peakRSS = 0;
|
26 | logStats();
|
27 | return new stream_1.Transform({
|
28 | objectMode: true,
|
29 | ...opt,
|
30 | transform(chunk, _encoding, cb) {
|
31 | progress++;
|
32 | processedLastSecond++;
|
33 | if (logProgress && progress % logEvery === 0) {
|
34 | logStats(chunk, false, progress % logEvery10 === 0);
|
35 | }
|
36 | cb(null, chunk);
|
37 | },
|
38 | final(cb) {
|
39 | logStats(undefined, true);
|
40 | cb();
|
41 | },
|
42 | });
|
43 | function logStats(chunk, final = false, tenx = false) {
|
44 | if (!logProgress)
|
45 | return;
|
46 | const mem = process.memoryUsage();
|
47 | const now = Date.now();
|
48 | const lastRPS = processedLastSecond / ((now - lastSecondStarted) / 1000) || 0;
|
49 | const rpsTotal = Math.round(progress / ((now - started) / 1000)) || 0;
|
50 | lastSecondStarted = now;
|
51 | processedLastSecond = 0;
|
52 | const rps10 = Math.round(sma.push(lastRPS));
|
53 | if (mem.rss > peakRSS)
|
54 | peakRSS = mem.rss;
|
55 | console.log((0, util_1.inspect)({
|
56 | [final ? `${metric}_final` : metric]: progress,
|
57 | ...(extra ? extra(chunk, progress) : {}),
|
58 | ...(logHeapUsed ? { heapUsed: (0, js_lib_1._mb)(mem.heapUsed) } : {}),
|
59 | ...(logHeapTotal ? { heapTotal: (0, js_lib_1._mb)(mem.heapTotal) } : {}),
|
60 | ...(logRss ? { rss: (0, js_lib_1._mb)(mem.rss) } : {}),
|
61 | ...(logPeakRSS ? { peakRSS: (0, js_lib_1._mb)(peakRSS) } : {}),
|
62 | ...(opt.rssMinusHeap ? { rssMinusHeap: (0, js_lib_1._mb)(mem.rss - mem.heapTotal) } : {}),
|
63 | ...(opt.external ? { external: (0, js_lib_1._mb)(mem.external) } : {}),
|
64 | ...(opt.arrayBuffers ? { arrayBuffers: (0, js_lib_1._mb)(mem.arrayBuffers || 0) } : {}),
|
65 | ...(logRPS
|
66 | ? {
|
67 | rps10,
|
68 | rpsTotal,
|
69 | }
|
70 | : {}),
|
71 | }, inspectOpt));
|
72 | if (tenx) {
|
73 | let perHour = Math.round((progress * 1000 * 60 * 60) / (now - started)) || 0;
|
74 | if (perHour > 900) {
|
75 | perHour = Math.round(perHour / 1000) + 'K';
|
76 | }
|
77 | console.log(`${(0, colors_1.dimGrey)((0, time_lib_1.dayjs)().toPretty())} ${(0, colors_1.white)(metric)} took ${(0, colors_1.yellow)((0, js_lib_1._since)(started))} so far to process ${(0, colors_1.yellow)(progress)} rows, ~${(0, colors_1.yellow)(perHour)}/hour`);
|
78 | }
|
79 | else if (final) {
|
80 | console.log(`${(0, colors_1.boldWhite)(metric)} took ${(0, colors_1.yellow)((0, js_lib_1._since)(started))} to process ${(0, colors_1.yellow)(progress)} rows with total RPS of ${(0, colors_1.yellow)(rpsTotal)}`);
|
81 | }
|
82 | }
|
83 | }
|
84 | exports.transformLogProgress = transformLogProgress;
|