@rio-cloud/cdk-v2-constructs 1.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +15 -0
- package/.jsii +7832 -0
- package/.versionrc.json +14 -0
- package/API.md +8136 -0
- package/CHANGELOG.md +5 -0
- package/LICENSE +202 -0
- package/README.md +56 -0
- package/lib/datadog/datadogLogIndexMonitoring.d.ts +49 -0
- package/lib/datadog/datadogLogIndexMonitoring.js +116 -0
- package/lib/datadog/datadogMonitor.d.ts +13 -0
- package/lib/datadog/datadogMonitor.js +19 -0
- package/lib/datadog/index.d.ts +1 -0
- package/lib/datadog/index.js +19 -0
- package/lib/fargate/datadog.d.ts +18 -0
- package/lib/fargate/datadog.js +225 -0
- package/lib/fargate/rio-fargate-service.d.ts +276 -0
- package/lib/fargate/rio-fargate-service.js +147 -0
- package/lib/fargate/spring.d.ts +6 -0
- package/lib/fargate/spring.js +39 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.js +34 -0
- package/lib/kafka/index.d.ts +2 -0
- package/lib/kafka/index.js +15 -0
- package/lib/kafka/kafka-event-spec.d.ts +43 -0
- package/lib/kafka/kafka-event-spec.js +106 -0
- package/lib/kafka/kafka-topic.d.ts +102 -0
- package/lib/kafka/kafka-topic.js +70 -0
- package/lib/pipeline/rio-backup-secrets-restore-stage.d.ts +40 -0
- package/lib/pipeline/rio-backup-secrets-restore-stage.js +104 -0
- package/lib/pipeline/rio-bitbucket-source-action.d.ts +25 -0
- package/lib/pipeline/rio-bitbucket-source-action.js +36 -0
- package/lib/rio-claidometer.d.ts +21 -0
- package/lib/rio-claidometer.js +39 -0
- package/lib/rio-landing-zone.d.ts +16 -0
- package/lib/rio-landing-zone.js +57 -0
- package/lib/rio-load-balancer.d.ts +26 -0
- package/lib/rio-load-balancer.js +42 -0
- package/lib/toggle.d.ts +21 -0
- package/lib/toggle.js +44 -0
- package/lib/watchful/alb.d.ts +47 -0
- package/lib/watchful/alb.js +52 -0
- package/lib/watchful/aspect.d.ts +16 -0
- package/lib/watchful/aspect.js +55 -0
- package/lib/watchful/cloudfront.d.ts +50 -0
- package/lib/watchful/cloudfront.js +65 -0
- package/lib/watchful/datadog-log-alarm.d.ts +37 -0
- package/lib/watchful/datadog-log-alarm.js +88 -0
- package/lib/watchful/datadog-metric-alarm.d.ts +32 -0
- package/lib/watchful/datadog-metric-alarm.js +158 -0
- package/lib/watchful/docdb.d.ts +62 -0
- package/lib/watchful/docdb.js +102 -0
- package/lib/watchful/dynamodb.d.ts +69 -0
- package/lib/watchful/dynamodb.js +87 -0
- package/lib/watchful/ecs.d.ts +50 -0
- package/lib/watchful/ecs.js +69 -0
- package/lib/watchful/lambda.d.ts +59 -0
- package/lib/watchful/lambda.js +65 -0
- package/lib/watchful/metric-alarm.d.ts +34 -0
- package/lib/watchful/metric-alarm.js +3 -0
- package/lib/watchful/rds.d.ts +47 -0
- package/lib/watchful/rds.js +47 -0
- package/lib/watchful/targetgroup.d.ts +47 -0
- package/lib/watchful/targetgroup.js +54 -0
- package/lib/watchful/upperToLower.d.ts +7 -0
- package/lib/watchful/upperToLower.js +35 -0
- package/lib/watchful/watchful.d.ts +119 -0
- package/lib/watchful/watchful.js +182 -0
- package/node_modules/argparse/CHANGELOG.md +216 -0
- package/node_modules/argparse/LICENSE +254 -0
- package/node_modules/argparse/README.md +84 -0
- package/node_modules/argparse/argparse.js +3707 -0
- package/node_modules/argparse/lib/sub.js +67 -0
- package/node_modules/argparse/lib/textwrap.js +440 -0
- package/node_modules/argparse/package.json +31 -0
- package/node_modules/js-yaml/CHANGELOG.md +616 -0
- package/node_modules/js-yaml/LICENSE +21 -0
- package/node_modules/js-yaml/README.md +246 -0
- package/node_modules/js-yaml/bin/js-yaml.js +126 -0
- package/node_modules/js-yaml/dist/js-yaml.js +3874 -0
- package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
- package/node_modules/js-yaml/dist/js-yaml.mjs +3851 -0
- package/node_modules/js-yaml/index.js +47 -0
- package/node_modules/js-yaml/lib/common.js +59 -0
- package/node_modules/js-yaml/lib/dumper.js +965 -0
- package/node_modules/js-yaml/lib/exception.js +55 -0
- package/node_modules/js-yaml/lib/loader.js +1727 -0
- package/node_modules/js-yaml/lib/schema/core.js +11 -0
- package/node_modules/js-yaml/lib/schema/default.js +22 -0
- package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
- package/node_modules/js-yaml/lib/schema/json.js +19 -0
- package/node_modules/js-yaml/lib/schema.js +121 -0
- package/node_modules/js-yaml/lib/snippet.js +101 -0
- package/node_modules/js-yaml/lib/type/binary.js +125 -0
- package/node_modules/js-yaml/lib/type/bool.js +35 -0
- package/node_modules/js-yaml/lib/type/float.js +97 -0
- package/node_modules/js-yaml/lib/type/int.js +156 -0
- package/node_modules/js-yaml/lib/type/map.js +8 -0
- package/node_modules/js-yaml/lib/type/merge.js +12 -0
- package/node_modules/js-yaml/lib/type/null.js +35 -0
- package/node_modules/js-yaml/lib/type/omap.js +44 -0
- package/node_modules/js-yaml/lib/type/pairs.js +53 -0
- package/node_modules/js-yaml/lib/type/seq.js +8 -0
- package/node_modules/js-yaml/lib/type/set.js +29 -0
- package/node_modules/js-yaml/lib/type/str.js +8 -0
- package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
- package/node_modules/js-yaml/lib/type.js +66 -0
- package/node_modules/js-yaml/package.json +66 -0
- package/package.json +126 -0
- package/release-commit-check.js +6 -0
- package/version.json +3 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DataDogMetricAlarm = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const cw = require("aws-cdk-lib/aws-cloudwatch");
|
|
8
|
+
const constructs_1 = require("constructs");
|
|
9
|
+
const upperToLower_1 = require("./upperToLower");
|
|
10
|
+
/**
|
|
11
|
+
* A wrapper for a custom resource that creates a DataDog Monitor.
|
|
12
|
+
*
|
|
13
|
+
* To use this construct, the DataDog integration needs to be installed.
|
|
14
|
+
*/
|
|
15
|
+
class DataDogMetricAlarm extends constructs_1.Construct {
|
|
16
|
+
constructor(scope, id, props) {
|
|
17
|
+
var _b;
|
|
18
|
+
super(scope, id);
|
|
19
|
+
this.serviceToken = upperToLower_1.UpperToLower.getOrCreate(this).provider.serviceToken;
|
|
20
|
+
new aws_cdk_lib_1.CustomResource(this, 'DDMonitor', {
|
|
21
|
+
serviceToken: props.serviceToken,
|
|
22
|
+
pascalCaseProperties: true,
|
|
23
|
+
resourceType: 'Custom::DataDogMonitor',
|
|
24
|
+
properties: {
|
|
25
|
+
ServiceName: props.serviceName,
|
|
26
|
+
version: '1.0.0',
|
|
27
|
+
monitor: {
|
|
28
|
+
type: 'query alert',
|
|
29
|
+
query: this.alarmToDataDogQuery(props),
|
|
30
|
+
name: `${(_b = this.node.scope) === null || _b === void 0 ? void 0 : _b.node.id} ${id}`,
|
|
31
|
+
// TeamName
|
|
32
|
+
message: `
|
|
33
|
+
{{#is_alert}}
|
|
34
|
+
${props.alarmDescription}
|
|
35
|
+
{{/is_alert}}
|
|
36
|
+
|
|
37
|
+
{{#is_alert_recovery}}
|
|
38
|
+
${props.alarmDescription} is back to normal.
|
|
39
|
+
{{/is_alert_recovery}}
|
|
40
|
+
|
|
41
|
+
@opsgenie-${props.dataDogOpsGenieIntegrationName}`,
|
|
42
|
+
options: {
|
|
43
|
+
notify_audit: false,
|
|
44
|
+
locked: false,
|
|
45
|
+
timeout_h: 0,
|
|
46
|
+
silenced: {},
|
|
47
|
+
include_tags: false,
|
|
48
|
+
new_host_delay: 300,
|
|
49
|
+
require_full_window: false,
|
|
50
|
+
notify_no_data: props.treatMissingData === cw.TreatMissingData.BREACHING,
|
|
51
|
+
renotify_interval: 0,
|
|
52
|
+
escalation_message: '',
|
|
53
|
+
evaluation_delay: 900,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Helper function to convert a generic alarm into a DataDog query string.
|
|
61
|
+
*/
|
|
62
|
+
alarmToDataDogQuery(alarm) {
|
|
63
|
+
let unit = 'not supported';
|
|
64
|
+
let totalPeriod = 0;
|
|
65
|
+
if (alarm.metric.period.toSeconds() < 60) {
|
|
66
|
+
totalPeriod = alarm.metric.period.toSeconds() * alarm.evaluationPeriods;
|
|
67
|
+
unit = 's';
|
|
68
|
+
}
|
|
69
|
+
if (alarm.metric.period.toMinutes() < 1440) {
|
|
70
|
+
totalPeriod = alarm.metric.period.toMinutes() * alarm.evaluationPeriods;
|
|
71
|
+
unit = 'm';
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
totalPeriod = alarm.metric.period.toDays() * alarm.evaluationPeriods;
|
|
75
|
+
unit = 'd';
|
|
76
|
+
}
|
|
77
|
+
// avg(last_15m):max:aws.fargate.cpu.percent{ecs_container_name:$ServiceName$} > 95
|
|
78
|
+
const namespace = alarm.metric.namespace.toLocaleLowerCase().replace('/', '.');
|
|
79
|
+
let metricName = alarm.metric.metricName;
|
|
80
|
+
// Special case for ALB / TargetGroup metrics
|
|
81
|
+
switch (metricName) {
|
|
82
|
+
case 'HTTPCode_ELB_5XX_Count':
|
|
83
|
+
metricName = 'HTTPCode_ELB_5XX';
|
|
84
|
+
break;
|
|
85
|
+
case 'HTTPCode_Target_5XX_Count':
|
|
86
|
+
metricName = 'HTTPCode_Target_5XX';
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
if (!metricName.includes('_')) {
|
|
90
|
+
metricName = metricName.replace(/([a-z])([A-Z])/g, '$1_$2');
|
|
91
|
+
}
|
|
92
|
+
metricName = metricName.toLocaleLowerCase();
|
|
93
|
+
const metric = `${namespace}.${metricName}`;
|
|
94
|
+
// statistics must be lowerCase and probably also converted (see allowed values in cw.Metric)
|
|
95
|
+
let comparisonOperator = 'not supported';
|
|
96
|
+
switch (alarm.comparisonOperator) {
|
|
97
|
+
case cw.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD:
|
|
98
|
+
comparisonOperator = '>=';
|
|
99
|
+
break;
|
|
100
|
+
case cw.ComparisonOperator.GREATER_THAN_THRESHOLD:
|
|
101
|
+
comparisonOperator = '>';
|
|
102
|
+
break;
|
|
103
|
+
case cw.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD:
|
|
104
|
+
comparisonOperator = '<=';
|
|
105
|
+
break;
|
|
106
|
+
case cw.ComparisonOperator.LESS_THAN_THRESHOLD:
|
|
107
|
+
comparisonOperator = '<';
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
//const timeStatistic = 'sum'; // For count it should be `sum`, for gauges maybe `avg`
|
|
111
|
+
let alarmStatistic = 'not supported';
|
|
112
|
+
switch (alarm.metric.statistic) {
|
|
113
|
+
case cw.Statistic.AVERAGE:
|
|
114
|
+
alarmStatistic = 'avg';
|
|
115
|
+
break;
|
|
116
|
+
case cw.Statistic.MAXIMUM:
|
|
117
|
+
alarmStatistic = 'max';
|
|
118
|
+
break;
|
|
119
|
+
case cw.Statistic.MINIMUM:
|
|
120
|
+
alarmStatistic = 'min';
|
|
121
|
+
break;
|
|
122
|
+
case cw.Statistic.SAMPLE_COUNT:
|
|
123
|
+
break;
|
|
124
|
+
case cw.Statistic.SUM:
|
|
125
|
+
alarmStatistic = 'sum';
|
|
126
|
+
break;
|
|
127
|
+
default:
|
|
128
|
+
alarmStatistic = 'avg';
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
let dimensions = `account_id:${aws_cdk_lib_1.Stack.of(this).account}`;
|
|
132
|
+
if (alarm.metric.dimensions) {
|
|
133
|
+
for (const key in alarm.metric.dimensions) {
|
|
134
|
+
const upperToLowerCr = new aws_cdk_lib_1.CustomResource(this, `${key}UpperToLower`, {
|
|
135
|
+
resourceType: 'Custom::UpperToLower',
|
|
136
|
+
serviceToken: this.serviceToken,
|
|
137
|
+
properties: {
|
|
138
|
+
Upper: alarm.metric.dimensions[key],
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
const value = upperToLowerCr.getAtt('Lower');
|
|
142
|
+
dimensions += `,${key.toLocaleLowerCase()}:${value}`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
switch (alarm.treatMissingData) {
|
|
146
|
+
case cw.TreatMissingData.NOT_BREACHING:
|
|
147
|
+
return `${alarmStatistic}(last_${totalPeriod}${unit}):default_zero(${alarmStatistic}:${metric}{${dimensions}}) ${comparisonOperator} ${alarm.threshold}`;
|
|
148
|
+
case cw.TreatMissingData.BREACHING:
|
|
149
|
+
case cw.TreatMissingData.IGNORE:
|
|
150
|
+
default:
|
|
151
|
+
return `${alarmStatistic}(last_${totalPeriod}${unit}):${alarmStatistic}:${metric}{${dimensions}} ${comparisonOperator} ${alarm.threshold}`;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.DataDogMetricAlarm = DataDogMetricAlarm;
|
|
156
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
157
|
+
DataDogMetricAlarm[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.DataDogMetricAlarm", version: "0.0.0" };
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1tZXRyaWMtYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvZGF0YWRvZy1tZXRyaWMtYWxhcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBb0Q7QUFDcEQsaURBQWlEO0FBQ2pELDJDQUF1QztBQUV2QyxpREFBOEM7QUFzQjlDOzs7O0dBSUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLHNCQUFTO0lBRS9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEI7O1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFlBQVksR0FBRywyQkFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBRXpFLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ3BDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxvQkFBb0IsRUFBRSxJQUFJO1lBQzFCLFlBQVksRUFBRSx3QkFBd0I7WUFDdEMsVUFBVSxFQUFFO2dCQUNWLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsYUFBYTtvQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7b0JBQ3RDLElBQUksRUFBRSxHQUFHLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLDBDQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO29CQUN6QyxXQUFXO29CQUNYLE9BQU8sRUFBRTs7RUFFakIsS0FBSyxDQUFDLGdCQUFnQjs7OztFQUl0QixLQUFLLENBQUMsZ0JBQWdCOzs7WUFHWixLQUFLLENBQUMsOEJBQThCLEVBQUU7b0JBQ3hDLE9BQU8sRUFBRTt3QkFDUCxZQUFZ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QUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLFVBQVUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO2FBQ3REO1NBQ0Y7UUFFRCxRQUFRLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5QixLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO2dCQUNwQyxPQUFPLEdBQUcsY0FBYyxTQUFTLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixjQUFjLElBQUksTUFBTSxJQUFJLFVBQVUsTUFBTSxrQkFBa0IsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0osS0FBSyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1lBQ25DLEtBQUssRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNoQztnQkFDRSxPQUFPLEdBQUcsY0FBYyxTQUFTLFdBQVcsR0FBRyxJQUFJLEtBQUssY0FBYyxJQUFJLE1BQU0sSUFBSSxVQUFVLEtBQUssa0JBQWtCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQzlJO0lBQ0gsQ0FBQzs7QUF0SkgsZ0RBdUpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIEN1c3RvbVJlc291cmNlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY3cgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZXRyaWNBbGFybVByb3BzIH0gZnJvbSAnLi9tZXRyaWMtYWxhcm0nO1xuaW1wb3J0IHsgVXBwZXJUb0xvd2VyIH0gZnJvbSAnLi91cHBlclRvTG93ZXInO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgRGF0YURvZ01vbml0b3IgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YURvZ01ldHJpY0FsYXJtUHJvcHMgZXh0ZW5kcyBNZXRyaWNBbGFybVByb3BzIHtcbiAgLyoqXG4gICAgICogU2VydmljZSB0b2tlbiB3aGljaCBwb2ludHMgdG8gdGhlIERhdGFEb2cgTW9uaXRvciBjdXN0b20gcmVzb3VyY2UgbGFtYmRhIG9yIHNucyB0b3BpYy5cbiAgICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIG5hbWUgdXNlZCB0byBuYW1lIHRoZSBtb250b3JzIChpbiBkYXRhZG9nLWludGVncmF0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIERhdGFEb2cncyBPcHNHZW5pZSBpbnRlZ3JhdGlvbi4gVXNlZCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBPcHNHZW5pZSBhbGFybXMgZm9yIHRoZSBjcmVhdGVkIERhdGFEb2cgTW9uaXRvci5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgd3JhcHBlciBmb3IgYSBjdXN0b20gcmVzb3VyY2UgdGhhdCBjcmVhdGVzIGEgRGF0YURvZyBNb25pdG9yLlxuICpcbiAqIFRvIHVzZSB0aGlzIGNvbnN0cnVjdCwgdGhlIERhdGFEb2cgaW50ZWdyYXRpb24gbmVlZHMgdG8gYmUgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YURvZ01ldHJpY0FsYXJtIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSBzZXJ2aWNlVG9rZW46IHN0cmluZztcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFEb2dNZXRyaWNBbGFybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuc2VydmljZVRva2VuID0gVXBwZXJUb0xvd2VyLmdldE9yQ3JlYXRlKHRoaXMpLnByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnRERNb25pdG9yJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5zZXJ2aWNlVG9rZW4sXG4gICAgICBwYXNjYWxDYXNlUHJvcGVydGllczogdHJ1ZSxcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6RGF0YURvZ01vbml0b3InLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBTZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIG1vbml0b3I6IHtcbiAgICAgICAgICB0eXBlOiAncXVlcnkgYWxlcnQnLFxuICAgICAgICAgIHF1ZXJ5OiB0aGlzLmFsYXJtVG9EYXRhRG9nUXVlcnkocHJvcHMpLFxuICAgICAgICAgIG5hbWU6IGAke3RoaXMubm9kZS5zY29wZT8ubm9kZS5pZH0gJHtpZH1gLCAvLyBkYXRhZG9nLWludGVncmF0aW9uIGN1c3RvbSByZXNvdXJjZSBwcmVwZW5kIGl0IHdpdGggVGVhbSBhbmQgU2VydmljZU5hbWVcbiAgICAgICAgICAvLyBUZWFtTmFtZVxuICAgICAgICAgIG1lc3NhZ2U6IGBcbnt7I2lzX2FsZXJ0fX1cbiR7cHJvcHMuYWxhcm1EZXNjcmlwdGlvbn1cbnt7L2lzX2FsZXJ0fX0gXG5cbnt7I2lzX2FsZXJ0X3JlY292ZXJ5fX1cbiR7cHJvcHMuYWxhcm1EZXNjcmlwdGlvbn0gaXMgYmFjayB0byBub3JtYWwuXG57ey9pc19hbGVydF9yZWNvdmVyeX19IFxuXG5Ab3BzZ2VuaWUtJHtwcm9wcy5kYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWV9YCxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBub3RpZnlfYXVkaXQ6IGZhbHNlLFxuICAgICAgICAgICAgbG9ja2VkOiBmYWxzZSwgLy8gZG91YmxlLWNoZWNrIVxuICAgICAgICAgICAgdGltZW91dF9oOiAwLFxuICAgICAgICAgICAgc2lsZW5jZWQ6IHt9LFxuICAgICAgICAgICAgaW5jbHVkZV90YWdzOiBmYWxzZSxcbiAgICAgICAgICAgIG5ld19ob3N0X2RlbGF5OiAzMDAsXG4gICAgICAgICAgICByZXF1aXJlX2Z1bGxfd2luZG93OiBmYWxzZSxcbiAgICAgICAgICAgIG5vdGlmeV9ub19kYXRhOiBwcm9wcy50cmVhdE1pc3NpbmdEYXRhID09PSBjdy5UcmVhdE1pc3NpbmdEYXRhLkJSRUFDSElORyxcbiAgICAgICAgICAgIHJlbm90aWZ5X2ludGVydmFsOiAwLFxuICAgICAgICAgICAgZXNjYWxhdGlvbl9tZXNzYWdlOiAnJyxcbiAgICAgICAgICAgIGV2YWx1YXRpb25fZGVsYXk6IDkwMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgZ2VuZXJpYyBhbGFybSBpbnRvIGEgRGF0YURvZyBxdWVyeSBzdHJpbmcuXG4gICAgICovXG4gIGFsYXJtVG9EYXRhRG9nUXVlcnkoYWxhcm06IE1ldHJpY0FsYXJtUHJvcHMpOiBzdHJpbmcge1xuICAgIGxldCB1bml0ID0gJ25vdCBzdXBwb3J0ZWQnO1xuICAgIGxldCB0b3RhbFBlcmlvZCA9IDA7XG4gICAgaWYgKGFsYXJtLm1ldHJpYy5wZXJpb2QudG9TZWNvbmRzKCkgPCA2MCkge1xuICAgICAgdG90YWxQZXJpb2QgPSBhbGFybS5tZXRyaWMucGVyaW9kLnRvU2Vjb25kcygpICogYWxhcm0uZXZhbHVhdGlvblBlcmlvZHM7XG4gICAgICB1bml0ID0gJ3MnO1xuICAgIH1cbiAgICBpZiAoYWxhcm0ubWV0cmljLnBlcmlvZC50b01pbnV0ZXMoKSA8IDE0NDApIHtcbiAgICAgIHRvdGFsUGVyaW9kID0gYWxhcm0ubWV0cmljLnBlcmlvZC50b01pbnV0ZXMoKSAqIGFsYXJtLmV2YWx1YXRpb25QZXJpb2RzO1xuICAgICAgdW5pdCA9ICdtJztcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWxQZXJpb2QgPSBhbGFybS5tZXRyaWMucGVyaW9kLnRvRGF5cygpICogYWxhcm0uZXZhbHVhdGlvblBlcmlvZHM7XG4gICAgICB1bml0ID0gJ2QnO1xuICAgIH1cblxuICAgIC8vIGF2ZyhsYXN0XzE1bSk6bWF4OmF3cy5mYXJnYXRlLmNwdS5wZXJjZW50e2Vjc19jb250YWluZXJfbmFtZTokU2VydmljZU5hbWUkfSA+IDk1XG4gICAgY29uc3QgbmFtZXNwYWNlID0gYWxhcm0ubWV0cmljLm5hbWVzcGFjZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoJy8nLCAnLicpO1xuXG4gICAgbGV0IG1ldHJpY05hbWUgPSBhbGFybS5tZXRyaWMubWV0cmljTmFtZTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgQUxCIC8gVGFyZ2V0R3JvdXAgbWV0cmljc1xuICAgIHN3aXRjaCAobWV0cmljTmFtZSkge1xuICAgICAgY2FzZSAnSFRUUENvZGVfRUxCXzVYWF9Db3VudCc6XG4gICAgICAgIG1ldHJpY05hbWUgPSAnSFRUUENvZGVfRUxCXzVYWCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSFRUUENvZGVfVGFyZ2V0XzVYWF9Db3VudCc6XG4gICAgICAgIG1ldHJpY05hbWUgPSAnSFRUUENvZGVfVGFyZ2V0XzVYWCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIW1ldHJpY05hbWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgbWV0cmljTmFtZSA9IG1ldHJpY05hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxXyQyJyk7XG4gICAgfVxuICAgIG1ldHJpY05hbWUgPSBtZXRyaWNOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG5cbiAgICBjb25zdCBtZXRyaWMgPSBgJHtuYW1lc3BhY2V9LiR7bWV0cmljTmFtZX1gO1xuXG4gICAgLy8gc3RhdGlzdGljcyBtdXN0IGJlIGxvd2VyQ2FzZSBhbmQgcHJvYmFibHkgYWxzbyBjb252ZXJ0ZWQgKHNlZSBhbGxvd2VkIHZhbHVlcyBpbiBjdy5NZXRyaWMpXG4gICAgbGV0IGNvbXBhcmlzb25PcGVyYXRvciA9ICdub3Qgc3VwcG9ydGVkJztcbiAgICBzd2l0Y2ggKGFsYXJtLmNvbXBhcmlzb25PcGVyYXRvcikge1xuICAgICAgY2FzZSBjdy5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRDpcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yID0gJz49JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xEOlxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3IgPSAnPic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjdy5Db21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRDpcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yID0gJzw9JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGN3LkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xEOlxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3IgPSAnPCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vY29uc3QgdGltZVN0YXRpc3RpYyA9ICdzdW0nOyAvLyBGb3IgY291bnQgaXQgc2hvdWxkIGJlIGBzdW1gLCBmb3IgZ2F1Z2VzIG1heWJlIGBhdmdgXG5cbiAgICBsZXQgYWxhcm1TdGF0aXN0aWMgPSAnbm90IHN1cHBvcnRlZCc7XG4gICAgc3dpdGNoIChhbGFybS5tZXRyaWMuc3RhdGlzdGljKSB7XG4gICAgICBjYXNlIGN3LlN0YXRpc3RpYy5BVkVSQUdFOlxuICAgICAgICBhbGFybVN0YXRpc3RpYyA9ICdhdmcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY3cuU3RhdGlzdGljLk1BWElNVU06XG4gICAgICAgIGFsYXJtU3RhdGlzdGljID0gJ21heCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjdy5TdGF0aXN0aWMuTUlOSU1VTTpcbiAgICAgICAgYWxhcm1TdGF0aXN0aWMgPSAnbWluJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGN3LlN0YXRpc3RpYy5TQU1QTEVfQ09VTlQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjdy5TdGF0aXN0aWMuU1VNOlxuICAgICAgICBhbGFybVN0YXRpc3RpYyA9ICdzdW0nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFsYXJtU3RhdGlzdGljID0gJ2F2Zyc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBkaW1lbnNpb25zID0gYGFjY291bnRfaWQ6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fWA7XG5cbiAgICBpZiAoYWxhcm0ubWV0cmljLmRpbWVuc2lvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGFsYXJtLm1ldHJpYy5kaW1lbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyVG9Mb3dlckNyID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIGAke2tleX1VcHBlclRvTG93ZXJgLCB7XG4gICAgICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpVcHBlclRvTG93ZXInLFxuICAgICAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5zZXJ2aWNlVG9rZW4sXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgVXBwZXI6IGFsYXJtLm1ldHJpYy5kaW1lbnNpb25zW2tleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdXBwZXJUb0xvd2VyQ3IuZ2V0QXR0KCdMb3dlcicpO1xuICAgICAgICBkaW1lbnNpb25zICs9IGAsJHtrZXkudG9Mb2NhbGVMb3dlckNhc2UoKX06JHt2YWx1ZX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoYWxhcm0udHJlYXRNaXNzaW5nRGF0YSkge1xuICAgICAgY2FzZSBjdy5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkc6XG4gICAgICAgIHJldHVybiBgJHthbGFybVN0YXRpc3RpY30obGFzdF8ke3RvdGFsUGVyaW9kfSR7dW5pdH0pOmRlZmF1bHRfemVybygke2FsYXJtU3RhdGlzdGljfToke21ldHJpY317JHtkaW1lbnNpb25zfX0pICR7Y29tcGFyaXNvbk9wZXJhdG9yfSAke2FsYXJtLnRocmVzaG9sZH1gO1xuICAgICAgY2FzZSBjdy5UcmVhdE1pc3NpbmdEYXRhLkJSRUFDSElORzpcbiAgICAgIGNhc2UgY3cuVHJlYXRNaXNzaW5nRGF0YS5JR05PUkU6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YWxhcm1TdGF0aXN0aWN9KGxhc3RfJHt0b3RhbFBlcmlvZH0ke3VuaXR9KToke2FsYXJtU3RhdGlzdGljfToke21ldHJpY317JHtkaW1lbnNpb25zfX0gJHtjb21wYXJpc29uT3BlcmF0b3J9ICR7YWxhcm0udGhyZXNob2xkfWA7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as docdb from 'aws-cdk-lib/aws-docdb';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { IWatchful } from './watchful';
|
|
4
|
+
/**
|
|
5
|
+
* Options for defining alarms.
|
|
6
|
+
*/
|
|
7
|
+
export interface WatchDocDbClusterOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Threshold of database cpu utilization.
|
|
10
|
+
*
|
|
11
|
+
* @default 80
|
|
12
|
+
*/
|
|
13
|
+
readonly cpuUtilizationThreshold?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Minimum database freeable memory in bytes.
|
|
16
|
+
*
|
|
17
|
+
* @default 64000000 (64 Megabyte)
|
|
18
|
+
*/
|
|
19
|
+
readonly freeableMemoryThresholdInByte?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Threshold of database swap usage
|
|
22
|
+
*
|
|
23
|
+
* @default 256000000 (256 Megabyte)
|
|
24
|
+
*/
|
|
25
|
+
readonly swapUsageThresholdInByte?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Minimum database free local storage space
|
|
28
|
+
*
|
|
29
|
+
* @default 2000000000 (2 Gigabyte)
|
|
30
|
+
*/
|
|
31
|
+
readonly freeLocalStorageInByte?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Properties for defining a WatchDocDbCluster
|
|
35
|
+
*/
|
|
36
|
+
export interface WatchDocDbClusterProps extends WatchDocDbClusterOptions {
|
|
37
|
+
/**
|
|
38
|
+
* The reference to IWatchful class. Used internally.
|
|
39
|
+
*/
|
|
40
|
+
readonly watchful: IWatchful;
|
|
41
|
+
/**
|
|
42
|
+
* The DocDB cluster that should be watched.
|
|
43
|
+
* [disable-awslint:ref-via-interface]
|
|
44
|
+
*/
|
|
45
|
+
readonly docDb: docdb.DatabaseCluster;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A Construct which creates the following alarms for DocumentDb clusters:
|
|
49
|
+
*
|
|
50
|
+
* - freeable memory
|
|
51
|
+
* - swap usage
|
|
52
|
+
* - free local storage
|
|
53
|
+
*/
|
|
54
|
+
export declare class WatchDocDbCluster extends Construct {
|
|
55
|
+
private readonly watchful;
|
|
56
|
+
private readonly docDb;
|
|
57
|
+
constructor(scope: Construct, id: string, props: WatchDocDbClusterProps);
|
|
58
|
+
private createCpuUtilizationTooHighAlarm;
|
|
59
|
+
private createFreeableMemoryTooLowAlarm;
|
|
60
|
+
private createSwapUsageTooHighAlarm;
|
|
61
|
+
private createFreeLocalStorageTooLowAlarm;
|
|
62
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WatchDocDbCluster = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const cw = require("aws-cdk-lib/aws-cloudwatch");
|
|
8
|
+
const constructs_1 = require("constructs");
|
|
9
|
+
/**
|
|
10
|
+
* A Construct which creates the following alarms for DocumentDb clusters:
|
|
11
|
+
*
|
|
12
|
+
* - freeable memory
|
|
13
|
+
* - swap usage
|
|
14
|
+
* - free local storage
|
|
15
|
+
*/
|
|
16
|
+
class WatchDocDbCluster extends constructs_1.Construct {
|
|
17
|
+
constructor(scope, id, props) {
|
|
18
|
+
super(scope, id);
|
|
19
|
+
this.watchful = props.watchful;
|
|
20
|
+
this.docDb = props.docDb;
|
|
21
|
+
this.watchful.createAlarm(this, 'CpuUtilization', this.createCpuUtilizationTooHighAlarm(props.cpuUtilizationThreshold));
|
|
22
|
+
this.watchful.createAlarm(this, 'FreeableMemoryTooLow', this.createFreeableMemoryTooLowAlarm(props.freeableMemoryThresholdInByte));
|
|
23
|
+
this.watchful.createAlarm(this, 'SwapUsageTooHigh', this.createSwapUsageTooHighAlarm(props.swapUsageThresholdInByte));
|
|
24
|
+
this.watchful.createAlarm(this, 'FreeLocalStorageTooLow', this.createFreeLocalStorageTooLowAlarm(props.freeLocalStorageInByte));
|
|
25
|
+
}
|
|
26
|
+
createCpuUtilizationTooHighAlarm(cpuUtilizationThreshold = 80) {
|
|
27
|
+
const docDbMetric = new cw.Metric({
|
|
28
|
+
metricName: 'CPUUtilization',
|
|
29
|
+
namespace: 'AWS/DocDB',
|
|
30
|
+
period: aws_cdk_lib_1.Duration.seconds(600),
|
|
31
|
+
statistic: cw.Statistic.AVERAGE,
|
|
32
|
+
dimensionsMap: {
|
|
33
|
+
DBClusterIdentifier: this.docDb.clusterIdentifier,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
metric: docDbMetric,
|
|
38
|
+
alarmDescription: 'Average database CPU utilization over last 10 minutes too high.',
|
|
39
|
+
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
40
|
+
threshold: cpuUtilizationThreshold,
|
|
41
|
+
evaluationPeriods: 1,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
createFreeableMemoryTooLowAlarm(freeableMemoryThresholdInByte = 64000000) {
|
|
45
|
+
const docDbMetric = new cw.Metric({
|
|
46
|
+
metricName: 'FreeableMemory',
|
|
47
|
+
namespace: 'AWS/DocDB',
|
|
48
|
+
period: aws_cdk_lib_1.Duration.seconds(600),
|
|
49
|
+
statistic: cw.Statistic.AVERAGE,
|
|
50
|
+
dimensionsMap: {
|
|
51
|
+
DBClusterIdentifier: this.docDb.clusterIdentifier,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
metric: docDbMetric,
|
|
56
|
+
alarmDescription: 'Average database freeable memory over last 10 minutes too low, performance may suffer.',
|
|
57
|
+
comparisonOperator: cw.ComparisonOperator.LESS_THAN_THRESHOLD,
|
|
58
|
+
threshold: freeableMemoryThresholdInByte,
|
|
59
|
+
evaluationPeriods: 1,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
createSwapUsageTooHighAlarm(swapUsageThresholdInByte = 256000000) {
|
|
63
|
+
const docDbMetric = new cw.Metric({
|
|
64
|
+
metricName: 'SwapUsage',
|
|
65
|
+
namespace: 'AWS/DocDB',
|
|
66
|
+
period: aws_cdk_lib_1.Duration.seconds(600),
|
|
67
|
+
statistic: cw.Statistic.AVERAGE,
|
|
68
|
+
dimensionsMap: {
|
|
69
|
+
DBClusterIdentifier: this.docDb.clusterIdentifier,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
metric: docDbMetric,
|
|
74
|
+
alarmDescription: 'Average database swap usage over last 10 minutes too high, performance may suffer.',
|
|
75
|
+
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
76
|
+
threshold: swapUsageThresholdInByte,
|
|
77
|
+
evaluationPeriods: 1,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
createFreeLocalStorageTooLowAlarm(freeLocalStorageInByte = 2000000000) {
|
|
81
|
+
const docDbMetric = new cw.Metric({
|
|
82
|
+
metricName: 'FreeLocalStorage',
|
|
83
|
+
namespace: 'AWS/DocDB',
|
|
84
|
+
period: aws_cdk_lib_1.Duration.seconds(600),
|
|
85
|
+
statistic: cw.Statistic.AVERAGE,
|
|
86
|
+
dimensionsMap: {
|
|
87
|
+
DBClusterIdentifier: this.docDb.clusterIdentifier,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
metric: docDbMetric,
|
|
92
|
+
alarmDescription: 'Average database free local storage space over last 10 minutes too low.',
|
|
93
|
+
comparisonOperator: cw.ComparisonOperator.LESS_THAN_THRESHOLD,
|
|
94
|
+
threshold: freeLocalStorageInByte,
|
|
95
|
+
evaluationPeriods: 1,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.WatchDocDbCluster = WatchDocDbCluster;
|
|
100
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
101
|
+
WatchDocDbCluster[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchDocDbCluster", version: "0.0.0" };
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvZG9jZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBdUM7QUFDdkMsaURBQWlEO0FBRWpELDJDQUF1QztBQWtEdkM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxzQkFBUztJQUk5QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsZ0NBQWdDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQ3JFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLHNCQUFzQixFQUN0QixJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQzFFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGtCQUFrQixFQUNsQixJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQ2pFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLHdCQUF3QixFQUN4QixJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRU8sZ0NBQWdDLENBQUMsdUJBQXVCLEdBQUcsRUFBRTtRQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDaEMsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixTQUFTLEVBQUUsV0FBVztZQUN0QixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzdCLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU87WUFDL0IsYUFBYSxFQUFFO2dCQUNiLG1CQUFtQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO2FBQ2xEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLE1BQU0sRUFBRSxXQUFXO1lBQ25CLGdCQUFnQixFQUFFLGlFQUFpRTtZQUNuRixrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ2hFLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLCtCQUErQixDQUFDLDZCQUE2QixHQUFHLFFBQVE7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2hDLFVBQVUsRUFBRSxnQkFBZ0I7WUFDNUIsU0FBUyxFQUFFLFdBQVc7WUFDdEIsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM3QixTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPO1lBQy9CLGFBQWEsRUFBRTtnQkFDYixtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjthQUNsRDtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxNQUFNLEVBQUUsV0FBVztZQUNuQixnQkFBZ0IsRUFBRSx3RkFBd0Y7WUFDMUcsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQjtZQUM3RCxTQUFTLEVBQUUsNkJBQTZCO1lBQ3hDLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFFTywyQkFBMkIsQ0FBQyx3QkFBd0IsR0FBRyxTQUFTO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQyxVQUFVLEVBQUUsV0FBVztZQUN2QixTQUFTLEVBQUUsV0FBVztZQUN0QixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzdCLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU87WUFDL0IsYUFBYSxFQUFFO2dCQUNiLG1CQUFtQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO2FBQ2xEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLE1BQU0sRUFBRSxXQUFXO1lBQ25CLGdCQUFnQixFQUFFLG9GQUFvRjtZQUN0RyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ2hFLFNBQVMsRUFBRSx3QkFBd0I7WUFDbkMsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLGlDQUFpQyxDQUFDLHNCQUFzQixHQUFHLFVBQVU7UUFDM0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2hDLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsU0FBUyxFQUFFLFdBQVc7WUFDdEIsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM3QixTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPO1lBQy9CLGFBQWEsRUFBRTtnQkFDYixtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjthQUNsRDtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxNQUFNLEVBQUUsV0FBVztZQUNuQixnQkFBZ0IsRUFBRSx5RUFBeUU7WUFDM0Ysa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQjtZQUM3RCxTQUFTLEVBQUUsc0JBQXNCO1lBQ2pDLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7O0FBdEdILDhDQXVHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY3cgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgZG9jZGIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWRvY2RiJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWV0cmljQWxhcm1Qcm9wcyB9IGZyb20gJy4vbWV0cmljLWFsYXJtJztcbmltcG9ydCB7IElXYXRjaGZ1bCB9IGZyb20gJy4vd2F0Y2hmdWwnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRlZmluaW5nIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaERvY0RiQ2x1c3Rlck9wdGlvbnMge1xuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgb2YgZGF0YWJhc2UgY3B1IHV0aWxpemF0aW9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODBcbiAgICAgKi9cbiAgcmVhZG9ubHkgY3B1VXRpbGl6YXRpb25UaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgICAqIE1pbmltdW0gZGF0YWJhc2UgZnJlZWFibGUgbWVtb3J5IGluIGJ5dGVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgNjQwMDAwMDAgKDY0IE1lZ2FieXRlKVxuICAgICAqL1xuICByZWFkb25seSBmcmVlYWJsZU1lbW9yeVRocmVzaG9sZEluQnl0ZT86IG51bWJlcjtcbiAgLyoqXG4gICAgICogVGhyZXNob2xkIG9mIGRhdGFiYXNlIHN3YXAgdXNhZ2VcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDI1NjAwMDAwMCAoMjU2IE1lZ2FieXRlKVxuICAgICAqL1xuICByZWFkb25seSBzd2FwVXNhZ2VUaHJlc2hvbGRJbkJ5dGU/OiBudW1iZXI7XG4gIC8qKlxuICAgICAqIE1pbmltdW0gZGF0YWJhc2UgZnJlZSBsb2NhbCBzdG9yYWdlIHNwYWNlXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAyMDAwMDAwMDAwICgyIEdpZ2FieXRlKVxuICAgICAqL1xuICByZWFkb25seSBmcmVlTG9jYWxTdG9yYWdlSW5CeXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgV2F0Y2hEb2NEYkNsdXN0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaERvY0RiQ2x1c3RlclByb3BzIGV4dGVuZHMgV2F0Y2hEb2NEYkNsdXN0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSB0byBJV2F0Y2hmdWwgY2xhc3MuIFVzZWQgaW50ZXJuYWxseS5cbiAgICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcblxuICAvKipcbiAgICAgKiBUaGUgRG9jREIgY2x1c3RlciB0aGF0IHNob3VsZCBiZSB3YXRjaGVkLlxuICAgICAqIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAgICovXG4gIHJlYWRvbmx5IGRvY0RiOiBkb2NkYi5EYXRhYmFzZUNsdXN0ZXI7XG59XG5cbi8qKlxuICogQSBDb25zdHJ1Y3Qgd2hpY2ggY3JlYXRlcyB0aGUgZm9sbG93aW5nIGFsYXJtcyBmb3IgRG9jdW1lbnREYiBjbHVzdGVyczpcbiAqXG4gKiAtIGZyZWVhYmxlIG1lbW9yeVxuICogLSBzd2FwIHVzYWdlXG4gKiAtIGZyZWUgbG9jYWwgc3RvcmFnZVxuICovXG5leHBvcnQgY2xhc3MgV2F0Y2hEb2NEYkNsdXN0ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHdhdGNoZnVsOiBJV2F0Y2hmdWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jRGI6IGRvY2RiLkRhdGFiYXNlQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2F0Y2hEb2NEYkNsdXN0ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLndhdGNoZnVsID0gcHJvcHMud2F0Y2hmdWw7XG4gICAgdGhpcy5kb2NEYiA9IHByb3BzLmRvY0RiO1xuXG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLFxuICAgICAgJ0NwdVV0aWxpemF0aW9uJyxcbiAgICAgIHRoaXMuY3JlYXRlQ3B1VXRpbGl6YXRpb25Ub29IaWdoQWxhcm0ocHJvcHMuY3B1VXRpbGl6YXRpb25UaHJlc2hvbGQpLFxuICAgICk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLFxuICAgICAgJ0ZyZWVhYmxlTWVtb3J5VG9vTG93JyxcbiAgICAgIHRoaXMuY3JlYXRlRnJlZWFibGVNZW1vcnlUb29Mb3dBbGFybShwcm9wcy5mcmVlYWJsZU1lbW9yeVRocmVzaG9sZEluQnl0ZSksXG4gICAgKTtcbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsXG4gICAgICAnU3dhcFVzYWdlVG9vSGlnaCcsXG4gICAgICB0aGlzLmNyZWF0ZVN3YXBVc2FnZVRvb0hpZ2hBbGFybShwcm9wcy5zd2FwVXNhZ2VUaHJlc2hvbGRJbkJ5dGUpLFxuICAgICk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLFxuICAgICAgJ0ZyZWVMb2NhbFN0b3JhZ2VUb29Mb3cnLFxuICAgICAgdGhpcy5jcmVhdGVGcmVlTG9jYWxTdG9yYWdlVG9vTG93QWxhcm0ocHJvcHMuZnJlZUxvY2FsU3RvcmFnZUluQnl0ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3B1VXRpbGl6YXRpb25Ub29IaWdoQWxhcm0oY3B1VXRpbGl6YXRpb25UaHJlc2hvbGQgPSA4MCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGRvY0RiTWV0cmljID0gbmV3IGN3Lk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiAnQ1BVVXRpbGl6YXRpb24nLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL0RvY0RCJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MDApLFxuICAgICAgc3RhdGlzdGljOiBjdy5TdGF0aXN0aWMuQVZFUkFHRSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgREJDbHVzdGVySWRlbnRpZmllcjogdGhpcy5kb2NEYi5jbHVzdGVySWRlbnRpZmllcixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogZG9jRGJNZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiAnQXZlcmFnZSBkYXRhYmFzZSBDUFUgdXRpbGl6YXRpb24gb3ZlciBsYXN0IDEwIG1pbnV0ZXMgdG9vIGhpZ2guJyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY3cuQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IGNwdVV0aWxpemF0aW9uVGhyZXNob2xkLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnJlZWFibGVNZW1vcnlUb29Mb3dBbGFybShmcmVlYWJsZU1lbW9yeVRocmVzaG9sZEluQnl0ZSA9IDY0MDAwMDAwKTogTWV0cmljQWxhcm1Qcm9wcyB7XG4gICAgY29uc3QgZG9jRGJNZXRyaWMgPSBuZXcgY3cuTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWU6ICdGcmVlYWJsZU1lbW9yeScsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvRG9jREInLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwMCksXG4gICAgICBzdGF0aXN0aWM6IGN3LlN0YXRpc3RpYy5BVkVSQUdFLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmRvY0RiLmNsdXN0ZXJJZGVudGlmaWVyLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljOiBkb2NEYk1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246ICdBdmVyYWdlIGRhdGFiYXNlIGZyZWVhYmxlIG1lbW9yeSBvdmVyIGxhc3QgMTAgbWludXRlcyB0b28gbG93LCBwZXJmb3JtYW5jZSBtYXkgc3VmZmVyLicsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiBmcmVlYWJsZU1lbW9yeVRocmVzaG9sZEluQnl0ZSxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN3YXBVc2FnZVRvb0hpZ2hBbGFybShzd2FwVXNhZ2VUaHJlc2hvbGRJbkJ5dGUgPSAyNTYwMDAwMDApOiBNZXRyaWNBbGFybVByb3BzIHtcbiAgICBjb25zdCBkb2NEYk1ldHJpYyA9IG5ldyBjdy5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogJ1N3YXBVc2FnZScsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvRG9jREInLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwMCksXG4gICAgICBzdGF0aXN0aWM6IGN3LlN0YXRpc3RpYy5BVkVSQUdFLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmRvY0RiLmNsdXN0ZXJJZGVudGlmaWVyLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljOiBkb2NEYk1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246ICdBdmVyYWdlIGRhdGFiYXNlIHN3YXAgdXNhZ2Ugb3ZlciBsYXN0IDEwIG1pbnV0ZXMgdG9vIGhpZ2gsIHBlcmZvcm1hbmNlIG1heSBzdWZmZXIuJyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY3cuQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IHN3YXBVc2FnZVRocmVzaG9sZEluQnl0ZSxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZyZWVMb2NhbFN0b3JhZ2VUb29Mb3dBbGFybShmcmVlTG9jYWxTdG9yYWdlSW5CeXRlID0gMjAwMDAwMDAwMCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGRvY0RiTWV0cmljID0gbmV3IGN3Lk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiAnRnJlZUxvY2FsU3RvcmFnZScsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvRG9jREInLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwMCksXG4gICAgICBzdGF0aXN0aWM6IGN3LlN0YXRpc3RpYy5BVkVSQUdFLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmRvY0RiLmNsdXN0ZXJJZGVudGlmaWVyLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljOiBkb2NEYk1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246ICdBdmVyYWdlIGRhdGFiYXNlIGZyZWUgbG9jYWwgc3RvcmFnZSBzcGFjZSBvdmVyIGxhc3QgMTAgbWludXRlcyB0b28gbG93LicsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiBmcmVlTG9jYWxTdG9yYWdlSW5CeXRlLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { aws_dynamodb as dynamodb } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { IWatchful } from './watchful';
|
|
4
|
+
/**
|
|
5
|
+
* Options for defining alarms.
|
|
6
|
+
*/
|
|
7
|
+
export interface WatchDynamoDbTableOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Threshold of read throttle events.
|
|
10
|
+
*
|
|
11
|
+
* @default 1
|
|
12
|
+
*/
|
|
13
|
+
readonly readThrottleEventsThreshold?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Threshold of write throttle events.
|
|
16
|
+
*
|
|
17
|
+
* @default 1
|
|
18
|
+
*/
|
|
19
|
+
readonly writeThrottleEventsThreshold?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Threshold of throttled requests events.
|
|
22
|
+
*
|
|
23
|
+
* @default 1
|
|
24
|
+
*/
|
|
25
|
+
readonly throttledRequestsEventsThreshold?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Threshold of user errors.
|
|
28
|
+
*
|
|
29
|
+
* @default 1
|
|
30
|
+
*/
|
|
31
|
+
readonly userErrorsThreshold?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Threshold of system errors.
|
|
34
|
+
*
|
|
35
|
+
* @default 1
|
|
36
|
+
*/
|
|
37
|
+
readonly systemErrorsThreshold?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Properties for defining a WatchDynamoDbTable
|
|
41
|
+
*/
|
|
42
|
+
export interface WatchDynamoDbTableProps extends WatchDynamoDbTableOptions {
|
|
43
|
+
/**
|
|
44
|
+
* The reference to IWatchful class. Used internally.
|
|
45
|
+
*/
|
|
46
|
+
readonly watchful: IWatchful;
|
|
47
|
+
/**
|
|
48
|
+
* The DynamoDb table that should be watched.
|
|
49
|
+
* [disable-awslint:ref-via-interface]
|
|
50
|
+
*/
|
|
51
|
+
readonly dynamoDbTable: dynamodb.Table;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A Construct which creates the following alarms for DynamoDb tables:
|
|
55
|
+
*
|
|
56
|
+
* - read throttles
|
|
57
|
+
* - write throttles
|
|
58
|
+
* - throttled requests
|
|
59
|
+
* - user errors
|
|
60
|
+
* - system errors
|
|
61
|
+
*/
|
|
62
|
+
export declare class WatchDynamoDbTable extends Construct {
|
|
63
|
+
private readonly watchful;
|
|
64
|
+
private readonly dynamoDb;
|
|
65
|
+
constructor(scope: Construct, id: string, props: WatchDynamoDbTableProps);
|
|
66
|
+
private createReadThrottleEventsAlarm;
|
|
67
|
+
private createWriteThrottleEventsAlarm;
|
|
68
|
+
private createThrottledRequestsEventsAlarm;
|
|
69
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WatchDynamoDbTable = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const constructs_1 = require("constructs");
|
|
8
|
+
/**
|
|
9
|
+
* A Construct which creates the following alarms for DynamoDb tables:
|
|
10
|
+
*
|
|
11
|
+
* - read throttles
|
|
12
|
+
* - write throttles
|
|
13
|
+
* - throttled requests
|
|
14
|
+
* - user errors
|
|
15
|
+
* - system errors
|
|
16
|
+
*/
|
|
17
|
+
class WatchDynamoDbTable extends constructs_1.Construct {
|
|
18
|
+
constructor(scope, id, props) {
|
|
19
|
+
super(scope, id);
|
|
20
|
+
this.watchful = props.watchful;
|
|
21
|
+
this.dynamoDb = props.dynamoDbTable;
|
|
22
|
+
this.watchful.createAlarm(this, 'ReadThrottleEvents', this.createReadThrottleEventsAlarm(props.readThrottleEventsThreshold));
|
|
23
|
+
this.watchful.createAlarm(this, 'WriteThrottleEvents', this.createWriteThrottleEventsAlarm(props.writeThrottleEventsThreshold));
|
|
24
|
+
this.watchful.createAlarm(this, 'ThrottledRequestsEvents', this.createThrottledRequestsEventsAlarm(props.throttledRequestsEventsThreshold));
|
|
25
|
+
}
|
|
26
|
+
createReadThrottleEventsAlarm(readThrottleEventsThreshold = 1) {
|
|
27
|
+
const dynamoDbMetric = new aws_cdk_lib_1.aws_cloudwatch.Metric({
|
|
28
|
+
metricName: 'ReadThrottleEvents',
|
|
29
|
+
namespace: 'AWS/DynamoDB',
|
|
30
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
31
|
+
statistic: aws_cdk_lib_1.aws_cloudwatch.Statistic.SUM,
|
|
32
|
+
dimensionsMap: {
|
|
33
|
+
TableName: this.dynamoDb.tableName,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
metric: dynamoDbMetric,
|
|
38
|
+
alarmDescription: 'Reads are throttled. Lower ReadCapacityUnitsUtilizationTarget or increase MaxReadCapacityUnits.',
|
|
39
|
+
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
40
|
+
threshold: readThrottleEventsThreshold,
|
|
41
|
+
treatMissingData: aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
42
|
+
evaluationPeriods: 1,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
createWriteThrottleEventsAlarm(writeThrottleEventsThreshold = 1) {
|
|
46
|
+
const dynamoDbMetric = new aws_cdk_lib_1.aws_cloudwatch.Metric({
|
|
47
|
+
metricName: 'WriteThrottleEvents',
|
|
48
|
+
namespace: 'AWS/DynamoDB',
|
|
49
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
50
|
+
statistic: aws_cdk_lib_1.aws_cloudwatch.Statistic.SUM,
|
|
51
|
+
dimensionsMap: {
|
|
52
|
+
TableName: this.dynamoDb.tableName,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
metric: dynamoDbMetric,
|
|
57
|
+
alarmDescription: 'Writes are throttled. Lower WriteCapacityUnitsUtilizationTarget or increase MaxWriteCapacityUnits.',
|
|
58
|
+
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
59
|
+
threshold: writeThrottleEventsThreshold,
|
|
60
|
+
treatMissingData: aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
61
|
+
evaluationPeriods: 1,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
createThrottledRequestsEventsAlarm(throttledRequestsEventsThreshold = 1) {
|
|
65
|
+
const dynamoDbMetric = new aws_cdk_lib_1.aws_cloudwatch.Metric({
|
|
66
|
+
metricName: 'ThrottledRequests',
|
|
67
|
+
namespace: 'AWS/DynamoDB',
|
|
68
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
69
|
+
statistic: aws_cdk_lib_1.aws_cloudwatch.Statistic.SUM,
|
|
70
|
+
dimensionsMap: {
|
|
71
|
+
TableName: this.dynamoDb.tableName,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
metric: dynamoDbMetric,
|
|
76
|
+
alarmDescription: 'Batch requests are throttled. Lower {Read/Write}CapacityUnitsUtilizationTarget or increase Max{Read/Write}CapacityUnits.',
|
|
77
|
+
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
78
|
+
threshold: throttledRequestsEventsThreshold,
|
|
79
|
+
treatMissingData: aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
80
|
+
evaluationPeriods: 1,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.WatchDynamoDbTable = WatchDynamoDbTable;
|
|
85
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
86
|
+
WatchDynamoDbTable[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchDynamoDbTable", version: "0.0.0" };
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1vZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvZHluYW1vZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBdUY7QUFDdkYsMkNBQXVDO0FBeUR2Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFJL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFFcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUM1QixvQkFBb0IsRUFDcEIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUN0RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUM1QixxQkFBcUIsRUFDckIsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUN4RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUM1Qix5QkFBeUIsRUFDekIsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUNoRixDQUFDO0lBQ0osQ0FBQztJQUVPLDZCQUE2QixDQUFDLDJCQUEyQixHQUFHLENBQUM7UUFFbkUsTUFBTSxjQUFjLEdBQUcsSUFBSSw0QkFBRSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxVQUFVLEVBQUUsb0JBQW9CO1lBQ2hDLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDNUIsU0FBUyxFQUFFLDRCQUFFLENBQUMsU0FBUyxDQUFDLEdBQUc7WUFDM0IsYUFBYSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7YUFDbkM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsTUFBTSxFQUFFLGNBQWM7WUFDdEIsZ0JBQWdCLEVBQ2QsaUdBQWlHO1lBQ25HLGtCQUFrQixFQUFFLDRCQUFFLENBQUMsa0JBQWtCLENBQUMsa0NBQWtDO1lBQzVFLFNBQVMsRUFBRSwyQkFBMkI7WUFDdEMsZ0JBQWdCLEVBQUUsNEJBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO1lBQ25ELGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFDTyw4QkFBOEIsQ0FBQyw0QkFBNEIsR0FBRyxDQUFDO1FBQ3JFLE1BQU0sY0FBYyxHQUFHLElBQUksNEJBQUUsQ0FBQyxNQUFNLENBQUM7WUFDbkMsVUFBVSxFQUFFLHFCQUFxQjtZQUNqQyxTQUFTLEVBQUUsY0FBYztZQUN6QixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLFNBQVMsRUFBRSw0QkFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHO1lBQzNCLGFBQWEsRUFBRTtnQkFDYixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2FBQ25DO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLGdCQUFnQixFQUNkLG9HQUFvRztZQUN0RyxrQkFBa0IsRUFBRSw0QkFBRSxDQUFDLGtCQUFrQixDQUFDLGtDQUFrQztZQUM1RSxTQUFTLEVBQUUsNEJBQTRCO1lBQ3ZDLGdCQUFnQixFQUFFLDRCQUFFLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtZQUNuRCxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUM7SUFDSixDQUFDO0lBQ08sa0NBQWtDLENBQUMsZ0NBQWdDLEdBQUcsQ0FBQztRQUM3RSxNQUFNLGNBQWMsR0FBRyxJQUFJLDRCQUFFLENBQUMsTUFBTSxDQUFDO1lBQ25DLFVBQVUsRUFBRSxtQkFBbUI7WUFDL0IsU0FBUyxFQUFFLGNBQWM7WUFDekIsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QixTQUFTLEVBQUUsNEJBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRztZQUMzQixhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUzthQUNuQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxNQUFNLEVBQUUsY0FBYztZQUN0QixnQkFBZ0IsRUFDZCwwSEFBMEg7WUFDNUgsa0JBQWtCLEVBQUUsNEJBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0M7WUFDNUUsU0FBUyxFQUFFLGdDQUFnQztZQUMzQyxnQkFBZ0IsRUFBRSw0QkFBRSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7WUFDbkQsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQzs7QUFwRkgsZ0RBcUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXdzX2Nsb3Vkd2F0Y2ggYXMgY3csIGF3c19keW5hbW9kYiBhcyBkeW5hbW9kYiwgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IE1ldHJpY0FsYXJtUHJvcHMgfSBmcm9tICcuL21ldHJpYy1hbGFybSc7XG5pbXBvcnQgeyBJV2F0Y2hmdWwgfSBmcm9tICcuL3dhdGNoZnVsJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBkZWZpbmluZyBhbGFybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hEeW5hbW9EYlRhYmxlT3B0aW9ucyB7XG4gIC8qKlxuICAgICAqIFRocmVzaG9sZCBvZiByZWFkIHRocm90dGxlIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgcmVhZG9ubHkgcmVhZFRocm90dGxlRXZlbnRzVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgb2Ygd3JpdGUgdGhyb3R0bGUgZXZlbnRzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuICByZWFkb25seSB3cml0ZVRocm90dGxlRXZlbnRzVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgb2YgdGhyb3R0bGVkIHJlcXVlc3RzIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgcmVhZG9ubHkgdGhyb3R0bGVkUmVxdWVzdHNFdmVudHNUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgICAqIFRocmVzaG9sZCBvZiB1c2VyIGVycm9ycy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgcmVhZG9ubHkgdXNlckVycm9yc1RocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgb2Ygc3lzdGVtIGVycm9ycy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtRXJyb3JzVGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgV2F0Y2hEeW5hbW9EYlRhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hEeW5hbW9EYlRhYmxlUHJvcHMgZXh0ZW5kcyBXYXRjaER5bmFtb0RiVGFibGVPcHRpb25zIHtcbiAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSB0byBJV2F0Y2hmdWwgY2xhc3MuIFVzZWQgaW50ZXJuYWxseS5cbiAgICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcblxuICAvKipcbiAgICAgKiBUaGUgRHluYW1vRGIgdGFibGUgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZC5cbiAgICAgKiBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgICAqL1xuICByZWFkb25seSBkeW5hbW9EYlRhYmxlOiBkeW5hbW9kYi5UYWJsZTtcbn1cblxuLyoqXG4gKiBBIENvbnN0cnVjdCB3aGljaCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgYWxhcm1zIGZvciBEeW5hbW9EYiB0YWJsZXM6XG4gKlxuICogLSByZWFkIHRocm90dGxlc1xuICogLSB3cml0ZSB0aHJvdHRsZXNcbiAqIC0gdGhyb3R0bGVkIHJlcXVlc3RzXG4gKiAtIHVzZXIgZXJyb3JzXG4gKiAtIHN5c3RlbSBlcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGNoRHluYW1vRGJUYWJsZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbW9EYjogZHluYW1vZGIuVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdhdGNoRHluYW1vRGJUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMud2F0Y2hmdWwgPSBwcm9wcy53YXRjaGZ1bDtcbiAgICB0aGlzLmR5bmFtb0RiID0gcHJvcHMuZHluYW1vRGJUYWJsZTtcblxuICAgIHRoaXMud2F0Y2hmdWwuY3JlYXRlQWxhcm0odGhpcyxcbiAgICAgICdSZWFkVGhyb3R0bGVFdmVudHMnLFxuICAgICAgdGhpcy5jcmVhdGVSZWFkVGhyb3R0bGVFdmVudHNBbGFybShwcm9wcy5yZWFkVGhyb3R0bGVFdmVudHNUaHJlc2hvbGQpLFxuICAgICk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLFxuICAgICAgJ1dyaXRlVGhyb3R0bGVFdmVudHMnLFxuICAgICAgdGhpcy5jcmVhdGVXcml0ZVRocm90dGxlRXZlbnRzQWxhcm0ocHJvcHMud3JpdGVUaHJvdHRsZUV2ZW50c1RocmVzaG9sZCksXG4gICAgKTtcbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsXG4gICAgICAnVGhyb3R0bGVkUmVxdWVzdHNFdmVudHMnLFxuICAgICAgdGhpcy5jcmVhdGVUaHJvdHRsZWRSZXF1ZXN0c0V2ZW50c0FsYXJtKHByb3BzLnRocm90dGxlZFJlcXVlc3RzRXZlbnRzVGhyZXNob2xkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZWFkVGhyb3R0bGVFdmVudHNBbGFybShyZWFkVGhyb3R0bGVFdmVudHNUaHJlc2hvbGQgPSAxKTogTWV0cmljQWxhcm1Qcm9wcyB7XG5cbiAgICBjb25zdCBkeW5hbW9EYk1ldHJpYyA9IG5ldyBjdy5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogJ1JlYWRUaHJvdHRsZUV2ZW50cycsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvRHluYW1vREInLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHN0YXRpc3RpYzogY3cuU3RhdGlzdGljLlNVTSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLmR5bmFtb0RiLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogZHluYW1vRGJNZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOlxuICAgICAgICAnUmVhZHMgYXJlIHRocm90dGxlZC4gTG93ZXIgUmVhZENhcGFjaXR5VW5pdHNVdGlsaXphdGlvblRhcmdldCBvciBpbmNyZWFzZSBNYXhSZWFkQ2FwYWNpdHlVbml0cy4nLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjdy5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICAgIHRocmVzaG9sZDogcmVhZFRocm90dGxlRXZlbnRzVGhyZXNob2xkLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY3cuVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVdyaXRlVGhyb3R0bGVFdmVudHNBbGFybSh3cml0ZVRocm90dGxlRXZlbnRzVGhyZXNob2xkID0gMSk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGR5bmFtb0RiTWV0cmljID0gbmV3IGN3Lk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiAnV3JpdGVUaHJvdHRsZUV2ZW50cycsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvRHluYW1vREInLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHN0YXRpc3RpYzogY3cuU3RhdGlzdGljLlNVTSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLmR5bmFtb0RiLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogZHluYW1vRGJNZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOlxuICAgICAgICAnV3JpdGVzIGFyZSB0aHJvdHRsZWQuIExvd2VyIFdyaXRlQ2FwYWNpdHlVbml0c1V0aWxpemF0aW9uVGFyZ2V0IG9yIGluY3JlYXNlIE1heFdyaXRlQ2FwYWNpdHlVbml0cy4nLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjdy5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICAgIHRocmVzaG9sZDogd3JpdGVUaHJvdHRsZUV2ZW50c1RocmVzaG9sZCxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGN3LlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVUaHJvdHRsZWRSZXF1ZXN0c0V2ZW50c0FsYXJtKHRocm90dGxlZFJlcXVlc3RzRXZlbnRzVGhyZXNob2xkID0gMSk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGR5bmFtb0RiTWV0cmljID0gbmV3IGN3Lk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiAnVGhyb3R0bGVkUmVxdWVzdHMnLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL0R5bmFtb0RCJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBzdGF0aXN0aWM6IGN3LlN0YXRpc3RpYy5TVU0sXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy5keW5hbW9EYi50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtZXRyaWM6IGR5bmFtb0RiTWV0cmljLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjpcbiAgICAgICAgJ0JhdGNoIHJlcXVlc3RzIGFyZSB0aHJvdHRsZWQuIExvd2VyIHtSZWFkL1dyaXRlfUNhcGFjaXR5VW5pdHNVdGlsaXphdGlvblRhcmdldCBvciBpbmNyZWFzZSBNYXh7UmVhZC9Xcml0ZX1DYXBhY2l0eVVuaXRzLicsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiB0aHJvdHRsZWRSZXF1ZXN0c0V2ZW50c1RocmVzaG9sZCxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGN3LlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as ecs from 'aws-cdk-lib/aws-ecs';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { IWatchful } from './watchful';
|
|
4
|
+
/**
|
|
5
|
+
* Options for defining alarms.
|
|
6
|
+
*/
|
|
7
|
+
export interface WatchEcsServiceOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Threshold for the cpu utilization alarm as percentage.
|
|
10
|
+
*
|
|
11
|
+
* @default 80
|
|
12
|
+
*/
|
|
13
|
+
readonly cpuUtilizationThresholdPercent?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Threshold for the memory utilization alarm as percentage.
|
|
16
|
+
*
|
|
17
|
+
* @default 95
|
|
18
|
+
*/
|
|
19
|
+
readonly memoryUtilizationThresholdPercent?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Properties for defining a WatchEcsService
|
|
23
|
+
*/
|
|
24
|
+
export interface WatchEcsServiceProps extends WatchEcsServiceOptions {
|
|
25
|
+
/**
|
|
26
|
+
* The reference to IWatchful class. Used internally.
|
|
27
|
+
*/
|
|
28
|
+
readonly watchful: IWatchful;
|
|
29
|
+
/**
|
|
30
|
+
* The ECS service that should be watched.
|
|
31
|
+
* [disable-awslint:ref-via-interface]
|
|
32
|
+
*/
|
|
33
|
+
readonly service: ecs.BaseService;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A Construct which creates default alarms for ECS services.
|
|
37
|
+
* A Construct which creates the following alarms for ECS services:
|
|
38
|
+
*
|
|
39
|
+
* - cpu utilization
|
|
40
|
+
* - memory utilization
|
|
41
|
+
* - error log alert
|
|
42
|
+
*/
|
|
43
|
+
export declare class WatchEcsService extends Construct {
|
|
44
|
+
private readonly watchful;
|
|
45
|
+
private readonly service;
|
|
46
|
+
constructor(scope: Construct, id: string, props: WatchEcsServiceProps);
|
|
47
|
+
private createLogErrorMonitor;
|
|
48
|
+
private createCpuUtilizationMonitor;
|
|
49
|
+
private createMemoryUtilizationMonitor;
|
|
50
|
+
}
|