@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,69 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchEcsService = 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 __1 = require("..");
10
+ const DEFAULT_CPU_UTILIZATION_THRESHOLD_PERCENT = 80;
11
+ const DEFAULT_MEMORY_UTILIZATION_THRESHOLD_PERCENT = 95;
12
+ /**
13
+ * A Construct which creates default alarms for ECS services.
14
+ * A Construct which creates the following alarms for ECS services:
15
+ *
16
+ * - cpu utilization
17
+ * - memory utilization
18
+ * - error log alert
19
+ */
20
+ class WatchEcsService extends constructs_1.Construct {
21
+ constructor(scope, id, props) {
22
+ super(scope, id);
23
+ this.watchful = props.watchful;
24
+ this.service = props.service;
25
+ this.watchful.createAlarm(this, 'CpuUtilization', this.createCpuUtilizationMonitor(props.cpuUtilizationThresholdPercent));
26
+ this.watchful.createAlarm(this, 'MemoryUtilization', this.createMemoryUtilizationMonitor(props.memoryUtilizationThresholdPercent));
27
+ this.watchful.createLogAlarm(this, 'LogErrorMonitor', this.createLogErrorMonitor());
28
+ }
29
+ createLogErrorMonitor() {
30
+ return {
31
+ autoCloseOpsGenieAlerts: true,
32
+ period: aws_cdk_lib_1.Duration.minutes(5),
33
+ unitOfPeriod: __1.UnitOfPeriod.MINUTES,
34
+ periodOperator: __1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
35
+ statistic: 'count',
36
+ queryFilters: 'error',
37
+ alarmDescription: 'Auto-generated alert for error logs',
38
+ threshold: 1,
39
+ priority: 3,
40
+ index: '*',
41
+ };
42
+ }
43
+ createCpuUtilizationMonitor(cpuUtilizationThresholdPercent = DEFAULT_CPU_UTILIZATION_THRESHOLD_PERCENT) {
44
+ const cpuUtilizationMetric = this.service.metricCpuUtilization().with({ period: aws_cdk_lib_1.Duration.minutes(10) });
45
+ return {
46
+ metric: cpuUtilizationMetric,
47
+ alarmDescription: `Average CPU utilization over last 10 minutes higher than ${cpuUtilizationThresholdPercent}%`,
48
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
49
+ threshold: cpuUtilizationThresholdPercent,
50
+ evaluationPeriods: 1,
51
+ };
52
+ }
53
+ createMemoryUtilizationMonitor(memoryUtilizationThresholdPercent = DEFAULT_MEMORY_UTILIZATION_THRESHOLD_PERCENT) {
54
+ const memoryUtilizationMetric = this.service
55
+ .metricMemoryUtilization()
56
+ .with({ period: aws_cdk_lib_1.Duration.minutes(10) });
57
+ return {
58
+ metric: memoryUtilizationMetric,
59
+ alarmDescription: `Average memory utilization over last 10 minutes higher than ${memoryUtilizationThresholdPercent}%`,
60
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
61
+ threshold: memoryUtilizationThresholdPercent,
62
+ evaluationPeriods: 1,
63
+ };
64
+ }
65
+ }
66
+ exports.WatchEcsService = WatchEcsService;
67
+ _a = JSII_RTTI_SYMBOL_1;
68
+ WatchEcsService[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchEcsService", version: "0.0.0" };
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL2Vjcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1QztBQUN2QyxpREFBaUQ7QUFFakQsMkNBQXVDO0FBQ3ZDLDBCQUF1RjtBQUd2RixNQUFNLHlDQUF5QyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxNQUFNLDRDQUE0QyxHQUFHLEVBQUUsQ0FBQztBQXFDeEQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQUk1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUU3QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQ3ZFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLG1CQUFtQixFQUNuQixJQUFJLENBQUMsOEJBQThCLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQzdFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQy9CLGlCQUFpQixFQUNqQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsT0FBTztZQUNMLHVCQUF1QixFQUFFLElBQUk7WUFDN0IsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzQixZQUFZLEVBQUUsZ0JBQVksQ0FBQyxPQUFPO1lBQ2xDLGNBQWMsRUFBRSxzQkFBa0IsQ0FBQyxrQ0FBa0M7WUFDckUsU0FBUyxFQUFFLE9BQU87WUFDbEIsWUFBWSxFQUFFLE9BQU87WUFDckIsZ0JBQWdCLEVBQUUscUNBQXFDO1lBQ3ZELFNBQVMsRUFBRSxDQUFDO1lBQ1osUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUUsR0FBRztTQUNYLENBQUM7SUFDSixDQUFDO0lBRU8sMkJBQTJCLENBQ2pDLGlDQUF5Qyx5Q0FBeUM7UUFFbEYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RyxPQUFPO1lBQ0wsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixnQkFBZ0IsRUFBRSw0REFBNEQsOEJBQThCLEdBQUc7WUFDL0csa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQjtZQUNoRSxTQUFTLEVBQUUsOEJBQThCO1lBQ3pDLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFFTyw4QkFBOEIsQ0FDcEMsb0NBQTRDLDRDQUE0QztRQUV4RixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ3pDLHVCQUF1QixFQUFFO2FBQ3pCLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsT0FBTztZQUNMLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsZ0JBQWdCLEVBQUUsK0RBQStELGlDQUFpQyxHQUFHO1lBQ3JILGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0I7WUFDaEUsU0FBUyxFQUFFLGlDQUFpQztZQUM1QyxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUM7SUFDSixDQUFDOztBQWpFSCwwQ0FtRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGN3IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29tcGFyaXNvbk9wZXJhdG9yLCBMb2dBbGFybVByb3BzLCBNZXRyaWNBbGFybVByb3BzLCBVbml0T2ZQZXJpb2QgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBJV2F0Y2hmdWwgfSBmcm9tICcuL3dhdGNoZnVsJztcblxuY29uc3QgREVGQVVMVF9DUFVfVVRJTElaQVRJT05fVEhSRVNIT0xEX1BFUkNFTlQgPSA4MDtcbmNvbnN0IERFRkFVTFRfTUVNT1JZX1VUSUxJWkFUSU9OX1RIUkVTSE9MRF9QRVJDRU5UID0gOTU7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGVmaW5pbmcgYWxhcm1zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoRWNzU2VydmljZU9wdGlvbnMge1xuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgZm9yIHRoZSBjcHUgdXRpbGl6YXRpb24gYWxhcm0gYXMgcGVyY2VudGFnZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDgwXG4gICAgICovXG4gIHJlYWRvbmx5IGNwdVV0aWxpemF0aW9uVGhyZXNob2xkUGVyY2VudD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgZm9yIHRoZSBtZW1vcnkgdXRpbGl6YXRpb24gYWxhcm0gYXMgcGVyY2VudGFnZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDk1XG4gICAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVV0aWxpemF0aW9uVGhyZXNob2xkUGVyY2VudD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIFdhdGNoRWNzU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoRWNzU2VydmljZVByb3BzIGV4dGVuZHMgV2F0Y2hFY3NTZXJ2aWNlT3B0aW9ucyB7XG4gIC8qKlxuICAgICAqIFRoZSByZWZlcmVuY2UgdG8gSVdhdGNoZnVsIGNsYXNzLiBVc2VkIGludGVybmFsbHkuXG4gICAgICovXG4gIHJlYWRvbmx5IHdhdGNoZnVsOiBJV2F0Y2hmdWw7XG5cbiAgLyoqXG4gICAgICogVGhlIEVDUyBzZXJ2aWNlIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQuXG4gICAgICogW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZTogZWNzLkJhc2VTZXJ2aWNlO1xufVxuXG4vKipcbiAqIEEgQ29uc3RydWN0IHdoaWNoIGNyZWF0ZXMgZGVmYXVsdCBhbGFybXMgZm9yIEVDUyBzZXJ2aWNlcy5cbiAqIEEgQ29uc3RydWN0IHdoaWNoIGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBhbGFybXMgZm9yIEVDUyBzZXJ2aWNlczpcbiAqXG4gKiAtIGNwdSB1dGlsaXphdGlvblxuICogLSBtZW1vcnkgdXRpbGl6YXRpb25cbiAqIC0gZXJyb3IgbG9nIGFsZXJ0XG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRjaEVjc1NlcnZpY2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHdhdGNoZnVsOiBJV2F0Y2hmdWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogZWNzLkJhc2VTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXYXRjaEVjc1NlcnZpY2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLndhdGNoZnVsID0gcHJvcHMud2F0Y2hmdWw7XG4gICAgdGhpcy5zZXJ2aWNlID0gcHJvcHMuc2VydmljZTtcblxuICAgIHRoaXMud2F0Y2hmdWwuY3JlYXRlQWxhcm0odGhpcyxcbiAgICAgICdDcHVVdGlsaXphdGlvbicsXG4gICAgICB0aGlzLmNyZWF0ZUNwdVV0aWxpemF0aW9uTW9uaXRvcihwcm9wcy5jcHVVdGlsaXphdGlvblRocmVzaG9sZFBlcmNlbnQpLFxuICAgICk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLFxuICAgICAgJ01lbW9yeVV0aWxpemF0aW9uJyxcbiAgICAgIHRoaXMuY3JlYXRlTWVtb3J5VXRpbGl6YXRpb25Nb25pdG9yKHByb3BzLm1lbW9yeVV0aWxpemF0aW9uVGhyZXNob2xkUGVyY2VudCksXG4gICAgKTtcbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUxvZ0FsYXJtKHRoaXMsXG4gICAgICAnTG9nRXJyb3JNb25pdG9yJyxcbiAgICAgIHRoaXMuY3JlYXRlTG9nRXJyb3JNb25pdG9yKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9nRXJyb3JNb25pdG9yKCk6IExvZ0FsYXJtUHJvcHMge1xuICAgIHJldHVybiB7XG4gICAgICBhdXRvQ2xvc2VPcHNHZW5pZUFsZXJ0czogdHJ1ZSxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIHVuaXRPZlBlcmlvZDogVW5pdE9mUGVyaW9kLk1JTlVURVMsIC8vIHRvRG86IG1vdmUgdGhhdCBzb21ld2hlcmUgZWxzZSBhbmQgc2V0IGRlZmF1bHRzIHRoZXJlP1xuICAgICAgcGVyaW9kT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgc3RhdGlzdGljOiAnY291bnQnLFxuICAgICAgcXVlcnlGaWx0ZXJzOiAnZXJyb3InLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogJ0F1dG8tZ2VuZXJhdGVkIGFsZXJ0IGZvciBlcnJvciBsb2dzJyxcbiAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgIHByaW9yaXR5OiAzLFxuICAgICAgaW5kZXg6ICcqJywgLy8gdG9Ebzogd2Ugc2hvdWxkIHRha2UgaGVyZSB0aGUgdGVhbSBuYW1lIGJ1dCBmb3Igb2xkZXIgc2V0dXBzIHRvIHdvcmsgd2Uga2VlcCB0aGF0IGZvciBjb21wYXRpYmlsaXR5XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3B1VXRpbGl6YXRpb25Nb25pdG9yKFxuICAgIGNwdVV0aWxpemF0aW9uVGhyZXNob2xkUGVyY2VudDogbnVtYmVyID0gREVGQVVMVF9DUFVfVVRJTElaQVRJT05fVEhSRVNIT0xEX1BFUkNFTlQsXG4gICk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGNwdVV0aWxpemF0aW9uTWV0cmljID0gdGhpcy5zZXJ2aWNlLm1ldHJpY0NwdVV0aWxpemF0aW9uKCkud2l0aCh7IHBlcmlvZDogRHVyYXRpb24ubWludXRlcygxMCkgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogY3B1VXRpbGl6YXRpb25NZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgQXZlcmFnZSBDUFUgdXRpbGl6YXRpb24gb3ZlciBsYXN0IDEwIG1pbnV0ZXMgaGlnaGVyIHRoYW4gJHtjcHVVdGlsaXphdGlvblRocmVzaG9sZFBlcmNlbnR9JWAsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiBjcHVVdGlsaXphdGlvblRocmVzaG9sZFBlcmNlbnQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNZW1vcnlVdGlsaXphdGlvbk1vbml0b3IoXG4gICAgbWVtb3J5VXRpbGl6YXRpb25UaHJlc2hvbGRQZXJjZW50OiBudW1iZXIgPSBERUZBVUxUX01FTU9SWV9VVElMSVpBVElPTl9USFJFU0hPTERfUEVSQ0VOVCxcbiAgKTogTWV0cmljQWxhcm1Qcm9wcyB7XG4gICAgY29uc3QgbWVtb3J5VXRpbGl6YXRpb25NZXRyaWMgPSB0aGlzLnNlcnZpY2VcbiAgICAgIC5tZXRyaWNNZW1vcnlVdGlsaXphdGlvbigpXG4gICAgICAud2l0aCh7IHBlcmlvZDogRHVyYXRpb24ubWludXRlcygxMCkgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogbWVtb3J5VXRpbGl6YXRpb25NZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgQXZlcmFnZSBtZW1vcnkgdXRpbGl6YXRpb24gb3ZlciBsYXN0IDEwIG1pbnV0ZXMgaGlnaGVyIHRoYW4gJHttZW1vcnlVdGlsaXphdGlvblRocmVzaG9sZFBlcmNlbnR9JWAsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiBtZW1vcnlVdGlsaXphdGlvblRocmVzaG9sZFBlcmNlbnQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICB9O1xuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,59 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ import { IWatchful } from './watchful';
4
+ /**
5
+ * Options for defining alarms.
6
+ */
7
+ export interface WatchLambdaFunctionOptions {
8
+ /**
9
+ * Number of allowed errors per minute. If there are more errors than that, an alarm will trigger.
10
+ *
11
+ * @default 0
12
+ */
13
+ readonly errorsPerMinuteThreshold?: number;
14
+ /**
15
+ * Number of allowed throttles per minute.
16
+ *
17
+ * @default 0
18
+ */
19
+ readonly throttlesPerMinuteThreshold?: number;
20
+ /**
21
+ * Threshold for the duration alarm as percentage of the function's timeout
22
+ * value.
23
+ *
24
+ * If this is set to 50%, the alarm will be set when p99 latency of the
25
+ * function exceeds 50% of the function's timeout setting.
26
+ *
27
+ * @default 80
28
+ */
29
+ readonly durationThresholdPercent?: number;
30
+ }
31
+ /**
32
+ * Properties for defining a WatchLambdaFunction
33
+ */
34
+ export interface WatchLambdaFunctionProps extends WatchLambdaFunctionOptions {
35
+ /**
36
+ * The reference to IWatchful class. Used internally.
37
+ */
38
+ readonly watchful: IWatchful;
39
+ /**
40
+ * The lambda function that should be watched.
41
+ * [disable-awslint:ref-via-interface]
42
+ */
43
+ readonly fn: lambda.Function;
44
+ }
45
+ /**
46
+ * A Construct which creates the following alarms for lambda functions:
47
+ *
48
+ * - errors
49
+ * - throttles
50
+ * - duration
51
+ */
52
+ export declare class WatchLambdaFunction extends Construct {
53
+ private readonly watchful;
54
+ private readonly fn;
55
+ constructor(scope: Construct, id: string, props: WatchLambdaFunctionProps);
56
+ private createErrorsMonitor;
57
+ private createThrottlesMonitor;
58
+ private createDurationMonitor;
59
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchLambdaFunction = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cw = require("aws-cdk-lib/aws-cloudwatch");
7
+ const constructs_1 = require("constructs");
8
+ const DEFAULT_DURATION_THRESHOLD_PERCENT = 80;
9
+ /**
10
+ * A Construct which creates the following alarms for lambda functions:
11
+ *
12
+ * - errors
13
+ * - throttles
14
+ * - duration
15
+ */
16
+ class WatchLambdaFunction extends constructs_1.Construct {
17
+ constructor(scope, id, props) {
18
+ super(scope, id);
19
+ const cfnFunction = props.fn.node.defaultChild;
20
+ const timeoutSec = cfnFunction.timeout || 3;
21
+ this.watchful = props.watchful;
22
+ this.fn = props.fn;
23
+ this.watchful.createAlarm(this, 'Errors', this.createErrorsMonitor(props.errorsPerMinuteThreshold));
24
+ this.watchful.createAlarm(this, 'Throttles', this.createThrottlesMonitor(props.throttlesPerMinuteThreshold));
25
+ this.watchful.createAlarm(this, 'Duration', this.createDurationMonitor(timeoutSec, props.durationThresholdPercent));
26
+ }
27
+ createErrorsMonitor(errorsPerMinuteThreshold = 0) {
28
+ const fn = this.fn;
29
+ const errorsMetric = fn.metricErrors();
30
+ return {
31
+ metric: errorsMetric,
32
+ alarmDescription: `Over ${errorsPerMinuteThreshold} errors per minute`,
33
+ threshold: errorsPerMinuteThreshold,
34
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
35
+ evaluationPeriods: 3,
36
+ };
37
+ }
38
+ createThrottlesMonitor(throttlesPerMinuteThreshold = 0) {
39
+ const fn = this.fn;
40
+ const throttlesMetric = fn.metricThrottles();
41
+ return {
42
+ metric: throttlesMetric,
43
+ alarmDescription: `Over ${throttlesPerMinuteThreshold} throttles per minute`,
44
+ threshold: throttlesPerMinuteThreshold,
45
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
46
+ evaluationPeriods: 3,
47
+ };
48
+ }
49
+ createDurationMonitor(timeoutSec, durationPercentThreshold = DEFAULT_DURATION_THRESHOLD_PERCENT) {
50
+ const fn = this.fn;
51
+ const durationMetric = fn.metricDuration();
52
+ const durationThresholdSec = Math.floor((durationPercentThreshold / 100) * timeoutSec);
53
+ return {
54
+ metric: durationMetric,
55
+ alarmDescription: `p99 latency >= ${durationThresholdSec}s (${durationPercentThreshold}%)`,
56
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
57
+ threshold: durationThresholdSec * 1000,
58
+ evaluationPeriods: 3,
59
+ };
60
+ }
61
+ }
62
+ exports.WatchLambdaFunction = WatchLambdaFunction;
63
+ _a = JSII_RTTI_SYMBOL_1;
64
+ WatchLambdaFunction[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchLambdaFunction", version: "0.0.0" };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL2xhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlEQUFpRDtBQUVqRCwyQ0FBdUM7QUFJdkMsTUFBTSxrQ0FBa0MsR0FBRyxFQUFFLENBQUM7QUFnRDlDOzs7Ozs7R0FNRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFJaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQWtDLENBQUM7UUFDckUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUM1QixVQUFVLEVBQ1YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE9BQU87WUFDTCxNQUFNLEVBQUUsWUFBWTtZQUNwQixnQkFBZ0IsRUFBRSxRQUFRLHdCQUF3QixvQkFBb0I7WUFDdEUsU0FBUyxFQUFFLHdCQUF3QjtZQUNuQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ2hFLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FBQywyQkFBMkIsR0FBRyxDQUFDO1FBQzVELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE9BQU87WUFDTCxNQUFNLEVBQUUsZUFBZTtZQUN2QixnQkFBZ0IsRUFBRSxRQUFRLDJCQUEyQix1QkFBdUI7WUFDNUUsU0FBUyxFQUFFLDJCQUEyQjtZQUN0QyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ2hFLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FDM0IsVUFBa0IsRUFDbEIsMkJBQW1DLGtDQUFrQztRQUVyRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMzQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUN2RixPQUFPO1lBQ0wsTUFBTSxFQUFFLGNBQWM7WUFDdEIsZ0JBQWdCLEVBQUUsa0JBQWtCLG9CQUFvQixNQUFNLHdCQUF3QixJQUFJO1lBQzFGLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0I7WUFDaEUsU0FBUyxFQUFFLG9CQUFvQixHQUFHLElBQUk7WUFDdEMsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQzs7QUEzREgsa0RBNERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3cgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZXRyaWNBbGFybVByb3BzIH0gZnJvbSAnLi9tZXRyaWMtYWxhcm0nO1xuaW1wb3J0IHsgSVdhdGNoZnVsIH0gZnJvbSAnLi93YXRjaGZ1bCc7XG5cbmNvbnN0IERFRkFVTFRfRFVSQVRJT05fVEhSRVNIT0xEX1BFUkNFTlQgPSA4MDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBkZWZpbmluZyBhbGFybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hMYW1iZGFGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYWxsb3dlZCBlcnJvcnMgcGVyIG1pbnV0ZS4gSWYgdGhlcmUgYXJlIG1vcmUgZXJyb3JzIHRoYW4gdGhhdCwgYW4gYWxhcm0gd2lsbCB0cmlnZ2VyLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICByZWFkb25seSBlcnJvcnNQZXJNaW51dGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAgICogTnVtYmVyIG9mIGFsbG93ZWQgdGhyb3R0bGVzIHBlciBtaW51dGUuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gIHJlYWRvbmx5IHRocm90dGxlc1Blck1pbnV0ZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgZm9yIHRoZSBkdXJhdGlvbiBhbGFybSBhcyBwZXJjZW50YWdlIG9mIHRoZSBmdW5jdGlvbidzIHRpbWVvdXRcbiAgICAgKiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIDUwJSwgdGhlIGFsYXJtIHdpbGwgYmUgc2V0IHdoZW4gcDk5IGxhdGVuY3kgb2YgdGhlXG4gICAgICogZnVuY3Rpb24gZXhjZWVkcyA1MCUgb2YgdGhlIGZ1bmN0aW9uJ3MgdGltZW91dCBzZXR0aW5nLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODBcbiAgICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb25UaHJlc2hvbGRQZXJjZW50PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgV2F0Y2hMYW1iZGFGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoTGFtYmRhRnVuY3Rpb25Qcm9wcyBleHRlbmRzIFdhdGNoTGFtYmRhRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSB0byBJV2F0Y2hmdWwgY2xhc3MuIFVzZWQgaW50ZXJuYWxseS5cbiAgICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcblxuICAvKipcbiAgICAgKiBUaGUgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQuXG4gICAgICogW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICAgKi9cbiAgcmVhZG9ubHkgZm46IGxhbWJkYS5GdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBIENvbnN0cnVjdCB3aGljaCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgYWxhcm1zIGZvciBsYW1iZGEgZnVuY3Rpb25zOlxuICpcbiAqIC0gZXJyb3JzXG4gKiAtIHRocm90dGxlc1xuICogLSBkdXJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgV2F0Y2hMYW1iZGFGdW5jdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcbiAgcHJpdmF0ZSByZWFkb25seSBmbjogbGFtYmRhLkZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXYXRjaExhbWJkYUZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgY2ZuRnVuY3Rpb24gPSBwcm9wcy5mbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb247XG4gICAgY29uc3QgdGltZW91dFNlYyA9IGNmbkZ1bmN0aW9uLnRpbWVvdXQgfHwgMztcblxuICAgIHRoaXMud2F0Y2hmdWwgPSBwcm9wcy53YXRjaGZ1bDtcbiAgICB0aGlzLmZuID0gcHJvcHMuZm47XG5cbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsICdFcnJvcnMnLCB0aGlzLmNyZWF0ZUVycm9yc01vbml0b3IocHJvcHMuZXJyb3JzUGVyTWludXRlVGhyZXNob2xkKSk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLCAnVGhyb3R0bGVzJywgdGhpcy5jcmVhdGVUaHJvdHRsZXNNb25pdG9yKHByb3BzLnRocm90dGxlc1Blck1pbnV0ZVRocmVzaG9sZCkpO1xuICAgIHRoaXMud2F0Y2hmdWwuY3JlYXRlQWxhcm0odGhpcyxcbiAgICAgICdEdXJhdGlvbicsXG4gICAgICB0aGlzLmNyZWF0ZUR1cmF0aW9uTW9uaXRvcih0aW1lb3V0U2VjLCBwcm9wcy5kdXJhdGlvblRocmVzaG9sZFBlcmNlbnQpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yc01vbml0b3IoZXJyb3JzUGVyTWludXRlVGhyZXNob2xkID0gMCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGZuID0gdGhpcy5mbjtcbiAgICBjb25zdCBlcnJvcnNNZXRyaWMgPSBmbi5tZXRyaWNFcnJvcnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljOiBlcnJvcnNNZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgT3ZlciAke2Vycm9yc1Blck1pbnV0ZVRocmVzaG9sZH0gZXJyb3JzIHBlciBtaW51dGVgLFxuICAgICAgdGhyZXNob2xkOiBlcnJvcnNQZXJNaW51dGVUaHJlc2hvbGQsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVzTW9uaXRvcih0aHJvdHRsZXNQZXJNaW51dGVUaHJlc2hvbGQgPSAwKTogTWV0cmljQWxhcm1Qcm9wcyB7XG4gICAgY29uc3QgZm4gPSB0aGlzLmZuO1xuICAgIGNvbnN0IHRocm90dGxlc01ldHJpYyA9IGZuLm1ldHJpY1Rocm90dGxlcygpO1xuICAgIHJldHVybiB7XG4gICAgICBtZXRyaWM6IHRocm90dGxlc01ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBPdmVyICR7dGhyb3R0bGVzUGVyTWludXRlVGhyZXNob2xkfSB0aHJvdHRsZXMgcGVyIG1pbnV0ZWAsXG4gICAgICB0aHJlc2hvbGQ6IHRocm90dGxlc1Blck1pbnV0ZVRocmVzaG9sZCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY3cuQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEdXJhdGlvbk1vbml0b3IoXG4gICAgdGltZW91dFNlYzogbnVtYmVyLFxuICAgIGR1cmF0aW9uUGVyY2VudFRocmVzaG9sZDogbnVtYmVyID0gREVGQVVMVF9EVVJBVElPTl9USFJFU0hPTERfUEVSQ0VOVCxcbiAgKTogTWV0cmljQWxhcm1Qcm9wcyB7XG4gICAgY29uc3QgZm4gPSB0aGlzLmZuO1xuICAgIGNvbnN0IGR1cmF0aW9uTWV0cmljID0gZm4ubWV0cmljRHVyYXRpb24oKTtcbiAgICBjb25zdCBkdXJhdGlvblRocmVzaG9sZFNlYyA9IE1hdGguZmxvb3IoKGR1cmF0aW9uUGVyY2VudFRocmVzaG9sZCAvIDEwMCkgKiB0aW1lb3V0U2VjKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljOiBkdXJhdGlvbk1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBwOTkgbGF0ZW5jeSA+PSAke2R1cmF0aW9uVGhyZXNob2xkU2VjfXMgKCR7ZHVyYXRpb25QZXJjZW50VGhyZXNob2xkfSUpYCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY3cuQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IGR1cmF0aW9uVGhyZXNob2xkU2VjICogMTAwMCwgLy8gbWlsbGlzZWNvbmRzXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMyxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,34 @@
1
+ import * as cw from 'aws-cdk-lib/aws-cloudwatch';
2
+ /**
3
+ * An interface to define a generic alarm that can be used in DataDog as well as in CloudWatch.
4
+ */
5
+ export interface MetricAlarmProps {
6
+ /**
7
+ * The CloudWatch metric used as source for the alarm.
8
+ */
9
+ readonly metric: cw.Metric;
10
+ /**
11
+ * Description for the alarm
12
+ */
13
+ readonly alarmDescription: string;
14
+ /**
15
+ * The value against which the specified statistic is compared.
16
+ */
17
+ readonly threshold: number;
18
+ /**
19
+ * Comparison to use to check if metric is breaching
20
+ *
21
+ * @default GreaterThanOrEqualToThreshold
22
+ */
23
+ readonly comparisonOperator: cw.ComparisonOperator;
24
+ /**
25
+ * Sets how this alarm is to handle missing data points.
26
+ *
27
+ * @default TreatMissingData.Missing
28
+ */
29
+ readonly treatMissingData?: cw.TreatMissingData;
30
+ /**
31
+ * The number of periods over which data is compared to the specified threshold.
32
+ */
33
+ readonly evaluationPeriods: number;
34
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljLWFsYXJtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL21ldHJpYy1hbGFybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3cgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0byBkZWZpbmUgYSBnZW5lcmljIGFsYXJtIHRoYXQgY2FuIGJlIHVzZWQgaW4gRGF0YURvZyBhcyB3ZWxsIGFzIGluIENsb3VkV2F0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljQWxhcm1Qcm9wcyB7XG4gIC8qKlxuICAgICAqIFRoZSBDbG91ZFdhdGNoIG1ldHJpYyB1c2VkIGFzIHNvdXJjZSBmb3IgdGhlIGFsYXJtLlxuICAgICAqL1xuICByZWFkb25seSBtZXRyaWM6IGN3Lk1ldHJpYztcbiAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gZm9yIHRoZSBhbGFybVxuICAgICAqL1xuICByZWFkb25seSBhbGFybURlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBhZ2FpbnN0IHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljIGlzIGNvbXBhcmVkLlxuICAgICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgLyoqXG4gICAgICogQ29tcGFyaXNvbiB0byB1c2UgdG8gY2hlY2sgaWYgbWV0cmljIGlzIGJyZWFjaGluZ1xuICAgICAqXG4gICAgICogQGRlZmF1bHQgR3JlYXRlclRoYW5PckVxdWFsVG9UaHJlc2hvbGRcbiAgICAgKi9cbiAgcmVhZG9ubHkgY29tcGFyaXNvbk9wZXJhdG9yOiBjdy5Db21wYXJpc29uT3BlcmF0b3I7XG4gIC8qKlxuICAgICAqIFNldHMgaG93IHRoaXMgYWxhcm0gaXMgdG8gaGFuZGxlIG1pc3NpbmcgZGF0YSBwb2ludHMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBUcmVhdE1pc3NpbmdEYXRhLk1pc3NpbmdcbiAgICAgKi9cbiAgcmVhZG9ubHkgdHJlYXRNaXNzaW5nRGF0YT86IGN3LlRyZWF0TWlzc2luZ0RhdGE7XG4gIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIGRhdGEgaXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAgICovXG4gIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,47 @@
1
+ import * as rds from 'aws-cdk-lib/aws-rds';
2
+ import { Construct } from 'constructs';
3
+ import { IWatchful } from './watchful';
4
+ /**
5
+ * Options for defining alarms.
6
+ */
7
+ export interface WatchDatabaseClusterOptions {
8
+ /**
9
+ * Max CPU utilization threshold in percent
10
+ *
11
+ * @default 80
12
+ */
13
+ readonly cpuUtilizationThreshold?: number;
14
+ /**
15
+ * Max freeable memory threshold in Byte
16
+ *
17
+ * @default 64000000
18
+ */
19
+ readonly freeableMemoryThreshold?: number;
20
+ }
21
+ /**
22
+ * Properties for defining a WatchDatabaseCluster
23
+ */
24
+ export interface WatchDatabaseClusterProps extends WatchDatabaseClusterOptions {
25
+ /**
26
+ * The reference to IWatchful class. Used internally.
27
+ */
28
+ readonly watchful: IWatchful;
29
+ /**
30
+ * The database cluster that should be watched.
31
+ * [disable-awslint:ref-via-interface]
32
+ */
33
+ readonly databaseCluster: rds.DatabaseCluster;
34
+ }
35
+ /**
36
+ * A Construct which creates the following alarms for database clusters:
37
+ *
38
+ * - cpu utilization
39
+ * - freeable memory
40
+ */
41
+ export declare class WatchDatabaseCluster extends Construct {
42
+ private readonly watchful;
43
+ private readonly rdsCluster;
44
+ constructor(scope: Construct, id: string, props: WatchDatabaseClusterProps);
45
+ private createCPUUtilizationMonitor;
46
+ private createFreeableMemoryMonitor;
47
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchDatabaseCluster = 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 database clusters:
11
+ *
12
+ * - cpu utilization
13
+ * - freeable memory
14
+ */
15
+ class WatchDatabaseCluster extends constructs_1.Construct {
16
+ constructor(scope, id, props) {
17
+ super(scope, id);
18
+ this.watchful = props.watchful;
19
+ this.rdsCluster = props.databaseCluster;
20
+ this.watchful.createAlarm(this, 'CPUUtilization', this.createCPUUtilizationMonitor(props.cpuUtilizationThreshold));
21
+ this.watchful.createAlarm(this, 'FreeableMemory', this.createFreeableMemoryMonitor(props.freeableMemoryThreshold));
22
+ }
23
+ createCPUUtilizationMonitor(cpuUtilizationThreshold = 80) {
24
+ const cpuUtilizationMetric = this.rdsCluster.metricCPUUtilization().with({ period: aws_cdk_lib_1.Duration.seconds(60) });
25
+ return {
26
+ metric: cpuUtilizationMetric,
27
+ alarmDescription: `CPU Utilization over ${cpuUtilizationThreshold}% for 10 minutes.`,
28
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
29
+ threshold: cpuUtilizationThreshold,
30
+ evaluationPeriods: 10,
31
+ };
32
+ }
33
+ createFreeableMemoryMonitor(freeableMemoryThreshold = 64000000) {
34
+ const freeableMemoryMetric = this.rdsCluster.metricFreeableMemory().with({ period: aws_cdk_lib_1.Duration.seconds(60) });
35
+ return {
36
+ metric: freeableMemoryMetric,
37
+ alarmDescription: `Freeable memory under ${freeableMemoryThreshold} for 10 minutes.`,
38
+ comparisonOperator: cw.ComparisonOperator.LESS_THAN_THRESHOLD,
39
+ threshold: freeableMemoryThreshold,
40
+ evaluationPeriods: 10,
41
+ };
42
+ }
43
+ }
44
+ exports.WatchDatabaseCluster = WatchDatabaseCluster;
45
+ _a = JSII_RTTI_SYMBOL_1;
46
+ WatchDatabaseCluster[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchDatabaseCluster", version: "0.0.0" };
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL3Jkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1QztBQUN2QyxpREFBaUQ7QUFFakQsMkNBQXVDO0FBdUN2Qzs7Ozs7R0FLRztBQUNILE1BQWEsb0JBQXFCLFNBQVEsc0JBQVM7SUFJakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFFeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRU8sMkJBQTJCLENBQUMsdUJBQXVCLEdBQUcsRUFBRTtRQUM5RCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU87WUFDTCxNQUFNLEVBQUUsb0JBQW9CO1lBQzVCLGdCQUFnQixFQUFFLHdCQUF3Qix1QkFBdUIsbUJBQW1CO1lBQ3BGLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0I7WUFDaEUsU0FBUyxFQUFFLHVCQUF1QjtZQUNsQyxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRU8sMkJBQTJCLENBQUMsdUJBQXVCLEdBQUcsUUFBUTtRQUNwRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU87WUFDTCxNQUFNLEVBQUUsb0JBQW9CO1lBQzVCLGdCQUFnQixFQUFFLHlCQUF5Qix1QkFBdUIsa0JBQWtCO1lBQ3BGLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUI7WUFDN0QsU0FBUyxFQUFFLHVCQUF1QjtZQUNsQyxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUM7SUFDSixDQUFDOztBQWxDSCxvREFtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGN3IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIHJkcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtcmRzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWV0cmljQWxhcm1Qcm9wcyB9IGZyb20gJy4vbWV0cmljLWFsYXJtJztcbmltcG9ydCB7IElXYXRjaGZ1bCB9IGZyb20gJy4vd2F0Y2hmdWwnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRlZmluaW5nIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaERhdGFiYXNlQ2x1c3Rlck9wdGlvbnMge1xuICAvKipcbiAgICAgKiBNYXggQ1BVIHV0aWxpemF0aW9uIHRocmVzaG9sZCBpbiBwZXJjZW50XG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCA4MFxuICAgICAqL1xuICByZWFkb25seSBjcHVVdGlsaXphdGlvblRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBNYXggZnJlZWFibGUgbWVtb3J5IHRocmVzaG9sZCBpbiBCeXRlXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCA2NDAwMDAwMFxuICAgICAqL1xuICByZWFkb25seSBmcmVlYWJsZU1lbW9yeVRocmVzaG9sZD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIFdhdGNoRGF0YWJhc2VDbHVzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hEYXRhYmFzZUNsdXN0ZXJQcm9wcyBleHRlbmRzIFdhdGNoRGF0YWJhc2VDbHVzdGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgICAqIFRoZSByZWZlcmVuY2UgdG8gSVdhdGNoZnVsIGNsYXNzLiBVc2VkIGludGVybmFsbHkuXG4gICAgICovXG4gIHJlYWRvbmx5IHdhdGNoZnVsOiBJV2F0Y2hmdWw7XG5cbiAgLyoqXG4gICAgICogVGhlIGRhdGFiYXNlIGNsdXN0ZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZC5cbiAgICAgKiBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgICAqL1xuICByZWFkb25seSBkYXRhYmFzZUNsdXN0ZXI6IHJkcy5EYXRhYmFzZUNsdXN0ZXI7XG59XG5cbi8qKlxuICogQSBDb25zdHJ1Y3Qgd2hpY2ggY3JlYXRlcyB0aGUgZm9sbG93aW5nIGFsYXJtcyBmb3IgZGF0YWJhc2UgY2x1c3RlcnM6XG4gKlxuICogLSBjcHUgdXRpbGl6YXRpb25cbiAqIC0gZnJlZWFibGUgbWVtb3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRjaERhdGFiYXNlQ2x1c3RlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcbiAgcHJpdmF0ZSByZWFkb25seSByZHNDbHVzdGVyOiByZHMuRGF0YWJhc2VDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXYXRjaERhdGFiYXNlQ2x1c3RlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMud2F0Y2hmdWwgPSBwcm9wcy53YXRjaGZ1bDtcbiAgICB0aGlzLnJkc0NsdXN0ZXIgPSBwcm9wcy5kYXRhYmFzZUNsdXN0ZXI7XG5cbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsICdDUFVVdGlsaXphdGlvbicsIHRoaXMuY3JlYXRlQ1BVVXRpbGl6YXRpb25Nb25pdG9yKHByb3BzLmNwdVV0aWxpemF0aW9uVGhyZXNob2xkKSk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLCAnRnJlZWFibGVNZW1vcnknLCB0aGlzLmNyZWF0ZUZyZWVhYmxlTWVtb3J5TW9uaXRvcihwcm9wcy5mcmVlYWJsZU1lbW9yeVRocmVzaG9sZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDUFVVdGlsaXphdGlvbk1vbml0b3IoY3B1VXRpbGl6YXRpb25UaHJlc2hvbGQgPSA4MCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGNwdVV0aWxpemF0aW9uTWV0cmljID0gdGhpcy5yZHNDbHVzdGVyLm1ldHJpY0NQVVV0aWxpemF0aW9uKCkud2l0aCh7IHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCkgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogY3B1VXRpbGl6YXRpb25NZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgQ1BVIFV0aWxpemF0aW9uIG92ZXIgJHtjcHVVdGlsaXphdGlvblRocmVzaG9sZH0lIGZvciAxMCBtaW51dGVzLmAsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiBjcHVVdGlsaXphdGlvblRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxMCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGcmVlYWJsZU1lbW9yeU1vbml0b3IoZnJlZWFibGVNZW1vcnlUaHJlc2hvbGQgPSA2NDAwMDAwMCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGZyZWVhYmxlTWVtb3J5TWV0cmljID0gdGhpcy5yZHNDbHVzdGVyLm1ldHJpY0ZyZWVhYmxlTWVtb3J5KCkud2l0aCh7IHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCkgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogZnJlZWFibGVNZW1vcnlNZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgRnJlZWFibGUgbWVtb3J5IHVuZGVyICR7ZnJlZWFibGVNZW1vcnlUaHJlc2hvbGR9IGZvciAxMCBtaW51dGVzLmAsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xELFxuICAgICAgdGhyZXNob2xkOiBmcmVlYWJsZU1lbW9yeVRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxMCxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,47 @@
1
+ import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
2
+ import { Construct } from 'constructs';
3
+ import { IWatchful } from './watchful';
4
+ /**
5
+ * Options for defining alarms.
6
+ */
7
+ export interface WatchApplicationTargetGroupOptions {
8
+ /**
9
+ * Number of allowed target connection errors per minute.
10
+ *
11
+ * @default 0
12
+ */
13
+ readonly targetConnectionErrorPerMinuteThreshold?: number;
14
+ /**
15
+ * Number of allowed HTTP 5xx requests per minute.
16
+ *
17
+ * @default 0
18
+ */
19
+ readonly http5xxPerMinuteThreshold?: number;
20
+ }
21
+ /**
22
+ * Properties for defining a WatchApplicationTargetGroup
23
+ */
24
+ export interface WatchApplicationTargetGroupProps extends WatchApplicationTargetGroupOptions {
25
+ /**
26
+ * The reference to IWatchful class. Used internally.
27
+ */
28
+ readonly watchful: IWatchful;
29
+ /**
30
+ * The application target group that should be watched.
31
+ * [disable-awslint:ref-via-interface]
32
+ */
33
+ readonly atg: elbv2.ApplicationTargetGroup;
34
+ }
35
+ /**
36
+ * A Construct which creates the following alarms for application target groups:
37
+ *
38
+ * - http-code 5xx
39
+ * - target connection errors
40
+ */
41
+ export declare class WatchApplicationTargetGroup extends Construct {
42
+ private readonly watchful;
43
+ private readonly atg;
44
+ constructor(scope: Construct, id: string, props: WatchApplicationTargetGroupProps);
45
+ private createTargetConnectionErrorMonitor;
46
+ private createHttpCode5xxMonitor;
47
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchApplicationTargetGroup = 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 elbv2 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
9
+ const constructs_1 = require("constructs");
10
+ /**
11
+ * A Construct which creates the following alarms for application target groups:
12
+ *
13
+ * - http-code 5xx
14
+ * - target connection errors
15
+ */
16
+ class WatchApplicationTargetGroup extends constructs_1.Construct {
17
+ constructor(scope, id, props) {
18
+ super(scope, id);
19
+ this.watchful = props.watchful;
20
+ this.atg = props.atg;
21
+ this.watchful.createAlarm(this, 'ConnectionError', this.createTargetConnectionErrorMonitor(props.targetConnectionErrorPerMinuteThreshold));
22
+ this.watchful.createAlarm(this, 'HttpCode5xx', this.createHttpCode5xxMonitor(props.http5xxPerMinuteThreshold));
23
+ }
24
+ createTargetConnectionErrorMonitor(targetConnectionErrorPerMinuteThreshold = 0) {
25
+ const atg = this.atg;
26
+ const rejectedMetric = atg.metricTargetConnectionErrorCount().with({ period: aws_cdk_lib_1.Duration.seconds(60) });
27
+ return {
28
+ metric: rejectedMetric,
29
+ alarmDescription: `Over ${targetConnectionErrorPerMinuteThreshold} target connection errors per minute`,
30
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
31
+ threshold: targetConnectionErrorPerMinuteThreshold,
32
+ treatMissingData: cw.TreatMissingData.NOT_BREACHING,
33
+ evaluationPeriods: 1,
34
+ };
35
+ }
36
+ createHttpCode5xxMonitor(http5xxPerMinuteThreshold = 0) {
37
+ const alb = this.atg;
38
+ const http5xxMetric = alb
39
+ .metricHttpCodeTarget(elbv2.HttpCodeTarget.TARGET_5XX_COUNT)
40
+ .with({ period: aws_cdk_lib_1.Duration.seconds(60) });
41
+ return {
42
+ metric: http5xxMetric,
43
+ alarmDescription: `Over ${http5xxPerMinuteThreshold} 5xx status codes from targets per minute`,
44
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
45
+ threshold: http5xxPerMinuteThreshold,
46
+ treatMissingData: cw.TreatMissingData.NOT_BREACHING,
47
+ evaluationPeriods: 1,
48
+ };
49
+ }
50
+ }
51
+ exports.WatchApplicationTargetGroup = WatchApplicationTargetGroup;
52
+ _a = JSII_RTTI_SYMBOL_1;
53
+ WatchApplicationTargetGroup[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchApplicationTargetGroup", version: "0.0.0" };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0Z3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvdGFyZ2V0Z3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBdUM7QUFDdkMsaURBQWlEO0FBQ2pELGdFQUFnRTtBQUNoRSwyQ0FBdUM7QUF1Q3ZDOzs7OztHQUtHO0FBQ0gsTUFBYSwyQkFBNEIsU0FBUSxzQkFBUztJQUl4RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVDO1FBQy9FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUVyQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGlCQUFpQixFQUNqQixJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQ3ZGLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQzVCLGFBQWEsRUFDYixJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQy9ELENBQUM7SUFDSixDQUFDO0lBRU8sa0NBQWtDLENBQUMsdUNBQXVDLEdBQUcsQ0FBQztRQUNwRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckcsT0FBTztZQUNMLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLGdCQUFnQixFQUFFLFFBQVEsdUNBQXVDLHNDQUFzQztZQUN2RyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ2hFLFNBQVMsRUFBRSx1Q0FBdUM7WUFDbEQsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7WUFDbkQsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLHdCQUF3QixDQUFDLHlCQUF5QixHQUFHLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixNQUFNLGFBQWEsR0FBRyxHQUFHO2FBQ3RCLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUM7YUFDM0QsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPO1lBQ0wsTUFBTSxFQUFFLGFBQWE7WUFDckIsZ0JBQWdCLEVBQUUsUUFBUSx5QkFBeUIsMkNBQTJDO1lBQzlGLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0I7WUFDaEUsU0FBUyxFQUFFLHlCQUF5QjtZQUNwQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtZQUNuRCxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUM7SUFDSixDQUFDOztBQTlDSCxrRUErQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGN3IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGVsYnYyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWV0cmljQWxhcm1Qcm9wcyB9IGZyb20gJy4vbWV0cmljLWFsYXJtJztcbmltcG9ydCB7IElXYXRjaGZ1bCB9IGZyb20gJy4vd2F0Y2hmdWwnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRlZmluaW5nIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBPcHRpb25zIHtcbiAgLyoqXG4gICAgICogTnVtYmVyIG9mIGFsbG93ZWQgdGFyZ2V0IGNvbm5lY3Rpb24gZXJyb3JzIHBlciBtaW51dGUuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gIHJlYWRvbmx5IHRhcmdldENvbm5lY3Rpb25FcnJvclBlck1pbnV0ZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYWxsb3dlZCBIVFRQIDV4eCByZXF1ZXN0cyBwZXIgbWludXRlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICByZWFkb25seSBodHRwNXh4UGVyTWludXRlVGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwUHJvcHMgZXh0ZW5kcyBXYXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBPcHRpb25zIHtcbiAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSB0byBJV2F0Y2hmdWwgY2xhc3MuIFVzZWQgaW50ZXJuYWxseS5cbiAgICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcblxuICAvKipcbiAgICAgKiBUaGUgYXBwbGljYXRpb24gdGFyZ2V0IGdyb3VwIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQuXG4gICAgICogW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICAgKi9cbiAgcmVhZG9ubHkgYXRnOiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwO1xufVxuXG4vKipcbiAqIEEgQ29uc3RydWN0IHdoaWNoIGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBhbGFybXMgZm9yIGFwcGxpY2F0aW9uIHRhcmdldCBncm91cHM6XG4gKlxuICogLSBodHRwLWNvZGUgNXh4XG4gKiAtIHRhcmdldCBjb25uZWN0aW9uIGVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB3YXRjaGZ1bDogSVdhdGNoZnVsO1xuICBwcml2YXRlIHJlYWRvbmx5IGF0ZzogZWxidjIuQXBwbGljYXRpb25UYXJnZXRHcm91cDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy53YXRjaGZ1bCA9IHByb3BzLndhdGNoZnVsO1xuICAgIHRoaXMuYXRnID0gcHJvcHMuYXRnO1xuXG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLFxuICAgICAgJ0Nvbm5lY3Rpb25FcnJvcicsXG4gICAgICB0aGlzLmNyZWF0ZVRhcmdldENvbm5lY3Rpb25FcnJvck1vbml0b3IocHJvcHMudGFyZ2V0Q29ubmVjdGlvbkVycm9yUGVyTWludXRlVGhyZXNob2xkKSxcbiAgICApO1xuICAgIHRoaXMud2F0Y2hmdWwuY3JlYXRlQWxhcm0odGhpcyxcbiAgICAgICdIdHRwQ29kZTV4eCcsXG4gICAgICB0aGlzLmNyZWF0ZUh0dHBDb2RlNXh4TW9uaXRvcihwcm9wcy5odHRwNXh4UGVyTWludXRlVGhyZXNob2xkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYXJnZXRDb25uZWN0aW9uRXJyb3JNb25pdG9yKHRhcmdldENvbm5lY3Rpb25FcnJvclBlck1pbnV0ZVRocmVzaG9sZCA9IDApOiBNZXRyaWNBbGFybVByb3BzIHtcbiAgICBjb25zdCBhdGcgPSB0aGlzLmF0ZztcbiAgICBjb25zdCByZWplY3RlZE1ldHJpYyA9IGF0Zy5tZXRyaWNUYXJnZXRDb25uZWN0aW9uRXJyb3JDb3VudCgpLndpdGgoeyBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtZXRyaWM6IHJlamVjdGVkTWV0cmljLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYE92ZXIgJHt0YXJnZXRDb25uZWN0aW9uRXJyb3JQZXJNaW51dGVUaHJlc2hvbGR9IHRhcmdldCBjb25uZWN0aW9uIGVycm9ycyBwZXIgbWludXRlYCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY3cuQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IHRhcmdldENvbm5lY3Rpb25FcnJvclBlck1pbnV0ZVRocmVzaG9sZCxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGN3LlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUh0dHBDb2RlNXh4TW9uaXRvcihodHRwNXh4UGVyTWludXRlVGhyZXNob2xkID0gMCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGFsYiA9IHRoaXMuYXRnO1xuICAgIGNvbnN0IGh0dHA1eHhNZXRyaWMgPSBhbGJcbiAgICAgIC5tZXRyaWNIdHRwQ29kZVRhcmdldChlbGJ2Mi5IdHRwQ29kZVRhcmdldC5UQVJHRVRfNVhYX0NPVU5UKVxuICAgICAgLndpdGgoeyBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtZXRyaWM6IGh0dHA1eHhNZXRyaWMsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgT3ZlciAke2h0dHA1eHhQZXJNaW51dGVUaHJlc2hvbGR9IDV4eCBzdGF0dXMgY29kZXMgZnJvbSB0YXJnZXRzIHBlciBtaW51dGVgLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjdy5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIHRocmVzaG9sZDogaHR0cDV4eFBlck1pbnV0ZVRocmVzaG9sZCxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGN3LlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import * as cr from 'aws-cdk-lib/custom-resources';
2
+ import { Construct } from 'constructs';
3
+ export declare class UpperToLower extends Construct {
4
+ static getOrCreate(scope: Construct): UpperToLower;
5
+ readonly provider: cr.Provider;
6
+ constructor(scope: Construct, id: string);
7
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpperToLower = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const lambda = require("aws-cdk-lib/aws-lambda");
6
+ const logs = require("aws-cdk-lib/aws-logs");
7
+ const cr = require("aws-cdk-lib/custom-resources");
8
+ const constructs_1 = require("constructs");
9
+ class UpperToLower extends constructs_1.Construct {
10
+ constructor(scope, id) {
11
+ super(scope, id);
12
+ const crLambda = new lambda.Function(this, 'UpperToLower', {
13
+ code: lambda.Code.fromInline(`exports.handler = async (e) => {
14
+ return {
15
+ Data: {
16
+ Lower: e.ResourceProperties.Upper.toLowerCase(),
17
+ },
18
+ };
19
+ };`),
20
+ handler: 'index.handler',
21
+ runtime: lambda.Runtime.NODEJS_12_X,
22
+ });
23
+ this.provider = new cr.Provider(this, 'MyProvider', {
24
+ onEventHandler: crLambda,
25
+ logRetention: logs.RetentionDays.ONE_WEEK,
26
+ });
27
+ }
28
+ static getOrCreate(scope) {
29
+ const stack = aws_cdk_lib_1.Stack.of(scope);
30
+ const id = 'upper-to-lower-custom-resource';
31
+ return stack.node.tryFindChild(id) || new UpperToLower(stack, id);
32
+ }
33
+ }
34
+ exports.UpperToLower = UpperToLower;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBwZXJUb0xvd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL3VwcGVyVG9Mb3dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBb0M7QUFDcEMsaURBQWlEO0FBQ2pELDZDQUE2QztBQUM3QyxtREFBbUQ7QUFDbkQsMkNBQXVDO0FBR3ZDLE1BQWEsWUFBYSxTQUFRLHNCQUFTO0lBVXpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDekQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOzs7Ozs7U0FNMUIsQ0FBQztZQUNKLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUNsRCxjQUFjLEVBQUUsUUFBUTtZQUN4QixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUExQk0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFnQjtRQUN4QyxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLEVBQUUsR0FBRyxnQ0FBZ0MsQ0FBQztRQUM1QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBaUIsSUFBSSxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztDQXVCRjtBQTdCRCxvQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG5leHBvcnQgY2xhc3MgVXBwZXJUb0xvd2VyIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICBwdWJsaWMgc3RhdGljIGdldE9yQ3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QpIHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgICBjb25zdCBpZCA9ICd1cHBlci10by1sb3dlci1jdXN0b20tcmVzb3VyY2UnO1xuICAgIHJldHVybiBzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgVXBwZXJUb0xvd2VyIHx8IG5ldyBVcHBlclRvTG93ZXIoc3RhY2ssIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm92aWRlcjogY3IuUHJvdmlkZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBjckxhbWJkYSA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ1VwcGVyVG9Mb3dlcicsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21JbmxpbmUoYGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIChlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgRGF0YToge1xuICAgICAgICAgICAgTG93ZXI6IGUuUmVzb3VyY2VQcm9wZXJ0aWVzLlVwcGVyLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH07YCksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICB9KTtcbiAgICB0aGlzLnByb3ZpZGVyID0gbmV3IGNyLlByb3ZpZGVyKHRoaXMsICdNeVByb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGNyTGFtYmRhLFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,119 @@
1
+ import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
2
+ import * as docdb from 'aws-cdk-lib/aws-docdb';
3
+ import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
4
+ import * as ecs from 'aws-cdk-lib/aws-ecs';
5
+ import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
6
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
7
+ import * as rds from 'aws-cdk-lib/aws-rds';
8
+ import * as sns from 'aws-cdk-lib/aws-sns';
9
+ import { Construct, IConstruct } from 'constructs';
10
+ import { WatchLambdaFunctionOptions, WatchCloudfrontDistributionOptions, WatchApplicationLoadBalancerOptions, WatchEcsServiceOptions, WatchApplicationTargetGroupOptions, MetricAlarmProps, WatchDocDbClusterOptions, WatchDatabaseClusterOptions, WatchDynamoDbTableOptions, LogAlarmProps } from '..';
11
+ /**
12
+ * Interface for Watchful implementation.
13
+ */
14
+ export interface IWatchful extends IConstruct {
15
+ /**
16
+ * Adds and alert for error logs
17
+ * @param serviceName The name of the service
18
+ */
19
+ createLogAlarm(scope: Construct, serviceName: string, alarm: LogAlarmProps): void;
20
+ /**
21
+ * Adds the alarmTopic as alarm action to the given alarm.
22
+ * @param alarm The watchful to add those resources to
23
+ *
24
+ */
25
+ createAlarm(scope: Construct, id: string, alarm: MetricAlarmProps): void;
26
+ }
27
+ /**
28
+ * Properties for defining Watchful
29
+ */
30
+ export interface WatchfulProps {
31
+ /**
32
+ * An SNS topic as target for alarm actions.
33
+ *
34
+ * @default: The SNS topic provided by OpsGenie Integration account module.
35
+ */
36
+ readonly alarmSns?: sns.ITopic;
37
+ /**
38
+ * The service token for the DataDog Monitor custom resource.
39
+ *
40
+ * @default: Empty.
41
+ */
42
+ readonly dataDogMonitorServiceToken?: string;
43
+ /**
44
+ * The service name.
45
+ *
46
+ * @default: The stack anme.
47
+ */
48
+ readonly dataDogMonitorServiceName?: string;
49
+ /**
50
+ * The OpsGenie handle used in DataDog to forward the DD monitor to OpsGenie.
51
+ *
52
+ * @default: Empty if dataDogMonitorServiceToken is not set. Otherwise, team SSM parameter from LandingZone is used.
53
+ */
54
+ readonly dataDogOpsGenieIntegrationName?: string;
55
+ }
56
+ /**
57
+ * A construct to watch given scope or resources. Opinionated DataDog alarms are automatically created for watched resources.
58
+ */
59
+ export declare class Watchful extends Construct implements IWatchful {
60
+ private readonly alarmTopic?;
61
+ private readonly dataDogMonitorServiceToken?;
62
+ private readonly dataDogOpsGenieIntegrationName?;
63
+ private readonly dataDogMonitorServiceName;
64
+ constructor(scope: Construct, id: string, props?: WatchfulProps);
65
+ /**
66
+ * Adds the alarmTopic as alarm action to the given alarm.
67
+ * @param alarm The watchful to add those resources to
68
+ */
69
+ createAlarm(scope: Construct, id: string, alarm: MetricAlarmProps): void;
70
+ /**
71
+ * Adds an alert for error logs
72
+ * @param scope
73
+ */
74
+ createLogAlarm(scope: Construct, id: string, alarm: LogAlarmProps): void;
75
+ /**
76
+ * Watches the given scope and adds alarms for known resources.
77
+ */
78
+ watchScope(scope: Construct): void;
79
+ /**
80
+ * Adds alarms for the given lambda function.
81
+ * @param fn A lambda function that should be watched [disable-awslint:ref-via-interface]
82
+ */
83
+ watchLambdaFunction(fn: lambda.Function, options?: WatchLambdaFunctionOptions): void;
84
+ /**
85
+ * Adds alarms for the given Cloudfront Distribution.
86
+ * @param cf A Cloudfront Distribution that should be watched [disable-awslint:ref-via-interface]
87
+ */
88
+ watchCloudfrontDistribution(cf: cloudfront.Distribution, options?: WatchCloudfrontDistributionOptions): void;
89
+ /**
90
+ * Adds alarms for the given ECS service.
91
+ * @param service An ECS service that should be watched [disable-awslint:ref-via-interface]
92
+ */
93
+ watchEcsService(service: ecs.BaseService, options?: WatchEcsServiceOptions): void;
94
+ /**
95
+ * Adds alarms for the given application load balancer.
96
+ * @param alb An application load balancer that should be watched [disable-awslint:ref-via-interface]
97
+ */
98
+ watchAlb(alb: elbv2.ApplicationLoadBalancer, options?: WatchApplicationLoadBalancerOptions): void;
99
+ /**
100
+ * Adds alarms for the given application target gorup.
101
+ * @param atg An application target group that should be watched [disable-awslint:ref-via-interface]
102
+ */
103
+ watchApplicationTargetGroup(atg: elbv2.ApplicationTargetGroup, options?: WatchApplicationTargetGroupOptions): void;
104
+ /**
105
+ * Adds alarms for the given DocDb cluster.
106
+ * @param docDb An DocDb cluster that should be watched [disable-awslint:ref-via-interface]
107
+ */
108
+ watchDocDb(docDb: docdb.DatabaseCluster, options?: WatchDocDbClusterOptions): void;
109
+ /**
110
+ * Adds alarms for the given database cluster.
111
+ * @param databaseCluster An database cluster that should be watched [disable-awslint:ref-via-interface]
112
+ */
113
+ watchDatabaseCluster(databaseCluster: rds.DatabaseCluster, options?: WatchDatabaseClusterOptions): void;
114
+ /**
115
+ * Adds alarms for the given DynamoDb table.
116
+ * @param dynamoDbTable An database cluster that should be watched [disable-awslint:ref-via-interface]
117
+ */
118
+ watchDynamoDbTable(dynamoDbTable: dynamodb.Table, options?: WatchDynamoDbTableOptions): void;
119
+ }