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: "9.15.2" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwrREFBOEQ7QUFHOUQseUdBQXNHO0FBQ3RHLHlDQVlzQjtBQUN0QiwrQ0FHeUI7QUFXekI7O0dBRUc7QUFDSCxNQUFhLHFDQUFzQyxTQUFRLG1CQUFVO0lBZW5FLFlBQ0UsS0FBc0IsRUFDdEIsS0FBaUQ7UUFFakQsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxZQUFZO1NBQzFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLO2FBQ3JCLDBCQUEwQixFQUFFO2FBQzVCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDekMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQzFDLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUzQixNQUFNLGFBQWEsR0FBRyxJQUFJLG1GQUF3QyxDQUNoRSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0IsS0FBSyxDQUNOLENBQUM7UUFFRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDekUs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cnQgdHlwZSB7IEhvcml6b250YWxBbm5vdGF0aW9uLCBJV2lkZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBHcmFwaFdpZGdldCwgUm93IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB0eXBlIHsgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTWV0cmljRmFjdG9yeVByb3BzIH0gZnJvbSBcIi4vT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTWV0cmljRmFjdG9yeVwiO1xuaW1wb3J0IHsgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTWV0cmljRmFjdG9yeSB9IGZyb20gXCIuL09wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIE1heFVzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmcsXG4gIEFsYXJtRmFjdG9yeSxcbiAgVXNhZ2VBbGFybUZhY3RvcnksXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgVGhpcmRXaWR0aCxcbiAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICBDb3VudEF4aXNGcm9tWmVybyxcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5LFxuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxufSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBCYXNlTW9uaXRvcmluZ1Byb3BzIHtcbiAgcmVhZG9ubHkgYWRkTWF4RGxxUzNDb3VudEFsYXJtPzogUmVjb3JkPHN0cmluZywgTWF4VXNhZ2VDb3VudFRocmVzaG9sZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTWV0cmljRmFjdG9yeVByb3BzLFxuICAgIE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmdPcHRpb25zIHt9XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIGlzIHN1YmplY3QgdG8gY2hhbmdlIGlmIGFuIEwyIGNvbnN0cnVjdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGlwZWxpbmVVcmw/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgbWV0cmljU2lua1JlY29yZHNJbkNvdW50OiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBtZXRyaWNTb3VyY2VCeXRlc1JlY2VpdmVkU3VtOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBtZXRyaWNTaW5rQnVsa1JlcXVlc3RMYXRlbmN5TWF4OiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBtZXRyaWNTaW5rQnVsa1BpcGVsaW5lTGF0ZW5jeU1heDogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWV0cmljRGxxUzNSZWNvcmRzQ291bnQ6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgcmVhZG9ubHkgYWxhcm1GYWN0b3J5OiBBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IHVzYWdlQWxhcm1GYWN0b3J5OiBVc2FnZUFsYXJtRmFjdG9yeTtcblxuICByZWFkb25seSB1c2FnZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBNb25pdG9yaW5nU2NvcGUsXG4gICAgcHJvcHM6IE9wZW5TZWFyY2hJbmdlc3Rpb25QaXBlbGluZU1vbml0b3JpbmdQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzKTtcblxuICAgIGNvbnN0IG5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogcHJvcHMucGlwZWxpbmVOYW1lLFxuICAgIH0pO1xuICAgIHRoaXMudGl0bGUgPSBuYW1pbmdTdHJhdGVneS5yZXNvbHZlSHVtYW5SZWFkYWJsZU5hbWUoKTtcbiAgICB0aGlzLnBpcGVsaW5lVXJsID0gc2NvcGVcbiAgICAgIC5jcmVhdGVBd3NDb25zb2xlVXJsRmFjdG9yeSgpXG4gICAgICAuZ2V0T3Npc1BpcGVsaW5lVXJsKHByb3BzLnBpcGVsaW5lTmFtZSk7XG5cbiAgICB0aGlzLmFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLnVzYWdlQWxhcm1GYWN0b3J5ID0gbmV3IFVzYWdlQWxhcm1GYWN0b3J5KHRoaXMuYWxhcm1GYWN0b3J5KTtcblxuICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgbWV0cmljRmFjdG9yeSA9IG5ldyBPcGVuU2VhcmNoSW5nZXN0aW9uUGlwZWxpbmVNZXRyaWNGYWN0b3J5KFxuICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgcHJvcHMsXG4gICAgKTtcblxuICAgIHRoaXMubWV0cmljU2lua1JlY29yZHNJbkNvdW50ID0gbWV0cmljRmFjdG9yeS5tZXRyaWNTaW5rUmVjb3Jkc0luQ291bnQoKTtcbiAgICB0aGlzLm1ldHJpY1NvdXJjZUJ5dGVzUmVjZWl2ZWRTdW0gPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNTb3VyY2VCeXRlc1JlY2VpdmVkU3VtKCk7XG4gICAgdGhpcy5tZXRyaWNTaW5rQnVsa1JlcXVlc3RMYXRlbmN5TWF4ID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljU2lua0J1bGtSZXF1ZXN0TGF0ZW5jeU1heCgpO1xuICAgIHRoaXMubWV0cmljU2lua0J1bGtQaXBlbGluZUxhdGVuY3lNYXggPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNTaW5rQnVsa1BpcGVsaW5lTGF0ZW5jeU1heCgpO1xuICAgIHRoaXMubWV0cmljRGxxUzNSZWNvcmRzQ291bnQgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0RscVMzUmVjb3Jkc0NvdW50KCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkTWF4RGxxUzNDb3VudEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkTWF4RGxxUzNDb3VudEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy51c2FnZUFsYXJtRmFjdG9yeS5hZGRNYXhDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLm1ldHJpY0RscVMzUmVjb3Jkc0NvdW50LFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBwcm9wcy51c2VDcmVhdGVkQWxhcm1zPy5jb25zdW1lKHRoaXMuY3JlYXRlZEFsYXJtcygpKTtcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0cygpO1xuICB9XG5cbiAgd2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmNyZWF0ZVRpdGxlV2lkZ2V0KCksXG4gICAgICBuZXcgUm93KFxuICAgICAgICB0aGlzLmNyZWF0ZUxhdGVuY3lXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVEbHFTM1dpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVRpdGxlV2lkZ2V0KCk6IElXaWRnZXQge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiT3BlblNlYXJjaCBJbmdlc3Rpb25cIixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZ29Ub0xpbmtVcmw6IHRoaXMucGlwZWxpbmVVcmwsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlTGF0ZW5jeVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IElXaWRnZXQge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJMYXRlbmN5XCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMubWV0cmljU2lua0J1bGtSZXF1ZXN0TGF0ZW5jeU1heCxcbiAgICAgICAgdGhpcy5tZXRyaWNTaW5rQnVsa1BpcGVsaW5lTGF0ZW5jeU1heCxcbiAgICAgIF0sXG4gICAgICBsZWZ0WUF4aXM6IFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5jb21pbmdEYXRhV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSVdpZGdldCB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkluY29taW5nIGRhdGFcIixcbiAgICAgIGxlZnQ6IFt0aGlzLm1ldHJpY1NpbmtSZWNvcmRzSW5Db3VudF0sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgICAgcmlnaHQ6IFt0aGlzLm1ldHJpY1NvdXJjZUJ5dGVzUmVjZWl2ZWRTdW1dLFxuICAgICAgcmlnaHRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRGxxUzNXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJV2lkZ2V0IHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRExRXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5tZXRyaWNEbHFTM1JlY29yZHNDb3VudF0sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnVzYWdlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==