@cdklabs/multi-az-observability 0.0.0-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 (212) hide show
  1. package/.jsii +10177 -0
  2. package/API.md +5119 -0
  3. package/LICENSE +202 -0
  4. package/README.md +175 -0
  5. package/cdk.json +68 -0
  6. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +214 -0
  7. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +763 -0
  8. package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.d.ts +22 -0
  9. package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +21 -0
  10. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +34 -0
  11. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +39 -0
  12. package/lib/alarmsandrules/CanaryOperationRegionalAlarmsAndRules.d.ts +7 -0
  13. package/lib/alarmsandrules/CanaryOperationRegionalAlarmsAndRules.js +11 -0
  14. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.d.ts +16 -0
  15. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +17 -0
  16. package/lib/alarmsandrules/IBaseOperationRegionalAlarmsAndRules.d.ts +18 -0
  17. package/lib/alarmsandrules/IBaseOperationRegionalAlarmsAndRules.js +3 -0
  18. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +30 -0
  19. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +3 -0
  20. package/lib/alarmsandrules/ICanaryOperationRegionalAlarmsAndRules.d.ts +6 -0
  21. package/lib/alarmsandrules/ICanaryOperationRegionalAlarmsAndRules.js +3 -0
  22. package/lib/alarmsandrules/ICanaryOperationZonalAlarmsAndRules.d.ts +12 -0
  23. package/lib/alarmsandrules/ICanaryOperationZonalAlarmsAndRules.js +3 -0
  24. package/lib/alarmsandrules/IOperationAlarmsAndRules.d.ts +55 -0
  25. package/lib/alarmsandrules/IOperationAlarmsAndRules.js +3 -0
  26. package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.d.ts +15 -0
  27. package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.js +3 -0
  28. package/lib/alarmsandrules/IServerSideOperationZonalAlarmsAndRules.d.ts +36 -0
  29. package/lib/alarmsandrules/IServerSideOperationZonalAlarmsAndRules.js +3 -0
  30. package/lib/alarmsandrules/IServiceAlarmsAndRules.d.ts +44 -0
  31. package/lib/alarmsandrules/IServiceAlarmsAndRules.js +3 -0
  32. package/lib/alarmsandrules/InsightRuleBody.d.ts +67 -0
  33. package/lib/alarmsandrules/InsightRuleBody.js +46 -0
  34. package/lib/alarmsandrules/OperationAlarmsAndRules.d.ts +59 -0
  35. package/lib/alarmsandrules/OperationAlarmsAndRules.js +135 -0
  36. package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.d.ts +19 -0
  37. package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.js +22 -0
  38. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.d.ts +40 -0
  39. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +46 -0
  40. package/lib/alarmsandrules/ServiceAlarmsAndRules.d.ts +48 -0
  41. package/lib/alarmsandrules/ServiceAlarmsAndRules.js +166 -0
  42. package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.d.ts +24 -0
  43. package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.js +3 -0
  44. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +62 -0
  45. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +3 -0
  46. package/lib/alarmsandrules/props/CanaryOperationRegionalAlarmsAndRulesProps.d.ts +6 -0
  47. package/lib/alarmsandrules/props/CanaryOperationRegionalAlarmsAndRulesProps.js +3 -0
  48. package/lib/alarmsandrules/props/CanaryOperationZonalAlarmsAndRulesProps.d.ts +6 -0
  49. package/lib/alarmsandrules/props/CanaryOperationZonalAlarmsAndRulesProps.js +3 -0
  50. package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.d.ts +45 -0
  51. package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.js +3 -0
  52. package/lib/alarmsandrules/props/ServerSideOperationRegionalAlarmsAndRulesProps.d.ts +6 -0
  53. package/lib/alarmsandrules/props/ServerSideOperationRegionalAlarmsAndRulesProps.js +3 -0
  54. package/lib/alarmsandrules/props/ServerSideOperationZonalAlarmsAndRulesProps.d.ts +6 -0
  55. package/lib/alarmsandrules/props/ServerSideOperationZonalAlarmsAndRulesProps.js +3 -0
  56. package/lib/alarmsandrules/props/ServiceAlarmsAndRulesProps.d.ts +13 -0
  57. package/lib/alarmsandrules/props/ServiceAlarmsAndRulesProps.js +3 -0
  58. package/lib/azmapper/AvailabilityZoneMapper.d.ts +86 -0
  59. package/lib/azmapper/AvailabilityZoneMapper.js +200 -0
  60. package/lib/azmapper/IAvailabilityZoneMapper.d.ts +86 -0
  61. package/lib/azmapper/IAvailabilityZoneMapper.js +3 -0
  62. package/lib/azmapper/props/AvailabilityZoneMapperProps.d.ts +13 -0
  63. package/lib/azmapper/props/AvailabilityZoneMapperProps.js +3 -0
  64. package/lib/azmapper/src/index.py +107 -0
  65. package/lib/canaries/CanaryFunction.d.ts +16 -0
  66. package/lib/canaries/CanaryFunction.js +152 -0
  67. package/lib/canaries/CanaryTest.d.ts +10 -0
  68. package/lib/canaries/CanaryTest.js +84 -0
  69. package/lib/canaries/ICanaryFunction.d.ts +6 -0
  70. package/lib/canaries/ICanaryFunction.js +3 -0
  71. package/lib/canaries/props/AddCanaryTestProps.d.ts +66 -0
  72. package/lib/canaries/props/AddCanaryTestProps.js +3 -0
  73. package/lib/canaries/props/CanaryFunctionProps.d.ts +29 -0
  74. package/lib/canaries/props/CanaryFunctionProps.js +3 -0
  75. package/lib/canaries/props/CanaryTestProps.d.ts +21 -0
  76. package/lib/canaries/props/CanaryTestProps.js +3 -0
  77. package/lib/canaries/props/NetworkConfigurationProps.d.ts +16 -0
  78. package/lib/canaries/props/NetworkConfigurationProps.js +3 -0
  79. package/lib/canaries/src/canary.zip +0 -0
  80. package/lib/dashboards/BasicServiceDashboard.d.ts +10 -0
  81. package/lib/dashboards/BasicServiceDashboard.js +130 -0
  82. package/lib/dashboards/ContributorInsightsWidget.d.ts +22 -0
  83. package/lib/dashboards/ContributorInsightsWidget.js +55 -0
  84. package/lib/dashboards/IOperationAvailabilityAndLatencyDashboard.d.ts +10 -0
  85. package/lib/dashboards/IOperationAvailabilityAndLatencyDashboard.js +3 -0
  86. package/lib/dashboards/IServiceAvailabilityAndLatencyDashboard.d.ts +10 -0
  87. package/lib/dashboards/IServiceAvailabilityAndLatencyDashboard.js +3 -0
  88. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +20 -0
  89. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +588 -0
  90. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +24 -0
  91. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +475 -0
  92. package/lib/dashboards/props/BasicServiceDashboardProps.d.ts +23 -0
  93. package/lib/dashboards/props/BasicServiceDashboardProps.js +3 -0
  94. package/lib/dashboards/props/ContributorInsightWidgetProps.d.ts +31 -0
  95. package/lib/dashboards/props/ContributorInsightWidgetProps.js +3 -0
  96. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +84 -0
  97. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +3 -0
  98. package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +37 -0
  99. package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +3 -0
  100. package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +37 -0
  101. package/lib/dashboards/props/OperationLatencyWidgetProps.js +3 -0
  102. package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.d.ts +30 -0
  103. package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.js +3 -0
  104. package/lib/index.d.ts +35 -0
  105. package/lib/index.js +30 -0
  106. package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +36 -0
  107. package/lib/metrics/ApplicationLoadBalancerMetrics.js +150 -0
  108. package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +61 -0
  109. package/lib/metrics/AvailabilityAndLatencyMetrics.js +212 -0
  110. package/lib/metrics/NetworkLoadBalancerMetrics.d.ts +19 -0
  111. package/lib/metrics/NetworkLoadBalancerMetrics.js +48 -0
  112. package/lib/metrics/RegionalAvailabilityMetrics.d.ts +19 -0
  113. package/lib/metrics/RegionalAvailabilityMetrics.js +71 -0
  114. package/lib/metrics/RegionalLatencyMetrics.d.ts +33 -0
  115. package/lib/metrics/RegionalLatencyMetrics.js +69 -0
  116. package/lib/metrics/ZonalAvailabilityMetrics.d.ts +19 -0
  117. package/lib/metrics/ZonalAvailabilityMetrics.js +71 -0
  118. package/lib/metrics/ZonalLatencyMetrics.d.ts +29 -0
  119. package/lib/metrics/ZonalLatencyMetrics.js +65 -0
  120. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +23 -0
  121. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +3 -0
  122. package/lib/metrics/props/AvailabilityMetricProps.d.ts +11 -0
  123. package/lib/metrics/props/AvailabilityMetricProps.js +3 -0
  124. package/lib/metrics/props/LatencyMetricProps.d.ts +15 -0
  125. package/lib/metrics/props/LatencyMetricProps.js +3 -0
  126. package/lib/metrics/props/RegionalAvailabilityMetricProps.d.ts +6 -0
  127. package/lib/metrics/props/RegionalAvailabilityMetricProps.js +3 -0
  128. package/lib/metrics/props/RegionalLatencyMetricProps.d.ts +6 -0
  129. package/lib/metrics/props/RegionalLatencyMetricProps.js +3 -0
  130. package/lib/metrics/props/ServiceAvailabilityMetricProps.d.ts +23 -0
  131. package/lib/metrics/props/ServiceAvailabilityMetricProps.js +3 -0
  132. package/lib/metrics/props/ServiceLatencyMericProps.d.ts +23 -0
  133. package/lib/metrics/props/ServiceLatencyMericProps.js +3 -0
  134. package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +10 -0
  135. package/lib/metrics/props/ZonalAvailabilityMetricProps.js +3 -0
  136. package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +10 -0
  137. package/lib/metrics/props/ZonalLatencyMetricProps.js +3 -0
  138. package/lib/monitoring/src/monitoring-layer.zip +0 -0
  139. package/lib/outlier-detection/IOutlierDetectionFunction.d.ts +12 -0
  140. package/lib/outlier-detection/IOutlierDetectionFunction.js +3 -0
  141. package/lib/outlier-detection/OutlierDetectionFunction.d.ts +16 -0
  142. package/lib/outlier-detection/OutlierDetectionFunction.js +126 -0
  143. package/lib/outlier-detection/props/OutlierDetectionFunctionProps.d.ts +12 -0
  144. package/lib/outlier-detection/props/OutlierDetectionFunctionProps.js +3 -0
  145. package/lib/outlier-detection/src/outlier-detection.zip +0 -0
  146. package/lib/outlier-detection/src/scipy-layer.zip +0 -0
  147. package/lib/services/BasicServiceMultiAZObservability.d.ts +64 -0
  148. package/lib/services/BasicServiceMultiAZObservability.js +504 -0
  149. package/lib/services/CanaryMetrics.d.ts +17 -0
  150. package/lib/services/CanaryMetrics.js +19 -0
  151. package/lib/services/CanaryTestMetricsOverride.d.ts +39 -0
  152. package/lib/services/CanaryTestMetricsOverride.js +23 -0
  153. package/lib/services/ContributorInsightRuleDetails.d.ts +42 -0
  154. package/lib/services/ContributorInsightRuleDetails.js +23 -0
  155. package/lib/services/IBasicServiceMultiAZObservability.d.ts +45 -0
  156. package/lib/services/IBasicServiceMultiAZObservability.js +3 -0
  157. package/lib/services/ICanaryMetrics.d.ts +14 -0
  158. package/lib/services/ICanaryMetrics.js +3 -0
  159. package/lib/services/ICanaryTestMetricsOverride.d.ts +36 -0
  160. package/lib/services/ICanaryTestMetricsOverride.js +3 -0
  161. package/lib/services/IContributorInsightRuleDetails.d.ts +38 -0
  162. package/lib/services/IContributorInsightRuleDetails.js +3 -0
  163. package/lib/services/IInstrumentedServiceMultiAZObservability.d.ts +39 -0
  164. package/lib/services/IInstrumentedServiceMultiAZObservability.js +3 -0
  165. package/lib/services/IOperation.d.ts +75 -0
  166. package/lib/services/IOperation.js +3 -0
  167. package/lib/services/IOperationMetricDetails.d.ts +78 -0
  168. package/lib/services/IOperationMetricDetails.js +3 -0
  169. package/lib/services/IService.d.ts +76 -0
  170. package/lib/services/IService.js +3 -0
  171. package/lib/services/IServiceMetricDetails.d.ts +68 -0
  172. package/lib/services/IServiceMetricDetails.js +3 -0
  173. package/lib/services/InstrumentedServiceMultiAZObservability.d.ts +55 -0
  174. package/lib/services/InstrumentedServiceMultiAZObservability.js +310 -0
  175. package/lib/services/Operation.d.ts +78 -0
  176. package/lib/services/Operation.js +34 -0
  177. package/lib/services/OperationMetricDetails.d.ts +82 -0
  178. package/lib/services/OperationMetricDetails.js +50 -0
  179. package/lib/services/Service.d.ts +80 -0
  180. package/lib/services/Service.js +36 -0
  181. package/lib/services/ServiceMetricDetails.d.ts +71 -0
  182. package/lib/services/ServiceMetricDetails.js +28 -0
  183. package/lib/services/props/BasicServiceMultiAZObservabilityProps.d.ts +126 -0
  184. package/lib/services/props/BasicServiceMultiAZObservabilityProps.js +3 -0
  185. package/lib/services/props/CanaryMetricProps.d.ts +14 -0
  186. package/lib/services/props/CanaryMetricProps.js +3 -0
  187. package/lib/services/props/CanaryTestMetricsOverrideProps.d.ts +47 -0
  188. package/lib/services/props/CanaryTestMetricsOverrideProps.js +3 -0
  189. package/lib/services/props/ContributorInsightRuleDetailsProps.d.ts +38 -0
  190. package/lib/services/props/ContributorInsightRuleDetailsProps.js +3 -0
  191. package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.d.ts +88 -0
  192. package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.js +3 -0
  193. package/lib/services/props/MetricDimensions.d.ts +61 -0
  194. package/lib/services/props/MetricDimensions.js +63 -0
  195. package/lib/services/props/OperationMetricDetailsProps.d.ts +97 -0
  196. package/lib/services/props/OperationMetricDetailsProps.js +3 -0
  197. package/lib/services/props/OperationProps.d.ts +93 -0
  198. package/lib/services/props/OperationProps.js +3 -0
  199. package/lib/services/props/ServiceMetricDetailsProps.d.ts +68 -0
  200. package/lib/services/props/ServiceMetricDetailsProps.js +3 -0
  201. package/lib/services/props/ServiceProps.d.ts +69 -0
  202. package/lib/services/props/ServiceProps.js +3 -0
  203. package/lib/utilities/AvailabilityMetricType.d.ts +26 -0
  204. package/lib/utilities/AvailabilityMetricType.js +33 -0
  205. package/lib/utilities/LatencyMetricType.d.ts +13 -0
  206. package/lib/utilities/LatencyMetricType.js +20 -0
  207. package/lib/utilities/OutlierDetectionAlgorithm.d.ts +42 -0
  208. package/lib/utilities/OutlierDetectionAlgorithm.js +49 -0
  209. package/lib/utilities/StackWithDynamicSource.d.ts +14 -0
  210. package/lib/utilities/StackWithDynamicSource.js +82 -0
  211. package/package.json +176 -0
  212. package/rosetta/default.ts-fixture +13 -0
