cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
76 lines • 10.4 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Route53HealthCheckMetricAdjuster = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const metric_1 = require("../../metric");
/**
* The supported statistics by Route53 Health Checks.
* @see https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-types.html
*/
const SUPPORTED_STATS = new Set([
metric_1.MetricStatistic.AVERAGE,
metric_1.MetricStatistic.MIN,
metric_1.MetricStatistic.MAX,
metric_1.MetricStatistic.SUM,
metric_1.MetricStatistic.N,
]);
/**
* Adjusts a metric so that alarms created from it can be used in Route53 Health Checks.
* The metric will be validated to ensure it satisfies Route53 Health Check alarm requirements, otherwise it will throw an {@link Error}.
* @see https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-types.html
*/
class Route53HealthCheckMetricAdjuster {
/** @inheritdoc */
adjustMetric(metric, alarmScope, props) {
// Route53 health checks do not support composite alarms
if (props.minMetricSamplesToAlarm) {
throw new Error("Alarms with 'minMetricSamplesToAlarm' are not supported.");
}
// Route53 health checks do to support metric math
if (!(metric instanceof aws_cloudwatch_1.Metric)) {
throw new Error("The specified metric must be a Metric instance.");
}
const { account, period, statistic } = metric;
if (account && account !== aws_cdk_lib_1.Stack.of(alarmScope).account) {
throw new Error("Cross-account metrics are not supported.");
}
// Route53 health checks do not support high-resolution metrics
if (period && period.toSeconds() < 60) {
throw new Error("High resolution metrics are not supported.");
}
// Route53 health checks only support a subset of statistics
if (!SUPPORTED_STATS.has(statistic)) {
throw new Error(`Metrics with statistic '${statistic}' are not supported.`);
}
// Can't use `metric.with()` to remove the label, only change it
// See: https://github.com/aws/aws-cdk/blob/v2.65.0/packages/%40aws-cdk/aws-cloudwatch/lib/metric.ts#L314-L342
return new aws_cloudwatch_1.Metric({
...metric,
// all fields except dimensions have the same names
dimensionsMap: metric.dimensions,
/*
* `AWS::CloudWatch::Alarm` CFN resource types have two variants:
* - Based on a single metric: Uses `MetricName` property.
* - Based on metric math: Uses `Metrics` property.
*
* If the `label` of a `Metric` instance is defined, when an
* alarm is created from it, even if it doesn't use metric math,
* it will use the `Metrics` property. Since Route53 does not
* support metric math it assumes any alarm created using the
* `Metrics` property must use metric math, thus it must be removed.
*
* See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html
* See: https://github.com/aws/aws-cdk/blob/v2.65.0/packages/@aws-cdk/aws-cloudwatch/lib/alarm.ts#L262-L298
*/
label: undefined,
});
}
}
exports.Route53HealthCheckMetricAdjuster = Route53HealthCheckMetricAdjuster;
_a = JSII_RTTI_SYMBOL_1;
Route53HealthCheckMetricAdjuster[_a] = { fqn: "cdk-monitoring-constructs.Route53HealthCheckMetricAdjuster", version: "10.0.0" };
Route53HealthCheckMetricAdjuster.INSTANCE = new Route53HealthCheckMetricAdjuster();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGU1M0hlYWx0aENoZWNrTWV0cmljQWRqdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJSb3V0ZTUzSGVhbHRoQ2hlY2tNZXRyaWNBZGp1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFvQztBQUNwQywrREFBb0Q7QUFHcEQseUNBQXVFO0FBR3ZFOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFTO0lBQ3RDLHdCQUFlLENBQUMsT0FBTztJQUN2Qix3QkFBZSxDQUFDLEdBQUc7SUFDbkIsd0JBQWUsQ0FBQyxHQUFHO0lBQ25CLHdCQUFlLENBQUMsR0FBRztJQUNuQix3QkFBZSxDQUFDLENBQUM7Q0FDbEIsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILE1BQWEsZ0NBQWdDO0lBRzNDLGtCQUFrQjtJQUNsQixZQUFZLENBQ1YsTUFBOEIsRUFDOUIsVUFBcUIsRUFDckIsS0FBb0I7UUFFcEIsd0RBQXdEO1FBQ3hELElBQUksS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwwREFBMEQsQ0FDM0QsQ0FBQztRQUNKLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLHVCQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRTlDLElBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUNiLDJCQUEyQixTQUFTLHNCQUFzQixDQUMzRCxDQUFDO1FBQ0osQ0FBQztRQUVELGdFQUFnRTtRQUNoRSw4R0FBOEc7UUFDOUcsT0FBTyxJQUFJLHVCQUFNLENBQUM7WUFDaEIsR0FBRyxNQUFNO1lBQ1QsbURBQW1EO1lBQ25ELGFBQWEsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUNoQzs7Ozs7Ozs7Ozs7OztlQWFHO1lBQ0gsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3REgsNEVBOERDOzs7QUE3RGlCLHlDQUFRLEdBQUcsSUFBSSxnQ0FBZ0MsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IE1ldHJpYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElNZXRyaWNBZGp1c3RlciB9IGZyb20gXCIuL0lNZXRyaWNBZGp1c3RlclwiO1xuaW1wb3J0IHsgTWV0cmljU3RhdGlzdGljLCBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0IH0gZnJvbSBcIi4uLy4uL21ldHJpY1wiO1xuaW1wb3J0IHsgQWRkQWxhcm1Qcm9wcyB9IGZyb20gXCIuLi9BbGFybUZhY3RvcnlcIjtcblxuLyoqXG4gKiBUaGUgc3VwcG9ydGVkIHN0YXRpc3RpY3MgYnkgUm91dGU1MyBIZWFsdGggQ2hlY2tzLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vUm91dGU1My9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvaGVhbHRoLWNoZWNrcy10eXBlcy5odG1sXG4gKi9cbmNvbnN0IFNVUFBPUlRFRF9TVEFUUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFLFxuICBNZXRyaWNTdGF0aXN0aWMuTUlOLFxuICBNZXRyaWNTdGF0aXN0aWMuTUFYLFxuICBNZXRyaWNTdGF0aXN0aWMuU1VNLFxuICBNZXRyaWNTdGF0aXN0aWMuTixcbl0pO1xuXG4vKipcbiAqIEFkanVzdHMgYSBtZXRyaWMgc28gdGhhdCBhbGFybXMgY3JlYXRlZCBmcm9tIGl0IGNhbiBiZSB1c2VkIGluIFJvdXRlNTMgSGVhbHRoIENoZWNrcy5cbiAqIFRoZSBtZXRyaWMgd2lsbCBiZSB2YWxpZGF0ZWQgdG8gZW5zdXJlIGl0IHNhdGlzZmllcyBSb3V0ZTUzIEhlYWx0aCBDaGVjayBhbGFybSByZXF1aXJlbWVudHMsIG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGFuIHtAbGluayBFcnJvcn0uXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9oZWFsdGgtY2hlY2tzLXR5cGVzLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlNTNIZWFsdGhDaGVja01ldHJpY0FkanVzdGVyIGltcGxlbWVudHMgSU1ldHJpY0FkanVzdGVyIHtcbiAgc3RhdGljIHJlYWRvbmx5IElOU1RBTkNFID0gbmV3IFJvdXRlNTNIZWFsdGhDaGVja01ldHJpY0FkanVzdGVyKCk7XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFkanVzdE1ldHJpYyhcbiAgICBtZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gICAgYWxhcm1TY29wZTogQ29uc3RydWN0LFxuICAgIHByb3BzOiBBZGRBbGFybVByb3BzLFxuICApOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0IHtcbiAgICAvLyBSb3V0ZTUzIGhlYWx0aCBjaGVja3MgZG8gbm90IHN1cHBvcnQgY29tcG9zaXRlIGFsYXJtc1xuICAgIGlmIChwcm9wcy5taW5NZXRyaWNTYW1wbGVzVG9BbGFybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFsYXJtcyB3aXRoICdtaW5NZXRyaWNTYW1wbGVzVG9BbGFybScgYXJlIG5vdCBzdXBwb3J0ZWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJvdXRlNTMgaGVhbHRoIGNoZWNrcyBkbyB0byBzdXBwb3J0IG1ldHJpYyBtYXRoXG4gICAgaWYgKCEobWV0cmljIGluc3RhbmNlb2YgTWV0cmljKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNwZWNpZmllZCBtZXRyaWMgbXVzdCBiZSBhIE1ldHJpYyBpbnN0YW5jZS5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhY2NvdW50LCBwZXJpb2QsIHN0YXRpc3RpYyB9ID0gbWV0cmljO1xuXG4gICAgaWYgKGFjY291bnQgJiYgYWNjb3VudCAhPT0gU3RhY2sub2YoYWxhcm1TY29wZSkuYWNjb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3Jvc3MtYWNjb3VudCBtZXRyaWNzIGFyZSBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICB9XG5cbiAgICAvLyBSb3V0ZTUzIGhlYWx0aCBjaGVja3MgZG8gbm90IHN1cHBvcnQgaGlnaC1yZXNvbHV0aW9uIG1ldHJpY3NcbiAgICBpZiAocGVyaW9kICYmIHBlcmlvZC50b1NlY29uZHMoKSA8IDYwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIaWdoIHJlc29sdXRpb24gbWV0cmljcyBhcmUgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgfVxuXG4gICAgLy8gUm91dGU1MyBoZWFsdGggY2hlY2tzIG9ubHkgc3VwcG9ydCBhIHN1YnNldCBvZiBzdGF0aXN0aWNzXG4gICAgaWYgKCFTVVBQT1JURURfU1RBVFMuaGFzKHN0YXRpc3RpYykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1ldHJpY3Mgd2l0aCBzdGF0aXN0aWMgJyR7c3RhdGlzdGljfScgYXJlIG5vdCBzdXBwb3J0ZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2FuJ3QgdXNlIGBtZXRyaWMud2l0aCgpYCB0byByZW1vdmUgdGhlIGxhYmVsLCBvbmx5IGNoYW5nZSBpdFxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuNjUuMC9wYWNrYWdlcy8lNDBhd3MtY2RrL2F3cy1jbG91ZHdhdGNoL2xpYi9tZXRyaWMudHMjTDMxNC1MMzQyXG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgLi4ubWV0cmljLFxuICAgICAgLy8gYWxsIGZpZWxkcyBleGNlcHQgZGltZW5zaW9ucyBoYXZlIHRoZSBzYW1lIG5hbWVzXG4gICAgICBkaW1lbnNpb25zTWFwOiBtZXRyaWMuZGltZW5zaW9ucyxcbiAgICAgIC8qXG4gICAgICAgKiBgQVdTOjpDbG91ZFdhdGNoOjpBbGFybWAgQ0ZOIHJlc291cmNlIHR5cGVzIGhhdmUgdHdvIHZhcmlhbnRzOlxuICAgICAgICogLSBCYXNlZCBvbiBhIHNpbmdsZSBtZXRyaWM6IFVzZXMgYE1ldHJpY05hbWVgIHByb3BlcnR5LlxuICAgICAgICogLSBCYXNlZCBvbiBtZXRyaWMgbWF0aDogVXNlcyBgTWV0cmljc2AgcHJvcGVydHkuXG4gICAgICAgKlxuICAgICAgICogSWYgdGhlIGBsYWJlbGAgb2YgYSBgTWV0cmljYCBpbnN0YW5jZSBpcyBkZWZpbmVkLCB3aGVuIGFuXG4gICAgICAgKiBhbGFybSBpcyBjcmVhdGVkIGZyb20gaXQsIGV2ZW4gaWYgaXQgZG9lc24ndCB1c2UgbWV0cmljIG1hdGgsXG4gICAgICAgKiBpdCB3aWxsIHVzZSB0aGUgYE1ldHJpY3NgIHByb3BlcnR5LiBTaW5jZSBSb3V0ZTUzIGRvZXMgbm90XG4gICAgICAgKiBzdXBwb3J0IG1ldHJpYyBtYXRoIGl0IGFzc3VtZXMgYW55IGFsYXJtIGNyZWF0ZWQgdXNpbmcgdGhlXG4gICAgICAgKiBgTWV0cmljc2AgcHJvcGVydHkgbXVzdCB1c2UgbWV0cmljIG1hdGgsIHRodXMgaXQgbXVzdCBiZSByZW1vdmVkLlxuICAgICAgICpcbiAgICAgICAqIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWNsb3Vkd2F0Y2gtYWxhcm0uaHRtbFxuICAgICAgICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi42NS4wL3BhY2thZ2VzL0Bhd3MtY2RrL2F3cy1jbG91ZHdhdGNoL2xpYi9hbGFybS50cyNMMjYyLUwyOThcbiAgICAgICAqL1xuICAgICAgbGFiZWw6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxufVxuIl19