@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,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 WatchApplicationLoadBalancerOptions {
8
+ /**
9
+ * Number of allowed rejected connections per minute.
10
+ *
11
+ * @default 0
12
+ */
13
+ readonly rejectedConnectionPerMinuteThreshold?: 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 WatchApplicationLoadBalancer
23
+ */
24
+ export interface WatchApplicationLoadBalancerProps extends WatchApplicationLoadBalancerOptions {
25
+ /**
26
+ * The reference to IWatchful class. Used internally.
27
+ */
28
+ readonly watchful: IWatchful;
29
+ /**
30
+ * The application load balancer that should be watched.
31
+ * [disable-awslint:ref-via-interface]
32
+ */
33
+ readonly alb: elbv2.ApplicationLoadBalancer;
34
+ }
35
+ /**
36
+ * A Construct which creates the following alarms for application load balancers:
37
+ *
38
+ * - rejected connections
39
+ * - http-code 5xx
40
+ */
41
+ export declare class WatchApplicationLoadBalancer extends Construct {
42
+ private readonly watchful;
43
+ private readonly alb;
44
+ constructor(scope: Construct, id: string, props: WatchApplicationLoadBalancerProps);
45
+ private createRejectedConnectionMonitor;
46
+ private createHttpCode5xxMonitor;
47
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchApplicationLoadBalancer = 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 load balancers:
12
+ *
13
+ * - rejected connections
14
+ * - http-code 5xx
15
+ */
16
+ class WatchApplicationLoadBalancer extends constructs_1.Construct {
17
+ constructor(scope, id, props) {
18
+ super(scope, id);
19
+ this.watchful = props.watchful;
20
+ this.alb = props.alb;
21
+ this.watchful.createAlarm(this, 'RejectedConnection', this.createRejectedConnectionMonitor(props.rejectedConnectionPerMinuteThreshold));
22
+ this.watchful.createAlarm(this, 'HttpCode5xx', this.createHttpCode5xxMonitor(props.http5xxPerMinuteThreshold));
23
+ }
24
+ createRejectedConnectionMonitor(rejectedConnectionPerMinuteThreshold = 0) {
25
+ const rejectedMetric = this.alb.metricRejectedConnectionCount().with({ period: aws_cdk_lib_1.Duration.seconds(60) });
26
+ return {
27
+ metric: rejectedMetric,
28
+ alarmDescription: `Over ${rejectedConnectionPerMinuteThreshold} rejected connections per minute`,
29
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
30
+ threshold: rejectedConnectionPerMinuteThreshold,
31
+ treatMissingData: cw.TreatMissingData.NOT_BREACHING,
32
+ evaluationPeriods: 1,
33
+ };
34
+ }
35
+ createHttpCode5xxMonitor(http5xxPerMinuteThreshold = 0) {
36
+ const http5xxMetric = this.alb
37
+ .metricHttpCodeElb(elbv2.HttpCodeElb.ELB_5XX_COUNT)
38
+ .with({ period: aws_cdk_lib_1.Duration.seconds(60) });
39
+ return {
40
+ metric: http5xxMetric,
41
+ alarmDescription: `Over ${http5xxPerMinuteThreshold} 5xx requests per minute`,
42
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
43
+ threshold: http5xxPerMinuteThreshold,
44
+ treatMissingData: cw.TreatMissingData.NOT_BREACHING,
45
+ evaluationPeriods: 1,
46
+ };
47
+ }
48
+ }
49
+ exports.WatchApplicationLoadBalancer = WatchApplicationLoadBalancer;
50
+ _a = JSII_RTTI_SYMBOL_1;
51
+ WatchApplicationLoadBalancer[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchApplicationLoadBalancer", version: "0.0.0" };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL2FsYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1QztBQUN2QyxpREFBaUQ7QUFDakQsZ0VBQWdFO0FBQ2hFLDJDQUF1QztBQXVDdkM7Ozs7O0dBS0c7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHNCQUFTO0lBSXpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0M7UUFDaEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBRXJCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFDNUIsb0JBQW9CLEVBQ3BCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FDakYsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVPLCtCQUErQixDQUFDLG9DQUFvQyxHQUFHLENBQUM7UUFDOUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkcsT0FBTztZQUNMLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLGdCQUFnQixFQUFFLFFBQVEsb0NBQW9DLGtDQUFrQztZQUNoRyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ2hFLFNBQVMsRUFBRSxvQ0FBb0M7WUFDL0MsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7WUFDbkQsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLHdCQUF3QixDQUFDLHlCQUF5QixHQUFHLENBQUM7UUFDNUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUc7YUFDM0IsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7YUFDbEQsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPO1lBQ0wsTUFBTSxFQUFFLGFBQWE7WUFDckIsZ0JBQWdCLEVBQUUsUUFBUSx5QkFBeUIsMEJBQTBCO1lBQzdFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0I7WUFDaEUsU0FBUyxFQUFFLHlCQUF5QjtZQUNwQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtZQUNuRCxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUM7SUFDSixDQUFDOztBQXpDSCxvRUEwQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGN3IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGVsYnYyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWV0cmljQWxhcm1Qcm9wcyB9IGZyb20gJy4vbWV0cmljLWFsYXJtJztcbmltcG9ydCB7IElXYXRjaGZ1bCB9IGZyb20gJy4vd2F0Y2hmdWwnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRlZmluaW5nIGFsYXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyT3B0aW9ucyB7XG4gIC8qKlxuICAgICAqIE51bWJlciBvZiBhbGxvd2VkIHJlamVjdGVkIGNvbm5lY3Rpb25zIHBlciBtaW51dGUuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gIHJlYWRvbmx5IHJlamVjdGVkQ29ubmVjdGlvblBlck1pbnV0ZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYWxsb3dlZCBIVFRQIDV4eCByZXF1ZXN0cyBwZXIgbWludXRlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICByZWFkb25seSBodHRwNXh4UGVyTWludXRlVGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJQcm9wcyBleHRlbmRzIFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJPcHRpb25zIHtcbiAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSB0byBJV2F0Y2hmdWwgY2xhc3MuIFVzZWQgaW50ZXJuYWxseS5cbiAgICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcblxuICAvKipcbiAgICAgKiBUaGUgYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlciB0aGF0IHNob3VsZCBiZSB3YXRjaGVkLlxuICAgICAqIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAgICovXG4gIHJlYWRvbmx5IGFsYjogZWxidjIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG59XG5cbi8qKlxuICogQSBDb25zdHJ1Y3Qgd2hpY2ggY3JlYXRlcyB0aGUgZm9sbG93aW5nIGFsYXJtcyBmb3IgYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlcnM6XG4gKlxuICogLSByZWplY3RlZCBjb25uZWN0aW9uc1xuICogLSBodHRwLWNvZGUgNXh4XG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRjaEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB3YXRjaGZ1bDogSVdhdGNoZnVsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFsYjogZWxidjIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLndhdGNoZnVsID0gcHJvcHMud2F0Y2hmdWw7XG4gICAgdGhpcy5hbGIgPSBwcm9wcy5hbGI7XG5cbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsXG4gICAgICAnUmVqZWN0ZWRDb25uZWN0aW9uJyxcbiAgICAgIHRoaXMuY3JlYXRlUmVqZWN0ZWRDb25uZWN0aW9uTW9uaXRvcihwcm9wcy5yZWplY3RlZENvbm5lY3Rpb25QZXJNaW51dGVUaHJlc2hvbGQpLFxuICAgICk7XG4gICAgdGhpcy53YXRjaGZ1bC5jcmVhdGVBbGFybSh0aGlzLCAnSHR0cENvZGU1eHgnLCB0aGlzLmNyZWF0ZUh0dHBDb2RlNXh4TW9uaXRvcihwcm9wcy5odHRwNXh4UGVyTWludXRlVGhyZXNob2xkKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlamVjdGVkQ29ubmVjdGlvbk1vbml0b3IocmVqZWN0ZWRDb25uZWN0aW9uUGVyTWludXRlVGhyZXNob2xkID0gMCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IHJlamVjdGVkTWV0cmljID0gdGhpcy5hbGIubWV0cmljUmVqZWN0ZWRDb25uZWN0aW9uQ291bnQoKS53aXRoKHsgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljOiByZWplY3RlZE1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBPdmVyICR7cmVqZWN0ZWRDb25uZWN0aW9uUGVyTWludXRlVGhyZXNob2xkfSByZWplY3RlZCBjb25uZWN0aW9ucyBwZXIgbWludXRlYCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY3cuQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IHJlamVjdGVkQ29ubmVjdGlvblBlck1pbnV0ZVRocmVzaG9sZCxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGN3LlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUh0dHBDb2RlNXh4TW9uaXRvcihodHRwNXh4UGVyTWludXRlVGhyZXNob2xkID0gMCk6IE1ldHJpY0FsYXJtUHJvcHMge1xuICAgIGNvbnN0IGh0dHA1eHhNZXRyaWMgPSB0aGlzLmFsYlxuICAgICAgLm1ldHJpY0h0dHBDb2RlRWxiKGVsYnYyLkh0dHBDb2RlRWxiLkVMQl81WFhfQ09VTlQpXG4gICAgICAud2l0aCh7IHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCkgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldHJpYzogaHR0cDV4eE1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBPdmVyICR7aHR0cDV4eFBlck1pbnV0ZVRocmVzaG9sZH0gNXh4IHJlcXVlc3RzIHBlciBtaW51dGVgLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjdy5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIHRocmVzaG9sZDogaHR0cDV4eFBlck1pbnV0ZVRocmVzaG9sZCxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGN3LlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { IAspect } from 'aws-cdk-lib';
2
+ import { IConstruct } from 'constructs';
3
+ import { Watchful } from './watchful';
4
+ /**
5
+ * A CDK aspect that can automatically watch all resources within a scope.
6
+ */
7
+ export declare class WatchfulAspect implements IAspect {
8
+ private readonly watchful;
9
+ /**
10
+ * Defines a watchful aspect
11
+ * @param watchful The watchful to add those resources to
12
+ * @param props Options
13
+ */
14
+ constructor(watchful: Watchful);
15
+ visit(node: IConstruct): void;
16
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchfulAspect = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cloudfront = require("aws-cdk-lib/aws-cloudfront");
7
+ const docdb = require("aws-cdk-lib/aws-docdb");
8
+ const dynamodb = require("aws-cdk-lib/aws-dynamodb");
9
+ const ecs = require("aws-cdk-lib/aws-ecs");
10
+ const elbv2 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
11
+ const lambda = require("aws-cdk-lib/aws-lambda");
12
+ const rds = require("aws-cdk-lib/aws-rds");
13
+ /**
14
+ * A CDK aspect that can automatically watch all resources within a scope.
15
+ */
16
+ class WatchfulAspect {
17
+ /**
18
+ * Defines a watchful aspect
19
+ * @param watchful The watchful to add those resources to
20
+ * @param props Options
21
+ */
22
+ constructor(watchful) {
23
+ this.watchful = watchful;
24
+ }
25
+ visit(node) {
26
+ if (node instanceof lambda.Function) {
27
+ this.watchful.watchLambdaFunction(node);
28
+ }
29
+ if (node instanceof ecs.BaseService) {
30
+ this.watchful.watchEcsService(node);
31
+ }
32
+ if (node instanceof elbv2.ApplicationLoadBalancer) {
33
+ this.watchful.watchAlb(node);
34
+ }
35
+ if (node instanceof elbv2.ApplicationTargetGroup) {
36
+ this.watchful.watchApplicationTargetGroup(node);
37
+ }
38
+ if (node instanceof docdb.DatabaseCluster) {
39
+ this.watchful.watchDocDb(node);
40
+ }
41
+ if (node instanceof rds.DatabaseCluster) {
42
+ this.watchful.watchDatabaseCluster(node);
43
+ }
44
+ if (node instanceof cloudfront.Distribution) {
45
+ this.watchful.watchCloudfrontDistribution(node);
46
+ }
47
+ if (node instanceof dynamodb.Table) {
48
+ this.watchful.watchDynamoDbTable(node);
49
+ }
50
+ }
51
+ }
52
+ exports.WatchfulAspect = WatchfulAspect;
53
+ _a = JSII_RTTI_SYMBOL_1;
54
+ WatchfulAspect[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchfulAspect", version: "0.0.0" };
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhdGNoZnVsL2FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHlEQUF5RDtBQUN6RCwrQ0FBK0M7QUFDL0MscURBQXFEO0FBQ3JELDJDQUEyQztBQUMzQyxnRUFBZ0U7QUFDaEUsaURBQWlEO0FBQ2pELDJDQUEyQztBQUkzQzs7R0FFRztBQUNILE1BQWEsY0FBYztJQUN6Qjs7OztTQUlLO0lBQ0wsWUFBNkIsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUFHLENBQUM7SUFFNUMsS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QztRQUNELElBQUksSUFBSSxZQUFZLEdBQUcsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLElBQUksWUFBWSxLQUFLLENBQUMsdUJBQXVCLEVBQUU7WUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7UUFDRCxJQUFJLElBQUksWUFBWSxLQUFLLENBQUMsc0JBQXNCLEVBQUU7WUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqRDtRQUNELElBQUksSUFBSSxZQUFZLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLElBQUksWUFBWSxHQUFHLENBQUMsZUFBZSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7UUFDRCxJQUFJLElBQUksWUFBWSxVQUFVLENBQUMsWUFBWSxFQUFFO1lBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLElBQUksWUFBWSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDOztBQWpDSCx3Q0FrQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXNwZWN0IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBkb2NkYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZG9jZGInO1xuaW1wb3J0ICogYXMgZHluYW1vZGIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCAqIGFzIGVsYnYyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIHJkcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtcmRzJztcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFdhdGNoZnVsIH0gZnJvbSAnLi93YXRjaGZ1bCc7XG5cbi8qKlxuICogQSBDREsgYXNwZWN0IHRoYXQgY2FuIGF1dG9tYXRpY2FsbHkgd2F0Y2ggYWxsIHJlc291cmNlcyB3aXRoaW4gYSBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGNoZnVsQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIC8qKlxuICAgICAqIERlZmluZXMgYSB3YXRjaGZ1bCBhc3BlY3RcbiAgICAgKiBAcGFyYW0gd2F0Y2hmdWwgVGhlIHdhdGNoZnVsIHRvIGFkZCB0aG9zZSByZXNvdXJjZXMgdG9cbiAgICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uc1xuICAgICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHdhdGNoZnVsOiBXYXRjaGZ1bCkge31cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLndhdGNoZnVsLndhdGNoTGFtYmRhRnVuY3Rpb24obm9kZSk7XG4gICAgfVxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgZWNzLkJhc2VTZXJ2aWNlKSB7XG4gICAgICB0aGlzLndhdGNoZnVsLndhdGNoRWNzU2VydmljZShub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBlbGJ2Mi5BcHBsaWNhdGlvbkxvYWRCYWxhbmNlcikge1xuICAgICAgdGhpcy53YXRjaGZ1bC53YXRjaEFsYihub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwKSB7XG4gICAgICB0aGlzLndhdGNoZnVsLndhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cChub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBkb2NkYi5EYXRhYmFzZUNsdXN0ZXIpIHtcbiAgICAgIHRoaXMud2F0Y2hmdWwud2F0Y2hEb2NEYihub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiByZHMuRGF0YWJhc2VDbHVzdGVyKSB7XG4gICAgICB0aGlzLndhdGNoZnVsLndhdGNoRGF0YWJhc2VDbHVzdGVyKG5vZGUpO1xuICAgIH1cbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGNsb3VkZnJvbnQuRGlzdHJpYnV0aW9uKSB7XG4gICAgICB0aGlzLndhdGNoZnVsLndhdGNoQ2xvdWRmcm9udERpc3RyaWJ1dGlvbihub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9kYi5UYWJsZSkge1xuICAgICAgdGhpcy53YXRjaGZ1bC53YXRjaER5bmFtb0RiVGFibGUobm9kZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,50 @@
1
+ import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
2
+ import { Construct } from 'constructs';
3
+ import { IWatchful } from './watchful';
4
+ /**
5
+ * Options for defining alarms.
6
+ */
7
+ export interface WatchCloudfrontDistributionOptions {
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
+ * Threshold for the cache hit alarm as percentage of the Cloudfront Distribution
16
+ *
17
+ * If this is set to 40%, the alarm will be set when the cache hit perentage is
18
+ * lower than the threshold setting
19
+ *
20
+ * @default 40
21
+ */
22
+ readonly cacheHitPercent?: number;
23
+ }
24
+ /**
25
+ * Properties for defining a WatchCloudfrontDistribution
26
+ */
27
+ export interface WatchCloudfrontDistributionProps extends WatchCloudfrontDistributionOptions {
28
+ /**
29
+ * The reference to IWatchful class. Used internally.
30
+ */
31
+ readonly watchful: IWatchful;
32
+ /**
33
+ * The cloudfront distribution that should be watched.
34
+ * [disable-awslint:ref-via-interface]
35
+ */
36
+ readonly cf: cloudfront.Distribution;
37
+ }
38
+ /**
39
+ * A Construct which creates the following alarms for cloudfront distributions:
40
+ *
41
+ * - http-code 5xx
42
+ * - low cache hits
43
+ */
44
+ export declare class WatchCloudfrontDistribution extends Construct {
45
+ private readonly watchful;
46
+ private readonly cf;
47
+ constructor(scope: Construct, id: string, props: WatchCloudfrontDistributionProps);
48
+ private create5xxMonitor;
49
+ private createCacheHitMonitor;
50
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WatchCloudfrontDistribution = 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 cloudfront distributions:
11
+ *
12
+ * - http-code 5xx
13
+ * - low cache hits
14
+ */
15
+ class WatchCloudfrontDistribution extends constructs_1.Construct {
16
+ constructor(scope, id, props) {
17
+ super(scope, id);
18
+ this.watchful = props.watchful;
19
+ this.cf = props.cf;
20
+ this.watchful.createAlarm(this, '5xxError', this.create5xxMonitor(props.errorsPerMinuteThreshold));
21
+ this.watchful.createAlarm(this, 'cacheHitRate', this.createCacheHitMonitor(props.cacheHitPercent));
22
+ }
23
+ create5xxMonitor(errorsPerMinuteThreshold = 0) {
24
+ const errorMetrics5xx = new cw.Metric({
25
+ metricName: '5xxErrorRate',
26
+ namespace: 'AWS/CloudFront',
27
+ period: aws_cdk_lib_1.Duration.seconds(600),
28
+ statistic: cw.Statistic.AVERAGE,
29
+ dimensionsMap: {
30
+ Region: 'Global',
31
+ DistributionId: this.cf.distributionId,
32
+ },
33
+ });
34
+ return {
35
+ metric: errorMetrics5xx,
36
+ alarmDescription: `Over ${errorsPerMinuteThreshold} 5xx errors per minute`,
37
+ threshold: errorsPerMinuteThreshold,
38
+ comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
39
+ evaluationPeriods: 3,
40
+ };
41
+ }
42
+ createCacheHitMonitor(cacheHitRateThreshold = 40) {
43
+ const cacheHitRateMetric = new cw.Metric({
44
+ metricName: 'CacheHitRate',
45
+ namespace: 'AWS/CloudFront',
46
+ period: aws_cdk_lib_1.Duration.seconds(600),
47
+ statistic: cw.Statistic.AVERAGE,
48
+ dimensionsMap: {
49
+ Region: 'Global',
50
+ DistributionId: this.cf.distributionId,
51
+ },
52
+ });
53
+ return {
54
+ metric: cacheHitRateMetric,
55
+ alarmDescription: `Cache hit rate less than ${cacheHitRateThreshold}`,
56
+ threshold: cacheHitRateThreshold,
57
+ comparisonOperator: cw.ComparisonOperator.LESS_THAN_THRESHOLD,
58
+ evaluationPeriods: 3,
59
+ };
60
+ }
61
+ }
62
+ exports.WatchCloudfrontDistribution = WatchCloudfrontDistribution;
63
+ _a = JSII_RTTI_SYMBOL_1;
64
+ WatchCloudfrontDistribution[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.WatchCloudfrontDistribution", version: "0.0.0" };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93YXRjaGZ1bC9jbG91ZGZyb250LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXVDO0FBRXZDLGlEQUFpRDtBQUNqRCwyQ0FBdUM7QUEwQ3ZDOzs7OztHQUtHO0FBQ0gsTUFBYSwyQkFBNEIsU0FBUSxzQkFBUztJQUl4RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVDO1FBQy9FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDO1FBQ25ELE1BQU0sZUFBZSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxVQUFVLEVBQUUsY0FBYztZQUMxQixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDN0IsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixhQUFhLEVBQUU7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7YUFDdkM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsTUFBTSxFQUFFLGVBQWU7WUFDdkIsZ0JBQWdCLEVBQUUsUUFBUSx3QkFBd0Isd0JBQXdCO1lBQzFFLFNBQVMsRUFBRSx3QkFBd0I7WUFDbkMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQjtZQUNoRSxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUM7SUFDSixDQUFDO0lBRU8scUJBQXFCLENBQUMscUJBQXFCLEdBQUcsRUFBRTtRQUN0RCxNQUFNLGtCQUFrQixHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN2QyxVQUFVLEVBQUUsY0FBYztZQUMxQixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDN0IsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixhQUFhLEVBQUU7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7YUFDdkM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixnQkFBZ0IsRUFBRSw0QkFBNEIscUJBQXFCLEVBQUU7WUFDckUsU0FBUyxFQUFFLHFCQUFxQjtZQUNoQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CO1lBQzdELGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQztJQUNKLENBQUM7O0FBbkRILGtFQW9EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjdyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IE1ldHJpY0FsYXJtUHJvcHMgfSBmcm9tICcuL21ldHJpYy1hbGFybSc7XG5pbXBvcnQgeyBJV2F0Y2hmdWwgfSBmcm9tICcuL3dhdGNoZnVsJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBkZWZpbmluZyBhbGFybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgICAqIE51bWJlciBvZiBhbGxvd2VkIGVycm9ycyBwZXIgbWludXRlLiBJZiB0aGVyZSBhcmUgbW9yZSBlcnJvcnMgdGhhbiB0aGF0LCBhbiBhbGFybSB3aWxsIHRyaWdnZXIuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gIHJlYWRvbmx5IGVycm9yc1Blck1pbnV0ZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICAgKiBUaHJlc2hvbGQgZm9yIHRoZSBjYWNoZSBoaXQgYWxhcm0gYXMgcGVyY2VudGFnZSBvZiB0aGUgQ2xvdWRmcm9udCBEaXN0cmlidXRpb25cbiAgICAgKlxuICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIDQwJSwgdGhlIGFsYXJtIHdpbGwgYmUgc2V0IHdoZW4gdGhlIGNhY2hlIGhpdCBwZXJlbnRhZ2UgaXNcbiAgICAgKiBsb3dlciB0aGFuIHRoZSB0aHJlc2hvbGQgc2V0dGluZ1xuICAgICAqXG4gICAgICogQGRlZmF1bHQgNDBcbiAgICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVIaXRQZXJjZW50PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uUHJvcHMgZXh0ZW5kcyBXYXRjaENsb3VkZnJvbnREaXN0cmlidXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSB0byBJV2F0Y2hmdWwgY2xhc3MuIFVzZWQgaW50ZXJuYWxseS5cbiAgICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hmdWw6IElXYXRjaGZ1bDtcblxuICAvKipcbiAgICAgKiBUaGUgY2xvdWRmcm9udCBkaXN0cmlidXRpb24gdGhhdCBzaG91bGQgYmUgd2F0Y2hlZC5cbiAgICAgKiBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgICAqL1xuICByZWFkb25seSBjZjogY2xvdWRmcm9udC5EaXN0cmlidXRpb247XG59XG5cbi8qKlxuICogQSBDb25zdHJ1Y3Qgd2hpY2ggY3JlYXRlcyB0aGUgZm9sbG93aW5nIGFsYXJtcyBmb3IgY2xvdWRmcm9udCBkaXN0cmlidXRpb25zOlxuICpcbiAqIC0gaHR0cC1jb2RlIDV4eFxuICogLSBsb3cgY2FjaGUgaGl0c1xuICovXG5leHBvcnQgY2xhc3MgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB3YXRjaGZ1bDogSVdhdGNoZnVsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNmOiBjbG91ZGZyb250LkRpc3RyaWJ1dGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy53YXRjaGZ1bCA9IHByb3BzLndhdGNoZnVsO1xuICAgIHRoaXMuY2YgPSBwcm9wcy5jZjtcbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsICc1eHhFcnJvcicsIHRoaXMuY3JlYXRlNXh4TW9uaXRvcihwcm9wcy5lcnJvcnNQZXJNaW51dGVUaHJlc2hvbGQpKTtcbiAgICB0aGlzLndhdGNoZnVsLmNyZWF0ZUFsYXJtKHRoaXMsICdjYWNoZUhpdFJhdGUnLCB0aGlzLmNyZWF0ZUNhY2hlSGl0TW9uaXRvcihwcm9wcy5jYWNoZUhpdFBlcmNlbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlNXh4TW9uaXRvcihlcnJvcnNQZXJNaW51dGVUaHJlc2hvbGQgPSAwKTogTWV0cmljQWxhcm1Qcm9wcyB7XG4gICAgY29uc3QgZXJyb3JNZXRyaWNzNXh4ID0gbmV3IGN3Lk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiAnNXh4RXJyb3JSYXRlJyxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9DbG91ZEZyb250JyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MDApLFxuICAgICAgc3RhdGlzdGljOiBjdy5TdGF0aXN0aWMuQVZFUkFHRSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgUmVnaW9uOiAnR2xvYmFsJyxcbiAgICAgICAgRGlzdHJpYnV0aW9uSWQ6IHRoaXMuY2YuZGlzdHJpYnV0aW9uSWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtZXRyaWM6IGVycm9yTWV0cmljczV4eCxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBPdmVyICR7ZXJyb3JzUGVyTWludXRlVGhyZXNob2xkfSA1eHggZXJyb3JzIHBlciBtaW51dGVgLFxuICAgICAgdGhyZXNob2xkOiBlcnJvcnNQZXJNaW51dGVUaHJlc2hvbGQsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGN3LkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2FjaGVIaXRNb25pdG9yKGNhY2hlSGl0UmF0ZVRocmVzaG9sZCA9IDQwKTogTWV0cmljQWxhcm1Qcm9wcyB7XG4gICAgY29uc3QgY2FjaGVIaXRSYXRlTWV0cmljID0gbmV3IGN3Lk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiAnQ2FjaGVIaXRSYXRlJyxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9DbG91ZEZyb250JyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MDApLFxuICAgICAgc3RhdGlzdGljOiBjdy5TdGF0aXN0aWMuQVZFUkFHRSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgUmVnaW9uOiAnR2xvYmFsJyxcbiAgICAgICAgRGlzdHJpYnV0aW9uSWQ6IHRoaXMuY2YuZGlzdHJpYnV0aW9uSWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtZXRyaWM6IGNhY2hlSGl0UmF0ZU1ldHJpYyxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBDYWNoZSBoaXQgcmF0ZSBsZXNzIHRoYW4gJHtjYWNoZUhpdFJhdGVUaHJlc2hvbGR9YCxcbiAgICAgIHRocmVzaG9sZDogY2FjaGVIaXRSYXRlVGhyZXNob2xkLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjdy5Db21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX1RIUkVTSE9MRCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ import { Duration } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ export interface DataDogLogQueryAlarmProps extends DataDogProps, LogAlarmProps {
4
+ }
5
+ export declare enum UnitOfPeriod {
6
+ SECONDS = "s",
7
+ MINUTES = "m",
8
+ HOURS = "h",
9
+ DAYS = "d"
10
+ }
11
+ export declare enum ComparisonOperator {
12
+ GREATER_THAN_OR_EQUAL_TO_THRESHOLD = ">=",
13
+ GREATER_THAN_THRESHOLD = ">",
14
+ LESS_THAN_OR_EQUAL_TO_THRESHOLD = "<=",
15
+ LESS_THAN_THRESHOLD = "<"
16
+ }
17
+ export interface DataDogProps {
18
+ readonly serviceToken: string;
19
+ readonly serviceName: string;
20
+ }
21
+ export interface LogAlarmProps {
22
+ readonly autoCloseOpsGenieAlerts: boolean;
23
+ readonly period: Duration;
24
+ readonly unitOfPeriod?: UnitOfPeriod;
25
+ readonly periodOperator: ComparisonOperator;
26
+ readonly statistic: 'count';
27
+ readonly queryFilters: 'error' | 'warn';
28
+ readonly alarmDescription: string;
29
+ readonly threshold: number;
30
+ readonly priority: number;
31
+ readonly index: string;
32
+ }
33
+ export declare class DataDogLogAlarm extends Construct {
34
+ constructor(scope: Construct, id: string, props: DataDogLogQueryAlarmProps);
35
+ private alarmToDataDogQuery;
36
+ private convertToDatadogPeriod;
37
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DataDogLogAlarm = exports.ComparisonOperator = exports.UnitOfPeriod = 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
+ var UnitOfPeriod;
9
+ (function (UnitOfPeriod) {
10
+ UnitOfPeriod["SECONDS"] = "s";
11
+ UnitOfPeriod["MINUTES"] = "m";
12
+ UnitOfPeriod["HOURS"] = "h";
13
+ UnitOfPeriod["DAYS"] = "d";
14
+ })(UnitOfPeriod = exports.UnitOfPeriod || (exports.UnitOfPeriod = {}));
15
+ const DEFAULT_UNIT_OF_PERIOD = UnitOfPeriod.SECONDS;
16
+ var ComparisonOperator;
17
+ (function (ComparisonOperator) {
18
+ ComparisonOperator["GREATER_THAN_OR_EQUAL_TO_THRESHOLD"] = ">=";
19
+ ComparisonOperator["GREATER_THAN_THRESHOLD"] = ">";
20
+ ComparisonOperator["LESS_THAN_OR_EQUAL_TO_THRESHOLD"] = "<=";
21
+ ComparisonOperator["LESS_THAN_THRESHOLD"] = "<";
22
+ })(ComparisonOperator = exports.ComparisonOperator || (exports.ComparisonOperator = {}));
23
+ class DataDogLogAlarm extends constructs_1.Construct {
24
+ constructor(scope, id, props) {
25
+ var _b;
26
+ super(scope, id);
27
+ new aws_cdk_lib_1.CustomResource(this, 'DDMonitor', {
28
+ serviceToken: props.serviceToken,
29
+ pascalCaseProperties: true,
30
+ resourceType: 'Custom::DataDogMonitor',
31
+ properties: {
32
+ alertTypes: ['opsgenie'],
33
+ autoCloseOpsGenieAlerts: props.autoCloseOpsGenieAlerts,
34
+ ServiceName: props.serviceName,
35
+ version: '1.0.0',
36
+ monitor: {
37
+ type: 'log alert',
38
+ priority: props.priority,
39
+ query: this.alarmToDataDogQuery(props),
40
+ name: `${(_b = this.node.scope) === null || _b === void 0 ? void 0 : _b.node.id} ${id}`,
41
+ message: `${props.alarmDescription}: {{log.link}}`,
42
+ options: {
43
+ notify_audit: false,
44
+ locked: false,
45
+ silenced: {},
46
+ include_tags: true,
47
+ require_full_window: false,
48
+ notify_no_data: false,
49
+ escalation_message: '',
50
+ enable_logs_sample: true,
51
+ renotify_interval: 10,
52
+ renotify_statuses: ['alert'],
53
+ },
54
+ },
55
+ },
56
+ });
57
+ }
58
+ alarmToDataDogQuery(alarm) {
59
+ const [periodValue, periodUnit] = this.convertToDatadogPeriod(alarm.period, alarm.unitOfPeriod);
60
+ let comparisonOperator = alarm.periodOperator;
61
+ const filters = new Map([
62
+ ['service', alarm.serviceName],
63
+ ['account_id', aws_cdk_lib_1.Stack.of(this).account],
64
+ ['status', alarm.queryFilters],
65
+ ]);
66
+ const concatenatedFilters = Array.from(filters.entries())
67
+ .map(([filterKey, filterValue]) => `${filterKey}:${filterValue}`)
68
+ .join(' ');
69
+ return `logs("${concatenatedFilters}").index("${alarm.index}").rollup("${alarm.statistic}").last("${periodValue}${periodUnit}") ${comparisonOperator} ${alarm.threshold}`;
70
+ }
71
+ convertToDatadogPeriod(period, unitOfPeriod) {
72
+ const unit = unitOfPeriod !== null && unitOfPeriod !== void 0 ? unitOfPeriod : DEFAULT_UNIT_OF_PERIOD;
73
+ const mapPeriodToDatadogTime = {
74
+ [UnitOfPeriod.SECONDS]: () => period.toSeconds(),
75
+ [UnitOfPeriod.MINUTES]: () => period.toMinutes(),
76
+ [UnitOfPeriod.HOURS]: () => period.toHours(),
77
+ [UnitOfPeriod.DAYS]: () => period.toDays(),
78
+ };
79
+ return [
80
+ mapPeriodToDatadogTime[unit](),
81
+ unit.toString(),
82
+ ];
83
+ }
84
+ }
85
+ exports.DataDogLogAlarm = DataDogLogAlarm;
86
+ _a = JSII_RTTI_SYMBOL_1;
87
+ DataDogLogAlarm[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.DataDogLogAlarm", version: "0.0.0" };
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1sb2ctYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvZGF0YWRvZy1sb2ctYWxhcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBOEQ7QUFDOUQsMkNBQXVDO0FBS3ZDLElBQVksWUFLWDtBQUxELFdBQVksWUFBWTtJQUN0Qiw2QkFBYSxDQUFBO0lBQ2IsNkJBQWEsQ0FBQTtJQUNiLDJCQUFXLENBQUE7SUFDWCwwQkFBVSxDQUFBO0FBQ1osQ0FBQyxFQUxXLFlBQVksR0FBWixvQkFBWSxLQUFaLG9CQUFZLFFBS3ZCO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO0FBRXBELElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwrREFBeUMsQ0FBQTtJQUN6QyxrREFBNEIsQ0FBQTtJQUM1Qiw0REFBc0MsQ0FBQTtJQUN0QywrQ0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBTFcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFLN0I7QUFvQkQsTUFBYSxlQUFnQixTQUFRLHNCQUFTO0lBQzVDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7O1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDcEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLG9CQUFvQixFQUFFLElBQUk7WUFDMUIsWUFBWSxFQUFFLHdCQUF3QjtZQUN0QyxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUN4Qix1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO2dCQUN0RCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixPQUFPLEVBQUU7b0JBQ1As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dXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFEb2dMb2dRdWVyeUFsYXJtUHJvcHMgZXh0ZW5kcyBEYXRhRG9nUHJvcHMsIExvZ0FsYXJtUHJvcHMge1xufVxuXG5leHBvcnQgZW51bSBVbml0T2ZQZXJpb2Qge1xuICBTRUNPTkRTID0gJ3MnLFxuICBNSU5VVEVTID0gJ20nLFxuICBIT1VSUyA9ICdoJyxcbiAgREFZUyA9ICdkJyxcbn1cblxuY29uc3QgREVGQVVMVF9VTklUX09GX1BFUklPRCA9IFVuaXRPZlBlcmlvZC5TRUNPTkRTO1xuXG5leHBvcnQgZW51bSBDb21wYXJpc29uT3BlcmF0b3Ige1xuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xEID0gJz49JyxcbiAgR1JFQVRFUl9USEFOX1RIUkVTSE9MRCA9ICc+JyxcbiAgTEVTU19USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCA9ICc8PScsXG4gIExFU1NfVEhBTl9USFJFU0hPTEQgPSAnPCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YURvZ1Byb3BzIHtcbiAgcmVhZG9ubHkgc2VydmljZVRva2VuOiBzdHJpbmc7IC8vIHBvaW50cyB0byBERCBtb25pdG9yIGN1c3RvbSByZXNvdXJjZSBsYW1iZGEgb3Igc25zIHRvcGljXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7IC8vIG5lZWRzIHRvIG1hdGNoIHRoZSBzZXJ2aWNlIG5hbWUgdXNlZCBpbiBkYXRhZG9nLWludGVncmF0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQWxhcm1Qcm9wcyB7XG4gIHJlYWRvbmx5IGF1dG9DbG9zZU9wc0dlbmllQWxlcnRzOiBib29sZWFuO1xuICByZWFkb25seSBwZXJpb2Q6IER1cmF0aW9uO1xuICByZWFkb25seSB1bml0T2ZQZXJpb2Q/OiBVbml0T2ZQZXJpb2Q7IC8vIHVuaXQgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWxlcnQuIGlmIG5vbmUgaXMgcHJvdmlkZWQgdGhlIHBlcmlvZHMgdW5pdCB3aWxsIGRlZmF1bHQgdG8gc2Vjb25kc1xuICByZWFkb25seSBwZXJpb2RPcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yO1xuICByZWFkb25seSBzdGF0aXN0aWM6ICdjb3VudCc7IC8vIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uXG4gIHJlYWRvbmx5IHF1ZXJ5RmlsdGVyczogJ2Vycm9yJ3wnd2Fybic7IC8vIGl0IHNob3VsZCBlaXRoZXIgc2F5IGVycm9yIG9yIHdhcm5cbiAgcmVhZG9ubHkgYWxhcm1EZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgcHJpb3JpdHk6IG51bWJlcjtcbiAgcmVhZG9ubHkgaW5kZXg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIERhdGFEb2dMb2dBbGFybSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhRG9nTG9nUXVlcnlBbGFybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnRERNb25pdG9yJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5zZXJ2aWNlVG9rZW4sXG4gICAgICBwYXNjYWxDYXNlUHJvcGVydGllczogdHJ1ZSxcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6RGF0YURvZ01vbml0b3InLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBhbGVydFR5cGVzOiBbJ29wc2dlbmllJ10sIC8vIGFsZXJ0IFR5cGUgaXMgbmVlZGVkIHRvIGludGVncmF0ZSB3aXRoIE9wc0dlbmllIGFuZCB0byBzZXQgdGhlIGF1dG9DbG9zZU9wc0dlbmllQWxlcnRzIG9wdGlvblxuICAgICAgICBhdXRvQ2xvc2VPcHNHZW5pZUFsZXJ0czogcHJvcHMuYXV0b0Nsb3NlT3BzR2VuaWVBbGVydHMsXG4gICAgICAgIFNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgbW9uaXRvcjoge1xuICAgICAgICAgIHR5cGU6ICdsb2cgYWxlcnQnLFxuICAgICAgICAgIHByaW9yaXR5OiBwcm9wcy5wcmlvcml0eSxcbiAgICAgICAgICBxdWVyeTogdGhpcy5hbGFybVRvRGF0YURvZ1F1ZXJ5KHByb3BzKSxcbiAgICAgICAgICBuYW1lOiBgJHt0aGlzLm5vZGUuc2NvcGU/Lm5vZGUuaWR9ICR7aWR9YCwgLy8gZGF0YWRvZy1pbnRlZ3JhdGlvbiBjdXN0b20gcmVzb3VyY2UgcHJlcGVuZCBpdCB3aXRoIFRlYW0gYW5kIFNlcnZpY2VOYW1lXG4gICAgICAgICAgbWVzc2FnZTogYCR7cHJvcHMuYWxhcm1EZXNjcmlwdGlvbn06IHt7bG9nLmxpbmt9fWAsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgbm90aWZ5X2F1ZGl0OiBmYWxzZSxcbiAgICAgICAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgICAgICAgICBzaWxlbmNlZDoge30sXG4gICAgICAgICAgICBpbmNsdWRlX3RhZ3M6IHRydWUsXG4gICAgICAgICAgICByZXF1aXJlX2Z1bGxfd2luZG93OiBmYWxzZSxcbiAgICAgICAgICAgIG5vdGlmeV9ub19kYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIGVzY2FsYXRpb25fbWVzc2FnZTogJycsXG4gICAgICAgICAgICBlbmFibGVfbG9nc19zYW1wbGU6IHRydWUsXG4gICAgICAgICAgICByZW5vdGlmeV9pbnRlcnZhbDogMTAsXG4gICAgICAgICAgICByZW5vdGlmeV9zdGF0dXNlczogWydhbGVydCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGFybVRvRGF0YURvZ1F1ZXJ5KGFsYXJtOiBEYXRhRG9nTG9nUXVlcnlBbGFybVByb3BzKTogc3RyaW5nIHtcblxuICAgIGNvbnN0IFtwZXJpb2RWYWx1ZSwgcGVyaW9kVW5pdF0gPSB0aGlzLmNvbnZlcnRUb0RhdGFkb2dQZXJpb2QoYWxhcm0ucGVyaW9kLCBhbGFybS51bml0T2ZQZXJpb2QpO1xuXG4gICAgbGV0IGNvbXBhcmlzb25PcGVyYXRvciA9IGFsYXJtLnBlcmlvZE9wZXJhdG9yO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IG5ldyBNYXAoW1xuICAgICAgWydzZXJ2aWNlJywgYWxhcm0uc2VydmljZU5hbWVdLFxuICAgICAgWydhY2NvdW50X2lkJywgU3RhY2sub2YodGhpcykuYWNjb3VudF0sXG4gICAgICBbJ3N0YXR1cycsIGFsYXJtLnF1ZXJ5RmlsdGVyc10sXG4gICAgXSk7XG5cbiAgICBjb25zdCBjb25jYXRlbmF0ZWRGaWx0ZXJzID0gQXJyYXkuZnJvbShmaWx0ZXJzLmVudHJpZXMoKSlcbiAgICAgIC5tYXAoKFtmaWx0ZXJLZXksIGZpbHRlclZhbHVlXSkgPT4gYCR7ZmlsdGVyS2V5fToke2ZpbHRlclZhbHVlfWApXG4gICAgICAuam9pbignICcpO1xuXG4gICAgcmV0dXJuIGBsb2dzKFwiJHtjb25jYXRlbmF0ZWRGaWx0ZXJzfVwiKS5pbmRleChcIiR7YWxhcm0uaW5kZXh9XCIpLnJvbGx1cChcIiR7YWxhcm0uc3RhdGlzdGljfVwiKS5sYXN0KFwiJHtwZXJpb2RWYWx1ZX0ke3BlcmlvZFVuaXR9XCIpICR7Y29tcGFyaXNvbk9wZXJhdG9yfSAke2FsYXJtLnRocmVzaG9sZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9EYXRhZG9nUGVyaW9kKHBlcmlvZDogRHVyYXRpb24sIHVuaXRPZlBlcmlvZD86IFVuaXRPZlBlcmlvZCk6IFtudW1iZXIsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVuaXQgPSB1bml0T2ZQZXJpb2QgPz8gREVGQVVMVF9VTklUX09GX1BFUklPRDtcbiAgICBjb25zdCBtYXBQZXJpb2RUb0RhdGFkb2dUaW1lID0ge1xuICAgICAgW1VuaXRPZlBlcmlvZC5TRUNPTkRTXTogKCkgPT4gcGVyaW9kLnRvU2Vjb25kcygpLFxuICAgICAgW1VuaXRPZlBlcmlvZC5NSU5VVEVTXTogKCkgPT4gcGVyaW9kLnRvTWludXRlcygpLFxuICAgICAgW1VuaXRPZlBlcmlvZC5IT1VSU106ICgpID0+IHBlcmlvZC50b0hvdXJzKCksXG4gICAgICBbVW5pdE9mUGVyaW9kLkRBWVNdOiAoKSA9PiBwZXJpb2QudG9EYXlzKCksXG4gICAgfTtcbiAgICByZXR1cm4gW1xuICAgICAgbWFwUGVyaW9kVG9EYXRhZG9nVGltZVt1bml0XSgpLFxuICAgICAgdW5pdC50b1N0cmluZygpLFxuICAgIF07XG4gIH1cbn0iXX0=
@@ -0,0 +1,32 @@
1
+ import { Construct } from 'constructs';
2
+ import { MetricAlarmProps } from './metric-alarm';
3
+ /**
4
+ * Interface for DataDogMonitor implementation.
5
+ */
6
+ export interface DataDogMetricAlarmProps extends MetricAlarmProps {
7
+ /**
8
+ * Service token which points to the DataDog Monitor custom resource lambda or sns topic.
9
+ */
10
+ readonly serviceToken: string;
11
+ /**
12
+ * The service name used to name the montors (in datadog-integration).
13
+ */
14
+ readonly serviceName: string;
15
+ /**
16
+ * The name of DataDog's OpsGenie integration. Used to automatically create OpsGenie alarms for the created DataDog Monitor.
17
+ */
18
+ readonly dataDogOpsGenieIntegrationName: string;
19
+ }
20
+ /**
21
+ * A wrapper for a custom resource that creates a DataDog Monitor.
22
+ *
23
+ * To use this construct, the DataDog integration needs to be installed.
24
+ */
25
+ export declare class DataDogMetricAlarm extends Construct {
26
+ private serviceToken;
27
+ constructor(scope: Construct, id: string, props: DataDogMetricAlarmProps);
28
+ /**
29
+ * Helper function to convert a generic alarm into a DataDog query string.
30
+ */
31
+ alarmToDataDogQuery(alarm: MetricAlarmProps): string;
32
+ }