@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.
Files changed (110) hide show
  1. package/.gitattributes +15 -0
  2. package/.jsii +7832 -0
  3. package/.versionrc.json +14 -0
  4. package/API.md +8136 -0
  5. package/CHANGELOG.md +5 -0
  6. package/LICENSE +202 -0
  7. package/README.md +56 -0
  8. package/lib/datadog/datadogLogIndexMonitoring.d.ts +49 -0
  9. package/lib/datadog/datadogLogIndexMonitoring.js +116 -0
  10. package/lib/datadog/datadogMonitor.d.ts +13 -0
  11. package/lib/datadog/datadogMonitor.js +19 -0
  12. package/lib/datadog/index.d.ts +1 -0
  13. package/lib/datadog/index.js +19 -0
  14. package/lib/fargate/datadog.d.ts +18 -0
  15. package/lib/fargate/datadog.js +225 -0
  16. package/lib/fargate/rio-fargate-service.d.ts +276 -0
  17. package/lib/fargate/rio-fargate-service.js +147 -0
  18. package/lib/fargate/spring.d.ts +6 -0
  19. package/lib/fargate/spring.js +39 -0
  20. package/lib/index.d.ts +21 -0
  21. package/lib/index.js +34 -0
  22. package/lib/kafka/index.d.ts +2 -0
  23. package/lib/kafka/index.js +15 -0
  24. package/lib/kafka/kafka-event-spec.d.ts +43 -0
  25. package/lib/kafka/kafka-event-spec.js +106 -0
  26. package/lib/kafka/kafka-topic.d.ts +102 -0
  27. package/lib/kafka/kafka-topic.js +70 -0
  28. package/lib/pipeline/rio-backup-secrets-restore-stage.d.ts +40 -0
  29. package/lib/pipeline/rio-backup-secrets-restore-stage.js +104 -0
  30. package/lib/pipeline/rio-bitbucket-source-action.d.ts +25 -0
  31. package/lib/pipeline/rio-bitbucket-source-action.js +36 -0
  32. package/lib/rio-claidometer.d.ts +21 -0
  33. package/lib/rio-claidometer.js +39 -0
  34. package/lib/rio-landing-zone.d.ts +16 -0
  35. package/lib/rio-landing-zone.js +57 -0
  36. package/lib/rio-load-balancer.d.ts +26 -0
  37. package/lib/rio-load-balancer.js +42 -0
  38. package/lib/toggle.d.ts +21 -0
  39. package/lib/toggle.js +44 -0
  40. package/lib/watchful/alb.d.ts +47 -0
  41. package/lib/watchful/alb.js +52 -0
  42. package/lib/watchful/aspect.d.ts +16 -0
  43. package/lib/watchful/aspect.js +55 -0
  44. package/lib/watchful/cloudfront.d.ts +50 -0
  45. package/lib/watchful/cloudfront.js +65 -0
  46. package/lib/watchful/datadog-log-alarm.d.ts +37 -0
  47. package/lib/watchful/datadog-log-alarm.js +88 -0
  48. package/lib/watchful/datadog-metric-alarm.d.ts +32 -0
  49. package/lib/watchful/datadog-metric-alarm.js +158 -0
  50. package/lib/watchful/docdb.d.ts +62 -0
  51. package/lib/watchful/docdb.js +102 -0
  52. package/lib/watchful/dynamodb.d.ts +69 -0
  53. package/lib/watchful/dynamodb.js +87 -0
  54. package/lib/watchful/ecs.d.ts +50 -0
  55. package/lib/watchful/ecs.js +69 -0
  56. package/lib/watchful/lambda.d.ts +59 -0
  57. package/lib/watchful/lambda.js +65 -0
  58. package/lib/watchful/metric-alarm.d.ts +34 -0
  59. package/lib/watchful/metric-alarm.js +3 -0
  60. package/lib/watchful/rds.d.ts +47 -0
  61. package/lib/watchful/rds.js +47 -0
  62. package/lib/watchful/targetgroup.d.ts +47 -0
  63. package/lib/watchful/targetgroup.js +54 -0
  64. package/lib/watchful/upperToLower.d.ts +7 -0
  65. package/lib/watchful/upperToLower.js +35 -0
  66. package/lib/watchful/watchful.d.ts +119 -0
  67. package/lib/watchful/watchful.js +182 -0
  68. package/node_modules/argparse/CHANGELOG.md +216 -0
  69. package/node_modules/argparse/LICENSE +254 -0
  70. package/node_modules/argparse/README.md +84 -0
  71. package/node_modules/argparse/argparse.js +3707 -0
  72. package/node_modules/argparse/lib/sub.js +67 -0
  73. package/node_modules/argparse/lib/textwrap.js +440 -0
  74. package/node_modules/argparse/package.json +31 -0
  75. package/node_modules/js-yaml/CHANGELOG.md +616 -0
  76. package/node_modules/js-yaml/LICENSE +21 -0
  77. package/node_modules/js-yaml/README.md +246 -0
  78. package/node_modules/js-yaml/bin/js-yaml.js +126 -0
  79. package/node_modules/js-yaml/dist/js-yaml.js +3874 -0
  80. package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
  81. package/node_modules/js-yaml/dist/js-yaml.mjs +3851 -0
  82. package/node_modules/js-yaml/index.js +47 -0
  83. package/node_modules/js-yaml/lib/common.js +59 -0
  84. package/node_modules/js-yaml/lib/dumper.js +965 -0
  85. package/node_modules/js-yaml/lib/exception.js +55 -0
  86. package/node_modules/js-yaml/lib/loader.js +1727 -0
  87. package/node_modules/js-yaml/lib/schema/core.js +11 -0
  88. package/node_modules/js-yaml/lib/schema/default.js +22 -0
  89. package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
  90. package/node_modules/js-yaml/lib/schema/json.js +19 -0
  91. package/node_modules/js-yaml/lib/schema.js +121 -0
  92. package/node_modules/js-yaml/lib/snippet.js +101 -0
  93. package/node_modules/js-yaml/lib/type/binary.js +125 -0
  94. package/node_modules/js-yaml/lib/type/bool.js +35 -0
  95. package/node_modules/js-yaml/lib/type/float.js +97 -0
  96. package/node_modules/js-yaml/lib/type/int.js +156 -0
  97. package/node_modules/js-yaml/lib/type/map.js +8 -0
  98. package/node_modules/js-yaml/lib/type/merge.js +12 -0
  99. package/node_modules/js-yaml/lib/type/null.js +35 -0
  100. package/node_modules/js-yaml/lib/type/omap.js +44 -0
  101. package/node_modules/js-yaml/lib/type/pairs.js +53 -0
  102. package/node_modules/js-yaml/lib/type/seq.js +8 -0
  103. package/node_modules/js-yaml/lib/type/set.js +29 -0
  104. package/node_modules/js-yaml/lib/type/str.js +8 -0
  105. package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
  106. package/node_modules/js-yaml/lib/type.js +66 -0
  107. package/node_modules/js-yaml/package.json +66 -0
  108. package/package.json +126 -0
  109. package/release-commit-check.js +6 -0
  110. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvZG9jZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBdUM7QUFDdkMsaURBQWlEO0FBRWpELDJDQUF1QztBQWtEdkM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxzQkFBUztJQUk5QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsZ0NBQWdDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQ3JFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLHNCQUFzQixFQUN0QixJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQzFFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGtCQUFrQixFQUNsQixJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQ2pFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLHdCQUF3QixFQUN4QixJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRU8sZ0NBQWdDLENBQUMsdUJBQXVCLEdBQUcsRUFBRTtRQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLEVB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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY3cgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgZG9jZGIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWRvY2RiJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWV0cmljQWxhcm1Qcm9wcyB9IGZyb20gJy4vbWV0cmljLWFsYXJtJztcbmltcG9ydCB7IElXYXRjaGZ1bCB9IGZyb20gJy4vd2F0Y2hmdWwnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRlZmluaW5nIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaERvY0RiQ2x1c3Rlck9wdGlvbnMge1xuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgb2YgZGF0YWJhc2UgY3B1IHV0aWxpemF0aW9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODBcbiAgICAgKi9cbiAgcmVhZG9ubHkgY3B1VXRpbGl6YXRpb25UaHJlc2hvbGQ/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
+ }