UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

90 lines 15.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SecretsManagerSecretMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const SecretsManagerMetricsPublisher_1 = require("./SecretsManagerMetricsPublisher"); const SecretsManagerSecretMetricFactory_1 = require("./SecretsManagerSecretMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class SecretsManagerSecretMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope); const publisher = SecretsManagerMetricsPublisher_1.SecretsManagerMetricsPublisher.getInstance(scope); publisher.addSecret(props.secret); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, namedConstruct: props.secret, fallbackConstructName: props.secret.secretName, }); this.title = namingStrategy.resolveHumanReadableName(); this.showLastRotationWidget = !!(props.showLastRotationWidget || props.addDaysSinceLastRotationAlarm); const metricFactory = new SecretsManagerSecretMetricFactory_1.SecretsManagerSecretMetricFactory(scope.createMetricFactory(), props); this.daysSinceLastChangeMetric = metricFactory.metricDaysSinceLastChange(); this.daysSinceLastRotationMetric = metricFactory.metricDaysSinceLastRotation(); this.alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); const ageAlarmFactory = new common_1.AgeAlarmFactory(this.alarmFactory); this.daysSinceLastChangeAnnotations = []; this.daysSinceLastRotationAnnotations = []; for (const disambiguator in props.addDaysSinceLastChangeAlarm) { const alarmProps = props.addDaysSinceLastChangeAlarm[disambiguator]; const createdAlarm = ageAlarmFactory.addDaysSinceUpdateAlarm(this.daysSinceLastChangeMetric, alarmProps, disambiguator); this.daysSinceLastChangeAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addDaysSinceLastRotationAlarm) { const alarmProps = props.addDaysSinceLastRotationAlarm[disambiguator]; const createdAlarm = ageAlarmFactory.addDaysSinceUpdateAlarm(this.daysSinceLastRotationMetric, alarmProps, disambiguator); this.daysSinceLastRotationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); props.usePublisher?.consume(publisher.lambda); } createDaysSinceLastChangeWidget() { return new aws_cloudwatch_1.GraphWidget({ width: common_1.HalfWidth, height: common_1.DefaultGraphWidgetHeight, title: "Days since last change", left: [this.daysSinceLastChangeMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.daysSinceLastChangeAnnotations, }); } createDaysSinceLastRotationWidget() { return new aws_cloudwatch_1.GraphWidget({ width: common_1.HalfWidth, height: common_1.DefaultGraphWidgetHeight, title: "Days since last rotation", left: [this.daysSinceLastRotationMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.daysSinceLastRotationAnnotations, }); } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "Secret", title: this.title, }); } widgets() { const widgets = [ this.createTitleWidget(), this.createDaysSinceLastChangeWidget(), ]; if (this.showLastRotationWidget) { widgets.push(this.createDaysSinceLastRotationWidget()); } return widgets; } summaryWidgets() { // TODO verify dimensions, mainly height return this.widgets(); } } exports.SecretsManagerSecretMonitoring = SecretsManagerSecretMonitoring; _a = JSII_RTTI_SYMBOL_1; SecretsManagerSecretMonitoring[_a] = { fqn: "cdk-monitoring-constructs.SecretsManagerSecretMonitoring", version: "9.15.2" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBSW9DO0FBR3BDLHFGQUFrRjtBQUNsRiwyRkFHNkM7QUFDN0MseUNBV3NCO0FBQ3RCLCtDQUd5QjtBQW9DekIsTUFBYSw4QkFBK0IsU0FBUSxtQkFBVTtJQVM1RCxZQUNFLEtBQXNCLEVBQ3RCLEtBQTBDO1FBRTFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLE1BQU0sU0FBUyxHQUFHLCtEQUE4QixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRSxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUM1QixxQkFBcUIsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVU7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQzlCLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQ3BFLENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxJQUFJLHFFQUFpQyxDQUN6RCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0IsS0FBSyxDQUNOLENBQUM7UUFDRixJQUFJLENBQUMseUJBQXlCLEdBQUcsYUFBYSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDM0UsSUFBSSxDQUFDLDJCQUEyQjtZQUM5QixhQUFhLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUU5QyxJQUFJ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QUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOztBQWxISCx3RUFtSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgSUZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXJNZXRyaWNzUHVibGlzaGVyIH0gZnJvbSBcIi4vU2VjcmV0c01hbmFnZXJNZXRyaWNzUHVibGlzaGVyXCI7XG5pbXBvcnQge1xuICBTZWNyZXRzTWFuYWdlclNlY3JldE1ldHJpY0ZhY3RvcnksXG4gIFNlY3JldHNNYW5hZ2VyU2VjcmV0TWV0cmljRmFjdG9yeVByb3BzLFxufSBmcm9tIFwiLi9TZWNyZXRzTWFuYWdlclNlY3JldE1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEFnZUFsYXJtRmFjdG9yeSxcbiAgQWxhcm1GYWN0b3J5LFxuICBCYXNlTW9uaXRvcmluZ1Byb3BzLFxuICBDb3VudEF4aXNGcm9tWmVybyxcbiAgRGF5c1NpbmNlVXBkYXRlVGhyZXNob2xkLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIEhhbGZXaWR0aCxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGlzaGVyQ29uc3VtZXIge1xuICBjb25zdW1lKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldHNNYW5hZ2VyU2VjcmV0TW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBCYXNlTW9uaXRvcmluZ1Byb3BzIHtcbiAgcmVhZG9ubHkgYWRkRGF5c1NpbmNlTGFzdENoYW5nZUFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBEYXlzU2luY2VVcGRhdGVUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkRGF5c1NpbmNlTGFzdFJvdGF0aW9uQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIERheXNTaW5jZVVwZGF0ZVRocmVzaG9sZFxuICA+O1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHRydWUsIGlmIGBhZGREYXlzU2luY2VMYXN0Um90YXRpb25BbGFybWAgaXMgc2V0LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dMYXN0Um90YXRpb25XaWRnZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgbWV0cmljcyBwdWJsaXNoZXIgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBUaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gbW9uaXRvciB0aGUgZnVuY3Rpb24gaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHVibGlzaGVyPzogSVB1Ymxpc2hlckNvbnN1bWVyO1xufVxuXG4vKipcbiAqIE1vbml0b3JpbmcgcHJvcHMgZm9yIFNlY3JldHMgTWFuYWdlciBzZWNyZXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldHNNYW5hZ2VyU2VjcmV0TW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgU2VjcmV0c01hbmFnZXJTZWNyZXRNZXRyaWNGYWN0b3J5UHJvcHMsXG4gICAgU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nT3B0aW9ucyB7fVxuXG5leHBvcnQgY2xhc3MgU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNob3dMYXN0Um90YXRpb25XaWRnZXQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFsYXJtRmFjdG9yeTogQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSBkYXlzU2luY2VMYXN0Q2hhbmdlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBkYXlzU2luY2VMYXN0Q2hhbmdlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IGRheXNTaW5jZUxhc3RSb3RhdGlvbk1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZGF5c1NpbmNlTGFzdFJvdGF0aW9uQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IE1vbml0b3JpbmdTY29wZSxcbiAgICBwcm9wczogU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlKTtcblxuICAgIGNvbnN0IHB1Ymxpc2hlciA9IFNlY3JldHNNYW5hZ2VyTWV0cmljc1B1Ymxpc2hlci5nZXRJbnN0YW5jZShzY29wZSk7XG4gICAgcHVibGlzaGVyLmFkZFNlY3JldChwcm9wcy5zZWNyZXQpO1xuXG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgbmFtZWRDb25zdHJ1Y3Q6IHByb3BzLnNlY3JldCxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogcHJvcHMuc2VjcmV0LnNlY3JldE5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5zaG93TGFzdFJvdGF0aW9uV2lkZ2V0ID0gISEoXG4gICAgICBwcm9wcy5zaG93TGFzdFJvdGF0aW9uV2lkZ2V0IHx8IHByb3BzLmFkZERheXNTaW5jZUxhc3RSb3RhdGlvbkFsYXJtXG4gICAgKTtcbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IFNlY3JldHNNYW5hZ2VyU2VjcmV0TWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzLFxuICAgICk7XG4gICAgdGhpcy5kYXlzU2luY2VMYXN0Q2hhbmdlTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNEYXlzU2luY2VMYXN0Q2hhbmdlKCk7XG4gICAgdGhpcy5kYXlzU2luY2VMYXN0Um90YXRpb25NZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNEYXlzU2luY2VMYXN0Um90YXRpb24oKTtcblxuICAgIHRoaXMuYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdTdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSxcbiAgICApO1xuICAgIGNvbnN0IGFnZUFsYXJtRmFjdG9yeSA9IG5ldyBBZ2VBbGFybUZhY3RvcnkodGhpcy5hbGFybUZhY3RvcnkpO1xuICAgIHRoaXMuZGF5c1NpbmNlTGFzdENoYW5nZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5kYXlzU2luY2VMYXN0Um90YXRpb25Bbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZERheXNTaW5jZUxhc3RDaGFuZ2VBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZERheXNTaW5jZUxhc3RDaGFuZ2VBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IGFnZUFsYXJtRmFjdG9yeS5hZGREYXlzU2luY2VVcGRhdGVBbGFybShcbiAgICAgICAgdGhpcy5kYXlzU2luY2VMYXN0Q2hhbmdlTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGF5c1NpbmNlTGFzdENoYW5nZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREYXlzU2luY2VMYXN0Um90YXRpb25BbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZERheXNTaW5jZUxhc3RSb3RhdGlvbkFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gYWdlQWxhcm1GYWN0b3J5LmFkZERheXNTaW5jZVVwZGF0ZUFsYXJtKFxuICAgICAgICB0aGlzLmRheXNTaW5jZUxhc3RSb3RhdGlvbk1ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLmRheXNTaW5jZUxhc3RSb3RhdGlvbkFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICAgIHByb3BzLnVzZVB1Ymxpc2hlcj8uY29uc3VtZShwdWJsaXNoZXIubGFtYmRhKTtcbiAgfVxuXG4gIGNyZWF0ZURheXNTaW5jZUxhc3RDaGFuZ2VXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aDogSGFsZldpZHRoLFxuICAgICAgaGVpZ2h0OiBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICB0aXRsZTogXCJEYXlzIHNpbmNlIGxhc3QgY2hhbmdlXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5kYXlzU2luY2VMYXN0Q2hhbmdlTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuZGF5c1NpbmNlTGFzdENoYW5nZUFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRGF5c1NpbmNlTGFzdFJvdGF0aW9uV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGg6IEhhbGZXaWR0aCxcbiAgICAgIGhlaWdodDogRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRGF5cyBzaW5jZSBsYXN0IHJvdGF0aW9uXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5kYXlzU2luY2VMYXN0Um90YXRpb25NZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5kYXlzU2luY2VMYXN0Um90YXRpb25Bbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiU2VjcmV0XCIsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICB9KTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICBjb25zdCB3aWRnZXRzID0gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgdGhpcy5jcmVhdGVEYXlzU2luY2VMYXN0Q2hhbmdlV2lkZ2V0KCksXG4gICAgXTtcblxuICAgIGlmICh0aGlzLnNob3dMYXN0Um90YXRpb25XaWRnZXQpIHtcbiAgICAgIHdpZGdldHMucHVzaCh0aGlzLmNyZWF0ZURheXNTaW5jZUxhc3RSb3RhdGlvbldpZGdldCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgLy8gVE9ETyB2ZXJpZnkgZGltZW5zaW9ucywgbWFpbmx5IGhlaWdodFxuICAgIHJldHVybiB0aGlzLndpZGdldHMoKTtcbiAgfVxufVxuIl19