@appland/appmap 3.69.0 → 3.70.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,11 @@
1
+ # [@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)
2
+
3
+
4
+ ### Features
5
+
6
+ * add --appmap-dir option ([778b31f](https://github.com/getappmap/appmap-js/commit/778b31f4b03488f17cdefb972d684462357728ba))
7
+ * stats for a single appmap ([34a4b67](https://github.com/getappmap/appmap-js/commit/34a4b672452755c356877e4ecae8f04d0f9e1994))
8
+
1
9
  # [@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
10
 
3
11
 
@@ -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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"}
@@ -4,273 +4,95 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.handler = exports.builder = exports.describe = exports.command = void 0;
7
- const process_1 = require("process");
8
- const fs = require('fs');
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const glob_1 = __importDefault(require("glob"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const statsForDirectory_1 = require("./directory/statsForDirectory");
12
+ const statsForMap_1 = require("./directory/statsForMap");
13
+ const locateAppMapDir_1 = require("../../lib/locateAppMapDir");
9
14
  const userInteraction_1 = __importDefault(require("../userInteraction"));
10
- const telemetry_1 = __importDefault(require("../../telemetry"));
11
15
  const utils_1 = require("../../utils");
12
- const models_1 = require("@appland/models");
13
- const chalk_1 = __importDefault(require("chalk"));
14
- const path_1 = require("path");
16
+ const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
15
17
  exports.command = 'stats [directory]';
16
- exports.describe = 'Show some statistics about events in scenarios read from AppMap files';
18
+ exports.describe = 'Show statistics about events from an AppMap or from all AppMaps in a directory';
17
19
  const LIMIT_DEFAULT = 10;
18
- const MINIMUM_APPMAP_SIZE = (1024 * 1024) / 1;
20
+ async function locateAppMapFile(userInput, appmapDir) {
21
+ let extension = '.appmap.json';
22
+ if (userInput.endsWith('.appmap.json')) {
23
+ extension = '';
24
+ }
25
+ else if (userInput.endsWith('.appmap')) {
26
+ extension = '.json';
27
+ }
28
+ const globMatch = (globString) => {
29
+ return glob_1.default.sync(globString);
30
+ };
31
+ const appmapInWorkingDir = () => globMatch(path_1.default.join(appmapDir, '**', userInput + extension));
32
+ const appmapInAppMapDir = () => [path_1.default.join(userInput + extension)].filter((p) => (0, fs_1.existsSync)(p));
33
+ const appmapAbsolute = () => {
34
+ if (!path_1.default.isAbsolute(userInput + extension))
35
+ return [];
36
+ return globMatch(userInput + extension);
37
+ };
38
+ let matches = [...appmapAbsolute(), ...appmapInWorkingDir(), ...appmapInAppMapDir()];
39
+ if (matches.length === 0) {
40
+ console.error(chalk_1.default.red('No matching AppMap found'));
41
+ return;
42
+ }
43
+ else if (matches.length > 1) {
44
+ const { choice } = await userInteraction_1.default.prompt({
45
+ type: 'list',
46
+ choices: matches,
47
+ name: 'choice',
48
+ message: 'There are multiple matching AppMaps, which one do you want to anlyze?',
49
+ });
50
+ return choice;
51
+ }
52
+ return matches[0];
53
+ }
19
54
  const builder = (args) => {
20
55
  args.option('directory', {
21
- describe: 'Working directory for the command.',
56
+ describe: 'program working directory',
22
57
  type: 'string',
23
58
  alias: 'd',
24
59
  });
25
- args.option('json', {
26
- describe: 'Format results as JSON.',
27
- type: 'boolean',
28
- alias: 'j',
60
+ args.option('appmap-dir', {
61
+ describe: 'directory to recursively inspect for AppMaps',
62
+ });
63
+ args.option('format', {
64
+ describe: 'How to format the output',
65
+ choices: ['json', 'text'],
66
+ alias: 'f',
67
+ default: 'text',
29
68
  });
30
69
  args.option('limit', {
31
- describe: 'limit the number of methods displayed (default ' + LIMIT_DEFAULT + ').',
70
+ describe: 'Number of methods to display',
32
71
  type: 'number',
33
72
  alias: 'l',
34
73
  default: LIMIT_DEFAULT,
35
74
  });
75
+ args.option('appmap-file', {
76
+ describe: 'AppMap to analyze',
77
+ type: 'string',
78
+ alias: 'a',
79
+ });
36
80
  return args.strict();
37
81
  };
38
82
  exports.builder = builder;
39
83
  async function handler(argv, handlerCaller = 'from_stats') {
40
84
  (0, utils_1.verbose)(argv.verbose);
41
- const commandFn = async () => {
42
- const { directory, json, limit: limitToUse } = argv;
43
- if (directory) {
44
- if ((0, utils_1.verbose)())
45
- console.log(`Using working directory ${directory}`);
46
- (0, process_1.chdir)(directory);
47
- }
48
- let directoryToUse = directory;
49
- if (!directoryToUse)
50
- directoryToUse = '.';
51
- async function calculateAppMapSizes(appMapDir) {
52
- const appMapSizes = {};
53
- // This function is too verbose to be useful in this context.
54
- const v = (0, utils_1.verbose)();
55
- (0, utils_1.verbose)(false);
56
- await (0, utils_1.listAppMapFiles)(appMapDir, (fileName) => {
57
- const stats = fs.statSync(fileName);
58
- appMapSizes[fileName] = {
59
- path: (0, path_1.relative)(appMapDir, fileName),
60
- size: stats.size,
61
- };
62
- });
63
- (0, utils_1.verbose)(v);
64
- return appMapSizes;
65
- }
66
- async function sortAppMapSizes(appMapSizes) {
67
- let appMapSizesArray = [];
68
- for (const key in appMapSizes) {
69
- appMapSizesArray.push({
70
- path: appMapSizes[key].path,
71
- size: appMapSizes[key].size,
72
- });
73
- }
74
- return appMapSizesArray.sort((a, b) => b.size - a.size);
75
- }
76
- function sizeInMB(size) {
77
- return Number((size / 1000 / 1000).toFixed(1));
78
- }
79
- async function calculateExecutionTimes(appMapDir) {
80
- // now that all functions were collected, index them by function
81
- // name, not by <thread_id,parent_id>
82
- let totalFunctionExecutionTimes = {};
83
- // This function is too verbose to be useful in this context.
84
- const v = (0, utils_1.verbose)();
85
- (0, utils_1.verbose)(false);
86
- // Note that event#elapsed time does NOT include instrumentation overhead.
87
- // So, instrumentation / elapsed can theoretically be greater than 1.
88
- let totalTime = 0;
89
- await (0, utils_1.listAppMapFiles)(appMapDir, (fileName) => {
90
- const file = fs.readFileSync(fileName, 'utf-8');
91
- const appmapData = JSON.parse(file.toString());
92
- const appmap = (0, models_1.buildAppMap)(appmapData).build();
93
- appmap.events.forEach((event) => {
94
- if (event.isCall()) {
95
- const eventReturn = event.returnEvent;
96
- if (!eventReturn)
97
- return;
98
- const name = event.codeObject.fqid;
99
- let elapsedInstrumentationTime = eventReturn.elapsedInstrumentationTime || 0;
100
- let path = '';
101
- // some paths are library functions but don't start with /. i.e.:
102
- // <internal:pack>
103
- // OpenSSL::Cipher#decrypt
104
- // Kernel#eval
105
- if (event.definedClass &&
106
- event.path &&
107
- (event.path[0] == '/' ||
108
- event.path[0] == '<' ||
109
- event.path.includes('::') ||
110
- event.path.startsWith('Kernel'))) {
111
- // Absolute path names generally signify a library function.
112
- // Send library function data to help optimize AppMap;
113
- // don't send user function data.
114
- path = event.path;
115
- }
116
- // Total up the elapsed time of root events.
117
- if (!event.parent && eventReturn.elapsedTime) {
118
- totalTime += eventReturn.elapsedTime;
119
- }
120
- const existingRecord = totalFunctionExecutionTimes[name];
121
- if (!existingRecord) {
122
- totalFunctionExecutionTimes[name] = {
123
- path,
124
- numberOfCalls: 1,
125
- elapsedInstrumentationTime,
126
- };
127
- }
128
- else {
129
- existingRecord.numberOfCalls += 1;
130
- existingRecord.elapsedInstrumentationTime += elapsedInstrumentationTime;
131
- if (existingRecord.path === '')
132
- existingRecord.path = path;
133
- }
134
- }
135
- });
136
- });
137
- (0, utils_1.verbose)(v);
138
- // convert hash to array
139
- let flatFunctionExecutionTimes = [];
140
- for (const name in totalFunctionExecutionTimes) {
141
- flatFunctionExecutionTimes.push({
142
- name: name,
143
- elapsedInstrumentationTime: totalFunctionExecutionTimes[name].elapsedInstrumentationTime,
144
- numberOfCalls: totalFunctionExecutionTimes[name].numberOfCalls,
145
- path: totalFunctionExecutionTimes[name].path,
146
- });
147
- }
148
- return { totalTime, functions: flatFunctionExecutionTimes };
149
- }
150
- async function sortExecutionTimes(functionExecutionTimes) {
151
- // sort the array
152
- return functionExecutionTimes.sort((a, b) => b.elapsedInstrumentationTime - a.elapsedInstrumentationTime);
153
- }
154
- async function showStats() {
155
- let biggestAppMapSizes = [];
156
- // column names in JSON files use snakecase
157
- let slowestExecutionTimes = [];
158
- try {
159
- userInteraction_1.default.status = `Computing AppMap stats...`;
160
- const appMapDir = directoryToUse;
161
- const appMapSizes = await calculateAppMapSizes(appMapDir);
162
- const sortedAppMapSizes = await sortAppMapSizes(appMapSizes);
163
- userInteraction_1.default.success();
164
- userInteraction_1.default.progress('');
165
- userInteraction_1.default.progress(chalk_1.default.underline(`Largest AppMaps (which are bigger than ${MINIMUM_APPMAP_SIZE / 1024}kb)`));
166
- sortedAppMapSizes
167
- .filter((appmap) => appmap.size > MINIMUM_APPMAP_SIZE)
168
- .slice(0, limitToUse)
169
- .forEach((appmap) => {
170
- biggestAppMapSizes.push({
171
- size: appmap.size,
172
- path: appmap.path,
173
- });
174
- });
175
- if (json) {
176
- console.log(JSON.stringify(biggestAppMapSizes));
177
- }
178
- else {
179
- biggestAppMapSizes.forEach((appmap) => {
180
- console.log(sizeInMB(appmap.size) + 'MB ' + appmap.path);
181
- });
182
- }
183
- userInteraction_1.default.progress('');
184
- userInteraction_1.default.status = `Computing functions with highest AppMap overhead...`;
185
- const executionTimes = await calculateExecutionTimes(appMapDir);
186
- const sortedExecutionTimes = await sortExecutionTimes(executionTimes.functions);
187
- let totalInstrumentationTime = 0;
188
- sortedExecutionTimes.forEach((time) => (totalInstrumentationTime += time.elapsedInstrumentationTime));
189
- userInteraction_1.default.success();
190
- userInteraction_1.default.progress('');
191
- // if there are no instrumentation data don't show this report
192
- if (sortedExecutionTimes.length > 0 &&
193
- sortedExecutionTimes[0].elapsedInstrumentationTime === 0) {
194
- console.log("These AppMaps don't contain function overhead data. Please update your appmap package to the latest version.");
195
- }
196
- else {
197
- sortedExecutionTimes.slice(0, limitToUse).forEach((executionTime) => {
198
- slowestExecutionTimes.push({
199
- elapsed_instrumentation_time_total: Number(executionTime.elapsedInstrumentationTime.toFixed(6)),
200
- num_calls: executionTime.numberOfCalls,
201
- name: executionTime.name,
202
- path: executionTime.path,
203
- });
204
- });
205
- if (json) {
206
- console.log(JSON.stringify(slowestExecutionTimes));
207
- }
208
- else {
209
- userInteraction_1.default.progress(chalk_1.default.underline(`Total instrumentation time`));
210
- console.log(`${Math.round(totalInstrumentationTime * 1000)}ms`);
211
- userInteraction_1.default.progress('');
212
- userInteraction_1.default.progress(chalk_1.default.underline(`Functions with highest AppMap overhead`));
213
- console.log(chalk_1.default.underline([
214
- 'Time'.padStart(9),
215
- '%'.padStart(5),
216
- 'Count'.padStart(7),
217
- 'Function name'.padEnd(30),
218
- ].join(' | ')));
219
- slowestExecutionTimes.forEach((executionTime) => {
220
- const displayMs = [
221
- Math.round(executionTime.elapsed_instrumentation_time_total * 1000).toString(),
222
- 'ms',
223
- ].join('');
224
- const displayPercent = `${(Math.round((executionTime.elapsed_instrumentation_time_total / totalInstrumentationTime) *
225
- 1000) / 10).toLocaleString('en-us', { maximumFractionDigits: 2, minimumFractionDigits: 0 })}%`;
226
- console.log([
227
- displayMs.padStart(9),
228
- displayPercent.padStart(5),
229
- executionTime.num_calls.toString().padStart(7),
230
- executionTime.name.split(':').slice(1).join(':'),
231
- ].join(' | '));
232
- });
233
- }
234
- }
235
- let telemetryMetrics = {};
236
- let telemetryMetricsCounter = 1;
237
- biggestAppMapSizes.forEach((appmap) => {
238
- telemetryMetrics[`biggestAppmaps_${telemetryMetricsCounter}`] = appmap.size;
239
- telemetryMetricsCounter += 1;
240
- });
241
- telemetryMetricsCounter = 1;
242
- slowestExecutionTimes.forEach((executionTime) => {
243
- telemetryMetrics[`slowestInstrumentationTimesTotal_${telemetryMetricsCounter}`] =
244
- executionTime.elapsed_instrumentation_time_total;
245
- telemetryMetrics[`slowestInstrumentationTimesPath_${telemetryMetricsCounter}`] =
246
- executionTime.path;
247
- telemetryMetricsCounter += 1;
248
- });
249
- telemetry_1.default.sendEvent({
250
- name: `stats:${handlerCaller}:success`,
251
- properties: {
252
- path: appMapDir,
253
- },
254
- metrics: telemetryMetrics,
255
- });
256
- }
257
- catch (err) {
258
- let errorMessage = err.toString();
259
- if (err instanceof Error) {
260
- telemetry_1.default.sendEvent({
261
- name: `stats:${handlerCaller}:error`,
262
- properties: {
263
- errorMessage,
264
- errorStack: err.stack,
265
- },
266
- });
267
- }
268
- }
269
- return [biggestAppMapSizes, slowestExecutionTimes];
270
- }
271
- return await showStats();
272
- };
273
- return await commandFn();
85
+ (0, handleWorkingDirectory_1.handleWorkingDirectory)(argv.directory);
86
+ const appmapDir = await (0, locateAppMapDir_1.locateAppMapDir)(argv.appmapDir);
87
+ const { format, limit, appmapFile } = argv;
88
+ if (appmapFile) {
89
+ const fileToAnalyze = await locateAppMapFile(appmapFile, appmapDir);
90
+ if (!fileToAnalyze)
91
+ return;
92
+ console.warn(`Analyzing AppMap: ${fileToAnalyze}`);
93
+ return await (0, statsForMap_1.statsForMap)(format, limit, fileToAnalyze);
94
+ }
95
+ return await (0, statsForDirectory_1.statsForDirectory)(appmapDir, format, limit, handlerCaller);
274
96
  }
275
97
  exports.handler = handler;
276
98
  exports.default = {
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/cmds/stats/stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/cmds/stats/stats.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appland/appmap",
3
- "version": "3.69.0",
3
+ "version": "3.70.0",
4
4
  "description": "",
5
5
  "bin": "built/cli.js",
6
6
  "publishConfig": {