UNPKG

3.83 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.transformLogProgress = void 0;
4const stream_1 = require("stream");
5const util_1 = require("util");
6const js_lib_1 = require("@naturalcycles/js-lib");
7const time_lib_1 = require("@naturalcycles/time-lib");
8const colors_1 = require("../../colors");
9const inspectOpt = {
10 colors: true,
11 breakLength: 300,
12};
13/**
14 * Pass-through transform that optionally logs progress.
15 */
16function 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; // true by default
19 const logEvery10 = logEvery * 10;
20 const started = Date.now();
21 let lastSecondStarted = Date.now();
22 const sma = new js_lib_1.SimpleMovingAverage(10); // over last 10 seconds
23 let processedLastSecond = 0;
24 let progress = 0;
25 let peakRSS = 0;
26 logStats(); // initial
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); // pass-through
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}
84exports.transformLogProgress = transformLogProgress;