UNPKG

cloud-report

Version:

Collects and analyzes cloud resources

71 lines (70 loc) 3.38 kB
"use strict"; 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;