@rio-cloud/cdk-v2-constructs 4.13.1 → 4.14.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 (67) hide show
  1. package/.jsii +7478 -3329
  2. package/CHANGELOG.md +21 -0
  3. package/lib/datadog/datadog-log-index-monitoring.d.ts +2 -2
  4. package/lib/datadog/datadog-log-index-monitoring.js +1 -1
  5. package/lib/datadogv2/datadog-dashboard.d.ts +28 -0
  6. package/lib/datadogv2/datadog-dashboard.js +31 -0
  7. package/lib/datadogv2/datadog-log-index-monitoring.d.ts +61 -0
  8. package/lib/datadogv2/datadog-log-index-monitoring.js +115 -0
  9. package/lib/datadogv2/datadog-monitor.d.ts +234 -0
  10. package/lib/datadogv2/datadog-monitor.js +134 -0
  11. package/lib/datadogv2/datadog-notification.d.ts +100 -0
  12. package/lib/datadogv2/datadog-notification.js +94 -0
  13. package/lib/datadogv2/index.d.ts +4 -0
  14. package/lib/datadogv2/index.js +17 -0
  15. package/lib/fargate/datadog.js +2 -2
  16. package/lib/fargate/index.d.ts +1 -0
  17. package/lib/fargate/index.js +14 -0
  18. package/lib/fargate/rio-fargate-service.d.ts +18 -18
  19. package/lib/fargate/rio-fargate-service.js +1 -1
  20. package/lib/index.d.ts +7 -13
  21. package/lib/index.js +8 -14
  22. package/lib/kafka/kafka-topic.d.ts +5 -5
  23. package/lib/kafka/kafka-topic.js +1 -1
  24. package/lib/kafka/rio-kafka-event-source.d.ts +1 -1
  25. package/lib/kafka/rio-kafka-event-source.js +1 -1
  26. package/lib/pipeline/rio-backup-secrets-restore-stage.d.ts +1 -1
  27. package/lib/pipeline/rio-backup-secrets-restore-stage.js +1 -1
  28. package/lib/pipeline/rio-bitbucket-source-action.d.ts +1 -1
  29. package/lib/pipeline/rio-bitbucket-source-action.js +1 -1
  30. package/lib/rio-landing-zone.d.ts +6 -0
  31. package/lib/rio-landing-zone.js +19 -1
  32. package/lib/watchful/alb.d.ts +2 -2
  33. package/lib/watchful/alb.js +1 -1
  34. package/lib/watchful/aspect.d.ts +6 -6
  35. package/lib/watchful/aspect.js +12 -7
  36. package/lib/watchful/cloudfront.d.ts +2 -2
  37. package/lib/watchful/cloudfront.js +1 -1
  38. package/lib/watchful/datadog-log-alarm.d.ts +1 -0
  39. package/lib/watchful/datadog-log-alarm.js +1 -1
  40. package/lib/watchful/docdb.d.ts +4 -4
  41. package/lib/watchful/docdb.js +1 -1
  42. package/lib/watchful/dynamodb.d.ts +5 -5
  43. package/lib/watchful/dynamodb.js +1 -1
  44. package/lib/watchful/ecs.d.ts +2 -2
  45. package/lib/watchful/ecs.js +1 -1
  46. package/lib/watchful/index.d.ts +13 -0
  47. package/lib/watchful/index.js +26 -0
  48. package/lib/watchful/lambda.d.ts +3 -3
  49. package/lib/watchful/lambda.js +2 -1
  50. package/lib/watchful/metric-alarm.d.ts +16 -16
  51. package/lib/watchful/metric-alarm.js +1 -1
  52. package/lib/watchful/rds.d.ts +2 -2
  53. package/lib/watchful/rds.js +1 -1
  54. package/lib/watchful/targetgroup.d.ts +2 -2
  55. package/lib/watchful/targetgroup.js +1 -1
  56. package/lib/watchful/watchful.d.ts +52 -48
  57. package/lib/watchful/watchful.js +104 -98
  58. package/lib/watchfulv2/datadog-log-alarm.d.ts +37 -0
  59. package/lib/watchfulv2/datadog-log-alarm.js +61 -0
  60. package/lib/watchfulv2/datadog-metric-alarm.d.ts +29 -0
  61. package/lib/watchfulv2/datadog-metric-alarm.js +132 -0
  62. package/lib/watchfulv2/index.d.ts +1 -0
  63. package/lib/watchfulv2/index.js +14 -0
  64. package/lib/watchfulv2/watchful.d.ts +53 -0
  65. package/lib/watchfulv2/watchful.js +76 -0
  66. package/package.json +18 -8
  67. package/version.json +1 -1
@@ -1,95 +1,20 @@
1
1
  "use strict";
2
- var _a;
2
+ var _a, _b;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Watchful = void 0;
4
+ exports.Watchful = exports.AbstractWatchful = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const cw_actions = require("aws-cdk-lib/aws-cloudwatch-actions");
8
8
  const ssm = require("aws-cdk-lib/aws-ssm");
9
9
  const constructs_1 = require("constructs");
