@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
128 lines • 12.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const SfpCommand_1 = __importDefault(require("../../../SfpCommand"));
const SFPStatsSender_1 = __importDefault(require("../../../core/stats/SFPStatsSender"));
const PoolListImpl_1 = __importDefault(require("../../../core/scratchorg/pool/PoolListImpl"));
const LimitsFetcher_1 = __importDefault(require("../../../core/limits/LimitsFetcher"));
const Table = require('cli-table');
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const core_1 = require("@salesforce/core");
const sfdxflags_1 = require("../../../flags/sfdxflags");
// Initialize Messages with the current plugin directory
core_1.Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'scratchorg_pool_metrics_publish');
class Publish extends SfpCommand_1.default {
async execute() {
this.validateEnvVars();
let nPooledScratchOrgs = 0;
let pools;
try {
const listOfScratchOrgs = (await new PoolListImpl_1.default(this.hubOrg, null, true).execute());
nPooledScratchOrgs = listOfScratchOrgs.length ? listOfScratchOrgs.length : 0;
pools = this.getMetricsForEachPool(listOfScratchOrgs);
}
catch (err) {
sfp_logger_1.default.log(`Failed to get metrics for scratch org pools. Ensure prerequisites are installed for pooling.`, sfp_logger_1.LoggerLevel.TRACE);
}
const table = new Table({
head: ['Metric', 'Value', 'Tag'],
});
const limits = await new LimitsFetcher_1.default(this.hubOrg.getConnection()).getApiLimits();
const remainingActiveScratchOrgs = limits.find((limit) => limit.name === 'ActiveScratchOrgs').remaining;
const remainingDailyScratchOrgs = limits.find((limit) => limit.name === 'DailyScratchOrgs').remaining;
const devhubUserName = this.hubOrg.getUsername();
SFPStatsSender_1.default.logGauge(`scratchorgs.active.remaining`, remainingActiveScratchOrgs, { target_org: devhubUserName });
SFPStatsSender_1.default.logGauge(`scratchorgs.daily.remaining`, remainingDailyScratchOrgs, { target_org: devhubUserName });
table.push(['sfpowerscripts.scratchorgs.active.remaining', remainingActiveScratchOrgs, devhubUserName]);
table.push(['sfpowerscripts.scratchorgs.daily.remaining', remainingDailyScratchOrgs, devhubUserName]);
SFPStatsSender_1.default.logGauge(`pool.footprint`, nPooledScratchOrgs);
table.push(['sfpowerscripts.pool.footprint', nPooledScratchOrgs, '']);
if (pools) {
for (let pool of Object.entries(pools)) {
SFPStatsSender_1.default.logGauge('pool.total', pool[1].nTotal, { poolName: pool[0] });
SFPStatsSender_1.default.logGauge('pool.available', pool[1].nAvailable, { poolName: pool[0] });
SFPStatsSender_1.default.logGauge('pool.inuse', pool[1].nInUse, { poolName: pool[0] });
SFPStatsSender_1.default.logGauge('pool.provisioning', pool[1].nProvisioningInProgress, { poolName: pool[0] });
table.push(['sfpowerscripts.pool.total', pool[1].nTotal, pool[0]]);
table.push(['sfpowerscripts.pool.available', pool[1].nAvailable, pool[0]]);
table.push(['sfpowerscripts.pool.inuse', pool[1].nInUse, pool[0]]);
table.push(['sfpowerscripts.pool.provisioning', pool[1].nProvisioningInProgress, pool[0]]);
}
}
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)('Metrics published:'), sfp_logger_1.LoggerLevel.INFO);
sfp_logger_1.default.log(table.toString(), sfp_logger_1.LoggerLevel.INFO);
}
getMetricsForEachPool(listOfScratchOrgs) {
const pools = {};
listOfScratchOrgs.forEach((scratchOrg) => {
if (!pools[scratchOrg.tag]) {
pools[scratchOrg.tag] = {
nTotal: 0,
nAvailable: 0,
nInUse: 0,
nProvisioningInProgress: 0,
};
}
if (scratchOrg.status === 'Available') {
pools[scratchOrg.tag].nAvailable++;
}
else if (scratchOrg.status === 'In use') {
pools[scratchOrg.tag].nInUse++;
}
else if (scratchOrg.status === 'Provisioning in progress') {
pools[scratchOrg.tag].nProvisioningInProgress++;
}
pools[scratchOrg.tag].nTotal =
pools[scratchOrg.tag].nAvailable +
pools[scratchOrg.tag].nInUse +
pools[scratchOrg.tag].nProvisioningInProgress;
});
return pools;
}
validateEnvVars() {
if (!(process.env.SFPOWERSCRIPTS_STATSD ||
process.env.SFPOWERSCRIPTS_DATADOG ||
process.env.SFPOWERSCRIPTS_NEWRELIC ||
process.env.SFPOWERSCRIPTS_SPLUNK)) {
throw new Error('Environment variable not set for metrics. No metrics will be published.');
}
}
}
Publish.description = messages.getMessage('commandDescription');
Publish.requiresDevhubUsername = true;
Publish.requiresProject = false;
Publish.examples = ['$ sfp pool:metrics:publish -v <myDevHub>'];
Publish.flags = {
targetdevhubusername: sfdxflags_1.targetdevhubusername,
loglevel: sfdxflags_1.loglevel
};
exports.default = Publish;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kcy9wb29sL21ldHJpY3MvcHVibGlzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUVBQTZDO0FBQzdDLHdGQUFnRTtBQUNoRSw4RkFBc0U7QUFFdEUsdUZBQStEO0FBQy9ELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNuQyxtRUFBaUY7QUFDakYsMkNBQTRDO0FBQzVDLHdEQUEwRTtBQUUxRSx3REFBd0Q7QUFDeEQsZUFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTVDLGlHQUFpRztBQUNqRyxtRkFBbUY7QUFDbkYsTUFBTSxRQUFRLEdBQUcsZUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztBQUUzRixNQUFxQixPQUFRLFNBQVEsb0JBQVU7SUFhcEMsS0FBSyxDQUFDLE9BQU87UUFDaEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLElBQUksa0JBQWtCLEdBQVcsQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBbUMsQ0FBQztRQUV4QyxJQUFJLENBQUM7WUFDRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxJQUFJLHNCQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQWlCLENBQUM7WUFFdEcsa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxvQkFBUyxDQUFDLEdBQUcsQ0FDVCw4RkFBOEYsRUFDOUYsd0JBQVcsQ0FBQyxLQUFLLENBQ3BCLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUM7WUFDcEIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLHVCQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ25GLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEcsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUVoRCx3QkFBYyxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSwwQkFBMEIsRUFBRSxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFDO1FBQ2xILHdCQUFjLENBQUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLEVBQUMsVUFBVSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUM7UUFFaEgsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLDZDQUE2QyxFQUFFLDBCQUEwQixFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDeEcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLDRDQUE0QyxFQUFFLHlCQUF5QixFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFdEcsd0JBQWMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUM5RCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsK0JBQStCLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLHdCQUFjLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdFLHdCQUFjLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckYsd0JBQWMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0Usd0JBQWMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXJHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0wsQ0FBQztRQUVELG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEsOEJBQWlCLEVBQUMsb0JBQW9CLENBQUMsRUFBRSx3QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLG9CQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSx3QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxpQkFBK0I7UUFDekQsTUFBTSxLQUFLLEdBQWlDLEVBQUUsQ0FBQztRQUUvQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO29CQUNwQixNQUFNLEVBQUUsQ0FBQztvQkFDVCxVQUFVLEVBQUUsQ0FBQztvQkFDYixNQUFNLEVBQUUsQ0FBQztvQkFDVCx1QkFBdUIsRUFBRSxDQUFDO2lCQUM3QixDQUFDO1lBQ04sQ0FBQztZQUNELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSywwQkFBMEIsRUFBRSxDQUFDO2dCQUMxRCxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDcEQsQ0FBQztZQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTTtnQkFDeEIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVO29CQUNoQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU07b0JBQzVCLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsdUJBQXVCLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUNJLENBQUMsQ0FDRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtZQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQjtZQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QjtZQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUNwQyxFQUNILENBQUM7WUFDQyxNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7UUFDL0YsQ0FBQztJQUNMLENBQUM7O0FBMUdhLG1CQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRXJELDhCQUFzQixHQUFHLElBQUksQ0FBQztBQUM5Qix1QkFBZSxHQUFHLEtBQUssQ0FBQztBQUUzQixnQkFBUSxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztBQUV4RCxhQUFLLEdBQUc7SUFDbkIsb0JBQW9CLEVBQXBCLGdDQUFvQjtJQUNwQixRQUFRLEVBQVIsb0JBQVE7Q0FDVixDQUFDO2tCQVhlLE9BQU8ifQ==