@@ -0,0 +1,10 @@
1
+ import { IRule } from 'aws-cdk-lib/aws-events';
2
+ import { Construct } from 'constructs';
3
+ import { CanaryTestProps } from './props/CanaryTestProps';
4
+ export declare class CanaryTest extends Construct {
5
+ timedEventRules: {
6
+ [key: string]: IRule;
7
+ };
8
+ metricNamespace: string;
9
+ constructor(scope: Construct, id: string, props: CanaryTestProps);
10
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CanaryTest = void 0;
4
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
5
+ // SPDX-License-Identifier: Apache-2.0
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_events_1 = require("aws-cdk-lib/aws-events");
8
+ const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
9
+ const constructs_1 = require("constructs");
10
+ class CanaryTest extends constructs_1.Construct {
11
+ constructor(scope, id, props) {
12
+ super(scope, id);
13
+ this.timedEventRules = {};
14
+ this.metricNamespace = props.operation.canaryMetricDetails
15
+ ? props.operation.canaryMetricDetails.canaryAvailabilityMetricDetails
16
+ .metricNamespace
17
+ : 'canary/metrics';
18
+ props.operation.service.availabilityZoneNames.forEach((availabilityZoneName, index) => {
19
+ let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(availabilityZoneName.substring(availabilityZoneName.length - 1));
20
+ let scheme = props.operation.service.baseUrl.split(':')[0];
21
+ let url = scheme +
22
+ '://' +
23
+ availabilityZoneName +
24
+ '.' +
25
+ props.loadBalancer.loadBalancerDnsName +
26
+ props.operation.path;
27
+ let data = {
28
+ parameters: {
29
+ methods: props.httpMethods !== undefined
30
+ ? props.httpMethods
31
+ : props.operation.httpMethods,
32
+ url: url,
33
+ postData: props.postData === undefined ? '' : props.postData,
34
+ headers: props.headers === undefined ? {} : props.headers,
35
+ operation: props.operation.operationName,
36
+ faultBoundaryId: availabilityZoneId,
37
+ faultBoundary: 'az',
38
+ metricNamespace: this.metricNamespace,
39
+ requestCount: props.requestCount,
40
+ },
41
+ };
42
+ this.timedEventRules[availabilityZoneId] = new aws_events_1.Rule(this, 'AZ' + index + props.operation.operationName + 'TimedEvent', {
43
+ schedule: aws_events_1.Schedule.expression(props.schedule),
44
+ enabled: true,
45
+ targets: [
46
+ new aws_events_targets_1.LambdaFunction(props.function, {
47
+ event: aws_events_1.RuleTargetInput.fromObject(data),
48
+ }),
49
+ ],
50
+ });
51
+ });
52
+ let scheme = props.operation.service.baseUrl.split(':')[0];
53
+ let url = scheme +
54
+ '://' +
55
+ props.loadBalancer.loadBalancerDnsName +
56
+ props.operation.path;
57
+ let data = {
58
+ parameters: {
59
+ methods: props.httpMethods !== undefined
60
+ ? props.httpMethods
61
+ : props.operation.httpMethods,
62
+ url: url,
63
+ postData: props.postData === undefined ? '' : props.postData,
64
+ headers: props.headers === undefined ? {} : props.headers,
65
+ operation: props.operation.operationName,
66
+ faultBoundaryId: aws_cdk_lib_1.Fn.ref('AWS::Region'),
67
+ faultBoundary: 'region',
68
+ metricNamespace: this.metricNamespace,
69
+ requestCount: props.regionalRequestCount,
70
+ },
71
+ };
72
+ this.timedEventRules[aws_cdk_lib_1.Fn.ref('AWS::Region')] = new aws_events_1.Rule(this, 'RegionalTimedEvent', {
73
+ schedule: aws_events_1.Schedule.expression(props.schedule),
74
+ enabled: true,
75
+ targets: [
76
+ new aws_events_targets_1.LambdaFunction(props.function, {
77
+ event: aws_events_1.RuleTargetInput.fromObject(data),
78
+ }),
79
+ ],
80
+ });
81
+ }
82
+ }
83
+ exports.CanaryTest = CanaryTest;
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYXJ5VGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYW5hcmllcy9DYW5hcnlUZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQWlDO0FBQ2pDLHVEQUFnRjtBQUNoRix1RUFBZ0U7QUFDaEUsMkNBQXVDO0FBR3ZDLE1BQWEsVUFBVyxTQUFRLHNCQUFTO0lBS3ZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsbUJBQW1CO1lBQ3hELENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLCtCQUErQjtpQkFDbEUsZUFBZTtZQUNsQixDQUFDLENBQUMsZ0JBQWdCLENBQUM7UUFFckIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUNuRCxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlCLElBQUksa0JBQWtCLEdBQ3BCLEtBQUssQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQ3pELG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQ2hFLENBQUM7WUFFSixJQUFJLE1BQU0sR0FBVyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQUksR0FBRyxHQUNMLE1BQU07Z0JBQ04sS0FBSztnQkFDTCxvQkFBb0I7Z0JBQ3BCLEdBQUc7Z0JBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxtQkFBbUI7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UUFBUSxFQUFFLHFCQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDN0MsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxtQ0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0JBQ2pDLEtBQUssRUFBRSw0QkFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7aUJBQ3hDLENBQUM7YUFDSDtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJHRCxnQ0FxR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElSdWxlLCBSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENhbmFyeVRlc3RQcm9wcyB9IGZyb20gJy4vcHJvcHMvQ2FuYXJ5VGVzdFByb3BzJztcblxuZXhwb3J0IGNsYXNzIENhbmFyeVRlc3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICB0aW1lZEV2ZW50UnVsZXM6IHsgW2tleTogc3RyaW5nXTogSVJ1bGUgfTtcblxuICBtZXRyaWNOYW1lc3BhY2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2FuYXJ5VGVzdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnRpbWVkRXZlbnRSdWxlcyA9IHt9O1xuXG4gICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlsc1xuICAgICAgPyBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzXG4gICAgICAgIC5tZXRyaWNOYW1lc3BhY2VcbiAgICAgIDogJ2NhbmFyeS9tZXRyaWNzJztcblxuICAgIHByb3BzLm9wZXJhdGlvbi5zZXJ2aWNlLmF2YWlsYWJpbGl0eVpvbmVOYW1lcy5mb3JFYWNoKFxuICAgICAgKGF2YWlsYWJpbGl0eVpvbmVOYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPVxuICAgICAgICAgIHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmVOYW1lLmxlbmd0aCAtIDEpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgbGV0IHNjaGVtZTogc3RyaW5nID0gcHJvcHMub3BlcmF0aW9uLnNlcnZpY2UuYmFzZVVybC5zcGxpdCgnOicpWzBdO1xuICAgICAgICBsZXQgdXJsOiBzdHJpbmcgPVxuICAgICAgICAgIHNjaGVtZSArXG4gICAgICAgICAgJzovLycgK1xuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVOYW1lICtcbiAgICAgICAgICAnLicgK1xuICAgICAgICAgIHByb3BzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lICtcbiAgICAgICAgICBwcm9wcy5vcGVyYXRpb24ucGF0aDtcblxuICAgICAgICBsZXQgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBtZXRob2RzOlxuICAgICAgICAgICAgICBwcm9wcy5odHRwTWV0aG9kcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBwcm9wcy5odHRwTWV0aG9kc1xuICAgICAgICAgICAgICAgIDogcHJvcHMub3BlcmF0aW9uLmh0dHBNZXRob2RzLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBwb3N0RGF0YTogcHJvcHMucG9zdERhdGEgPT09IHVuZGVmaW5lZCA/ICcnIDogcHJvcHMucG9zdERhdGEsXG4gICAgICAgICAgICBoZWFkZXJzOiBwcm9wcy5oZWFkZXJzID09PSB1bmRlZmluZWQgPyB7fSA6IHByb3BzLmhlYWRlcnMsXG4gICAgICAgICAgICBvcGVyYXRpb246IHByb3BzLm9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgZmF1bHRCb3VuZGFyeUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBmYXVsdEJvdW5kYXJ5OiAnYXonLFxuICAgICAgICAgICAgbWV0cmljTmFtZXNwYWNlOiB0aGlzLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgIHJlcXVlc3RDb3VudDogcHJvcHMucmVxdWVzdENvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy50aW1lZEV2ZW50UnVsZXNbYXZhaWxhYmlsaXR5Wm9uZUlkXSA9IG5ldyBSdWxlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ0FaJyArIGluZGV4ICsgcHJvcHMub3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUgKyAnVGltZWRFdmVudCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMuc2NoZWR1bGUpLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICAgICAgbmV3IExhbWJkYUZ1bmN0aW9uKHByb3BzLmZ1bmN0aW9uLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KGRhdGEpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGxldCBzY2hlbWU6IHN0cmluZyA9IHByb3BzLm9wZXJhdGlvbi5zZXJ2aWNlLmJhc2VVcmwuc3BsaXQoJzonKVswXTtcbiAgICBsZXQgdXJsOiBzdHJpbmcgPVxuICAgICAgc2NoZW1lICtcbiAgICAgICc6Ly8nICtcbiAgICAgIHByb3BzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lICtcbiAgICAgIHByb3BzLm9wZXJhdGlvbi5wYXRoO1xuXG4gICAgbGV0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIG1ldGhvZHM6XG4gICAgICAgICAgcHJvcHMuaHR0cE1ldGhvZHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBwcm9wcy5odHRwTWV0aG9kc1xuICAgICAgICAgICAgOiBwcm9wcy5vcGVyYXRpb24uaHR0cE1ldGhvZHMsXG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBwb3N0RGF0YTogcHJvcHMucG9zdERhdGEgPT09IHVuZGVmaW5lZCA/ICcnIDogcHJvcHMucG9zdERhdGEsXG4gICAgICAgIGhlYWRlcnM6IHByb3BzLmhlYWRlcnMgPT09IHVuZGVmaW5lZCA/IHt9IDogcHJvcHMuaGVhZGVycyxcbiAgICAgICAgb3BlcmF0aW9uOiBwcm9wcy5vcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgZmF1bHRCb3VuZGFyeUlkOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgIGZhdWx0Qm91bmRhcnk6ICdyZWdpb24nLFxuICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICByZXF1ZXN0Q291bnQ6IHByb3BzLnJlZ2lvbmFsUmVxdWVzdENvdW50LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGhpcy50aW1lZEV2ZW50UnVsZXNbRm4ucmVmKCdBV1M6OlJlZ2lvbicpXSA9IG5ldyBSdWxlKFxuICAgICAgdGhpcyxcbiAgICAgICdSZWdpb25hbFRpbWVkRXZlbnQnLFxuICAgICAge1xuICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuZXhwcmVzc2lvbihwcm9wcy5zY2hlZHVsZSksXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICBuZXcgTGFtYmRhRnVuY3Rpb24ocHJvcHMuZnVuY3Rpb24sIHtcbiAgICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChkYXRhKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ import { IFunction } from 'aws-cdk-lib/aws-lambda';
2
+ import { ILogGroup } from 'aws-cdk-lib/aws-logs';
3
+ export interface ICanaryFunction {
4
+ function: IFunction;
5
+ logGroup: ILogGroup;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUNhbmFyeUZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbmFyaWVzL0lDYW5hcnlGdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgSUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJTG9nR3JvdXAgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhbmFyeUZ1bmN0aW9uIHtcbiAgZnVuY3Rpb246IElGdW5jdGlvbjtcblxuICBsb2dHcm91cDogSUxvZ0dyb3VwO1xufVxuIl19
@@ -0,0 +1,66 @@
1
+ import { Duration } from 'aws-cdk-lib';
2
+ import { ILoadBalancerV2 } from 'aws-cdk-lib/aws-elasticloadbalancingv2';
3
+ import { NetworkConfigurationProps } from './NetworkConfigurationProps';
4
+ /**
5
+ * The props for requesting a canary be made for an operation
6
+ */
7
+ export interface AddCanaryTestProps {
8
+ /**
9
+ * The number of requests to send on each test
10
+ */
11
+ readonly requestCount: number;
12
+ /**
13
+ * Specifies a separate number of request to send to the regional endpoint.
14
+ *
15
+ * @default - The same number of requests specified by the requestCount property is used.
16
+ */
17
+ readonly regionalRequestCount?: number;
18
+ /**
19
+ * A schedule expression
20
+ */
21
+ readonly schedule: string;
22
+ /**
23
+ * Data to supply in a POST, PUT, or PATCH operation
24
+ *
25
+ * @default - No data is sent in a POST, PUT, or PATCH request
26
+ */
27
+ readonly postData?: string;
28
+ /**
29
+ * Any headers to include
30
+ *
31
+ * @default - No additional headers are added to the requests
32
+ */
33
+ readonly headers?: {
34
+ [key: string]: string;
35
+ };
36
+ /**
37
+ * The load balancer that will be tested against
38
+ */
39
+ readonly loadBalancer: ILoadBalancerV2;
40
+ /**
41
+ * Defining this will override the methods defined in the operation
42
+ * and will use these instead.
43
+ *
44
+ * @default - The operation's defined HTTP methods will be used to
45
+ * conduct the canary tests
46
+ */
47
+ readonly httpMethods?: string[];
48
+ /**
49
+ * The VPC network configuration.
50
+ *
51
+ * @default - The Lambda function is not run in a VPC
52
+ */
53
+ readonly networkConfiguration?: NetworkConfigurationProps;
54
+ /**
55
+ * The timeout for each individual HTTP request
56
+ *
57
+ * @default - Defaults to 2 seconds
58
+ */
59
+ readonly timeout?: Duration;
60
+ /**
61
+ * Whether to ignore TLS validation errors
62
+ *
63
+ * @default - false
64
+ */
65
+ readonly ignoreTlsErrors?: boolean;
66
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkQ2FuYXJ5VGVzdFByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NhbmFyaWVzL3Byb3BzL0FkZENhbmFyeVRlc3RQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJTG9hZEJhbGFuY2VyVjIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mic7XG5pbXBvcnQgeyBOZXR3b3JrQ29uZmlndXJhdGlvblByb3BzIH0gZnJvbSAnLi9OZXR3b3JrQ29uZmlndXJhdGlvblByb3BzJztcblxuLyoqXG4gKiBUaGUgcHJvcHMgZm9yIHJlcXVlc3RpbmcgYSBjYW5hcnkgYmUgbWFkZSBmb3IgYW4gb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQ2FuYXJ5VGVzdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdG8gc2VuZCBvbiBlYWNoIHRlc3RcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBzZXBhcmF0ZSBudW1iZXIgb2YgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSByZWdpb25hbCBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgc2FtZSBudW1iZXIgb2YgcmVxdWVzdHMgc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0Q291bnQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbmFsUmVxdWVzdENvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNjaGVkdWxlIGV4cHJlc3Npb25cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGEgdG8gc3VwcGx5IGluIGEgUE9TVCwgUFVULCBvciBQQVRDSCBvcGVyYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBkYXRhIGlzIHNlbnQgaW4gYSBQT1NULCBQVVQsIG9yIFBBVENIIHJlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHBvc3REYXRhPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbnkgaGVhZGVycyB0byBpbmNsdWRlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBoZWFkZXJzIGFyZSBhZGRlZCB0byB0aGUgcmVxdWVzdHNcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZCBiYWxhbmNlciB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3RcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlcjogSUxvYWRCYWxhbmNlclYyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmluZyB0aGlzIHdpbGwgb3ZlcnJpZGUgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgb3BlcmF0aW9uXG4gICAqIGFuZCB3aWxsIHVzZSB0aGVzZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBvcGVyYXRpb24ncyBkZWZpbmVkIEhUVFAgbWV0aG9kcyB3aWxsIGJlIHVzZWQgdG9cbiAgICogY29uZHVjdCB0aGUgY2FuYXJ5IHRlc3RzXG4gICAqL1xuICByZWFkb25seSBodHRwTWV0aG9kcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIG5ldHdvcmsgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgTGFtYmRhIGZ1bmN0aW9uIGlzIG5vdCBydW4gaW4gYSBWUENcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtDb25maWd1cmF0aW9uPzogTmV0d29ya0NvbmZpZ3VyYXRpb25Qcm9wcztcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgZm9yIGVhY2ggaW5kaXZpZHVhbCBIVFRQIHJlcXVlc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0cyB0byAyIHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgVExTIHZhbGlkYXRpb24gZXJyb3JzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZVRsc0Vycm9ycz86IGJvb2xlYW47XG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { Duration } from 'aws-cdk-lib';
2
+ import { IVpc, SubnetSelection } from 'aws-cdk-lib/aws-ec2';
3
+ /**
4
+ * Properties for the canary function
5
+ */
6
+ export interface CanaryFunctionProps {
7
+ /**
8
+ * If you want the function to run in your VPC, provide
9
+ * the VPC object.
10
+ *
11
+ * @default - The function is not run in a customer VPC
12
+ */
13
+ readonly vpc?: IVpc;
14
+ /**
15
+ * The subnets to use in the VPC
16
+ */
17
+ readonly subnetSelection?: SubnetSelection;
18
+ /**
19
+ * Set to true to ignore TLS certificate errors, default is to
20
+ * not ignore them
21
+ */
22
+ readonly ignoreTlsErrors?: boolean;
23
+ /**
24
+ * Specify the timeout for each http request
25
+ *
26
+ * @default - 2 seconds
27
+ */
28
+ readonly httpTimeout?: Duration;
29
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYXJ5RnVuY3Rpb25Qcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYW5hcmllcy9wcm9wcy9DYW5hcnlGdW5jdGlvblByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElWcGMsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBjYW5hcnkgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5hcnlGdW5jdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIElmIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0byBydW4gaW4geW91ciBWUEMsIHByb3ZpZGVcbiAgICogdGhlIFZQQyBvYmplY3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIGZ1bmN0aW9uIGlzIG5vdCBydW4gaW4gYSBjdXN0b21lciBWUENcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXRzIHRvIHVzZSBpbiB0aGUgVlBDXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIGlnbm9yZSBUTFMgY2VydGlmaWNhdGUgZXJyb3JzLCBkZWZhdWx0IGlzIHRvXG4gICAqIG5vdCBpZ25vcmUgdGhlbVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlVGxzRXJyb3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdGltZW91dCBmb3IgZWFjaCBodHRwIHJlcXVlc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSAyIHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IGh0dHBUaW1lb3V0PzogRHVyYXRpb247XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { IFunction } from 'aws-cdk-lib/aws-lambda';
2
+ import { AddCanaryTestProps } from './AddCanaryTestProps';
3
+ import { IAvailabilityZoneMapper } from '../../azmapper/IAvailabilityZoneMapper';
4
+ import { IOperation } from '../../services/IOperation';
5
+ /**
6
+ * The props for creating a canary test on a single operation
7
+ */
8
+ export interface CanaryTestProps extends AddCanaryTestProps {
9
+ /**
10
+ * The function that will run the canary requests
11
+ */
12
+ readonly function: IFunction;
13
+ /**
14
+ * The operation for the canary test
15
+ */
16
+ readonly operation: IOperation;
17
+ /**
18
+ * The AZ Mapper
19
+ */
20
+ readonly azMapper: IAvailabilityZoneMapper;
21
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYXJ5VGVzdFByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NhbmFyaWVzL3Byb3BzL0NhbmFyeVRlc3RQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgSUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBBZGRDYW5hcnlUZXN0UHJvcHMgfSBmcm9tICcuL0FkZENhbmFyeVRlc3RQcm9wcyc7XG5pbXBvcnQgeyBJQXZhaWxhYmlsaXR5Wm9uZU1hcHBlciB9IGZyb20gJy4uLy4uL2F6bWFwcGVyL0lBdmFpbGFiaWxpdHlab25lTWFwcGVyJztcbmltcG9ydCB7IElPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9JT3BlcmF0aW9uJztcblxuLyoqXG4gKiBUaGUgcHJvcHMgZm9yIGNyZWF0aW5nIGEgY2FuYXJ5IHRlc3Qgb24gYSBzaW5nbGUgb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuYXJ5VGVzdFByb3BzIGV4dGVuZHMgQWRkQ2FuYXJ5VGVzdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgcnVuIHRoZSBjYW5hcnkgcmVxdWVzdHNcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uOiBJRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24gZm9yIHRoZSBjYW5hcnkgdGVzdFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uOiBJT3BlcmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgQVogTWFwcGVyXG4gICAqL1xuICByZWFkb25seSBhek1hcHBlcjogSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXI7XG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import { IVpc, SubnetSelection } from 'aws-cdk-lib/aws-ec2';
2
+ /**
3
+ * The network configuration for the canary function
4
+ */
5
+ export interface NetworkConfigurationProps {
6
+ /**
7
+ * The VPC to run the canary in. A security group will be created
8
+ * that allows the function to communicate with the VPC as well
9
+ * as the required IAM permissions.
10
+ */
11
+ readonly vpc: IVpc;
12
+ /**
13
+ * The subnets the Lambda function will be deployed in the VPC.
14
+ */
15
+ readonly subnetSelection: SubnetSelection;
16
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV0d29ya0NvbmZpZ3VyYXRpb25Qcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYW5hcmllcy9wcm9wcy9OZXR3b3JrQ29uZmlndXJhdGlvblByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBJVnBjLCBTdWJuZXRTZWxlY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcblxuLyoqXG4gKiBUaGUgbmV0d29yayBjb25maWd1cmF0aW9uIGZvciB0aGUgY2FuYXJ5IGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0NvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgVlBDIHRvIHJ1biB0aGUgY2FuYXJ5IGluLiBBIHNlY3VyaXR5IGdyb3VwIHdpbGwgYmUgY3JlYXRlZFxuICAgKiB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgVlBDIGFzIHdlbGxcbiAgICogYXMgdGhlIHJlcXVpcmVkIElBTSBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwYztcblxuICAvKipcbiAgICogVGhlIHN1Ym5ldHMgdGhlIExhbWJkYSBmdW5jdGlvbiB3aWxsIGJlIGRlcGxveWVkIGluIHRoZSBWUEMuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb246IFN1Ym5ldFNlbGVjdGlvbjtcbn1cbiJdfQ==
Binary file
@@ -0,0 +1,10 @@
1
+ import { Dashboard } from 'aws-cdk-lib/aws-cloudwatch';
2
+ import { Construct } from 'constructs';
3
+ import { BasicServiceDashboardProps } from './props/BasicServiceDashboardProps';
4
+ export declare class BasicServiceDashboard extends Construct {
5
+ private static createLoadBalancerWidgets;
6
+ private static createNatGatewayWidgets;
7
+ private static createTopLevelAlarmWidgets;
8
+ dashboard: Dashboard;
9
+ constructor(scope: Construct, id: string, props: BasicServiceDashboardProps);
10
+ }
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BasicServiceDashboard = void 0;
4
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
5
+ // SPDX-License-Identifier: Apache-2.0
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
8
+ const constructs_1 = require("constructs");
9
+ class BasicServiceDashboard extends constructs_1.Construct {
10
+ static createLoadBalancerWidgets(alarms, metrics, azMapper) {
11
+ let widgets = [];
12
+ widgets.push(new aws_cloudwatch_1.TextWidget({
13
+ markdown: 'Load Balancer Fault Count Metrics',
14
+ height: 2,
15
+ width: 24,
16
+ }));
17
+ let rowTracker = 0;
18
+ Object.keys(alarms).forEach((azLetter, index) => {
19
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
20
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
21
+ height: 6,
22
+ width: 8,
23
+ title: availabilityZoneId + ' Load Balancer Faults',
24
+ region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
25
+ left: [metrics[azLetter]],
26
+ statistic: 'Sum',
27
+ leftYAxis: {
28
+ min: 0,
29
+ label: 'Fault Count',
30
+ showUnits: false,
31
+ },
32
+ }));
33
+ //We're on the third one for this set, add 3 alarms
34
+ //or if we're at the end, at the necessary amount
35
+ //of alarms, 1, 2, or 3
36
+ if (index % 3 == 2 || index - 1 == Object.keys(alarms).length) {
37
+ for (let k = rowTracker; k <= index; k++) {
38
+ let azId = Object.keys(alarms).at(k);
39
+ widgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
40
+ height: 2,
41
+ width: 8,
42
+ alarms: [alarms[azId]],
43
+ }));
44
+ }
45
+ rowTracker += index + 1;
46
+ }
47
+ });
48
+ return widgets;
49
+ }
50
+ static createNatGatewayWidgets(alarms, metrics, azMapper) {
51
+ let widgets = [];
52
+ widgets.push(new aws_cloudwatch_1.TextWidget({
53
+ markdown: 'NAT Gateway Dropped Packet Metrics',
54
+ height: 2,
55
+ width: 24,
56
+ }));
57
+ let rowTracker = 0;
58
+ Object.keys(alarms).forEach((azLetter, index) => {
59
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
60
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
61
+ height: 6,
62
+ width: 8,
63
+ title: availabilityZoneId + ' NAT Gateway Dropped Packets',
64
+ region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
65
+ left: [metrics[azLetter]],
66
+ statistic: 'Sum',
67
+ leftYAxis: {
68
+ min: 0,
69
+ label: 'Dropped packets',
70
+ showUnits: false,
71
+ },
72
+ }));
73
+ //We're on the third one for this set, add 3 alarms
74
+ //or if we're at the end, at the necessary amount
75
+ //of alarms, 1, 2, or 3
76
+ if (index % 3 == 2 || index - 1 == Object.keys(alarms).length) {
77
+ for (let k = rowTracker; k <= index; k++) {
78
+ let azId = Object.keys(alarms).at(k);
79
+ widgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
80
+ height: 2,
81
+ width: 8,
82
+ alarms: [alarms[azId]],
83
+ }));
84
+ }
85
+ rowTracker += index + 1;
86
+ }
87
+ });
88
+ return widgets;
89
+ }
90
+ static createTopLevelAlarmWidgets(alarms, azMapper) {
91
+ let widgets = [];
92
+ widgets.push(new aws_cloudwatch_1.TextWidget({
93
+ markdown: 'Availability Zone Isolated Impact Alarms',
94
+ height: 2,
95
+ width: 24,
96
+ }));
97
+ Object.keys(alarms).forEach((azLetter) => {
98
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
99
+ widgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
100
+ alarms: [alarms[azLetter]],
101
+ height: 2,
102
+ width: 8,
103
+ title: availabilityZoneId + ' Aggregate Isolated Impact',
104
+ }));
105
+ });
106
+ return widgets;
107
+ }
108
+ constructor(scope, id, props) {
109
+ super(scope, id);
110
+ let widgets = [];
111
+ widgets.push(BasicServiceDashboard.createTopLevelAlarmWidgets(props.zonalAggregateIsolatedImpactAlarms, props.azMapper));
112
+ if (props.zonalLoadBalancerIsolatedImpactAlarms !== undefined &&
113
+ props.zonalLoadBalancerFaultRateMetrics !== undefined) {
114
+ widgets.push(BasicServiceDashboard.createLoadBalancerWidgets(props.zonalLoadBalancerIsolatedImpactAlarms, props.zonalLoadBalancerFaultRateMetrics, props.azMapper));
115
+ }
116
+ if (props.zonalNatGatewayIsolatedImpactAlarms !== undefined &&
117
+ props.zonalNatGatewayPacketDropMetrics !== undefined) {
118
+ widgets.push(BasicServiceDashboard.createNatGatewayWidgets(props.zonalNatGatewayIsolatedImpactAlarms, props.zonalNatGatewayPacketDropMetrics, props.azMapper));
119
+ }
120
+ this.dashboard = new aws_cloudwatch_1.Dashboard(this, 'BasicServiceDashboard', {
121
+ dashboardName: props.serviceName.toLowerCase() +
122
+ aws_cdk_lib_1.Fn.sub('-service-availability-${AWS::Region}'),
123
+ defaultInterval: props.interval,
124
+ periodOverride: aws_cloudwatch_1.PeriodOverride.INHERIT,
125
+ widgets: widgets,
126
+ });
127
+ }
128
+ }
129
+ exports.BasicServiceDashboard = BasicServiceDashboard;
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzaWNTZXJ2aWNlRGFzaGJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rhc2hib2FyZHMvQmFzaWNTZXJ2aWNlRGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQWlDO0FBQ2pDLCtEQVNvQztBQUNwQywyQ0FBdUM7QUFJdkMsTUFBYSxxQkFBc0IsU0FBUSxzQkFBUztJQUUxQyxNQUFNLENBQUMseUJBQXlCLENBQ3RDLE1BQWlDLEVBQ2pDLE9BQW1DLEVBQ25DLFFBQWdDO1FBRWhDLElBQUksT0FBTyxHQUFjLEVBQUUsQ0FBQztRQUU1QixPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksMkJBQVUsQ0FBQztZQUNiLFFBQVEsRUFBRSxtQ0FBbUM7WUFDN0MsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxVQUFVLEdBQVcsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLElBQUksa0JBQWtCLEdBQVcsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWpHLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSw0QkFBVyxDQUFDO2dCQUNkLE1BQU0sRUFBRSxDQUFDO2dCQUNULEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxrQkFBa0IsR0FBRyx1QkFBdUI7Z0JBQ25ELE1BQU0sRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixTQUFTLEVBQUUsS0FBSztnQkFDaEIsU0FBUyxFQUFFO29CQUNULEdBQUcsRUFBRSxDQUFDO29CQUNOLEtBQUssRUFBRSxhQUFhO29CQUNwQixTQUFTLEVBQUUsS0FBSztpQkFDakI7YUFDRixDQUFDLENBQ0gsQ0FBQztZQUVGLG1EQUFtRDtZQUNuRCxpREFBaUQ7WUFDakQsdUJBQXVCO1lBQ3ZCLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3pDLElBQUksSUFBSSxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBRSxDQUFDO29CQUM5QyxPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksa0NBQWlCLENBQUM7d0JBQ3BCLE1BQU0sRUFBRSxDQUFDO3dCQUNULEtBQUssRUFBRSxDQUFDO3dCQUNSLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkIsQ0FBQyxDQUNILENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxVQUFVLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sTUFBTSxDQUFDLHVCQUF1QixDQUNwQyxNQUFpQyxFQUNqQyxPQUFtQyxFQUNuQyxRQUFnQztRQUVoQyxJQUFJLE9BQU8sR0FBYyxFQUFFLENBQUM7UUFFNUIsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLDJCQUFVLENBQUM7WUFDYixRQUFRLEVBQUUsb0NBQW9DO1lBQzlDLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksVUFBVSxHQUFXLENBQUMsQ0FBQztRQUUzQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUU5QyxJQUFJLGtCQUFrQixHQUFXLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVqRyxPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksNEJBQVcsQ0FBQztnQkFDZCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLEVBQUUsa0JBQWtCLEdBQUcsOEJBQThCO2dCQUMxRCxNQUFNLEVBQUUsZ0JBQUUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2hDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFNBQVMsRUFBRTtvQkFDVCxHQUFHLEVBQUUsQ0FBQztvQkFDTixLQUFLLEVBQUUsaUJBQWlCO29CQUN4QixTQUFTLEVBQUUsS0FBSztpQkFDakI7YUFDRixDQUFDLENBQ0gsQ0FBQztZQUVGLG1EQUFtRDtZQUNuRCxpREFBaUQ7WUFDakQsdUJBQXVCO1lBQ3ZCLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3pDLElBQUksSUFBSSxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBRSxDQUFDO29CQUM5QyxPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksa0NBQWlCLENBQUM7d0JBQ3BCLE1BQU0sRUFBRSxDQUFDO3dCQUNULEtBQUssRUFBRSxDQUFDO3dCQUNSLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkIsQ0FBQyxDQUNILENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxVQUFVLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sTUFBTSxDQUFDLDBCQUEwQixDQUFDLE1BRXpDLEVBQ0QsUUFBZ0M7UUFFOUIsSUFBSSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBRTVCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSwyQkFBVSxDQUFDO1lBQ2IsUUFBUSxFQUFFLDBDQUEwQztZQUNwRCxNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLElBQUksa0JBQWtCLEdBQVcsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWpHLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSxrQ0FBaUIsQ0FBQztnQkFDcEIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLEVBQUUsQ0FBQztnQkFDVCxLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLEVBQUUsa0JBQWtCLEdBQUcsNEJBQTRCO2FBQ3pELENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBSUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksT0FBTyxHQUFnQixFQUFFLENBQUM7UUFFOUIsT0FBTyxDQUFDLElBQUksQ0FDVixxQkFBcUIsQ0FBQywwQkFBMEIsQ0FDOUMsS0FBSyxDQUFDLGtDQUFrQyxFQUN4QyxLQUFLLENBQUMsUUFBUSxDQUNmLENBQ0YsQ0FBQztRQUVGLElBQ0UsS0FBSyxDQUFDLHFDQUFxQyxLQUFLLFNBQVM7WUFDekQsS0FBSyxDQUFDLGlDQUFpQyxLQUFLLFNBQVMsRUFDckQsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQ1YscUJBQXFCLENBQUMseUJBQXlCLENBQzdDLEtBQUssQ0FBQyxxQ0FBcUMsRUFDM0MsS0FBSyxDQUFDLGlDQUFpQyxFQUN2QyxLQUFLLENBQUMsUUFBUSxDQUNmLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUNFLEtBQUssQ0FBQyxtQ0FBbUMsS0FBSyxTQUFTO1lBQ3ZELEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxTQUFTLEVBQ3BELENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUNWLHFCQUFxQixDQUFDLHVCQUF1QixDQUMzQyxLQUFLLENBQUMsbUNBQW1DLEVBQ3pDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFDdEMsS0FBSyxDQUFDLFFBQVEsQ0FDZixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDBCQUFTLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQzVELGFBQWEsRUFDWCxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDL0IsZ0JBQUUsQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUM7WUFDaEQsZUFBZSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQy9CLGNBQWMsRUFBRSwrQkFBYyxDQUFDLE9BQU87WUFDdEMsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdk1ELHNEQXVNQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEZuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQWxhcm1TdGF0dXNXaWRnZXQsXG4gIERhc2hib2FyZCxcbiAgR3JhcGhXaWRnZXQsXG4gIElBbGFybSxcbiAgSU1ldHJpYyxcbiAgSVdpZGdldCxcbiAgUGVyaW9kT3ZlcnJpZGUsXG4gIFRleHRXaWRnZXQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzaWNTZXJ2aWNlRGFzaGJvYXJkUHJvcHMgfSBmcm9tICcuL3Byb3BzL0Jhc2ljU2VydmljZURhc2hib2FyZFByb3BzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9BdmFpbGFiaWxpdHlab25lTWFwcGVyJztcblxuZXhwb3J0IGNsYXNzIEJhc2ljU2VydmljZURhc2hib2FyZCBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlTG9hZEJhbGFuY2VyV2lkZ2V0cyhcbiAgICBhbGFybXM6IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH0sXG4gICAgbWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0sXG4gICAgYXpNYXBwZXI6IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIsXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogJ0xvYWQgQmFsYW5jZXIgRmF1bHQgQ291bnQgTWV0cmljcycsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCByb3dUcmFja2VyOiBudW1iZXIgPSAwO1xuXG4gICAgT2JqZWN0LmtleXMoYWxhcm1zKS5mb3JFYWNoKChhekxldHRlciwgaW5kZXgpID0+IHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0aXRsZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBMb2FkIEJhbGFuY2VyIEZhdWx0cycsXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogW21ldHJpY3NbYXpMZXR0ZXJdXSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdGYXVsdCBDb3VudCcsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy9XZSdyZSBvbiB0aGUgdGhpcmQgb25lIGZvciB0aGlzIHNldCwgYWRkIDMgYWxhcm1zXG4gICAgICAvL29yIGlmIHdlJ3JlIGF0IHRoZSBlbmQsIGF0IHRoZSBuZWNlc3NhcnkgYW1vdW50XG4gICAgICAvL29mIGFsYXJtcywgMSwgMiwgb3IgM1xuICAgICAgaWYgKGluZGV4ICUgMyA9PSAyIHx8IGluZGV4IC0gMSA9PSBPYmplY3Qua2V5cyhhbGFybXMpLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBrID0gcm93VHJhY2tlcjsgayA8PSBpbmRleDsgaysrKSB7XG4gICAgICAgICAgbGV0IGF6SWQ6IHN0cmluZyA9IE9iamVjdC5rZXlzKGFsYXJtcykuYXQoaykhO1xuICAgICAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgICAgIG5ldyBBbGFybVN0YXR1c1dpZGdldCh7XG4gICAgICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgICAgIGFsYXJtczogW2FsYXJtc1theklkXV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93VHJhY2tlciArPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZU5hdEdhdGV3YXlXaWRnZXRzKFxuICAgIGFsYXJtczogeyBba2V5OiBzdHJpbmddOiBJQWxhcm0gfSxcbiAgICBtZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSxcbiAgICBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIG1hcmtkb3duOiAnTkFUIEdhdGV3YXkgRHJvcHBlZCBQYWNrZXQgTWV0cmljcycsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCByb3dUcmFja2VyOiBudW1iZXIgPSAwO1xuXG4gICAgT2JqZWN0LmtleXMoYWxhcm1zKS5mb3JFYWNoKChhekxldHRlciwgaW5kZXgpID0+IHtcblxuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIE5BVCBHYXRld2F5IERyb3BwZWQgUGFja2V0cycsXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogW21ldHJpY3NbYXpMZXR0ZXJdXSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdEcm9wcGVkIHBhY2tldHMnLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vV2UncmUgb24gdGhlIHRoaXJkIG9uZSBmb3IgdGhpcyBzZXQsIGFkZCAzIGFsYXJtc1xuICAgICAgLy9vciBpZiB3ZSdyZSBhdCB0aGUgZW5kLCBhdCB0aGUgbmVjZXNzYXJ5IGFtb3VudFxuICAgICAgLy9vZiBhbGFybXMsIDEsIDIsIG9yIDNcbiAgICAgIGlmIChpbmRleCAlIDMgPT0gMiB8fCBpbmRleCAtIDEgPT0gT2JqZWN0LmtleXMoYWxhcm1zKS5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHJvd1RyYWNrZXI7IGsgPD0gaW5kZXg7IGsrKykge1xuICAgICAgICAgIGxldCBheklkOiBzdHJpbmcgPSBPYmplY3Qua2V5cyhhbGFybXMpLmF0KGspITtcbiAgICAgICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgICAgICBhbGFybXM6IFthbGFybXNbYXpJZF1dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd1RyYWNrZXIgKz0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVUb3BMZXZlbEFsYXJtV2lkZ2V0cyhhbGFybXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBJQWxhcm07XG4gIH0sXG4gIGF6TWFwcGVyOiBBdmFpbGFiaWxpdHlab25lTWFwcGVyLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgbWFya2Rvd246ICdBdmFpbGFiaWxpdHkgWm9uZSBJc29sYXRlZCBJbXBhY3QgQWxhcm1zJyxcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgT2JqZWN0LmtleXMoYWxhcm1zKS5mb3JFYWNoKChhekxldHRlcikgPT4ge1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBBbGFybVN0YXR1c1dpZGdldCh7XG4gICAgICAgICAgYWxhcm1zOiBbYWxhcm1zW2F6TGV0dGVyXV0sXG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEFnZ3JlZ2F0ZSBJc29sYXRlZCBJbXBhY3QnLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIGRhc2hib2FyZDogRGFzaGJvYXJkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYXNpY1NlcnZpY2VEYXNoYm9hcmRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdW10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVUb3BMZXZlbEFsYXJtV2lkZ2V0cyhcbiAgICAgICAgcHJvcHMuem9uYWxBZ2dyZWdhdGVJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgcHJvcHMuYXpNYXBwZXIsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy56b25hbExvYWRCYWxhbmNlcklzb2xhdGVkSW1wYWN0QWxhcm1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLnpvbmFsTG9hZEJhbGFuY2VyRmF1bHRSYXRlTWV0cmljcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVMb2FkQmFsYW5jZXJXaWRnZXRzKFxuICAgICAgICAgIHByb3BzLnpvbmFsTG9hZEJhbGFuY2VySXNvbGF0ZWRJbXBhY3RBbGFybXMsXG4gICAgICAgICAgcHJvcHMuem9uYWxMb2FkQmFsYW5jZXJGYXVsdFJhdGVNZXRyaWNzLFxuICAgICAgICAgIHByb3BzLmF6TWFwcGVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlJc29sYXRlZEltcGFjdEFsYXJtcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlQYWNrZXREcm9wTWV0cmljcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVOYXRHYXRld2F5V2lkZ2V0cyhcbiAgICAgICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlQYWNrZXREcm9wTWV0cmljcyxcbiAgICAgICAgICBwcm9wcy5hek1hcHBlcixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKHRoaXMsICdCYXNpY1NlcnZpY2VEYXNoYm9hcmQnLCB7XG4gICAgICBkYXNoYm9hcmROYW1lOlxuICAgICAgICBwcm9wcy5zZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgRm4uc3ViKCctc2VydmljZS1hdmFpbGFiaWxpdHktJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgIGRlZmF1bHRJbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBwZXJpb2RPdmVycmlkZTogUGVyaW9kT3ZlcnJpZGUuSU5IRVJJVCxcbiAgICAgIHdpZGdldHM6IHdpZGdldHMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { ConcreteWidget, IWidget } from 'aws-cdk-lib/aws-cloudwatch';
2
+ import { ContributorInsightWidgetProps } from './props/ContributorInsightWidgetProps';
3
+ /**
4
+ * A Contributor Insight dashboard widget
5
+ */
6
+ export declare class ContributorInsightsWidget extends ConcreteWidget implements IWidget {
7
+ /**
8
+ * The widget properties
9
+ */
10
+ properties: ContributorInsightWidgetProps;
11
+ /**
12
+ * Creates the widget
13
+ * @param props
14
+ */
15
+ constructor(props: ContributorInsightWidgetProps);
16
+ /**
17
+ * Converts the widget into an array of JSON objects (not string), this returns
18
+ * a single item in the array
19
+ * @returns An array of dictionaries
20
+ */
21
+ toJson(): any[];
22
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContributorInsightsWidget = void 0;
4
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
5
+ // SPDX-License-Identifier: Apache-2.0
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
8
+ /**
9
+ * A Contributor Insight dashboard widget
10
+ */
11
+ class ContributorInsightsWidget extends aws_cloudwatch_1.ConcreteWidget {
12
+ /**
13
+ * Creates the widget
14
+ * @param props
15
+ */
16
+ constructor(props) {
17
+ super(props.width === undefined ? 6 : props.width, props.height === undefined ? 6 : props.height);
18
+ this.properties = props;
19
+ }
20
+ /**
21
+ * Converts the widget into an array of JSON objects (not string), this returns
22
+ * a single item in the array
23
+ * @returns An array of dictionaries
24
+ */
25
+ toJson() {
26
+ return [
27
+ {
28
+ type: 'metric',
29
+ width: this.width,
30
+ height: this.height,
31
+ x: this.x,
32
+ y: this.y,
33
+ properties: {
34
+ insightRule: {
35
+ maxContributorCount: this.properties.topContributors,
36
+ orderBy: this.properties.orderStatistic,
37
+ ruleName: this.properties.insightRule.attrRuleName,
38
+ },
39
+ region: this.properties.region !== undefined
40
+ ? this.properties.region
41
+ : aws_cdk_lib_1.Fn.ref('AWS::Region'),
42
+ legend: {
43
+ position: this.properties.legendPosition,
44
+ },
45
+ view: 'timeSeries',
46
+ period: this.properties.period.toSeconds(),
47
+ title: this.properties.title,
48
+ accountId: this.properties.accountId,
49
+ },
50
+ },
51
+ ];
52
+ }
53
+ }
54
+ exports.ContributorInsightsWidget = ContributorInsightsWidget;
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXNoYm9hcmRzL0NvbnRyaWJ1dG9ySW5zaWdodHNXaWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBaUM7QUFDakMsK0RBQXFFO0FBR3JFOztHQUVHO0FBQ0gsTUFBYSx5QkFDWCxTQUFRLCtCQUFjO0lBT3RCOzs7T0FHRztJQUNILFlBQVksS0FBb0M7UUFDOUMsS0FBSyxDQUNILEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQzNDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQzlDLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU07UUFDSixPQUFPO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ1QsVUFBVSxFQUFFO29CQUNWLFdBQVcsRUFBRTt3QkFDWCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWU7d0JBQ3BELE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWM7d0JBQ3ZDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZO3FCQUNuRDtvQkFDRCxNQUFNLEVBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUzt3QkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTt3QkFDeEIsQ0FBQyxDQUFDLGdCQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztvQkFDM0IsTUFBTSxFQUFFO3dCQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWM7cUJBQ3pDO29CQUNELElBQUksRUFBRSxZQUFZO29CQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUMxQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO29CQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO2lCQUNyQzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXRERCw4REFzREMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbmNyZXRlV2lkZ2V0LCBJV2lkZ2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQ29udHJpYnV0b3JJbnNpZ2h0V2lkZ2V0UHJvcHMgfSBmcm9tICcuL3Byb3BzL0NvbnRyaWJ1dG9ySW5zaWdodFdpZGdldFByb3BzJztcblxuLyoqXG4gKiBBIENvbnRyaWJ1dG9yIEluc2lnaHQgZGFzaGJvYXJkIHdpZGdldFxuICovXG5leHBvcnQgY2xhc3MgQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldFxuICBleHRlbmRzIENvbmNyZXRlV2lkZ2V0XG4gIGltcGxlbWVudHMgSVdpZGdldCB7XG4gIC8qKlxuICAgKiBUaGUgd2lkZ2V0IHByb3BlcnRpZXNcbiAgICovXG4gIHByb3BlcnRpZXM6IENvbnRyaWJ1dG9ySW5zaWdodFdpZGdldFByb3BzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSB3aWRnZXRcbiAgICogQHBhcmFtIHByb3BzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ29udHJpYnV0b3JJbnNpZ2h0V2lkZ2V0UHJvcHMpIHtcbiAgICBzdXBlcihcbiAgICAgIHByb3BzLndpZHRoID09PSB1bmRlZmluZWQgPyA2IDogcHJvcHMud2lkdGgsXG4gICAgICBwcm9wcy5oZWlnaHQgPT09IHVuZGVmaW5lZCA/IDYgOiBwcm9wcy5oZWlnaHQsXG4gICAgKTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgd2lkZ2V0IGludG8gYW4gYXJyYXkgb2YgSlNPTiBvYmplY3RzIChub3Qgc3RyaW5nKSwgdGhpcyByZXR1cm5zXG4gICAqIGEgc2luZ2xlIGl0ZW0gaW4gdGhlIGFycmF5XG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRpY3Rpb25hcmllc1xuICAgKi9cbiAgdG9Kc29uKCk6IGFueVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgeTogdGhpcy55LFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgaW5zaWdodFJ1bGU6IHtcbiAgICAgICAgICAgIG1heENvbnRyaWJ1dG9yQ291bnQ6IHRoaXMucHJvcGVydGllcy50b3BDb250cmlidXRvcnMsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnByb3BlcnRpZXMub3JkZXJTdGF0aXN0aWMsXG4gICAgICAgICAgICBydWxlTmFtZTogdGhpcy5wcm9wZXJ0aWVzLmluc2lnaHRSdWxlLmF0dHJSdWxlTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlZ2lvbjpcbiAgICAgICAgICAgIHRoaXMucHJvcGVydGllcy5yZWdpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHRoaXMucHJvcGVydGllcy5yZWdpb25cbiAgICAgICAgICAgICAgOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5wcm9wZXJ0aWVzLmxlZ2VuZFBvc2l0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmlldzogJ3RpbWVTZXJpZXMnLFxuICAgICAgICAgIHBlcmlvZDogdGhpcy5wcm9wZXJ0aWVzLnBlcmlvZC50b1NlY29uZHMoKSxcbiAgICAgICAgICB0aXRsZTogdGhpcy5wcm9wZXJ0aWVzLnRpdGxlLFxuICAgICAgICAgIGFjY291bnRJZDogdGhpcy5wcm9wZXJ0aWVzLmFjY291bnRJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { Dashboard } from 'aws-cdk-lib/aws-cloudwatch';
2
+ /**
3
+ * An operation level availability and latency dashboard
4
+ */
5
+ export interface IOperationAvailabilityAndLatencyDashboard {
6
+ /**
7
+ * The operation level dashboard
8
+ */
9
+ dashboard: Dashboard;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSU9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGFzaGJvYXJkcy9JT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuXG4vKipcbiAqIEFuIG9wZXJhdGlvbiBsZXZlbCBhdmFpbGFiaWxpdHkgYW5kIGxhdGVuY3kgZGFzaGJvYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQge1xuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbiBsZXZlbCBkYXNoYm9hcmRcbiAgICovXG4gIGRhc2hib2FyZDogRGFzaGJvYXJkO1xufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { Dashboard } from 'aws-cdk-lib/aws-cloudwatch';
2
+ /**
3
+ * A service-level availability and latency dashboard
4
+ */
5
+ export interface IServiceAvailabilityAndLatencyDashboard {
6
+ /**
7
+ * The service availability and latency dashboard
8
+ */
9
+ dashboard: Dashboard;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rhc2hib2FyZHMvSVNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5cbi8qKlxuICogQSBzZXJ2aWNlLWxldmVsIGF2YWlsYWJpbGl0eSBhbmQgbGF0ZW5jeSBkYXNoYm9hcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQge1xuICAvKipcbiAgICogVGhlIHNlcnZpY2UgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IGRhc2hib2FyZFxuICAgKi9cbiAgZGFzaGJvYXJkOiBEYXNoYm9hcmQ7XG59XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { Dashboard } from 'aws-cdk-lib/aws-cloudwatch';
2
+ import { Construct } from 'constructs';
3
+ import { IOperationAvailabilityAndLatencyDashboard } from './IOperationAvailabilityAndLatencyDashboard';
4
+ import { OperationAvailabilityAndLatencyDashboardProps } from './props/OperationAvailabilityAndLatencyDashboardProps';
5
+ /**
6
+ * Creates an operation level availability and latency dashboard
7
+ */
8
+ export declare class OperationAvailabilityAndLatencyDashboard extends Construct implements IOperationAvailabilityAndLatencyDashboard {
9
+ private static createTopLevelAggregateAlarmWidgets;
10
+ private static createAvailabilityWidgets;
11
+ private static createLatencyWidgets;
12
+ private static createApplicationLoadBalancerWidgets;
13
+ private static createNetworkLoadBalancerWidgets;
14
+ /**
15
+ * The operation level dashboard
16
+ */
17
+ dashboard: Dashboard;
18
+ private azMapper;
19
+ constructor(scope: Construct, id: string, props: OperationAvailabilityAndLatencyDashboardProps);
20
+ }