cloud-report
Version:
Collects and analyzes cloud resources
104 lines (103 loc) • 5.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("../../../types");
const base_1 = require("../../base");
class ESInstancesReservationAnalyzer extends base_1.BaseAnalyzer {
analyze(params, fullReport) {
const allDomains = params.domains;
const allReservedInstances = params.reserved_instances;
if (!allDomains || !allReservedInstances) {
return undefined;
}
const instances_reserved = { type: types_1.CheckAnalysisType.CostOptimization };
instances_reserved.what = "Are Elasticsearch Instances reserved?";
instances_reserved.why = `You can reserve the Elasticsearch Service domain
which are you going to run for long time to save the cost.`;
instances_reserved.recommendation = "Recommended to reserve all long running instances";
instances_reserved.benchmark = ['all'];
const allRegionsAnalysis = {};
for (const region in allDomains) {
const regionDomains = allDomains[region];
allRegionsAnalysis[region] = [];
const instanceCountMap = this.getCountOfInstancesReservedByInstanceType(allReservedInstances[region]);
for (const domain of regionDomains) {
if (!domain.ElasticsearchClusterConfig) {
continue;
}
const instanceType = domain.ElasticsearchClusterConfig.InstanceType;
let instanceCount = domain.ElasticsearchClusterConfig.InstanceCount;
const masterInstanceType = domain.ElasticsearchClusterConfig.InstanceType;
const masterInstanceCount = domain.ElasticsearchClusterConfig.DedicatedMasterCount;
const domainInstancesAnalysis = {};
domainInstancesAnalysis.resource = domain;
domainInstancesAnalysis.resourceSummary = {
name: "DomainInstanceType",
value: `${domain.DomainName} | ${instanceType}`,
};
const dedicatedMasterEnabled = domain.ElasticsearchClusterConfig.DedicatedMasterEnabled;
if (dedicatedMasterEnabled && instanceType === masterInstanceType) {
instanceCount += masterInstanceCount;
}
if (this.getInstancesReservedCount(instanceCountMap, instanceType, instanceCount) === instanceCount) {
domainInstancesAnalysis.severity = types_1.SeverityStatus.Good;
domainInstancesAnalysis.message = "All Instances are reserved";
}
else {
domainInstancesAnalysis.severity = types_1.SeverityStatus.Warning;
domainInstancesAnalysis.message = "Some of the Instances are not reserved";
domainInstancesAnalysis.action = "Reserve the instances to save costs";
}
allRegionsAnalysis[region].push(domainInstancesAnalysis);
if (dedicatedMasterEnabled && instanceType !== masterInstanceType) {
const domainMasterInstancesAnalysis = {};
domainMasterInstancesAnalysis.resource = domain;
domainMasterInstancesAnalysis.resourceSummary = {
name: "DomainInstanceType",
value: `${domain.DomainName} | ${masterInstanceType}`,
};
if (this.getInstancesReservedCount(instanceCountMap, masterInstanceType, masterInstanceCount) === masterInstanceCount) {
domainMasterInstancesAnalysis.severity = types_1.SeverityStatus.Good;
domainMasterInstancesAnalysis.message = "All Instances are reserved";
}
else {
domainMasterInstancesAnalysis.severity = types_1.SeverityStatus.Warning;
domainMasterInstancesAnalysis.message = "Some of the Instances are not reserved";
domainMasterInstancesAnalysis.action = "Reserve the instances to save costs";
}
allRegionsAnalysis[region].push(domainMasterInstancesAnalysis);
}
}
}
instances_reserved.regions = allRegionsAnalysis;
return { instances_reserved };
}
getCountOfInstancesReservedByInstanceType(reservedInstances) {
if (!reservedInstances || !reservedInstances.length) {
return {};
}
return reservedInstances.filter((reservedInstance) => {
return reservedInstance.State === "active";
}).reduce((instanceCountMap, reservedInstance) => {
instanceCountMap[reservedInstance.ElasticsearchInstanceType]
= instanceCountMap[reservedInstance.ElasticsearchInstanceType] || { actual: 0, used: 0 };
instanceCountMap[reservedInstance.ElasticsearchInstanceType].actual
+= reservedInstance.ElasticsearchInstanceCount;
return instanceCountMap;
}, {});
}
getInstancesReservedCount(instanceCountMap, instanceType, instanceCount) {
const instanceCountObj = instanceCountMap[instanceType];
if (!instanceCountObj) {
return 0;
}
if (instanceCount <= instanceCountObj.actual - instanceCountObj.used) {
instanceCountObj.used += instanceCount;
return instanceCount;
}
else {
instanceCountObj.used = instanceCountObj.actual;
return instanceCountObj.actual - instanceCountObj.used;
}
}
}
exports.ESInstancesReservationAnalyzer = ESInstancesReservationAnalyzer;