10
- const __1 = require("..");
11
- /**
12
- * A construct to watch given scope or resources. Opinionated DataDog alarms are automatically created for watched resources.
13
- */
14
- class Watchful extends constructs_1.Construct {
15
- constructor(scope, id, props = {}) {
16
- super(scope, id);
17
- // const opsGenieAlarmTopicArn = Fn.importValue('opsgenie-cloudwatch-alarm-sns-topic-arn');
18
- // const opsGenieAlarmTopic = sns.Topic.fromTopicArn(this, 'OpsGenieTopic', opsGenieAlarmTopicArn);
19
- this.alarmTopic = props.alarmSns;
20
- this.dataDogMonitorServiceToken = props.dataDogMonitorServiceToken;
21
- this.dataDogMonitorServiceName = props.dataDogMonitorServiceName ?? aws_cdk_lib_1.Stack.of(this).stackName;
22
- if (props.dataDogMonitorServiceToken !== undefined) {
23
- const teamNameParam = ssm.StringParameter.fromStringParameterName(this, 'TeamNameParam', '/config/team/name');
24
- this.dataDogOpsGenieIntegrationName = props.dataDogOpsGenieIntegrationName ?? teamNameParam.stringValue;
25
- }
26
- }
27
- /**
28
- * Adds the alarmTopic as alarm action to the given alarm.
29
- * @param alarm The watchful to add those resources to
30
- */
31
- createAlarm(scope, id, alarm) {
32
- if (this.alarmTopic !== undefined) {
33
- const cwAlarm = alarm.metric.createAlarm(scope, id, {
34
- alarmDescription: alarm.alarmDescription,
35
- threshold: alarm.threshold,
36
- comparisonOperator: alarm.comparisonOperator,
37
- evaluationPeriods: alarm.evaluationPeriods,
38
- });
39
- if (this.alarmTopic) {
40
- cwAlarm.addAlarmAction(new cw_actions.SnsAction(this.alarmTopic));
41
- cwAlarm.addOkAction(new cw_actions.SnsAction(this.alarmTopic));
42
- }
43
- }
44
- if (this.dataDogMonitorServiceToken !== undefined) {
45
- new __1.DataDogMetricAlarm(scope, id, {
46
- serviceToken: this.dataDogMonitorServiceToken ?? '',
47
- serviceName: this.dataDogMonitorServiceName,
48
- dataDogOpsGenieIntegrationName: this.dataDogOpsGenieIntegrationName ?? '',
49
- alarmDescription: alarm.alarmDescription,
50
- comparisonOperator: alarm.comparisonOperator,
51
- evaluationPeriods: alarm.evaluationPeriods,
52
- metric: alarm.metric,
53
- threshold: alarm.threshold,
54
- treatMissingData: alarm.treatMissingData,
55
- });
56
- }
57
- }
58
- /**
59
- * Adds an alert for error logs
60
- * @param scope
61
- */
62
- createLogAlarm(scope, id, alarm) {
63
- if (this.dataDogMonitorServiceToken !== undefined) {
64
- new __1.DataDogLogAlarm(scope, id, {
65
- serviceToken: this.dataDogMonitorServiceToken ?? '',
66
- serviceName: this.dataDogMonitorServiceName,
67
- autoCloseOpsGenieAlerts: alarm.autoCloseOpsGenieAlerts,
68
- period: alarm.period,
69
- unitOfPeriod: alarm.unitOfPeriod,
70
- periodOperator: alarm.periodOperator,
71
- statistic: alarm.statistic,
72
- queryFilters: alarm.queryFilters,
73
- alarmDescription: alarm.alarmDescription,
74
- threshold: alarm.threshold,
75
- priority: alarm.priority,
76
- index: alarm.index,
77
- });
78
- }
79
- }
80
- /**
81
- * Watches the given scope and adds alarms for known resources.
82
- */
83
- watchScope(scope) {
84
- const aspect = new __1.WatchfulAspect(this);
85
- aws_cdk_lib_1.Aspects.of(scope).add(aspect);
86
- }
10
+ const _1 = require("./");
11
+ class AbstractWatchful extends constructs_1.Construct {
87
12
  /**
88
13
  * Adds alarms for the given lambda function.
89
- * @param fn A lambda function that should be watched [disable-awslint:ref-via-interface]
14
+ * @param fn - A lambda function that should be watched [disable-awslint:ref-via-interface]
90
15
  */
91
16
  watchLambdaFunction(fn, options = {}) {
92
- new __1.WatchLambdaFunction(this, fn.node.id, {
17
+ new _1.WatchLambdaFunction(this, fn.node.id, {
93
18
  watchful: this,
94
19
  fn,
95
20
  ...options,
@@ -97,10 +22,10 @@ class Watchful extends constructs_1.Construct {
97
22
  }
98
23
  /**
99
24
  * Adds alarms for the given Cloudfront Distribution.
100
- * @param cf A Cloudfront Distribution that should be watched [disable-awslint:ref-via-interface]
25
+ * @param cf - A Cloudfront Distribution that should be watched [disable-awslint:ref-via-interface]
101
26
  */
102
27
  watchCloudfrontDistribution(cf, options = {}) {
103
- new __1.WatchCloudfrontDistribution(this, cf.node.id, {
28
+ new _1.WatchCloudfrontDistribution(this, cf.node.id, {
104
29
  watchful: this,
105
30
  cf,
106
31
  ...options,
@@ -108,10 +33,10 @@ class Watchful extends constructs_1.Construct {
108
33
  }
109
34
  /**
110
35
  * Adds alarms for the given ECS service.
111
- * @param service An ECS service that should be watched [disable-awslint:ref-via-interface]
36
+ * @param service - An ECS service that should be watched [disable-awslint:ref-via-interface]
112
37
  */
113
38
  watchEcsService(service, options = {}) {
114
- new __1.WatchEcsService(this, service.node.id, {
39
+ new _1.WatchEcsService(this, service.node.id, {
115
40
  watchful: this,
116
41
  service,
117
42
  ...options,
@@ -119,10 +44,10 @@ class Watchful extends constructs_1.Construct {
119
44
  }
120
45
  /**
121
46
  * Adds alarms for the given application load balancer.
122
- * @param alb An application load balancer that should be watched [disable-awslint:ref-via-interface]
47
+ * @param alb - An application load balancer that should be watched [disable-awslint:ref-via-interface]
123
48
  */
124
49
  watchAlb(alb, options = {}) {
125
- new __1.WatchApplicationLoadBalancer(this, alb.node.id, {
50
+ new _1.WatchApplicationLoadBalancer(this, alb.node.id, {
126
51
  watchful: this,
127
52
  alb,
128
53
  ...options,
@@ -130,10 +55,10 @@ class Watchful extends constructs_1.Construct {
130
55
  }
131
56
  /**
132
57
  * Adds alarms for the given application target gorup.
133
- * @param atg An application target group that should be watched [disable-awslint:ref-via-interface]
58
+ * @param atg - An application target group that should be watched [disable-awslint:ref-via-interface]
134
59
  */
135
60
  watchApplicationTargetGroup(atg, options = {}) {
136
- new __1.WatchApplicationTargetGroup(this, atg.node.id, {
61
+ new _1.WatchApplicationTargetGroup(this, atg.node.id, {
137
62
  watchful: this,
138
63
  atg,
139
64
  ...options,
@@ -141,10 +66,10 @@ class Watchful extends constructs_1.Construct {
141
66
  }
142
67
  /**
143
68
  * Adds alarms for the given DocDb cluster.
144
- * @param docDb An DocDb cluster that should be watched [disable-awslint:ref-via-interface]
69
+ * @param docDb - An DocDb cluster that should be watched [disable-awslint:ref-via-interface]
145
70
  */
146
71
  watchDocDb(docDb, options = {}) {
147
- new __1.WatchDocDbCluster(this, docDb.node.id, {
72
+ new _1.WatchDocDbCluster(this, docDb.node.id, {
148
73
  watchful: this,
149
74
  docDb,
150
75
  ...options,
@@ -152,10 +77,10 @@ class Watchful extends constructs_1.Construct {
152
77
  }
153
78
  /**
154
79
  * Adds alarms for the given database cluster.
155
- * @param databaseCluster An database cluster that should be watched [disable-awslint:ref-via-interface]
80
+ * @param databaseCluster - An database cluster that should be watched [disable-awslint:ref-via-interface]
156
81
  */
157
82
  watchDatabaseCluster(databaseCluster, options = {}) {
158
- new __1.WatchDatabaseCluster(this, databaseCluster.node.id, {
83
+ new _1.WatchDatabaseCluster(this, databaseCluster.node.id, {
159
84
  watchful: this,
160
85
  databaseCluster,
161
86
  ...options,
@@ -163,17 +88,98 @@ class Watchful extends constructs_1.Construct {
163
88
  }
164
89
  /**
165
90
  * Adds alarms for the given DynamoDb table.
166
- * @param dynamoDbTable An database cluster that should be watched [disable-awslint:ref-via-interface]
91
+ * @param dynamoDbTable - An database cluster that should be watched [disable-awslint:ref-via-interface]
167
92
  */
168
93
  watchDynamoDbTable(dynamoDbTable, options = {}) {
169
- new __1.WatchDynamoDbTable(this, dynamoDbTable.node.id, {
94
+ new _1.WatchDynamoDbTable(this, dynamoDbTable.node.id, {
170
95
  watchful: this,
171
96
  dynamoDbTable: dynamoDbTable,
172
97
  ...options,
173
98
  });
174
99
  }
175
100
  }
176
- exports.Watchful = Watchful;
101
+ exports.AbstractWatchful = AbstractWatchful;
177
102
  _a = JSII_RTTI_SYMBOL_1;
178
- Watchful[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.Watchful", version: "0.0.0" };
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hmdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvd2F0Y2hmdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFFN0MsaUVBQWlFO0FBUWpFLDJDQUEyQztBQUMzQywyQ0FBbUQ7QUFDbkQsMEJBc0JZO0FBb0RaOztHQUVHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVM7SUFNckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUF1QixFQUFFO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsMkZBQTJGO1FBQzNGLG1HQUFtRztRQUNuRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztRQUVuRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDLHlCQUF5QixJQUFJLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU3RixJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxTQUFTLEVBQUU7WUFFbEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FDL0QsSUFBSSxFQUNKLGVBQWUsRUFDZixtQkFBbUIsQ0FDcEIsQ0FBQztZQUNGLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUMsOEJBQThCLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQztTQUN6RztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxXQUFXLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDdEUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUNsRCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2dCQUN4QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7Z0JBQzVDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDaEU7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLDBCQUEwQixLQUFLLFNBQVMsRUFBRTtZQUNqRCxJQUFJLHNCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQ2hDLFlBQVksRUFBRSxJQUFJLENBQUMsMEJBQTBCLElBQUksRUFBRTtnQkFDbkQsV0FBVyxFQUFFLElBQUksQ0FBQyx5QkFBeUI7Z0JBQzNDLDhCQUE4QixFQUFFLElBQUksQ0FBQyw4QkFBOEIsSUFBSSxFQUFFO2dCQUN6RSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2dCQUN4QyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO2dCQUM1QyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO2dCQUMxQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjthQUN6QyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFFdEUsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEtBQUssU0FBUyxFQUFFO1lBQ2pELElBQUksbUJBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUM3QixZQUFZLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixJQUFJLEVBQUU7Z0JBQ25ELFdBQVcsRUFBRSxJQUFJLENBQUMseUJBQXlCO2dCQUMzQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO2dCQUN0RCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO2dCQUNwQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtnQkFDeEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSzthQUNuQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxLQUFnQjtRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMscUJBQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxtQkFBbUIsQ0FBQyxFQUFtQixFQUFFLFVBQXNDLEVBQUU7UUFFdEYsSUFBSSx1QkFBbUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDeEMsUUFBUSxFQUFFLElBQUk7WUFDZCxFQUFFO1lBQ0YsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDJCQUEyQixDQUNoQyxFQUEyQixFQUMzQixVQUE4QyxFQUFFO1FBRWhELElBQUksK0JBQTJCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2hELFFBQVEsRUFBRSxJQUFJO1lBQ2QsRUFBRTtZQUNGLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsT0FBd0IsRUFBRSxVQUFrQyxFQUFFO1FBQ25GLElBQUksbUJBQWUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDekMsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPO1lBQ1AsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxHQUFrQyxFQUFFLFVBQStDLEVBQUU7UUFDbkcsSUFBSSxnQ0FBNEIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEQsUUFBUSxFQUFFLElBQUk7WUFDZCxHQUFHO1lBQ0gsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDJCQUEyQixDQUNoQyxHQUFpQyxFQUNqQyxVQUE4QyxFQUFFO1FBRWhELElBQUksK0JBQTJCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2pELFFBQVEsRUFBRSxJQUFJO1lBQ2QsR0FBRztZQUNILEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsS0FBNEIsRUFBRSxVQUFvQyxFQUFFO1FBQ3BGLElBQUkscUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3pDLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSztZQUNMLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxvQkFBb0IsQ0FBQyxlQUFvQyxFQUFFLFVBQXVDLEVBQUU7UUFDekcsSUFBSSx3QkFBb0IsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDdEQsUUFBUSxFQUFFLElBQUk7WUFDZCxlQUFlO1lBQ2YsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtCQUFrQixDQUFDLGFBQTZCLEVBQUUsVUFBcUMsRUFBRTtRQUM5RixJQUFJLHNCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsRCxRQUFRLEVBQUUsSUFBSTtZQUNkLGFBQWEsRUFBRSxhQUFhO1lBQzVCLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBak1ILDRCQWtNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzcGVjdHMsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjd19hY3Rpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgZG9jZGIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWRvY2RiJztcbmltcG9ydCAqIGFzIGR5bmFtb2RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgKiBhcyBlbGJ2MiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyByZHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJkcyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIFdhdGNoZnVsQXNwZWN0LFxuICBXYXRjaExhbWJkYUZ1bmN0aW9uLFxuICBXYXRjaExhbWJkYUZ1bmN0aW9uT3B0aW9ucyxcbiAgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uLFxuICBXYXRjaENsb3VkZnJvbnREaXN0cmlidXRpb25PcHRpb25zLFxuICBXYXRjaEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxuICBXYXRjaEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyT3B0aW9ucyxcbiAgV2F0Y2hFY3NTZXJ2aWNlLFxuICBXYXRjaEVjc1NlcnZpY2VPcHRpb25zLFxuICBXYXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAsXG4gIFdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cE9wdGlvbnMsXG4gIERhdGFEb2dNZXRyaWNBbGFybSxcbiAgRGF0YURvZ0xvZ0FsYXJtLFxuICBNZXRyaWNBbGFybVByb3BzLFxuICBXYXRjaERvY0RiQ2x1c3RlcixcbiAgV2F0Y2hEb2NEYkNsdXN0ZXJPcHRpb25zLFxuICBXYXRjaERhdGFiYXNlQ2x1c3RlcixcbiAgV2F0Y2hEYXRhYmFzZUNsdXN0ZXJPcHRpb25zLFxuICBXYXRjaER5bmFtb0RiVGFibGUsXG4gIFdhdGNoRHluYW1vRGJUYWJsZU9wdGlvbnMsXG4gIExvZ0FsYXJtUHJvcHMsXG59IGZyb20gJy4uJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIFdhdGNoZnVsIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXYXRjaGZ1bCBleHRlbmRzIElDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogQWRkcyBhbmQgYWxlcnQgZm9yIGVycm9yIGxvZ3NcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqL1xuICBjcmVhdGVMb2dBbGFybShzY29wZTogQ29uc3RydWN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBhbGFybTogTG9nQWxhcm1Qcm9wcyk6IHZvaWQ7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBhbGFybVRvcGljIGFzIGFsYXJtIGFjdGlvbiB0byB0aGUgZ2l2ZW4gYWxhcm0uXG4gICAqIEBwYXJhbSBhbGFybSBUaGUgd2F0Y2hmdWwgdG8gYWRkIHRob3NlIHJlc291cmNlcyB0b1xuICAgKlxuICAgKi9cbiAgY3JlYXRlQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYWxhcm06IE1ldHJpY0FsYXJtUHJvcHMpOiB2b2lkO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGRlZmluaW5nIFdhdGNoZnVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hmdWxQcm9wcyB7XG4gIC8qKlxuICAgKiBBbiBTTlMgdG9waWMgYXMgdGFyZ2V0IGZvciBhbGFybSBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdDogVGhlIFNOUyB0b3BpYyBwcm92aWRlZCBieSBPcHNHZW5pZSBJbnRlZ3JhdGlvbiBhY2NvdW50IG1vZHVsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtU25zPzogc25zLklUb3BpYztcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgdG9rZW4gZm9yIHRoZSBEYXRhRG9nIE1vbml0b3IgY3VzdG9tIHJlc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdDogRW1wdHkuXG4gICAqL1xuICByZWFkb25seSBkYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQ6IFRoZSBzdGFjayBhbm1lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9wc0dlbmllIGhhbmRsZSB1c2VkIGluIERhdGFEb2cgdG8gZm9yd2FyZCB0aGUgREQgbW9uaXRvciB0byBPcHNHZW5pZS5cbiAgICpcbiAgICogQGRlZmF1bHQ6IEVtcHR5IGlmIGRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuIGlzIG5vdCBzZXQuIE90aGVyd2lzZSwgdGVhbSBTU00gcGFyYW1ldGVyIGZyb20gTGFuZGluZ1pvbmUgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbnN0cnVjdCB0byB3YXRjaCBnaXZlbiBzY29wZSBvciByZXNvdXJjZXMuIE9waW5pb25hdGVkIERhdGFEb2cgYWxhcm1zIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHdhdGNoZWQgcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgV2F0Y2hmdWwgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJV2F0Y2hmdWwge1xuICBwcml2YXRlIHJlYWRvbmx5IGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhRG9nTW9uaXRvclNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdhdGNoZnVsUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBjb25zdCBvcHNHZW5pZUFsYXJtVG9waWNBcm4gPSBGbi5pbXBvcnRWYWx1ZSgnb3BzZ2VuaWUtY2xvdWR3YXRjaC1hbGFybS1zbnMtdG9waWMtYXJuJyk7XG4gICAgLy8gY29uc3Qgb3BzR2VuaWVBbGFybVRvcGljID0gc25zLlRvcGljLmZyb21Ub3BpY0Fybih0aGlzLCAnT3BzR2VuaWVUb3BpYycsIG9wc0dlbmllQWxhcm1Ub3BpY0Fybik7XG4gICAgdGhpcy5hbGFybVRvcGljID0gcHJvcHMuYWxhcm1TbnM7XG4gICAgdGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiA9IHByb3BzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuO1xuXG4gICAgdGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VOYW1lID0gcHJvcHMuZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZSA/PyBTdGFjay5vZih0aGlzKS5zdGFja05hbWU7XG5cbiAgICBpZiAocHJvcHMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICBjb25zdCB0ZWFtTmFtZVBhcmFtID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyTmFtZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ1RlYW1OYW1lUGFyYW0nLFxuICAgICAgICAnL2NvbmZpZy90ZWFtL25hbWUnLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lID0gcHJvcHMuZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lID8/IHRlYW1OYW1lUGFyYW0uc3RyaW5nVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGFsYXJtVG9waWMgYXMgYWxhcm0gYWN0aW9uIHRvIHRoZSBnaXZlbiBhbGFybS5cbiAgICogQHBhcmFtIGFsYXJtIFRoZSB3YXRjaGZ1bCB0byBhZGQgdGhvc2UgcmVzb3VyY2VzIHRvXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYWxhcm06IE1ldHJpY0FsYXJtUHJvcHMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbGFybVRvcGljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN3QWxhcm0gPSBhbGFybS5tZXRyaWMuY3JlYXRlQWxhcm0oc2NvcGUsIGlkLCB7XG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGFsYXJtLmFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgIHRocmVzaG9sZDogYWxhcm0udGhyZXNob2xkLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGFsYXJtLmNvbXBhcmlzb25PcGVyYXRvcixcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IGFsYXJtLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5hbGFybVRvcGljKSB7XG4gICAgICAgIGN3QWxhcm0uYWRkQWxhcm1BY3Rpb24obmV3IGN3X2FjdGlvbnMuU25zQWN0aW9uKHRoaXMuYWxhcm1Ub3BpYykpO1xuICAgICAgICBjd0FsYXJtLmFkZE9rQWN0aW9uKG5ldyBjd19hY3Rpb25zLlNuc0FjdGlvbih0aGlzLmFsYXJtVG9waWMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXcgRGF0YURvZ01ldHJpY0FsYXJtKHNjb3BlLCBpZCwge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gPz8gJycsXG4gICAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZU5hbWUsXG4gICAgICAgIGRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZTogdGhpcy5kYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWUgPz8gJycsXG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGFsYXJtLmFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogYWxhcm0uY29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogYWxhcm0uZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgIG1ldHJpYzogYWxhcm0ubWV0cmljLFxuICAgICAgICB0aHJlc2hvbGQ6IGFsYXJtLnRocmVzaG9sZCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogYWxhcm0udHJlYXRNaXNzaW5nRGF0YSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGFsZXJ0IGZvciBlcnJvciBsb2dzXG4gICAqIEBwYXJhbSBzY29wZVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUxvZ0FsYXJtKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGFsYXJtOiBMb2dBbGFybVByb3BzKTp2b2lkIHtcblxuICAgIGlmICh0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ldyBEYXRhRG9nTG9nQWxhcm0oc2NvcGUsIGlkLCB7XG4gICAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiA/PyAnJyxcbiAgICAgICAgc2VydmljZU5hbWU6IHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZSxcbiAgICAgICAgYXV0b0Nsb3NlT3BzR2VuaWVBbGVydHM6IGFsYXJtLmF1dG9DbG9zZU9wc0dlbmllQWxlcnRzLFxuICAgICAgICBwZXJpb2Q6IGFsYXJtLnBlcmlvZCxcbiAgICAgICAgdW5pdE9mUGVyaW9kOiBhbGFybS51bml0T2ZQZXJpb2QsIC8vIHRvRG86IG1vdmUgdGhhdCBzb21ld2hlcmUgZWxzZSBhbmQgc2V0IGRlZmF1bHRzIHRoZXJlP1xuICAgICAgICBwZXJpb2RPcGVyYXRvcjogYWxhcm0ucGVyaW9kT3BlcmF0b3IsXG4gICAgICAgIHN0YXRpc3RpYzogYWxhcm0uc3RhdGlzdGljLFxuICAgICAgICBxdWVyeUZpbHRlcnM6IGFsYXJtLnF1ZXJ5RmlsdGVycywgLy8gdG9EbzogbW92ZSB0aGF0IHNvbWV3aGVyZSBlbHNlIGFuZCBzZXQgZGVmYXVsdHMgdGhlcmU/XG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGFsYXJtLmFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgIHRocmVzaG9sZDogYWxhcm0udGhyZXNob2xkLFxuICAgICAgICBwcmlvcml0eTogYWxhcm0ucHJpb3JpdHksXG4gICAgICAgIGluZGV4OiBhbGFybS5pbmRleCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVzIHRoZSBnaXZlbiBzY29wZSBhbmQgYWRkcyBhbGFybXMgZm9yIGtub3duIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyB3YXRjaFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBhc3BlY3QgPSBuZXcgV2F0Y2hmdWxBc3BlY3QodGhpcyk7XG4gICAgQXNwZWN0cy5vZihzY29wZSkuYWRkKGFzcGVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBmbiBBIGxhbWJkYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hMYW1iZGFGdW5jdGlvbihmbjogbGFtYmRhLkZ1bmN0aW9uLCBvcHRpb25zOiBXYXRjaExhbWJkYUZ1bmN0aW9uT3B0aW9ucyA9IHt9KTogdm9pZCB7XG5cbiAgICBuZXcgV2F0Y2hMYW1iZGFGdW5jdGlvbih0aGlzLCBmbi5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGZuLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIENsb3VkZnJvbnQgRGlzdHJpYnV0aW9uLlxuICAgKiBAcGFyYW0gY2YgQSBDbG91ZGZyb250IERpc3RyaWJ1dGlvbiB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uKFxuICAgIGNmOiBjbG91ZGZyb250LkRpc3RyaWJ1dGlvbixcbiAgICBvcHRpb25zOiBXYXRjaENsb3VkZnJvbnREaXN0cmlidXRpb25PcHRpb25zID0ge30sXG4gICk6IHZvaWQge1xuICAgIG5ldyBXYXRjaENsb3VkZnJvbnREaXN0cmlidXRpb24odGhpcywgY2Yubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBjZixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBFQ1Mgc2VydmljZS5cbiAgICogQHBhcmFtIHNlcnZpY2UgQW4gRUNTIHNlcnZpY2UgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRWNzU2VydmljZShzZXJ2aWNlOiBlY3MuQmFzZVNlcnZpY2UsIG9wdGlvbnM6IFdhdGNoRWNzU2VydmljZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaEVjc1NlcnZpY2UodGhpcywgc2VydmljZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIHNlcnZpY2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlci5cbiAgICogQHBhcmFtIGFsYiBBbiBhcHBsaWNhdGlvbiBsb2FkIGJhbGFuY2VyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaEFsYihhbGI6IGVsYnYyLkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLCBvcHRpb25zOiBXYXRjaEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgbmV3IFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIodGhpcywgYWxiLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgYWxiLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHRhcmdldCBnb3J1cC5cbiAgICogQHBhcmFtIGF0ZyBBbiBhcHBsaWNhdGlvbiB0YXJnZXQgZ3JvdXAgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cChcbiAgICBhdGc6IGVsYnYyLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAsXG4gICAgb3B0aW9uczogV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwKHRoaXMsIGF0Zy5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGF0ZyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBEb2NEYiBjbHVzdGVyLlxuICAgKiBAcGFyYW0gZG9jRGIgQW4gIERvY0RiIGNsdXN0ZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRG9jRGIoZG9jRGI6IGRvY2RiLkRhdGFiYXNlQ2x1c3Rlciwgb3B0aW9uczogV2F0Y2hEb2NEYkNsdXN0ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hEb2NEYkNsdXN0ZXIodGhpcywgZG9jRGIubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBkb2NEYixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBkYXRhYmFzZSBjbHVzdGVyLlxuICAgKiBAcGFyYW0gZGF0YWJhc2VDbHVzdGVyIEFuIGRhdGFiYXNlIGNsdXN0ZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRGF0YWJhc2VDbHVzdGVyKGRhdGFiYXNlQ2x1c3RlcjogcmRzLkRhdGFiYXNlQ2x1c3Rlciwgb3B0aW9uczogV2F0Y2hEYXRhYmFzZUNsdXN0ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hEYXRhYmFzZUNsdXN0ZXIodGhpcywgZGF0YWJhc2VDbHVzdGVyLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgZGF0YWJhc2VDbHVzdGVyLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIER5bmFtb0RiIHRhYmxlLlxuICAgKiBAcGFyYW0gZHluYW1vRGJUYWJsZSBBbiBkYXRhYmFzZSBjbHVzdGVyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaER5bmFtb0RiVGFibGUoZHluYW1vRGJUYWJsZTogZHluYW1vZGIuVGFibGUsIG9wdGlvbnM6IFdhdGNoRHluYW1vRGJUYWJsZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaER5bmFtb0RiVGFibGUodGhpcywgZHluYW1vRGJUYWJsZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGR5bmFtb0RiVGFibGU6IGR5bmFtb0RiVGFibGUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
103
+ AbstractWatchful[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.AbstractWatchful", version: "0.0.0" };
104
+ /**
105
+ * A construct to watch given scope or resources. Opinionated DataDog alarms are automatically created for watched resources.
106
+ */
107
+ class Watchful extends AbstractWatchful {
108
+ constructor(scope, id, props = {}) {
109
+ super(scope, id);
110
+ // const opsGenieAlarmTopicArn = Fn.importValue('opsgenie-cloudwatch-alarm-sns-topic-arn');
111
+ // const opsGenieAlarmTopic = sns.Topic.fromTopicArn(this, 'OpsGenieTopic', opsGenieAlarmTopicArn);
112
+ this.alarmTopic = props.alarmSns;
113
+ this.dataDogMonitorServiceToken = props.dataDogMonitorServiceToken;
114
+ this.dataDogMonitorServiceName = props.dataDogMonitorServiceName ?? aws_cdk_lib_1.Stack.of(this).stackName;
115
+ if (props.dataDogMonitorServiceToken !== undefined) {
116
+ const teamNameParam = ssm.StringParameter.fromStringParameterName(this, 'TeamNameParam', '/config/team/name');
117
+ this.dataDogOpsGenieIntegrationName = props.dataDogOpsGenieIntegrationName ?? teamNameParam.stringValue;
118
+ }
119
+ }
120
+ /**
121
+ * Adds the alarmTopic as alarm action to the given alarm.
122
+ * @param alarm The watchful to add those resources to
123
+ */
124
+ createAlarm(scope, id, alarm) {
125
+ if (this.alarmTopic !== undefined) {
126
+ const cwAlarm = alarm.metric.createAlarm(scope, id, {
127
+ alarmDescription: alarm.alarmDescription,
128
+ threshold: alarm.threshold,
129
+ comparisonOperator: alarm.comparisonOperator,
130
+ evaluationPeriods: alarm.evaluationPeriods,
131
+ });
132
+ if (this.alarmTopic) {
133
+ cwAlarm.addAlarmAction(new cw_actions.SnsAction(this.alarmTopic));
134
+ cwAlarm.addOkAction(new cw_actions.SnsAction(this.alarmTopic));
135
+ }
136
+ }
137
+ if (this.dataDogMonitorServiceToken !== undefined) {
138
+ new _1.DataDogMetricAlarm(scope, id, {
139
+ serviceToken: this.dataDogMonitorServiceToken ?? '',
140
+ serviceName: this.dataDogMonitorServiceName,
141
+ dataDogOpsGenieIntegrationName: this.dataDogOpsGenieIntegrationName ?? '',
142
+ alarmDescription: alarm.alarmDescription,
143
+ comparisonOperator: alarm.comparisonOperator,
144
+ evaluationPeriods: alarm.evaluationPeriods,
145
+ metric: alarm.metric,
146
+ threshold: alarm.threshold,
147
+ treatMissingData: alarm.treatMissingData,
148
+ });
149
+ }
150
+ }
151
+ /**
152
+ * Adds an alert for error logs
153
+ * @param scope
154
+ */
155
+ createLogAlarm(scope, id, alarm) {
156
+ if (this.dataDogMonitorServiceToken !== undefined) {
157
+ new _1.DataDogLogAlarm(scope, id, {
158
+ serviceToken: this.dataDogMonitorServiceToken ?? '',
159
+ serviceName: alarm.lambdaCloudwatchGroupName ?? this.dataDogMonitorServiceName,
160
+ autoCloseOpsGenieAlerts: alarm.autoCloseOpsGenieAlerts,
161
+ period: alarm.period,
162
+ unitOfPeriod: alarm.unitOfPeriod,
163
+ periodOperator: alarm.periodOperator,
164
+ statistic: alarm.statistic,
165
+ queryFilters: alarm.queryFilters,
166
+ alarmDescription: alarm.alarmDescription,
167
+ threshold: alarm.threshold,
168
+ priority: alarm.priority,
169
+ index: alarm.index,
170
+ lambdaCloudwatchGroupName: alarm.lambdaCloudwatchGroupName,
171
+ });
172
+ }
173
+ }
174
+ /**
175
+ * Watches the given scope and adds alarms for known resources.
176
+ */
177
+ watchScope(scope) {
178
+ const aspect = new _1.WatchfulAspect(this);
179
+ aws_cdk_lib_1.Aspects.of(scope).add(aspect);
180
+ }
181
+ }
182
+ exports.Watchful = Watchful;
183
+ _b = JSII_RTTI_SYMBOL_1;
184
+ Watchful[_b] = { fqn: "@rio-cloud/cdk-v2-constructs.Watchful", version: "0.0.0" };
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hmdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvd2F0Y2hmdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFFN0MsaUVBQWlFO0FBUWpFLDJDQUEyQztBQUMzQywyQ0FBbUQ7QUFDbkQseUJBc0JZO0FBbUJaLE1BQXNCLGdCQUFpQixTQUFRLHNCQUFTO0lBSXREOzs7T0FHRztJQUNJLG1CQUFtQixDQUFDLEVBQW1CLEVBQUUsVUFBc0MsRUFBRTtRQUV0RixJQUFJLHNCQUFtQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLEVBQUU7WUFDRixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksMkJBQTJCLENBQ2hDLEVBQTJCLEVBQzNCLFVBQThDLEVBQUU7UUFFaEQsSUFBSSw4QkFBMkIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDaEQsUUFBUSxFQUFFLElBQUk7WUFDZCxFQUFFO1lBQ0YsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxPQUF3QixFQUFFLFVBQWtDLEVBQUU7UUFDbkYsSUFBSSxrQkFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU87WUFDUCxHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLEdBQWtDLEVBQUUsVUFBK0MsRUFBRTtRQUNuRyxJQUFJLCtCQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsRCxRQUFRLEVBQUUs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Q2hDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQ2hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2dCQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLHlCQUF5QixFQUFFLEtBQUssQ0FBQyx5QkFBeUI7YUFDM0QsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsS0FBZ0I7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLHFCQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDOztBQTNGSCw0QkE2RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3BlY3RzLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgY3dfYWN0aW9ucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaC1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGRvY2RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1kb2NkYic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0ICogYXMgZWxidjIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgcmRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yZHMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBXYXRjaGZ1bEFzcGVjdCxcbiAgV2F0Y2hMYW1iZGFGdW5jdGlvbixcbiAgV2F0Y2hMYW1iZGFGdW5jdGlvbk9wdGlvbnMsXG4gIFdhdGNoQ2xvdWRmcm9udERpc3RyaWJ1dGlvbixcbiAgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uT3B0aW9ucyxcbiAgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck9wdGlvbnMsXG4gIFdhdGNoRWNzU2VydmljZSxcbiAgV2F0Y2hFY3NTZXJ2aWNlT3B0aW9ucyxcbiAgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICBXYXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBPcHRpb25zLFxuICBEYXRhRG9nTWV0cmljQWxhcm0sXG4gIERhdGFEb2dMb2dBbGFybSxcbiAgTWV0cmljQWxhcm1Qcm9wcyxcbiAgV2F0Y2hEb2NEYkNsdXN0ZXIsXG4gIFdhdGNoRG9jRGJDbHVzdGVyT3B0aW9ucyxcbiAgV2F0Y2hEYXRhYmFzZUNsdXN0ZXIsXG4gIFdhdGNoRGF0YWJhc2VDbHVzdGVyT3B0aW9ucyxcbiAgV2F0Y2hEeW5hbW9EYlRhYmxlLFxuICBXYXRjaER5bmFtb0RiVGFibGVPcHRpb25zLFxuICBMb2dBbGFybVByb3BzLFxufSBmcm9tICcuLyc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBXYXRjaGZ1bCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2F0Y2hmdWwgZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEFkZHMgYW5kIGFsZXJ0IGZvciBlcnJvciBsb2dzXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqL1xuICBjcmVhdGVMb2dBbGFybShzY29wZTogQ29uc3RydWN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBhbGFybTogTG9nQWxhcm1Qcm9wcyk6IHZvaWQ7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBhbGFybVRvcGljIGFzIGFsYXJtIGFjdGlvbiB0byB0aGUgZ2l2ZW4gYWxhcm0uXG4gICAqIEBwYXJhbSBhbGFybSAtIFRoZSB3YXRjaGZ1bCB0byBhZGQgdGhvc2UgcmVzb3VyY2VzIHRvXG4gICAqXG4gICAqL1xuICBjcmVhdGVBbGFybShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhbGFybTogTWV0cmljQWxhcm1Qcm9wcyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdhdGNoZnVsIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVdhdGNoZnVsIHtcbiAgYWJzdHJhY3QgY3JlYXRlTG9nQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgc2VydmljZU5hbWU6IHN0cmluZywgYWxhcm06IExvZ0FsYXJtUHJvcHMpOiB2b2lkXG4gIGFic3RyYWN0IGNyZWF0ZUFsYXJtKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGFsYXJtOiBNZXRyaWNBbGFybVByb3BzKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBmbiAtIEEgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaExhbWJkYUZ1bmN0aW9uKGZuOiBsYW1iZGEuRnVuY3Rpb24sIG9wdGlvbnM6IFdhdGNoTGFtYmRhRnVuY3Rpb25PcHRpb25zID0ge30pOiB2b2lkIHtcblxuICAgIG5ldyBXYXRjaExhbWJkYUZ1bmN0aW9uKHRoaXMsIGZuLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgZm4sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gQ2xvdWRmcm9udCBEaXN0cmlidXRpb24uXG4gICAqIEBwYXJhbSBjZiAtIEEgQ2xvdWRmcm9udCBEaXN0cmlidXRpb24gdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoQ2xvdWRmcm9udERpc3RyaWJ1dGlvbihcbiAgICBjZjogY2xvdWRmcm9udC5EaXN0cmlidXRpb24sXG4gICAgb3B0aW9uczogV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uKHRoaXMsIGNmLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgY2YsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gRUNTIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBzZXJ2aWNlIC0gQW4gRUNTIHNlcnZpY2UgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRWNzU2VydmljZShzZXJ2aWNlOiBlY3MuQmFzZVNlcnZpY2UsIG9wdGlvbnM6IFdhdGNoRWNzU2VydmljZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaEVjc1NlcnZpY2UodGhpcywgc2VydmljZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIHNlcnZpY2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlci5cbiAgICogQHBhcmFtIGFsYiAtIEFuIGFwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoQWxiKGFsYjogZWxidjIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsIG9wdGlvbnM6IFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcih0aGlzLCBhbGIubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBhbGIsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gdGFyZ2V0IGdvcnVwLlxuICAgKiBAcGFyYW0gYXRnIC0gQW4gYXBwbGljYXRpb24gdGFyZ2V0IGdyb3VwIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAoXG4gICAgYXRnOiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICAgIG9wdGlvbnM6IFdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cE9wdGlvbnMgPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgbmV3IFdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cCh0aGlzLCBhdGcubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBhdGcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gRG9jRGIgY2x1c3Rlci5cbiAgICogQHBhcmFtIGRvY0RiIC0gQW4gRG9jRGIgY2x1c3RlciB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hEb2NEYihkb2NEYjogZG9jZGIuRGF0YWJhc2VDbHVzdGVyLCBvcHRpb25zOiBXYXRjaERvY0RiQ2x1c3Rlck9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaERvY0RiQ2x1c3Rlcih0aGlzLCBkb2NEYi5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGRvY0RiLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIGRhdGFiYXNlIGNsdXN0ZXIuXG4gICAqIEBwYXJhbSBkYXRhYmFzZUNsdXN0ZXIgLSBBbiBkYXRhYmFzZSBjbHVzdGVyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaERhdGFiYXNlQ2x1c3RlcihkYXRhYmFzZUNsdXN0ZXI6IHJkcy5EYXRhYmFzZUNsdXN0ZXIsIG9wdGlvbnM6IFdhdGNoRGF0YWJhc2VDbHVzdGVyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgbmV3IFdhdGNoRGF0YWJhc2VDbHVzdGVyKHRoaXMsIGRhdGFiYXNlQ2x1c3Rlci5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBEeW5hbW9EYiB0YWJsZS5cbiAgICogQHBhcmFtIGR5bmFtb0RiVGFibGUgLSBBbiBkYXRhYmFzZSBjbHVzdGVyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaER5bmFtb0RiVGFibGUoZHluYW1vRGJUYWJsZTogZHluYW1vZGIuVGFibGUsIG9wdGlvbnM6IFdhdGNoRHluYW1vRGJUYWJsZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaER5bmFtb0RiVGFibGUodGhpcywgZHluYW1vRGJUYWJsZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGR5bmFtb0RiVGFibGU6IGR5bmFtb0RiVGFibGUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZGVmaW5pbmcgV2F0Y2hmdWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGZ1bFByb3BzIHtcbiAgLyoqXG4gICAqIEFuIFNOUyB0b3BpYyBhcyB0YXJnZXQgZm9yIGFsYXJtIGFjdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgIFRoZSBTTlMgdG9waWMgcHJvdmlkZWQgYnkgT3BzR2VuaWUgSW50ZWdyYXRpb24gYWNjb3VudCBtb2R1bGUuXG4gICAqL1xuICByZWFkb25seSBhbGFybVNucz86IHNucy5JVG9waWM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHRva2VuIGZvciB0aGUgRGF0YURvZyBNb25pdG9yIGN1c3RvbSByZXNvdXJjZS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBFbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIFRoZSBzdGFjayBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9wc0dlbmllIGhhbmRsZSB1c2VkIGluIERhdGFEb2cgdG8gZm9yd2FyZCB0aGUgREQgbW9uaXRvciB0byBPcHNHZW5pZS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBFbXB0eSBpZiBkYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiBpcyBub3Qgc2V0LiBPdGhlcndpc2UsIHRlYW0gU1NNIHBhcmFtZXRlciBmcm9tIExhbmRpbmdab25lIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBkYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdG8gd2F0Y2ggZ2l2ZW4gc2NvcGUgb3IgcmVzb3VyY2VzLiBPcGluaW9uYXRlZCBEYXRhRG9nIGFsYXJtcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB3YXRjaGVkIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGNoZnVsIGV4dGVuZHMgQWJzdHJhY3RXYXRjaGZ1bCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxhcm1Ub3BpYz86IHNucy5JVG9waWM7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFEb2dNb25pdG9yU2VydmljZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2F0Y2hmdWxQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIGNvbnN0IG9wc0dlbmllQWxhcm1Ub3BpY0FybiA9IEZuLmltcG9ydFZhbHVlKCdvcHNnZW5pZS1jbG91ZHdhdGNoLWFsYXJtLXNucy10b3BpYy1hcm4nKTtcbiAgICAvLyBjb25zdCBvcHNHZW5pZUFsYXJtVG9waWMgPSBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdPcHNHZW5pZVRvcGljJywgb3BzR2VuaWVBbGFybVRvcGljQXJuKTtcbiAgICB0aGlzLmFsYXJtVG9waWMgPSBwcm9wcy5hbGFybVNucztcbiAgICB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuID0gcHJvcHMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW47XG5cbiAgICB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZU5hbWUgPSBwcm9wcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VOYW1lID8/IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIGlmIChwcm9wcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgIGNvbnN0IHRlYW1OYW1lUGFyYW0gPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICAnVGVhbU5hbWVQYXJhbScsXG4gICAgICAgICcvY29uZmlnL3RlYW0vbmFtZScsXG4gICAgICApO1xuICAgICAgdGhpcy5kYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWUgPSBwcm9wcy5kYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWUgPz8gdGVhbU5hbWVQYXJhbS5zdHJpbmdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgYWxhcm1Ub3BpYyBhcyBhbGFybSBhY3Rpb24gdG8gdGhlIGdpdmVuIGFsYXJtLlxuICAgKiBAcGFyYW0gYWxhcm0gVGhlIHdhdGNoZnVsIHRvIGFkZCB0aG9zZSByZXNvdXJjZXMgdG9cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBbGFybShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhbGFybTogTWV0cmljQWxhcm1Qcm9wcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFsYXJtVG9waWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3dBbGFybSA9IGFsYXJtLm1ldHJpYy5jcmVhdGVBbGFybShzY29wZSwgaWQsIHtcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYWxhcm0uYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiBhbGFybS50aHJlc2hvbGQsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogYWxhcm0uY29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogYWxhcm0uZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmFsYXJtVG9waWMpIHtcbiAgICAgICAgY3dBbGFybS5hZGRBbGFybUFjdGlvbihuZXcgY3dfYWN0aW9ucy5TbnNBY3Rpb24odGhpcy5hbGFybVRvcGljKSk7XG4gICAgICAgIGN3QWxhcm0uYWRkT2tBY3Rpb24obmV3IGN3X2FjdGlvbnMuU25zQWN0aW9uKHRoaXMuYWxhcm1Ub3BpYykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ldyBEYXRhRG9nTWV0cmljQWxhcm0oc2NvcGUsIGlkLCB7XG4gICAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiA/PyAnJyxcbiAgICAgICAgc2VydmljZU5hbWU6IHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZSxcbiAgICAgICAgZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lOiB0aGlzLmRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZSA/PyAnJyxcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYWxhcm0uYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBhbGFybS5jb21wYXJpc29uT3BlcmF0b3IsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBhbGFybS5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgbWV0cmljOiBhbGFybS5tZXRyaWMsXG4gICAgICAgIHRocmVzaG9sZDogYWxhcm0udGhyZXNob2xkLFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBhbGFybS50cmVhdE1pc3NpbmdEYXRhLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWxlcnQgZm9yIGVycm9yIGxvZ3NcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTG9nQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYWxhcm06IExvZ0FsYXJtUHJvcHMpOnZvaWQge1xuXG4gICAgaWYgKHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3IERhdGFEb2dMb2dBbGFybShzY29wZSwgaWQsIHtcbiAgICAgICAgc2VydmljZVRva2VuOiB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuID8/ICcnLFxuICAgICAgICBzZXJ2aWNlTmFtZTogYWxhcm0ubGFtYmRhQ2xvdWR3YXRjaEdyb3VwTmFtZSA/PyB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZU5hbWUsXG4gICAgICAgIGF1dG9DbG9zZU9wc0dlbmllQWxlcnRzOiBhbGFybS5hdXRvQ2xvc2VPcHNHZW5pZUFsZXJ0cyxcbiAgICAgICAgcGVyaW9kOiBhbGFybS5wZXJpb2QsXG4gICAgICAgIHVuaXRPZlBlcmlvZDogYWxhcm0udW5pdE9mUGVyaW9kLCAvLyB0b0RvOiBtb3ZlIHRoYXQgc29tZXdoZXJlIGVsc2UgYW5kIHNldCBkZWZhdWx0cyB0aGVyZT9cbiAgICAgICAgcGVyaW9kT3BlcmF0b3I6IGFsYXJtLnBlcmlvZE9wZXJhdG9yLFxuICAgICAgICBzdGF0aXN0aWM6IGFsYXJtLnN0YXRpc3RpYyxcbiAgICAgICAgcXVlcnlGaWx0ZXJzOiBhbGFybS5xdWVyeUZpbHRlcnMsIC8vIHRvRG86IG1vdmUgdGhhdCBzb21ld2hlcmUgZWxzZSBhbmQgc2V0IGRlZmF1bHRzIHRoZXJlP1xuICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBhbGFybS5hbGFybURlc2NyaXB0aW9uLFxuICAgICAgICB0aHJlc2hvbGQ6IGFsYXJtLnRocmVzaG9sZCxcbiAgICAgICAgcHJpb3JpdHk6IGFsYXJtLnByaW9yaXR5LFxuICAgICAgICBpbmRleDogYWxhcm0uaW5kZXgsXG4gICAgICAgIGxhbWJkYUNsb3Vkd2F0Y2hHcm91cE5hbWU6IGFsYXJtLmxhbWJkYUNsb3Vkd2F0Y2hHcm91cE5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcyB0aGUgZ2l2ZW4gc2NvcGUgYW5kIGFkZHMgYWxhcm1zIGZvciBrbm93biByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3QgYXNwZWN0ID0gbmV3IFdhdGNoZnVsQXNwZWN0KHRoaXMpO1xuICAgIEFzcGVjdHMub2Yoc2NvcGUpLmFkZChhc3BlY3QpO1xuICB9XG5cbn1cbiJdfQ==
@@ -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 serviceName: string;
19
+ }
20
+ export interface LogAlarmProps {
21
+ readonly autoCloseOpsGenieAlerts: boolean;
22
+ readonly period: Duration;
23
+ readonly unitOfPeriod?: UnitOfPeriod;
24
+ readonly periodOperator: ComparisonOperator;
25
+ readonly statistic: 'count';
26
+ readonly queryFilters: 'error' | 'warn';
27
+ readonly alarmDescription: string;
28
+ readonly threshold: number;
29
+ readonly priority: number;
30
+ readonly index: string;
31
+ readonly lambdaCloudwatchGroupName?: 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,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataDogLogAlarm = exports.ComparisonOperator = exports.UnitOfPeriod = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const datadogv2_1 = require("../datadogv2");
7
+ var UnitOfPeriod;
8
+ (function (UnitOfPeriod) {
9
+ UnitOfPeriod["SECONDS"] = "s";
10
+ UnitOfPeriod["MINUTES"] = "m";
11
+ UnitOfPeriod["HOURS"] = "h";
12
+ UnitOfPeriod["DAYS"] = "d";
13
+ })(UnitOfPeriod = exports.UnitOfPeriod || (exports.UnitOfPeriod = {}));
14
+ const DEFAULT_UNIT_OF_PERIOD = UnitOfPeriod.SECONDS;
15
+ var ComparisonOperator;
16
+ (function (ComparisonOperator) {
17
+ ComparisonOperator["GREATER_THAN_OR_EQUAL_TO_THRESHOLD"] = ">=";
18
+ ComparisonOperator["GREATER_THAN_THRESHOLD"] = ">";
19
+ ComparisonOperator["LESS_THAN_OR_EQUAL_TO_THRESHOLD"] = "<=";
20
+ ComparisonOperator["LESS_THAN_THRESHOLD"] = "<";
21
+ })(ComparisonOperator = exports.ComparisonOperator || (exports.ComparisonOperator = {}));
22
+ class DataDogLogAlarm extends constructs_1.Construct {
23
+ constructor(scope, id, props) {
24
+ super(scope, id);
25
+ new datadogv2_1.DatadogMonitor(scope, 'ErrorMonitorLogAlert', {
26
+ serviceName: props.serviceName,
27
+ monitorType: datadogv2_1.DatadogMonitorQueryAlertType.LOG_ALERT,
28
+ name: `${this.node.scope?.node.id} ${id}`,
29
+ query: this.alarmToDataDogQuery(props),
30
+ message: `${props.alarmDescription}: {{log.link}}`,
31
+ });
32
+ }
33
+ alarmToDataDogQuery(alarm) {
34
+ const [periodValue, periodUnit] = this.convertToDatadogPeriod(alarm.period, alarm.unitOfPeriod);
35
+ let comparisonOperator = alarm.periodOperator;
36
+ const filters = new Map([
37
+ ['service', alarm.serviceName],
38
+ ['account_id', aws_cdk_lib_1.Stack.of(this).account],
39
+ ['status', alarm.queryFilters],
40
+ ]);
41
+ const concatenatedFilters = Array.from(filters.entries())
42
+ .map(([filterKey, filterValue]) => `${filterKey}:${filterValue}`)
43
+ .join(' ');
44
+ return `logs("${concatenatedFilters}").index("${alarm.index}").rollup("${alarm.statistic}").last("${periodValue}${periodUnit}") ${comparisonOperator} ${alarm.threshold}`;
45
+ }
46
+ convertToDatadogPeriod(period, unitOfPeriod) {
47
+ const unit = unitOfPeriod ?? DEFAULT_UNIT_OF_PERIOD;
48
+ const mapPeriodToDatadogTime = {
49
+ [UnitOfPeriod.SECONDS]: () => period.toSeconds(),
50
+ [UnitOfPeriod.MINUTES]: () => period.toMinutes(),
51
+ [UnitOfPeriod.HOURS]: () => period.toHours(),
52
+ [UnitOfPeriod.DAYS]: () => period.toDays(),
53
+ };
54
+ return [
55
+ mapPeriodToDatadogTime[unit](),
56
+ unit.toString(),
57
+ ];
58
+ }
59
+ }
60
+ exports.DataDogLogAlarm = DataDogLogAlarm;
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1sb2ctYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWx2Mi9kYXRhZG9nLWxvZy1hbGFybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEM7QUFDOUMsMkNBQXVDO0FBQ3ZDLDRDQUE0RTtBQUs1RSxJQUFZLFlBS1g7QUFMRCxXQUFZLFlBQVk7SUFDdEIsNkJBQWEsQ0FBQTtJQUNiLDZCQUFhLENBQUE7SUFDYiwyQkFBVyxDQUFBO0lBQ1gsMEJBQVUsQ0FBQTtBQUNaLENBQUMsRUFMVyxZQUFZLEdBQVosb0JBQVksS0FBWixvQkFBWSxRQUt2QjtBQUVELE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztBQUVwRCxJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDNUIsK0RBQXlDLENBQUE7SUFDekMsa0RBQTRCLENBQUE7SUFDNUIsNERBQXNDLENBQUE7SUFDdEMsK0NBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLGtCQUFrQixHQUFsQiwwQkFBa0IsS0FBbEIsMEJBQWtCLFFBSzdCO0FBb0JELE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQUM1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSwwQkFBYyxDQUFDLEtBQUssRUFDdEIsc0JBQXNCLEVBQ3RCO1lBQ0UsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFdBQVcsRUFBRSx3Q0FBNEIsQ0FBQyxTQUFTO1lBQ25ELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsZ0JBQWdCO1NBQ25ELENBQUMsQ0FBQztJQUVQLENBQUM7SUFDTyxtQkFBbUIsQ0FBQyxLQUFnQztRQUUxRCxNQUFNLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDdEIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUM5QixDQUFDLFlBQVksRUFBRSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDdEMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQztTQUMvQixDQUFDLENBQUM7UUFFSCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQzthQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixPQUFPLFNBQVMsbUJBQW1CLGFBQWEsS0FBSyxDQUFDLEtBQUssY0FBYyxLQUFLLENBQUMsU0FBUyxZQUFZLFdBQVcsR0FBRyxVQUFVLE1BQU0sa0JBQWtCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVLLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFnQixFQUFFLFlBQTJCO1FBQzFFLE1BQU0sSUFBSSxHQUFHLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztRQUNwRCxNQUFNLHNCQUFzQixHQUFHO1lBQzdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDaEQsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNoRCxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQzVDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7U0FDM0MsQ0FBQztRQUNGLE9BQU87WUFDTCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxFQUFFO1NBQ2hCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEvQ0QsMENBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBEYXRhZG9nTW9uaXRvciwgRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZSB9IGZyb20gJy4uL2RhdGFkb2d2Mic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YURvZ0xvZ1F1ZXJ5QWxhcm1Qcm9wcyBleHRlbmRzIERhdGFEb2dQcm9wcywgTG9nQWxhcm1Qcm9wcyB7XG59XG5cbmV4cG9ydCBlbnVtIFVuaXRPZlBlcmlvZCB7XG4gIFNFQ09ORFMgPSAncycsXG4gIE1JTlVURVMgPSAnbScsXG4gIEhPVVJTID0gJ2gnLFxuICBEQVlTID0gJ2QnLFxufVxuXG5jb25zdCBERUZBVUxUX1VOSVRfT0ZfUEVSSU9EID0gVW5pdE9mUGVyaW9kLlNFQ09ORFM7XG5cbmV4cG9ydCBlbnVtIENvbXBhcmlzb25PcGVyYXRvciB7XG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQgPSAnPj0nLFxuICBHUkVBVEVSX1RIQU5fVEhSRVNIT0xEID0gJz4nLFxuICBMRVNTX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xEID0gJzw9JyxcbiAgTEVTU19USEFOX1RIUkVTSE9MRCA9ICc8Jyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhRG9nUHJvcHMge1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nOyAvLyBuZWVkcyB0byBtYXRjaCB0aGUgc2VydmljZSBuYW1lIHVzZWQgaW4gZGF0YWRvZy1pbnRlZ3JhdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ0FsYXJtUHJvcHMge1xuICByZWFkb25seSBhdXRvQ2xvc2VPcHNHZW5pZUFsZXJ0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGVyaW9kOiBEdXJhdGlvbjtcbiAgcmVhZG9ubHkgdW5pdE9mUGVyaW9kPzogVW5pdE9mUGVyaW9kOyAvLyB1bml0IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFsZXJ0LiBpZiBub25lIGlzIHByb3ZpZGVkIHRoZSBwZXJpb2RzIHVuaXQgd2lsbCBkZWZhdWx0IHRvIHNlY29uZHNcbiAgcmVhZG9ubHkgcGVyaW9kT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcjtcbiAgcmVhZG9ubHkgc3RhdGlzdGljOiAnY291bnQnOyAvLyBhZ2dyZWdhdGlvbiBmdW5jdGlvblxuICByZWFkb25seSBxdWVyeUZpbHRlcnM6ICdlcnJvcid8J3dhcm4nOyAvLyBpdCBzaG91bGQgZWl0aGVyIHNheSBlcnJvciBvciB3YXJuXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgdGhyZXNob2xkOiBudW1iZXI7XG4gIHJlYWRvbmx5IHByaW9yaXR5OiBudW1iZXI7XG4gIHJlYWRvbmx5IGluZGV4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxhbWJkYUNsb3Vkd2F0Y2hHcm91cE5hbWU/OiBzdHJpbmc7IC8vIFNob3VsZCBvbmx5IGJlIHNldCBpbiBjYXNlIG9mIGxhbWJkYSBmdW5jdGlvbi4gVGhlIGNsb3Vkd2F0Y2ggbG9nIGdyb3VwIG5hbWUgaXMgc2FtZSB0aGUgbGFtYmRhIGZ1bmN0aW9uIG5hbWVcbn1cblxuZXhwb3J0IGNsYXNzIERhdGFEb2dMb2dBbGFybSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhRG9nTG9nUXVlcnlBbGFybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBEYXRhZG9nTW9uaXRvcihzY29wZSxcbiAgICAgICdFcnJvck1vbml0b3JMb2dBbGVydCcsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuTE9HX0FMRVJULFxuICAgICAgICBuYW1lOiBgJHt0aGlzLm5vZGUuc2NvcGU/Lm5vZGUuaWR9ICR7aWR9YCxcbiAgICAgICAgcXVlcnk6IHRoaXMuYWxhcm1Ub0RhdGFEb2dRdWVyeShwcm9wcyksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BzLmFsYXJtRGVzY3JpcHRpb259OiB7e2xvZy5saW5rfX1gLFxuICAgICAgfSk7XG5cbiAgfVxuICBwcml2YXRlIGFsYXJtVG9EYXRhRG9nUXVlcnkoYWxhcm06IERhdGFEb2dMb2dRdWVyeUFsYXJtUHJvcHMpOiBzdHJpbmcge1xuXG4gICAgY29uc3QgW3BlcmlvZFZhbHVlLCBwZXJpb2RVbml0XSA9IHRoaXMuY29udmVydFRvRGF0YWRvZ1BlcmlvZChhbGFybS5wZXJpb2QsIGFsYXJtLnVuaXRPZlBlcmlvZCk7XG5cbiAgICBsZXQgY29tcGFyaXNvbk9wZXJhdG9yID0gYWxhcm0ucGVyaW9kT3BlcmF0b3I7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gbmV3IE1hcChbXG4gICAgICBbJ3NlcnZpY2UnLCBhbGFybS5zZXJ2aWNlTmFtZV0sXG4gICAgICBbJ2FjY291bnRfaWQnLCBTdGFjay5vZih0aGlzKS5hY2NvdW50XSxcbiAgICAgIFsnc3RhdHVzJywgYWxhcm0ucXVlcnlGaWx0ZXJzXSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGNvbmNhdGVuYXRlZEZpbHRlcnMgPSBBcnJheS5mcm9tKGZpbHRlcnMuZW50cmllcygpKVxuICAgICAgLm1hcCgoW2ZpbHRlcktleSwgZmlsdGVyVmFsdWVdKSA9PiBgJHtmaWx0ZXJLZXl9OiR7ZmlsdGVyVmFsdWV9YClcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gYGxvZ3MoXCIke2NvbmNhdGVuYXRlZEZpbHRlcnN9XCIpLmluZGV4KFwiJHthbGFybS5pbmRleH1cIikucm9sbHVwKFwiJHthbGFybS5zdGF0aXN0aWN9XCIpLmxhc3QoXCIke3BlcmlvZFZhbHVlfSR7cGVyaW9kVW5pdH1cIikgJHtjb21wYXJpc29uT3BlcmF0b3J9ICR7YWxhcm0udGhyZXNob2xkfWA7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUb0RhdGFkb2dQZXJpb2QocGVyaW9kOiBEdXJhdGlvbiwgdW5pdE9mUGVyaW9kPzogVW5pdE9mUGVyaW9kKTogW251bWJlciwgc3RyaW5nXSB7XG4gICAgY29uc3QgdW5pdCA9IHVuaXRPZlBlcmlvZCA/PyBERUZBVUxUX1VOSVRfT0ZfUEVSSU9EO1xuICAgIGNvbnN0IG1hcFBlcmlvZFRvRGF0YWRvZ1RpbWUgPSB7XG4gICAgICBbVW5pdE9mUGVyaW9kLlNFQ09ORFNdOiAoKSA9PiBwZXJpb2QudG9TZWNvbmRzKCksXG4gICAgICBbVW5pdE9mUGVyaW9kLk1JTlVURVNdOiAoKSA9PiBwZXJpb2QudG9NaW51dGVzKCksXG4gICAgICBbVW5pdE9mUGVyaW9kLkhPVVJTXTogKCkgPT4gcGVyaW9kLnRvSG91cnMoKSxcbiAgICAgIFtVbml0T2ZQZXJpb2QuREFZU106ICgpID0+IHBlcmlvZC50b0RheXMoKSxcbiAgICB9O1xuICAgIHJldHVybiBbXG4gICAgICBtYXBQZXJpb2RUb0RhdGFkb2dUaW1lW3VuaXRdKCksXG4gICAgICB1bml0LnRvU3RyaW5nKCksXG4gICAgXTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,29 @@
1
+ import { Construct } from 'constructs';
2
+ import { INotification } from '../datadogv2';
3
+ import { MetricAlarmProps } from '../watchful/metric-alarm';
4
+ /**
5
+ * Interface for DataDogMonitor implementation.
6
+ */
7
+ export interface DataDogMetricAlarmProps extends MetricAlarmProps {
8
+ /**
9
+ * The service name used to name and tag the monitors.
10
+ */
11
+ readonly serviceName: string;
12
+ /**
13
+ * The name of DataDog's OpsGenie integration. Used to automatically create OpsGenie alarms for the created DataDog Monitor.
14
+ */
15
+ readonly notification?: INotification;
16
+ }
17
+ /**
18
+ * A wrapper for a custom resource that creates a DataDog Monitor.
19
+ *
20
+ * To use this construct, the DataDog integration needs to be installed.
21
+ */
22
+ export declare class DataDogMetricAlarm extends Construct {
23
+ constructor(scope: Construct, id: string, props: DataDogMetricAlarmProps);
24
+ private getMessage;
25
+ /**
26
+ * Helper function to convert a generic alarm into a DataDog query string.
27
+ */
28
+ alarmToDataDogQuery(alarm: MetricAlarmProps): string;
29
+ }