eae5d8c807
These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
138 lines
5.3 KiB
JavaScript
138 lines
5.3 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
'use strict';
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.submitAllStats = exports.createStatsStream = void 0;
|
|
const es = require("event-stream");
|
|
const fancyLog = require("fancy-log");
|
|
const ansiColors = require("ansi-colors");
|
|
class Entry {
|
|
constructor(name, totalCount, totalSize) {
|
|
this.name = name;
|
|
this.totalCount = totalCount;
|
|
this.totalSize = totalSize;
|
|
}
|
|
toString(pretty) {
|
|
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 '${ansiColors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`;
|
|
}
|
|
else {
|
|
const count = this.totalCount < 100
|
|
? ansiColors.green(this.totalCount.toString())
|
|
: ansiColors.red(this.totalCount.toString());
|
|
return `Stats for '${ansiColors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const _entries = new Map();
|
|
function createStatsStream(group, log) {
|
|
const entry = new Entry(group, 0, 0);
|
|
_entries.set(entry.name, entry);
|
|
return es.through(function (data) {
|
|
const file = data;
|
|
if (typeof file.path === 'string') {
|
|
entry.totalCount += 1;
|
|
if (Buffer.isBuffer(file.contents)) {
|
|
entry.totalSize += file.contents.length;
|
|
}
|
|
else if (file.stat && typeof file.stat.size === 'number') {
|
|
entry.totalSize += file.stat.size;
|
|
}
|
|
else {
|
|
// funky file...
|
|
}
|
|
}
|
|
this.emit('data', data);
|
|
}, function () {
|
|
if (log) {
|
|
if (entry.totalCount === 1) {
|
|
fancyLog(`Stats for '${ansiColors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`);
|
|
}
|
|
else {
|
|
const count = entry.totalCount < 100
|
|
? ansiColors.green(entry.totalCount.toString())
|
|
: ansiColors.red(entry.totalCount.toString());
|
|
fancyLog(`Stats for '${ansiColors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`);
|
|
}
|
|
}
|
|
this.emit('end');
|
|
});
|
|
}
|
|
exports.createStatsStream = createStatsStream;
|
|
function submitAllStats(productJson, commit) {
|
|
const appInsights = require('applicationinsights');
|
|
const sorted = [];
|
|
// move entries for single files to the front
|
|
_entries.forEach(value => {
|
|
if (value.totalCount === 1) {
|
|
sorted.unshift(value);
|
|
}
|
|
else {
|
|
sorted.push(value);
|
|
}
|
|
});
|
|
// print to console
|
|
for (const entry of sorted) {
|
|
console.log(entry.toString(true));
|
|
}
|
|
// 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(false);
|
|
}
|
|
return new Promise(resolve => {
|
|
try {
|
|
const sizes = {};
|
|
const counts = {};
|
|
for (const entry of sorted) {
|
|
sizes[entry.name] = entry.totalSize;
|
|
counts[entry.name] = entry.totalCount;
|
|
}
|
|
appInsights.setup(productJson.aiConfig.asimovKey)
|
|
.setAutoCollectConsole(false)
|
|
.setAutoCollectExceptions(false)
|
|
.setAutoCollectPerformance(false)
|
|
.setAutoCollectRequests(false)
|
|
.setAutoCollectDependencies(false)
|
|
.setAutoDependencyCorrelation(false)
|
|
.start();
|
|
appInsights.defaultClient.config.endpointUrl = 'https://vortex.data.microsoft.com/collect/v1';
|
|
/* __GDPR__
|
|
"monacoworkbench/packagemetrics" : {
|
|
"commit" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
|
"size" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
|
"count" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
|
|
}
|
|
*/
|
|
appInsights.defaultClient.trackEvent({
|
|
name: 'monacoworkbench/packagemetrics',
|
|
properties: { commit, size: JSON.stringify(sizes), count: JSON.stringify(counts) }
|
|
});
|
|
appInsights.defaultClient.flush({
|
|
callback: () => {
|
|
appInsights.dispose();
|
|
resolve(true);
|
|
}
|
|
});
|
|
}
|
|
catch (err) {
|
|
console.error('ERROR sending build stats as telemetry event!');
|
|
console.error(err);
|
|
resolve(false);
|
|
}
|
|
});
|
|
}
|
|
exports.submitAllStats = submitAllStats;
|