cost-monitoring-construct
Version:
A CDK construct that helps track applications' costs separately and receive alerts in case of unpredicted resource usage
95 lines • 11.1 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IBudgetStrategy = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const utils_1 = require("./utils");
class IBudgetStrategy {
/**
* defines the stratcure of a BudgetStategy class.
*
* @param construct - use to define it's resources inside it.
* @param props.monthlyBudget - montly budget in US Dollors.
* @param props.defaultTopic - default SNS topic name. Only if provided, the BudgetStratgy creates an SNS topic and send notifications to it.
* @param props.subscribers - list of email address that the BudgetStrategy will use to send alerts to.
*/
constructor(construct, props) {
this.stack = construct;
this.props = props;
if (props.defaultTopic) {
this._defaultTopic = new aws_cdk_lib_1.aws_sns.Topic(this.stack, `${props.defaultTopic}-topic`, {
topicName: props.defaultTopic,
});
}
}
/**
* creates all the daily, monthly, quaryerly, and yearly budgets based on the implementation of the related methods.
*/
createBudgets() {
this.createDailyBudgets(this.dailyLimit, this.createAllSubscribers());
this.createMonthlyBudgets(this.monthlyLimit, this.createAllSubscribers());
this.createQuarterlyBudgets(this.quarterlyLimit, this.createAllSubscribers());
this.createYearlyBudgets(this.yearlyLimit, this.createAllSubscribers());
}
createAllSubscribers() {
const snsSubscriber = this.createSNSSubscriber();
if (snsSubscriber) {
return [...this.createEmailSubscribers(), snsSubscriber];
}
else {
return this.createEmailSubscribers();
}
}
createSNSSubscriber() {
if (!this.defaultTopic) {
return;
}
return {
subscriptionType: utils_1.SubscriptionType.SNS,
address: this.defaultTopic?.topicArn,
};
}
createEmailSubscribers() {
return (this.props.subscribers?.map((email) => {
return {
subscriptionType: utils_1.SubscriptionType.EMAIL,
address: email,
};
}) ?? []);
}
/**
* Return default SNS topic only if the defultTopic prop has been passed when instantiating.
*/
get defaultTopic() {
return this._defaultTopic;
}
/**
* calculates daily limit based on the provided monthly limit.
*/
get dailyLimit() {
return Math.floor(this.monthlyLimit / 30);
}
/**
* returns montly limit.
*/
get monthlyLimit() {
return this.props.monthlyLimitInDollars;
}
/**
* calculates quarterly limit based on the provided monthly limit.
*/
get quarterlyLimit() {
return this.monthlyLimit * 3;
}
/**
* calculates yearly limit based on the provided daily budget.
*/
get yearlyLimit() {
return this.dailyLimit * 365;
}
}
exports.IBudgetStrategy = IBudgetStrategy;
_a = JSII_RTTI_SYMBOL_1;
IBudgetStrategy[_a] = { fqn: "cost-monitoring-construct.IBudgetStrategy", version: "1.2.3" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVkZ2V0LXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1ZGdldC1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0RTtBQUM1RSxtQ0FBa0Q7QUFRbEQsTUFBc0IsZUFBZTtJQUtuQzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxTQUFnQixFQUFFLEtBQTJCO1FBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUkscUJBQUcsQ0FBQyxLQUFLLENBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQ1YsR0FBRyxLQUFLLENBQUMsWUFBWSxRQUFRLEVBQzdCO2dCQUNFLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWTthQUM5QixDQUNGLENBQUM7U0FDSDtJQUNILENBQUM7SUFtQkQ7O09BRUc7SUFDSSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsc0JBQXNCLENBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUM1QixDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWpELElBQUksYUFBYSxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzFEO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUd6QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixPQUFPO1NBQ1I7UUFFRCxPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsd0JBQWdCLENBQUMsR0FBRztZQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLE9BQU8sQ0FDTCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwQyxPQUFPO2dCQUNMLGdCQUFnQixFQUFFLHdCQUFnQixDQUFDLEtBQUs7Z0JBQ3hDLE9BQU8sRUFBRSxLQUFLO2FBQ2YsQ0FBQztRQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUMvQixDQUFDOztBQTdISCwwQ0E4SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgYXdzX3NucyBhcyBzbnMsIGF3c19idWRnZXRzIGFzIGJ1ZGdldHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEVtYWlsLCBTdWJzY3JpcHRpb25UeXBlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQnVkZ2V0U3RyYXRlZ3lQcm9wcyB7XG4gIG1vbnRobHlMaW1pdEluRG9sbGFyczogbnVtYmVyO1xuICBzdWJzY3JpYmVyczogQXJyYXk8RW1haWw+O1xuICBkZWZhdWx0VG9waWM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJQnVkZ2V0U3RyYXRlZ3kge1xuICBwcml2YXRlIHByb3BzOiBJQnVkZ2V0U3RyYXRlZ3lQcm9wcztcbiAgcHJpdmF0ZSBfZGVmYXVsdFRvcGljPzogc25zLlRvcGljO1xuICBwcm90ZWN0ZWQgc3RhY2s6IFN0YWNrO1xuXG4gIC8qKlxuICAgKiBkZWZpbmVzIHRoZSBzdHJhdGN1cmUgb2YgYSBCdWRnZXRTdGF0ZWd5IGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gY29uc3RydWN0IC0gdXNlIHRvIGRlZmluZSBpdCdzIHJlc291cmNlcyBpbnNpZGUgaXQuXG4gICAqIEBwYXJhbSBwcm9wcy5tb250aGx5QnVkZ2V0IC0gbW9udGx5IGJ1ZGdldCBpbiBVUyBEb2xsb3JzLlxuICAgKiBAcGFyYW0gcHJvcHMuZGVmYXVsdFRvcGljIC0gZGVmYXVsdCBTTlMgdG9waWMgbmFtZS4gT25seSBpZiBwcm92aWRlZCwgdGhlIEJ1ZGdldFN0cmF0Z3kgY3JlYXRlcyBhbiBTTlMgdG9waWMgYW5kIHNlbmQgbm90aWZpY2F0aW9ucyB0byBpdC5cbiAgICogQHBhcmFtIHByb3BzLnN1YnNjcmliZXJzIC0gbGlzdCBvZiBlbWFpbCBhZGRyZXNzIHRoYXQgdGhlIEJ1ZGdldFN0cmF0ZWd5IHdpbGwgdXNlIHRvIHNlbmQgYWxlcnRzIHRvLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uc3RydWN0OiBTdGFjaywgcHJvcHM6IElCdWRnZXRTdHJhdGVneVByb3BzKSB7XG4gICAgdGhpcy5zdGFjayA9IGNvbnN0cnVjdDtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFRvcGljKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0VG9waWMgPSBuZXcgc25zLlRvcGljKFxuICAgICAgICB0aGlzLnN0YWNrLFxuICAgICAgICBgJHtwcm9wcy5kZWZhdWx0VG9waWN9LXRvcGljYCxcbiAgICAgICAge1xuICAgICAgICAgIHRvcGljTmFtZTogcHJvcHMuZGVmYXVsdFRvcGljLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEYWlseUJ1ZGdldHMoXG4gICAgZGFpbHlMaW1pdDogbnVtYmVyLFxuICAgIHN1YnNjcmliZXJzOiBBcnJheTxidWRnZXRzLkNmbkJ1ZGdldC5TdWJzY3JpYmVyUHJvcGVydHk+XG4gICk6IHZvaWQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVNb250aGx5QnVkZ2V0cyhcbiAgICBtb250aGx5TGltaXQ6IG51bWJlcixcbiAgICBzdWJzY3JpYmVyczogQXJyYXk8YnVkZ2V0cy5DZm5CdWRnZXQuU3Vic2NyaWJlclByb3BlcnR5PlxuICApOiB2b2lkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlUXVhcnRlcmx5QnVkZ2V0cyhcbiAgICBxdWFydGVybHlMaW1pdDogbnVtYmVyLFxuICAgIHN1YnNjcmliZXJzOiBBcnJheTxidWRnZXRzLkNmbkJ1ZGdldC5TdWJzY3JpYmVyUHJvcGVydHk+XG4gICk6IHZvaWQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVZZWFybHlCdWRnZXRzKFxuICAgIHllYXJseUxpbWl0OiBudW1iZXIsXG4gICAgc3Vic2NyaWJlcnM6IEFycmF5PGJ1ZGdldHMuQ2ZuQnVkZ2V0LlN1YnNjcmliZXJQcm9wZXJ0eT5cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogY3JlYXRlcyBhbGwgdGhlIGRhaWx5LCBtb250aGx5LCBxdWFyeWVybHksIGFuZCB5ZWFybHkgYnVkZ2V0cyBiYXNlZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlbGF0ZWQgbWV0aG9kcy5cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCdWRnZXRzKCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRGFpbHlCdWRnZXRzKHRoaXMuZGFpbHlMaW1pdCwgdGhpcy5jcmVhdGVBbGxTdWJzY3JpYmVycygpKTtcbiAgICB0aGlzLmNyZWF0ZU1vbnRobHlCdWRnZXRzKHRoaXMubW9udGhseUxpbWl0LCB0aGlzLmNyZWF0ZUFsbFN1YnNjcmliZXJzKCkpO1xuICAgIHRoaXMuY3JlYXRlUXVhcnRlcmx5QnVkZ2V0cyhcbiAgICAgIHRoaXMucXVhcnRlcmx5TGltaXQsXG4gICAgICB0aGlzLmNyZWF0ZUFsbFN1YnNjcmliZXJzKClcbiAgICApO1xuICAgIHRoaXMuY3JlYXRlWWVhcmx5QnVkZ2V0cyh0aGlzLnllYXJseUxpbWl0LCB0aGlzLmNyZWF0ZUFsbFN1YnNjcmliZXJzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBbGxTdWJzY3JpYmVycygpOiBBcnJheTxidWRnZXRzLkNmbkJ1ZGdldC5TdWJzY3JpYmVyUHJvcGVydHk+IHtcbiAgICBjb25zdCBzbnNTdWJzY3JpYmVyID0gdGhpcy5jcmVhdGVTTlNTdWJzY3JpYmVyKCk7XG5cbiAgICBpZiAoc25zU3Vic2NyaWJlcikge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmNyZWF0ZUVtYWlsU3Vic2NyaWJlcnMoKSwgc25zU3Vic2NyaWJlcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtYWlsU3Vic2NyaWJlcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNOU1N1YnNjcmliZXIoKTpcbiAgICB8IGJ1ZGdldHMuQ2ZuQnVkZ2V0LlN1YnNjcmliZXJQcm9wZXJ0eVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdFRvcGljKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YnNjcmlwdGlvblR5cGU6IFN1YnNjcmlwdGlvblR5cGUuU05TLFxuICAgICAgYWRkcmVzczogdGhpcy5kZWZhdWx0VG9waWM/LnRvcGljQXJuLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVtYWlsU3Vic2NyaWJlcnMoKTogQXJyYXk8YnVkZ2V0cy5DZm5CdWRnZXQuU3Vic2NyaWJlclByb3BlcnR5PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucHJvcHMuc3Vic2NyaWJlcnM/Lm1hcCgoZW1haWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25UeXBlOiBTdWJzY3JpcHRpb25UeXBlLkVNQUlMLFxuICAgICAgICAgIGFkZHJlc3M6IGVtYWlsLFxuICAgICAgICB9O1xuICAgICAgfSkgPz8gW11cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBkZWZhdWx0IFNOUyB0b3BpYyBvbmx5IGlmIHRoZSBkZWZ1bHRUb3BpYyBwcm9wIGhhcyBiZWVuIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRUb3BpYygpOiBzbnMuVG9waWMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VG9waWM7XG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlcyBkYWlseSBsaW1pdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbW9udGhseSBsaW1pdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGFpbHlMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMubW9udGhseUxpbWl0IC8gMzApO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgbW9udGx5IGxpbWl0LlxuICAgKi9cbiAgcHVibGljIGdldCBtb250aGx5TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tb250aGx5TGltaXRJbkRvbGxhcnM7XG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlcyBxdWFydGVybHkgbGltaXQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vbnRobHkgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1YXJ0ZXJseUxpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhseUxpbWl0ICogMztcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGVzIHllYXJseSBsaW1pdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGFpbHkgYnVkZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldCB5ZWFybHlMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRhaWx5TGltaXQgKiAzNjU7XG4gIH1cbn1cbiJdfQ==