@appland/appmap 3.69.0 → 3.71.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [@appland/appmap-v3.71.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.70.0...@appland/appmap-v3.71.0) (2023-03-21)
2
+
3
+
4
+ ### Features
5
+
6
+ * add --directory option to prune command ([1ec6551](https://github.com/getappmap/appmap-js/commit/1ec655147378e0cce49e3cb1446438eb95f2c787))
7
+ * add ability to prune functions by fqid ([d358dac](https://github.com/getappmap/appmap-js/commit/d358dacd4852530da6e01278e3591808dae352bd))
8
+ * better output for prune command ([47ed85f](https://github.com/getappmap/appmap-js/commit/47ed85f53154bb1edbb7883e768700cde69e42b7))
9
+ * update prune cli command ([e6472ab](https://github.com/getappmap/appmap-js/commit/e6472ab8877fcded10c1a22927c43837f5793753))
10
+ * use base64url-encoded filter state for pruning ([2a1c3d9](https://github.com/getappmap/appmap-js/commit/2a1c3d9ffa8e0b95186f886418e49493a022fa19))
11
+
12
+ # [@appland/appmap-v3.70.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.69.0...@appland/appmap-v3.70.0) (2023-03-20)
13
+
14
+
15
+ ### Features
16
+
17
+ * add --appmap-dir option ([778b31f](https://github.com/getappmap/appmap-js/commit/778b31f4b03488f17cdefb972d684462357728ba))
18
+ * stats for a single appmap ([34a4b67](https://github.com/getappmap/appmap-js/commit/34a4b672452755c356877e4ecae8f04d0f9e1994))
19
+
1
20
  # [@appland/appmap-v3.69.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.68.1...@appland/appmap-v3.69.0) (2023-03-20)
2
21
 
3
22
 
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const fs_1 = __importDefault(require("fs"));
7
7
  const JSONStream_1 = __importDefault(require("JSONStream"));
8
8
  const path_1 = require("path");
9
+ const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
9
10
  const pruneAppMap_1 = require("./pruneAppMap");
10
11
  async function fromFile(filePath) {
11
12
  let data = { events: [] };
@@ -40,29 +41,86 @@ function parseSize(size) {
40
41
  }
41
42
  return Number(byteStr) * p;
42
43
  }
44
+ function messageWhenUsingFilter(filters) {
45
+ let exclusions = [];
46
+ if ('hideUnlabeled' in filters)
47
+ exclusions.push('All unlabeled functions');
48
+ if ('hideMediaRequests' in filters)
49
+ exclusions.push('All media requests');
50
+ if ('hideExternalPaths' in filters)
51
+ exclusions.push('All external paths');
52
+ if ('hideElapsedTimeUnder' in filters && filters.hideElapsedTimeUnder !== false)
53
+ exclusions.push(`All functions with elapsed time under ${filters.hideElapsedTimeUnder} ms`);
54
+ if ('hideName' in filters)
55
+ exclusions = [...exclusions, ...filters.hideName];
56
+ return `The following was pruned from the map: \n ${exclusions.join('\n ')}`;
57
+ }
58
+ function displayMessage(appMap, format, usesFilter) {
59
+ let message;
60
+ if (usesFilter) {
61
+ const filters = appMap.data.exclusions;
62
+ message =
63
+ format === 'json' ? JSON.stringify({ filters }, null, 2) : messageWhenUsingFilter(filters);
64
+ }
65
+ else {
66
+ const exclusions = Array.from(appMap.data.exclusions.values());
67
+ message =
68
+ format === 'json'
69
+ ? JSON.stringify({ exclusions }, null, 2)
70
+ : `The following was pruned from the map:\n ${exclusions.join('\n ')}`;
71
+ }
72
+ console.log(message);
73
+ }
43
74
  exports.default = {
44
- command: 'prune <file> <size>',
45
- describe: 'Prune an appmap file down to the given size',
75
+ command: 'prune <file>',
76
+ describe: 'Make an appmap file smaller by removing events',
46
77
  builder: (argv) => {
47
78
  argv.option('output-dir', {
48
- describe: 'Specifies the output directory. Pruned files will be written here.',
79
+ describe: 'Specifies the output directory',
49
80
  type: 'string',
50
81
  default: '.',
51
82
  alias: 'o',
52
83
  });
84
+ argv.option('format', {
85
+ describe: 'How to format the output',
86
+ choices: ['json', 'text'],
87
+ default: 'text',
88
+ });
53
89
  argv.positional('file', {
54
90
  describe: 'AppMap to prune',
55
91
  });
56
- argv.positional('size', {
92
+ argv.option('size', {
57
93
  describe: 'Prune input file to this size',
94
+ default: '15mb',
95
+ type: 'string',
96
+ alias: 's',
97
+ });
98
+ argv.option('directory', {
99
+ describe: 'Working directory for the command',
100
+ type: 'string',
101
+ alias: 'd',
102
+ });
103
+ argv.option('filter', {
104
+ describe: 'Filter to use to prune the map',
105
+ type: 'string',
58
106
  });
59
107
  },
60
108
  handler: async (argv) => {
61
- const size = parseSize(argv.size);
62
- const appMap = (0, pruneAppMap_1.pruneAppMap)(await fromFile(argv.file), size);
109
+ (0, handleWorkingDirectory_1.handleWorkingDirectory)(argv.directory);
110
+ const map = await fromFile(argv.file);
111
+ let appMap;
112
+ if (argv.filter) {
113
+ appMap = (0, pruneAppMap_1.pruneWithFilter)(map, argv.filter);
114
+ }
115
+ else if (argv.size) {
116
+ appMap = (0, pruneAppMap_1.pruneAppMap)(map, parseSize(argv.size));
117
+ }
118
+ else {
119
+ throw Error('Invalid usage');
120
+ }
63
121
  const outputPath = `${argv.outputDir}/${(0, path_1.basename)(argv.file)}`;
64
122
  fs_1.default.writeFileSync(outputPath, JSON.stringify(appMap));
65
- console.log('done');
123
+ displayMessage(appMap, argv.format, !!argv.filter);
66
124
  },
67
125
  };
68
126
  //# sourceMappingURL=prune.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/cmds/prune/prune.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/cmds/prune/prune.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pruneAppMap = void 0;
3
+ exports.pruneWithFilter = exports.pruneAppMap = void 0;
4
4
  const models_1 = require("@appland/models");
5
5
  const pruneAppMap = (appMap, size) => {
6
6
  return (0, models_1.buildAppMap)().source(appMap).prune(size).normalize().build();
7
7
  };
8
8
  exports.pruneAppMap = pruneAppMap;
9
+ const pruneWithFilter = (appMap, serializedFilter) => {
10
+ const fullMap = (0, models_1.buildAppMap)().source(appMap).normalize().build();
11
+ const filterOrState = (0, models_1.deserializeAppmapState)(serializedFilter);
12
+ const filters = 'filters' in filterOrState ? filterOrState.filters : filterOrState;
13
+ const appmapFilter = new models_1.AppMapFilter();
14
+ appmapFilter.declutter.limitRootEvents.on = false;
15
+ appmapFilter.declutter.hideMediaRequests.on = false;
16
+ appmapFilter.apply(filters);
17
+ const prunedMap = appmapFilter.filter(fullMap, []);
18
+ prunedMap.data = Object.assign(Object.assign({}, prunedMap.data), { exclusions: filters });
19
+ return prunedMap;
20
+ };
21
+ exports.pruneWithFilter = pruneWithFilter;
9
22
  //# sourceMappingURL=pruneAppMap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pruneAppMap.js","sourceRoot":"","sources":["../../../src/cmds/prune/pruneAppMap.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAQvC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAO,EAAE;IAC/D,OAAO,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB"}
1
+ {"version":3,"file":"pruneAppMap.js","sourceRoot":"","sources":["../../../src/cmds/prune/pruneAppMap.ts"],"names":[],"mappings":";;;AAAA,4CAAoF;AAQ7E,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAO,EAAE;IAC/D,OAAO,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB;AAEK,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,gBAAwB,EAAO,EAAE;IAC/E,MAAM,OAAO,GAAG,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;IAEjE,MAAM,aAAa,GAAG,IAAA,+BAAsB,EAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;IAEnF,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,GAAG,KAAK,CAAC;IAClD,YAAY,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,GAAG,KAAK,CAAC;IACpD,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAQ,CAAC;IAC1D,SAAS,CAAC,IAAI,mCAAQ,SAAS,CAAC,IAAI,KAAE,UAAU,EAAE,OAAO,GAAE,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAdW,QAAA,eAAe,mBAc1B"}
@@ -0,0 +1,261 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.statsForDirectory = exports.sizeInMB = void 0;
30
+ const fs = __importStar(require("fs"));
31
+ const userInteraction_1 = __importDefault(require("../../userInteraction"));
32
+ const telemetry_1 = __importDefault(require("../../../telemetry"));
33
+ const utils_1 = require("../../../utils");
34
+ const models_1 = require("@appland/models");
35
+ const chalk_1 = __importDefault(require("chalk"));
36
+ const path_1 = require("path");
37
+ const MINIMUM_APPMAP_SIZE = (1024 * 1024) / 1;
38
+ function sizeInMB(size) {
39
+ return Number((size / 1000 / 1000).toFixed(1));
40
+ }
41
+ exports.sizeInMB = sizeInMB;
42
+ async function statsForDirectory(appMapDir, format, limit, handlerCaller = 'from_stats') {
43
+ async function calculateAppMapSizes(appMapDir) {
44
+ const appMapSizes = {};
45
+ // This function is too verbose to be useful in this context.
46
+ const v = (0, utils_1.verbose)();
47
+ (0, utils_1.verbose)(false);
48
+ await (0, utils_1.listAppMapFiles)(appMapDir, (fileName) => {
49
+ const stats = fs.statSync(fileName);
50
+ appMapSizes[fileName] = {
51
+ path: (0, path_1.relative)(appMapDir, fileName),
52
+ size: stats.size,
53
+ };
54
+ });
55
+ (0, utils_1.verbose)(v);
56
+ return appMapSizes;
57
+ }
58
+ async function sortAppMapSizes(appMapSizes) {
59
+ let appMapSizesArray = [];
60
+ for (const key in appMapSizes) {
61
+ appMapSizesArray.push({
62
+ path: appMapSizes[key].path,
63
+ size: appMapSizes[key].size,
64
+ });
65
+ }
66
+ return appMapSizesArray.sort((a, b) => b.size - a.size);
67
+ }
68
+ async function calculateExecutionTimes(appMapDir) {
69
+ // now that all functions were collected, index them by function
70
+ // name, not by <thread_id,parent_id>
71
+ let totalFunctionExecutionTimes = {};
72
+ // This function is too verbose to be useful in this context.
73
+ const v = (0, utils_1.verbose)();
74
+ (0, utils_1.verbose)(false);
75
+ // Note that event#elapsed time does NOT include instrumentation overhead.
76
+ // So, instrumentation / elapsed can theoretically be greater than 1.
77
+ let totalTime = 0;
78
+ await (0, utils_1.listAppMapFiles)(appMapDir, (fileName) => {
79
+ const file = fs.readFileSync(fileName, 'utf-8');
80
+ const appmapData = JSON.parse(file.toString());
81
+ const appmap = (0, models_1.buildAppMap)(appmapData).build();
82
+ appmap.events.forEach((event) => {
83
+ if (event.isCall()) {
84
+ const eventReturn = event.returnEvent;
85
+ if (!eventReturn)
86
+ return;
87
+ const name = event.codeObject.fqid;
88
+ let elapsedInstrumentationTime = eventReturn.elapsedInstrumentationTime || 0;
89
+ let path = '';
90
+ // some paths are library functions but don't start with /. i.e.:
91
+ // <internal:pack>
92
+ // OpenSSL::Cipher#decrypt
93
+ // Kernel#eval
94
+ if (event.definedClass &&
95
+ event.path &&
96
+ (event.path[0] == '/' ||
97
+ event.path[0] == '<' ||
98
+ event.path.includes('::') ||
99
+ event.path.startsWith('Kernel'))) {
100
+ // Absolute path names generally signify a library function.
101
+ // Send library function data to help optimize AppMap;
102
+ // don't send user function data.
103
+ path = event.path;
104
+ }
105
+ // Total up the elapsed time of root events.
106
+ if (!event.parent && eventReturn.elapsedTime) {
107
+ totalTime += eventReturn.elapsedTime;
108
+ }
109
+ const existingRecord = totalFunctionExecutionTimes[name];
110
+ if (!existingRecord) {
111
+ totalFunctionExecutionTimes[name] = {
112
+ path,
113
+ numberOfCalls: 1,
114
+ elapsedInstrumentationTime,
115
+ };
116
+ }
117
+ else {
118
+ existingRecord.numberOfCalls += 1;
119
+ existingRecord.elapsedInstrumentationTime += elapsedInstrumentationTime;
120
+ if (existingRecord.path === '')
121
+ existingRecord.path = path;
122
+ }
123
+ }
124
+ });
125
+ });
126
+ (0, utils_1.verbose)(v);
127
+ // convert hash to array
128
+ let flatFunctionExecutionTimes = [];
129
+ for (const name in totalFunctionExecutionTimes) {
130
+ flatFunctionExecutionTimes.push({
131
+ name: name,
132
+ elapsedInstrumentationTime: totalFunctionExecutionTimes[name].elapsedInstrumentationTime,
133
+ numberOfCalls: totalFunctionExecutionTimes[name].numberOfCalls,
134
+ path: totalFunctionExecutionTimes[name].path,
135
+ });
136
+ }
137
+ return { totalTime, functions: flatFunctionExecutionTimes };
138
+ }
139
+ async function sortExecutionTimes(functionExecutionTimes) {
140
+ // sort the array
141
+ return functionExecutionTimes.sort((a, b) => b.elapsedInstrumentationTime - a.elapsedInstrumentationTime);
142
+ }
143
+ async function showStats() {
144
+ let biggestAppMapSizes = [];
145
+ // column names in JSON files use snakecase
146
+ let slowestExecutionTimes = [];
147
+ try {
148
+ userInteraction_1.default.status = `Computing AppMap stats...`;
149
+ const appMapSizes = await calculateAppMapSizes(appMapDir);
150
+ const sortedAppMapSizes = await sortAppMapSizes(appMapSizes);
151
+ userInteraction_1.default.success();
152
+ userInteraction_1.default.progress('');
153
+ userInteraction_1.default.progress(chalk_1.default.underline(`Largest AppMaps (which are bigger than ${MINIMUM_APPMAP_SIZE / 1024}kb)`));
154
+ sortedAppMapSizes
155
+ .filter((appmap) => appmap.size > MINIMUM_APPMAP_SIZE)
156
+ .slice(0, limit)
157
+ .forEach((appmap) => {
158
+ biggestAppMapSizes.push({
159
+ size: appmap.size,
160
+ path: appmap.path,
161
+ });
162
+ });
163
+ if (format === 'json') {
164
+ console.log(JSON.stringify(biggestAppMapSizes));
165
+ }
166
+ else {
167
+ biggestAppMapSizes.forEach((appmap) => {
168
+ console.log(sizeInMB(appmap.size) + 'MB ' + appmap.path);
169
+ });
170
+ }
171
+ userInteraction_1.default.progress('');
172
+ userInteraction_1.default.status = `Computing functions with highest AppMap overhead...`;
173
+ const executionTimes = await calculateExecutionTimes(appMapDir);
174
+ const sortedExecutionTimes = await sortExecutionTimes(executionTimes.functions);
175
+ let totalInstrumentationTime = 0;
176
+ sortedExecutionTimes.forEach((time) => (totalInstrumentationTime += time.elapsedInstrumentationTime));
177
+ userInteraction_1.default.success();
178
+ userInteraction_1.default.progress('');
179
+ // if there are no instrumentation data don't show this report
180
+ if (sortedExecutionTimes.length > 0 &&
181
+ sortedExecutionTimes[0].elapsedInstrumentationTime === 0) {
182
+ console.log("These AppMaps don't contain function overhead data. Please update your appmap package to the latest version.");
183
+ }
184
+ else {
185
+ sortedExecutionTimes.slice(0, limit).forEach((executionTime) => {
186
+ slowestExecutionTimes.push({
187
+ elapsed_instrumentation_time_total: Number(executionTime.elapsedInstrumentationTime.toFixed(6)),
188
+ num_calls: executionTime.numberOfCalls,
189
+ name: executionTime.name,
190
+ path: executionTime.path,
191
+ });
192
+ });
193
+ if (format === 'json') {
194
+ console.log(JSON.stringify(slowestExecutionTimes));
195
+ }
196
+ else {
197
+ userInteraction_1.default.progress(chalk_1.default.underline(`Total instrumentation time`));
198
+ console.log(`${Math.round(totalInstrumentationTime * 1000)}ms`);
199
+ userInteraction_1.default.progress('');
200
+ userInteraction_1.default.progress(chalk_1.default.underline(`Functions with highest AppMap overhead`));
201
+ console.log(chalk_1.default.underline([
202
+ 'Time'.padStart(9),
203
+ '%'.padStart(5),
204
+ 'Count'.padStart(7),
205
+ 'Function name'.padEnd(30),
206
+ ].join(' | ')));
207
+ slowestExecutionTimes.forEach((executionTime) => {
208
+ const displayMs = [
209
+ Math.round(executionTime.elapsed_instrumentation_time_total * 1000).toString(),
210
+ 'ms',
211
+ ].join('');
212
+ const displayPercent = `${(Math.round((executionTime.elapsed_instrumentation_time_total / totalInstrumentationTime) * 1000) / 10).toLocaleString('en-us', { maximumFractionDigits: 2, minimumFractionDigits: 0 })}%`;
213
+ console.log([
214
+ displayMs.padStart(9),
215
+ displayPercent.padStart(5),
216
+ executionTime.num_calls.toString().padStart(7),
217
+ executionTime.name.split(':').slice(1).join(':'),
218
+ ].join(' | '));
219
+ });
220
+ }
221
+ }
222
+ let telemetryMetrics = {};
223
+ let telemetryMetricsCounter = 1;
224
+ biggestAppMapSizes.forEach((appmap) => {
225
+ telemetryMetrics[`biggestAppmaps_${telemetryMetricsCounter}`] = appmap.size;
226
+ telemetryMetricsCounter += 1;
227
+ });
228
+ telemetryMetricsCounter = 1;
229
+ slowestExecutionTimes.forEach((executionTime) => {
230
+ telemetryMetrics[`slowestInstrumentationTimesTotal_${telemetryMetricsCounter}`] =
231
+ executionTime.elapsed_instrumentation_time_total;
232
+ telemetryMetrics[`slowestInstrumentationTimesPath_${telemetryMetricsCounter}`] =
233
+ executionTime.path;
234
+ telemetryMetricsCounter += 1;
235
+ });
236
+ telemetry_1.default.sendEvent({
237
+ name: `stats:${handlerCaller}:success`,
238
+ properties: {
239
+ path: appMapDir,
240
+ },
241
+ metrics: telemetryMetrics,
242
+ });
243
+ }
244
+ catch (err) {
245
+ let errorMessage = err.toString();
246
+ if (err instanceof Error) {
247
+ telemetry_1.default.sendEvent({
248
+ name: `stats:${handlerCaller}:error`,
249
+ properties: {
250
+ errorMessage,
251
+ errorStack: err.stack,
252
+ },
253
+ });
254
+ }
255
+ }
256
+ return [biggestAppMapSizes, slowestExecutionTimes];
257
+ }
258
+ return await showStats();
259
+ }
260
+ exports.statsForDirectory = statsForDirectory;
261
+ //# sourceMappingURL=statsForDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsForDirectory.js","sourceRoot":"","sources":["../../../../src/cmds/stats/directory/statsForDirectory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.statsForMap = void 0;
30
+ const fs = __importStar(require("fs"));
31
+ const models_1 = require("@appland/models");
32
+ const JSONStream_1 = __importDefault(require("JSONStream"));
33
+ const KILOBYTE = 1000;
34
+ const MEGABYTE = KILOBYTE * 1000;
35
+ const GIGABYTE = MEGABYTE * 1000;
36
+ const sizeof = (obj) => JSON.stringify(obj).length;
37
+ function displaySize(size) {
38
+ let divisor;
39
+ let suffix;
40
+ if (size > GIGABYTE) {
41
+ divisor = GIGABYTE;
42
+ suffix = 'GB';
43
+ }
44
+ else if (size > MEGABYTE) {
45
+ divisor = MEGABYTE;
46
+ suffix = 'MB';
47
+ }
48
+ else if (size > KILOBYTE) {
49
+ divisor = KILOBYTE;
50
+ suffix = 'KB';
51
+ }
52
+ else {
53
+ divisor = 1;
54
+ suffix = 'bytes';
55
+ }
56
+ return `${(size / divisor).toFixed(1)} ${suffix}`;
57
+ }
58
+ async function parseClassMap(mapPath) {
59
+ let classMap;
60
+ return new Promise((resolve) => {
61
+ fs.createReadStream(mapPath).pipe(JSONStream_1.default.parse('events.*')
62
+ .on('header', (obj) => {
63
+ classMap = new models_1.ClassMap(obj.classMap);
64
+ })
65
+ .on('close', () => {
66
+ resolve(classMap);
67
+ }));
68
+ });
69
+ }
70
+ async function accumulateEvents(mapPath) {
71
+ const classMap = await parseClassMap(mapPath);
72
+ const events = {};
73
+ return new Promise((resolve) => {
74
+ fs.createReadStream(mapPath).pipe(JSONStream_1.default.parse('events.*')
75
+ .on('data', (eventData) => {
76
+ if (eventData.event !== 'call' ||
77
+ eventData.sql_query ||
78
+ eventData.http_server_request ||
79
+ eventData.http_client_request) {
80
+ return;
81
+ }
82
+ const event = new models_1.Event(eventData);
83
+ const obj = classMap.codeObjectFromEvent(event);
84
+ if (obj) {
85
+ const fqid = obj.fqid;
86
+ const size = sizeof(event);
87
+ const entry = events[fqid];
88
+ if (entry) {
89
+ entry.size += size;
90
+ entry.count += 1;
91
+ }
92
+ else {
93
+ events[fqid] = { location: obj.location, size, count: 1 };
94
+ }
95
+ }
96
+ })
97
+ .on('close', () => {
98
+ resolve(Object.keys(events)
99
+ .map((key) => {
100
+ const { location, size, count } = events[key];
101
+ return { function: key, count, size, location };
102
+ })
103
+ .sort((a, b) => b.count - a.count));
104
+ }));
105
+ });
106
+ }
107
+ async function statsForMap(format, limit, mapPath) {
108
+ const eventsStats = (await accumulateEvents(mapPath)).slice(0, limit);
109
+ if (format === 'json') {
110
+ console.log(JSON.stringify(eventsStats, null, 2));
111
+ }
112
+ else {
113
+ eventsStats.forEach((callData, index) => {
114
+ const { function: fn, count, size } = callData;
115
+ console.log([`${index + 1}. ${fn}`, `count: ${count}`, `estimated size: ${displaySize(size)}`, ''].join('\n '));
116
+ });
117
+ }
118
+ return eventsStats;
119
+ }
120
+ exports.statsForMap = statsForMap;
121
+ //# sourceMappingURL=statsForMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsForMap.js","sourceRoot":"","sources":["../../../../src/cmds/stats/directory/statsForMap.ts"],"names":[],"mappings":"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"}