cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
97 lines • 14.9 kB
JavaScript
"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=