stats.ts 3.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

import * as es from 'event-stream';
import * as util from 'gulp-util';
import * as File from 'vinyl';
11
import * as appInsights from 'applicationinsights';
12 13 14 15

class Entry {
	constructor(readonly name: string, public totalCount: number, public totalSize: number) { }

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
	toString(pretty?: boolean): string {
		if (!pretty) {
			if (this.totalCount === 1) {
				return `${this.name}: ${this.totalSize} bytes`;
			} else {
				return `${this.name}: ${this.totalCount} files with ${this.totalSize} bytes`;
			}
		} else {
			if (this.totalCount === 1) {
				return `Stats for '${util.colors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`;

			} else {
				let count = this.totalCount < 100
					? util.colors.green(this.totalCount.toString())
					: util.colors.red(this.totalCount.toString());

				return `Stats for '${util.colors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`;
			}
		}
35 36 37 38 39
	}
}

const _entries = new Map<string, Entry>();

40
export function createStatsStream(group: string, log?: boolean): es.ThroughStream {
41 42 43 44

	const entry = new Entry(group, 0, 0);
	_entries.set(entry.name, entry);

45
	return es.through(function (data) {
46 47 48
		let file = data as File;
		if (typeof file.path === 'string') {
			entry.totalCount += 1;
49 50 51
			if (Buffer.isBuffer(file.contents)) {
				entry.totalSize += file.contents.length;
			} else if (file.stat && typeof file.stat.size === 'number') {
52
				entry.totalSize += file.stat.size;
53 54
			} else {
				// funky file...
55 56 57
			}
		}
		this.emit('data', data);
58
	}, function () {
59
		if (log) {
60 61
			if (entry.totalCount === 1) {
				util.log(`Stats for '${util.colors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`);
62

63 64 65 66 67 68 69
			} else {
				let count = entry.totalCount < 100
					? util.colors.green(entry.totalCount.toString())
					: util.colors.red(entry.totalCount.toString());

				util.log(`Stats for '${util.colors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`);
			}
70
		}
71 72 73

		this.emit('end');
	});
74
}
75

76 77
export function submitAllStats(productJson: any): Promise<void> {

78
	let sorted: Entry[] = [];
79
	// move entries for single files to the front
80 81 82 83 84 85 86
	_entries.forEach(value => {
		if (value.totalCount === 1) {
			sorted.unshift(value);
		} else {
			sorted.push(value);
		}
	});
87 88

	// print to console
89 90 91
	for (const entry of sorted) {
		console.log(entry.toString(true));
	}
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

	// send data as telementry event when the
	// product is configured to send telemetry
	if (!productJson || !productJson.aiConfig || typeof productJson.aiConfig.asimovKey !== 'string') {
		return Promise.resolve();
	}

	return new Promise(resolve => {

		const measurements = Object.create(null);
		for (const entry of sorted) {
			measurements[`${entry.name}.size`] = entry.totalSize;
			measurements[`${entry.name}.count`] = entry.totalCount;
		}

		appInsights.setup(productJson.aiConfig.asimovKey)
			.setAutoCollectConsole(false)
			.setAutoCollectExceptions(false)
			.setAutoCollectPerformance(false)
			.setAutoCollectRequests(false)
			.start();

J
Johannes Rieken 已提交
114 115 116
		const client = appInsights.getClient(productJson.aiConfig.asimovKey);
		client.config.endpointUrl = 'https://vortex.data.microsoft.com/collect/v1';

117 118 119 120 121
		/* __GDPR__
			"monacoworkbench/bundleStats" : {
				"outcome" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }
			}
		*/
J
Johannes Rieken 已提交
122 123
		client.trackEvent(`monacoworkbench/bundleStats`, undefined, measurements);
		client.sendPendingData(() => resolve());
124 125
	});

126
}