@guardian/cdk 48.2.0-beta.1 → 49.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-budget-alarm.js","sourceRoot":"","sources":["../../../src/experimental/constructs/error-budget-alarm.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAGvC,+DAMoC;AACpC,+EAA+D;AAE/D,iDAA4C;AAqC5C,SAAS,gBAAgB,CACvB,eAA+B,EAC/B,gBAAgC,EAChC,WAAqB;IAErB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,YAAiC,CAAC;IACxE,QAAQ,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC;IACvD,QAAQ,CAAC,2BAA2B,GAAG,GAAG,CAAC;IAC3C,QAAQ,CAAC,gCAAgC,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;AACtE,CAAC;AAED,uCAAuC;AACvC,MAAa,4BAA4B;IAEvC,YAAY,KAAc,EAAE,KAA4B;QAEtD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAExC,MAAM,QAAQ,GAAW,eAAK,CAAC,YAAY,CACzC,KAAK,EACL,cAAc,EACd,eAAe,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAC9E,CAAC;QAEF,MAAM,YAAY,GAAa;YAC7B,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,sBAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,WAAW,EAAE,sBAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;SACjC,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,sBAAsB,CAAC,KAAK,EAAE;YACtD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,YAAY;YACtB,WAAW;YACX,QAAQ;YACR,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAa;YACjC,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,sBAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,WAAW,EAAE,sBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;SAClC,CAAC;QAEF,MAAM,iBAAiB,GAAG,IAAI,sBAAsB,CAAC,KAAK,EAAE;YAC1D,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,gBAAgB;YAC1B,WAAW;YACX,QAAQ;YACR,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;QAEH,gBAAgB,CACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,CAAC,WAAW,CAC7B,CAAC;QAEF,MAAM,YAAY,GAAa;YAC7B,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,sBAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,WAAW,EAAE,sBAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SAC/B,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,sBAAsB,CAAC,KAAK,EAAE;YACtD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"error-budget-alarm.js","sourceRoot":"","sources":["../../../src/experimental/constructs/error-budget-alarm.ts"],"names":[],"mappings":"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","sourcesContent":["import { Duration } from \"aws-cdk-lib\";\nimport type { CfnCompositeAlarm,\n IMetric} from \"aws-cdk-lib/aws-cloudwatch\";\nimport {\n Alarm, AlarmRule, AlarmState,\n ComparisonOperator,\n CompositeAlarm,\n MathExpression,\n TreatMissingData\n} from \"aws-cdk-lib/aws-cloudwatch\";\nimport { SnsAction } from \"aws-cdk-lib/aws-cloudwatch-actions\";\nimport type { ITopic} from \"aws-cdk-lib/aws-sns\";\nimport { Topic } from \"aws-cdk-lib/aws-sns\";\nimport type { GuStack } from \"../../constructs/core\";\n\nexport interface ErrorBudgetAlarmProps {\n snsTopicNameForAlerts: string;\n sloTarget: number;\n badEvents: IMetric; // Should this be IMetric[]?\n validEvents: IMetric; // Should this be IMetric[]?\n // Could accept a MathExpression for more complicated cases?\n}\n\ninterface BurnRateSpeed {\n speed: 'Fast' | 'Moderate' | 'Slow';\n burnRate: number;\n}\n\ninterface BurnRate extends BurnRateSpeed {\n longWindow: Duration;\n shortWindow: Duration;\n}\n\ninterface IndividualBurnRateAlarmProps {\n burnRateSpeed: BurnRateSpeed;\n window: Duration;\n errorBudget: number;\n badEvents: IMetric;\n validEvents: IMetric;\n}\n\ninterface CompositeBurnRateAlarmProps {\n burnRate: BurnRate;\n errorBudget: number;\n badEvents: IMetric;\n validEvents: IMetric;\n snsTopic: ITopic;\n}\n\nfunction applySuppression(\n alarmToSuppress: CompositeAlarm,\n suppressingAlarm: CompositeAlarm,\n shortWindow: Duration,\n) {\n const cfnAlarm = alarmToSuppress.node.defaultChild as CfnCompositeAlarm;\n cfnAlarm.actionsSuppressor = suppressingAlarm.alarmArn;\n cfnAlarm.actionsSuppressorWaitPeriod = 120;\n cfnAlarm.actionsSuppressorExtensionPeriod = shortWindow.toSeconds();\n}\n\n// Do we need to extend construct here?\nexport class ErrorBudgetAlarmExperimental {\n\n constructor(scope: GuStack, props: ErrorBudgetAlarmProps) {\n\n const errorBudget = 1 - props.sloTarget;\n\n const snsTopic: ITopic = Topic.fromTopicArn(\n scope,\n 'SnsSloAlarms',\n `arn:aws:sns:${scope.region}:${scope.account}:${props.snsTopicNameForAlerts}`,\n );\n\n const fastBurnRate: BurnRate = {\n speed: 'Fast',\n burnRate: 15,\n longWindow: Duration.hours(1),\n shortWindow: Duration.minutes(5),\n };\n\n const fastBurnAlarm = new CompositeBurnRateAlarm(scope, {\n badEvents: props.badEvents,\n burnRate: fastBurnRate,\n errorBudget,\n snsTopic,\n validEvents: props.validEvents,\n });\n\n const moderateBurnRate: BurnRate = {\n speed: 'Moderate',\n burnRate: 6,\n longWindow: Duration.hours(6),\n shortWindow: Duration.minutes(30),\n };\n\n const moderateBurnAlarm = new CompositeBurnRateAlarm(scope, {\n badEvents: props.badEvents,\n burnRate: moderateBurnRate,\n errorBudget,\n snsTopic,\n validEvents: props.validEvents,\n });\n\n applySuppression(\n moderateBurnAlarm,\n fastBurnAlarm,\n moderateBurnRate.shortWindow,\n );\n\n const slowBurnRate: BurnRate = {\n speed: 'Slow',\n burnRate: 3,\n longWindow: Duration.days(1),\n shortWindow: Duration.hours(2),\n };\n\n const slowBurnAlarm = new CompositeBurnRateAlarm(scope, {\n badEvents: props.badEvents,\n burnRate: slowBurnRate,\n errorBudget,\n snsTopic, // TODO - use a different topic for tickets or figure out how to route notifications vs tickets using a single topic\n validEvents: props.validEvents,\n });\n\n applySuppression(\n slowBurnAlarm,\n moderateBurnAlarm,\n slowBurnRate.shortWindow,\n );\n\n }\n\n}\n\nclass IndividualBurnRateAlarm extends Alarm {\n constructor(scope: GuStack, props: IndividualBurnRateAlarmProps) {\n const undesirableErrorBudgetConsumption = props.errorBudget * props.burnRateSpeed.burnRate;\n super(\n scope,\n `${props.burnRateSpeed.speed}BurnOver${props.window.toHumanString()}`,\n {\n metric: new MathExpression({\n expression: `badEvents/validEvents`,\n label: 'Observed failure rate',\n usingMetrics: {\n badEvents: props.badEvents,\n validEvents: props.validEvents,\n },\n period: props.window,\n }),\n evaluationPeriods: 1,\n threshold: undesirableErrorBudgetConsumption,\n comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,\n treatMissingData: TreatMissingData.NOT_BREACHING,\n },\n );\n }\n}\n\nclass CompositeBurnRateAlarm extends CompositeAlarm {\n constructor(scope: GuStack, props: CompositeBurnRateAlarmProps) {\n const sharedIndividualAlarmProps = {\n badEvents: props.badEvents,\n burnRateSpeed: {\n speed: props.burnRate.speed,\n burnRate: props.burnRate.burnRate,\n },\n errorBudget: props.errorBudget,\n validEvents: props.validEvents\n };\n super(scope,\n `${props.burnRate.speed}BurnCompositeAlarm`,\n {\n alarmRule: AlarmRule.allOf(\n AlarmRule.fromAlarm(\n new IndividualBurnRateAlarm(scope, {\n ...sharedIndividualAlarmProps,\n window: props.burnRate.longWindow,\n }),\n AlarmState.ALARM,\n ),\n AlarmRule.fromAlarm(\n new IndividualBurnRateAlarm(scope, {\n ...sharedIndividualAlarmProps,\n window: props.burnRate.shortWindow,\n }),\n AlarmState.ALARM,\n ),\n ),\n },\n );\n this.addAlarmAction(new SnsAction(props.snsTopic));\n }\n}\n"]}
|