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

97 lines 14.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.OpenSearchIngestionPipelineMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const OpenSearchIngestionPipelineMetricFactory_1 = require("./OpenSearchIngestionPipelineMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); /** * @experimental This is subject to change if an L2 construct becomes available. */ class OpenSearchIngestionPipelineMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope, props); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName: props.pipelineName, }); this.title = namingStrategy.resolveHumanReadableName(); this.pipelineUrl = scope .createAwsConsoleUrlFactory() .getOsisPipelineUrl(props.pipelineName); this.alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.usageAlarmFactory = new common_1.UsageAlarmFactory(this.alarmFactory); this.usageAnnotations = []; const metricFactory = new OpenSearchIngestionPipelineMetricFactory_1.OpenSearchIngestionPipelineMetricFactory(scope.createMetricFactory(), props); this.metricSinkRecordsInCount = metricFactory.metricSinkRecordsInCount(); this.metricSourceBytesReceivedSum = metricFactory.metricSourceBytesReceivedSum(); this.metricSinkBulkRequestLatencyMax = metricFactory.metricSinkBulkRequestLatencyMax(); this.metricSinkBulkPipelineLatencyMax = metricFactory.metricSinkBulkPipelineLatencyMax(); this.metricDlqS3RecordsCount = metricFactory.metricDlqS3RecordsCount(); for (const disambiguator in props.addMaxDlqS3CountAlarm) { const alarmProps = props.addMaxDlqS3CountAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMaxCountAlarm(this.metricDlqS3RecordsCount, alarmProps, disambiguator); this.usageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { return this.widgets(); } widgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createLatencyWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight), this.createIncomingDataWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight), this.createDlqS3Widget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight)), ]; } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "OpenSearch Ingestion", title: this.title, goToLinkUrl: this.pipelineUrl, }); } createLatencyWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Latency", left: [ this.metricSinkBulkRequestLatencyMax, this.metricSinkBulkPipelineLatencyMax, ], leftYAxis: common_1.TimeAxisMillisFromZero, }); } createIncomingDataWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Incoming data", left: [this.metricSinkRecordsInCount], leftYAxis: common_1.CountAxisFromZero, right: [this.metricSourceBytesReceivedSum], rightYAxis: common_1.CountAxisFromZero, }); } createDlqS3Widget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "DLQ", left: [this.metricDlqS3RecordsCount], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.usageAnnotations, }); } } exports.OpenSearchIngestionPipelineMonitoring = OpenSearchIngestionPipelineMonitoring; _a = JSII_RTTI_SYMBOL_1; OpenSearchIngestionPipelineMonitoring[_a] = { fqn: "cdk-monitoring-constructs.OpenSearchIngestionPipelineMonitoring", version: "10.2.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwrREFBOEQ7QUFHOUQseUdBQXNHO0FBQ3RHLHlDQVlzQjtBQUN0QiwrQ0FHeUI7QUFXekI7O0dBRUc7QUFDSCxNQUFhLHFDQUFzQyxTQUFRLG1CQUFVO0lBZW5FLFlBQ0UsS0FBc0IsRUFDdEIsS0FBaUQ7UUFFakQsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxZQUFZO1NBQzFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLO2FBQ3JCLDBCQUEwQixFQUFFO2FBQzVCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDekMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQzFDLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUzQixNQUFNLGFBQWEsR0FBRyxJQUFJLG1GQUF3QyxDQUNoRSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0IsS0FBSyxDQUNOLENBQUM7UUFFRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDekUs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bnQiOlsiaW1wb3J0IHR5cGUgeyBIb3Jpem9udGFsQW5ub3RhdGlvbiwgSVdpZGdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgR3JhcGhXaWRnZXQsIFJvdyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuXG5pbXBvcnQgdHlwZSB7IE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1ldHJpY0ZhY3RvcnlQcm9wcyB9IGZyb20gXCIuL09wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7IE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1ldHJpY0ZhY3RvcnkgfSBmcm9tIFwiLi9PcGVuU2VhcmNoSW5nZXN0aW9uUGlwZWxpbmVNZXRyaWNGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBCYXNlTW9uaXRvcmluZ1Byb3BzLFxuICBNYXhVc2FnZUNvdW50VGhyZXNob2xkLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICBNb25pdG9yaW5nLFxuICBBbGFybUZhY3RvcnksXG4gIFVzYWdlQWxhcm1GYWN0b3J5LFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFRoaXJkV2lkdGgsXG4gIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgQ291bnRBeGlzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbiAgTW9uaXRvcmluZ0hlYWRlcldpZGdldCxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmdPcHRpb25zXG4gIGV4dGVuZHMgQmFzZU1vbml0b3JpbmdQcm9wcyB7XG4gIHJlYWRvbmx5IGFkZE1heERscVMzQ291bnRBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heFVzYWdlQ291bnRUaHJlc2hvbGQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmdQcm9wc1xuICBleHRlbmRzIE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBPcGVuU2VhcmNoSW5nZXN0aW9uUGlwZWxpbmVNb25pdG9yaW5nT3B0aW9ucyB7fVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhpcyBpcyBzdWJqZWN0IHRvIGNoYW5nZSBpZiBhbiBMMiBjb25zdHJ1Y3QgYmVjb21lcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuU2VhcmNoSW5nZXN0aW9uUGlwZWxpbmVNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lVXJsPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IG1ldHJpY1NpbmtSZWNvcmRzSW5Db3VudDogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWV0cmljU291cmNlQnl0ZXNSZWNlaXZlZFN1bTogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWV0cmljU2lua0J1bGtSZXF1ZXN0TGF0ZW5jeU1heDogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWV0cmljU2lua0J1bGtQaXBlbGluZUxhdGVuY3lNYXg6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1ldHJpY0RscVMzUmVjb3Jkc0NvdW50OiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIHJlYWRvbmx5IGFsYXJtRmFjdG9yeTogQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSB1c2FnZUFsYXJtRmFjdG9yeTogVXNhZ2VBbGFybUZhY3Rvcnk7XG5cbiAgcmVhZG9ubHkgdXNhZ2VBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogTW9uaXRvcmluZ1Njb3BlLFxuICAgIHByb3BzOiBPcGVuU2VhcmNoSW5nZXN0aW9uUGlwZWxpbmVNb25pdG9yaW5nUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBwcm9wcyk7XG5cbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWU6IHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5waXBlbGluZVVybCA9IHNjb3BlXG4gICAgICAuY3JlYXRlQXdzQ29uc29sZVVybEZhY3RvcnkoKVxuICAgICAgLmdldE9zaXNQaXBlbGluZVVybChwcm9wcy5waXBlbGluZU5hbWUpO1xuXG4gICAgdGhpcy5hbGFybUZhY3RvcnkgPSB0aGlzLmNyZWF0ZUFsYXJtRmFjdG9yeShcbiAgICAgIG5hbWluZ1N0cmF0ZWd5LnJlc29sdmVBbGFybUZyaWVuZGx5TmFtZSgpLFxuICAgICk7XG4gICAgdGhpcy51c2FnZUFsYXJtRmFjdG9yeSA9IG5ldyBVc2FnZUFsYXJtRmFjdG9yeSh0aGlzLmFsYXJtRmFjdG9yeSk7XG5cbiAgICB0aGlzLnVzYWdlQW5ub3RhdGlvbnMgPSBbXTtcblxuICAgIGNvbnN0IG1ldHJpY0ZhY3RvcnkgPSBuZXcgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzLFxuICAgICk7XG5cbiAgICB0aGlzLm1ldHJpY1NpbmtSZWNvcmRzSW5Db3VudCA9IG1ldHJpY0ZhY3RvcnkubWV0cmljU2lua1JlY29yZHNJbkNvdW50KCk7XG4gICAgdGhpcy5tZXRyaWNTb3VyY2VCeXRlc1JlY2VpdmVkU3VtID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljU291cmNlQnl0ZXNSZWNlaXZlZFN1bSgpO1xuICAgIHRoaXMubWV0cmljU2lua0J1bGtSZXF1ZXN0TGF0ZW5jeU1heCA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1NpbmtCdWxrUmVxdWVzdExhdGVuY3lNYXgoKTtcbiAgICB0aGlzLm1ldHJpY1NpbmtCdWxrUGlwZWxpbmVMYXRlbmN5TWF4ID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljU2lua0J1bGtQaXBlbGluZUxhdGVuY3lNYXgoKTtcbiAgICB0aGlzLm1ldHJpY0RscVMzUmVjb3Jkc0NvdW50ID0gbWV0cmljRmFjdG9yeS5tZXRyaWNEbHFTM1JlY29yZHNDb3VudCgpO1xuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZE1heERscVMzQ291bnRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1heERscVMzQ291bnRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMudXNhZ2VBbGFybUZhY3RvcnkuYWRkTWF4Q291bnRBbGFybShcbiAgICAgICAgdGhpcy5tZXRyaWNEbHFTM1JlY29yZHNDb3VudCxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLnVzYWdlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBzdW1tYXJ5V2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiB0aGlzLndpZGdldHMoKTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVMYXRlbmN5V2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlSW5jb21pbmdEYXRhV2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlRGxxUzNXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVUaXRsZVdpZGdldCgpOiBJV2lkZ2V0IHtcbiAgICByZXR1cm4gbmV3IE1vbml0b3JpbmdIZWFkZXJXaWRnZXQoe1xuICAgICAgZmFtaWx5OiBcIk9wZW5TZWFyY2ggSW5nZXN0aW9uXCIsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGdvVG9MaW5rVXJsOiB0aGlzLnBpcGVsaW5lVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUxhdGVuY3lXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJV2lkZ2V0IHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiTGF0ZW5jeVwiLFxuICAgICAgbGVmdDogW1xuICAgICAgICB0aGlzLm1ldHJpY1NpbmtCdWxrUmVxdWVzdExhdGVuY3lNYXgsXG4gICAgICAgIHRoaXMubWV0cmljU2lua0J1bGtQaXBlbGluZUxhdGVuY3lNYXgsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUluY29taW5nRGF0YVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IElXaWRnZXQge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJbmNvbWluZyBkYXRhXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5tZXRyaWNTaW5rUmVjb3Jkc0luQ291bnRdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIHJpZ2h0OiBbdGhpcy5tZXRyaWNTb3VyY2VCeXRlc1JlY2VpdmVkU3VtXSxcbiAgICAgIHJpZ2h0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZURscVMzV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSVdpZGdldCB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkRMUVwiLFxuICAgICAgbGVmdDogW3RoaXMubWV0cmljRGxxUzNSZWNvcmRzQ291bnRdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy51c2FnZUFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG59XG4iXX0=