cloud-report
Version:
Collects and analyzes cloud resources
71 lines (70 loc) • 3.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("../../../types");
const base_1 = require("../../base");
class ApiGateway5xxAlarmsAnalyzer extends base_1.BaseAnalyzer {
analyze(params, fullReport) {
const allAlarms = params.alarms;
if (!allAlarms || !fullReport["aws.apigateway"] || !fullReport["aws.apigateway"].apis) {
return undefined;
}
const allApis = fullReport["aws.apigateway"].apis;
const api_5xx_errors_alarms = { type: types_1.CheckAnalysisType.OperationalExcellence };
api_5xx_errors_alarms.what = "Are alarms are enabled for Api 5XX errors?";
api_5xx_errors_alarms.why = `It is important to set alarms for 5XX Errors as otherwise
you won't be aware when the application is failing`;
api_5xx_errors_alarms.recommendation = "Recommended to set alarm for 5XX Errors to take appropriative action.";
api_5xx_errors_alarms.benchmark = ['all'];
const allRegionsAnalysis = {};
for (const region in allApis) {
const regionApis = allApis[region];
const regionAlarms = allAlarms[region];
const alarmsMapByApi = this.mapAlarmsByApi(regionAlarms);
allRegionsAnalysis[region] = [];
for (const api of regionApis) {
const alarmAnalysis = {};
const apiAlarms = alarmsMapByApi[api.name];
alarmAnalysis.resource = { api, alarms: apiAlarms };
alarmAnalysis.resourceSummary = {
name: "ApiName",
value: api.name,
};
if (this.is5xxAlarmsPresent(apiAlarms)) {
alarmAnalysis.severity = types_1.SeverityStatus.Good;
alarmAnalysis.message = "5XX errors alarms are enabled";
}
else {
alarmAnalysis.severity = types_1.SeverityStatus.Failure;
alarmAnalysis.message = "5XX errors alarms are not enabled";
alarmAnalysis.action = "Set 5XX errors alarms";
}
allRegionsAnalysis[region].push(alarmAnalysis);
}
}
api_5xx_errors_alarms.regions = allRegionsAnalysis;
return { api_5xx_errors_alarms };
}
mapAlarmsByApi(alarms) {
return alarms.reduce((alarmsMap, alarm) => {
if (alarm.Namespace === "AWS/ApiGateway" && alarm.Dimensions) {
const apiDimension = alarm.Dimensions.find((dimension) => {
return dimension.Name === "ApiName";
});
if (apiDimension && apiDimension.Value) {
alarmsMap[apiDimension.Value] = alarmsMap[apiDimension.Value] || [];
alarmsMap[apiDimension.Value].push(alarm);
}
}
return alarmsMap;
}, {});
}
is5xxAlarmsPresent(alarms) {
return alarms && alarms.some((alarm) => {
return alarm.ActionsEnabled &&
alarm.AlarmActions &&
alarm.AlarmActions.length &&
alarm.MetricName.toLowerCase().includes("5xx");
});
}
}
exports.ApiGateway5xxAlarmsAnalyzer = ApiGateway5xxAlarmsAnalyzer;