@cdklabs/multi-az-observability 0.0.1-alpha.3 → 0.0.1-alpha.31

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 (100) hide show
  1. package/.jsii +374 -147
  2. package/API.md +292 -100
  3. package/README.md +21 -14
  4. package/cdk.json +1 -1
  5. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +7 -7
  6. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +35 -35
  7. package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +2 -2
  8. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +6 -15
  9. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +2 -10
  10. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.d.ts +11 -3
  11. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +24 -13
  12. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -8
  13. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
  14. package/lib/alarmsandrules/IOperationAlarmsAndRules.d.ts +19 -27
  15. package/lib/alarmsandrules/IOperationAlarmsAndRules.js +1 -1
  16. package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.js +1 -1
  17. package/lib/alarmsandrules/IServiceAlarmsAndRules.d.ts +0 -8
  18. package/lib/alarmsandrules/IServiceAlarmsAndRules.js +1 -1
  19. package/lib/alarmsandrules/OperationAlarmsAndRules.d.ts +14 -22
  20. package/lib/alarmsandrules/OperationAlarmsAndRules.js +51 -71
  21. package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.d.ts +5 -5
  22. package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.js +2 -3
  23. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.d.ts +21 -13
  24. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +43 -29
  25. package/lib/alarmsandrules/ServiceAlarmsAndRules.d.ts +0 -2
  26. package/lib/alarmsandrules/ServiceAlarmsAndRules.js +61 -39
  27. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +6 -44
  28. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
  29. package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.d.ts +28 -7
  30. package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.js +1 -1
  31. package/lib/azmapper/AvailabilityZoneMapper.js +4 -3
  32. package/lib/basic_observability/BasicServiceDashboard.d.ts +0 -3
  33. package/lib/basic_observability/BasicServiceDashboard.js +24 -112
  34. package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
  35. package/lib/basic_observability/BasicServiceMultiAZObservability.js +100 -312
  36. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +50 -0
  37. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
  38. package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
  39. package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
  40. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -38
  41. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
  42. package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
  43. package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
  44. package/lib/canaries/CanaryFunction.js +7 -6
  45. package/lib/canaries/src/canary.zip +0 -0
  46. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +2 -6
  47. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +440 -506
  48. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +0 -1
  49. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +56 -113
  50. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +3 -66
  51. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
  52. package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
  53. package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
  54. package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
  55. package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
  56. package/lib/index.d.ts +5 -0
  57. package/lib/index.js +8 -2
  58. package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +72 -4
  59. package/lib/metrics/ApplicationLoadBalancerMetrics.js +671 -33
  60. package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
  61. package/lib/metrics/AvailabilityAndLatencyMetrics.js +117 -24
  62. package/lib/metrics/NatGatewayMetrics.d.ts +113 -0
  63. package/lib/metrics/NatGatewayMetrics.js +357 -0
  64. package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
  65. package/lib/metrics/RegionalLatencyMetrics.js +27 -20
  66. package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
  67. package/lib/metrics/ZonalAvailabilityMetrics.js +10 -25
  68. package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
  69. package/lib/metrics/ZonalLatencyMetrics.js +33 -23
  70. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
  71. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
  72. package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
  73. package/lib/metrics/props/LatencyMetricProps.js +1 -1
  74. package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
  75. package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
  76. package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
  77. package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
  78. package/lib/monitoring/src/monitoring-layer.zip +0 -0
  79. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
  80. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
  81. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts +18 -0
  82. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
  83. package/lib/outlier-detection/OutlierDetectionFunction.js +6 -5
  84. package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
  85. package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
  86. package/lib/outlier-detection/src/outlier-detection.zip +0 -0
  87. package/lib/outlier-detection/src/scipy-layer.zip +0 -0
  88. package/lib/services/CanaryMetrics.js +1 -1
  89. package/lib/services/CanaryTestMetricsOverride.js +1 -1
  90. package/lib/services/ContributorInsightRuleDetails.js +1 -1
  91. package/lib/services/InstrumentedServiceMultiAZObservability.d.ts +10 -0
  92. package/lib/services/InstrumentedServiceMultiAZObservability.js +188 -194
  93. package/lib/services/Operation.js +1 -1
  94. package/lib/services/OperationMetricDetails.js +1 -1
  95. package/lib/services/Service.js +1 -1
  96. package/lib/services/ServiceMetricDetails.js +1 -1
  97. package/lib/services/props/MetricDimensions.js +1 -1
  98. package/lib/utilities/MetricsHelper.d.ts +15 -10
  99. package/lib/utilities/MetricsHelper.js +19 -11
  100. package/package.json +8 -8
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NatGatewayMetrics = void 0;
4
+ const MetricsHelper_1 = require("../utilities/MetricsHelper");
5
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const PacketLossOutlierAlgorithm_1 = require("../outlier-detection/PacketLossOutlierAlgorithm");
8
+ /**
9
+ * Provides functions for getting CloudWatch metrics and alarms for NAT Gateways.
10
+ */
11
+ class NatGatewayMetrics {
12
+ /**
13
+ * Gets the count of packet drops for all NAT Gateways that belong to the provided AZ
14
+ * @param natgws
15
+ * @param availabilityZoneId
16
+ * @param period
17
+ * @returns
18
+ */
19
+ static getDroppedPacketCountMetricForAZ(natgws, availabilityZoneId, period, prefix, color) {
20
+ let keyprefix = prefix ? prefix : MetricsHelper_1.MetricsHelper.nextChar();
21
+ let packetDropCountMetrics = {};
22
+ natgws.forEach((natgw, index) => {
23
+ packetDropCountMetrics[`${keyprefix}${index}`] = new aws_cloudwatch_1.Metric({
24
+ metricName: 'PacketsDropCount',
25
+ namespace: 'AWS/NATGateway',
26
+ statistic: aws_cloudwatch_1.Stats.SUM,
27
+ unit: aws_cloudwatch_1.Unit.COUNT,
28
+ label: availabilityZoneId,
29
+ dimensionsMap: {
30
+ NatGatewayId: natgw.attrNatGatewayId,
31
+ },
32
+ period: period,
33
+ });
34
+ });
35
+ return new aws_cloudwatch_1.MathExpression({
36
+ expression: Object.keys(packetDropCountMetrics).join("+"),
37
+ usingMetrics: packetDropCountMetrics,
38
+ period: period,
39
+ label: availabilityZoneId,
40
+ color: color
41
+ });
42
+ }
43
+ /**
44
+ * Get the packet drop rate for all NAT Gateways that belong to the provided AZ
45
+ * @param natgws
46
+ * @param availabilityZoneId
47
+ * @param period
48
+ * @returns Percent of packet drops like 52%
49
+ */
50
+ static getDroppedPacketRateMetricForAZ(natgws, availabilityZoneId, period, prefix, color) {
51
+ let keyprefix = prefix ? prefix : MetricsHelper_1.MetricsHelper.nextChar();
52
+ let packetDropCountMetrics = {};
53
+ let packetsInFromSourceMetrics = {};
54
+ let packetsInFromDestinationMetrics = {};
55
+ natgws.forEach((natgw, index) => {
56
+ packetDropCountMetrics[`${keyprefix}${index}1`] = new aws_cloudwatch_1.Metric({
57
+ metricName: 'PacketsDropCount',
58
+ namespace: 'AWS/NATGateway',
59
+ statistic: aws_cloudwatch_1.Stats.SUM,
60
+ unit: aws_cloudwatch_1.Unit.COUNT,
61
+ label: availabilityZoneId + ' packet drops',
62
+ dimensionsMap: {
63
+ NatGatewayId: natgw.attrNatGatewayId,
64
+ },
65
+ period: period,
66
+ });
67
+ // Calculate packets in from source
68
+ packetsInFromSourceMetrics[`${keyprefix}${index}2`] = new aws_cloudwatch_1.Metric({
69
+ metricName: 'PacketsInFromSource',
70
+ namespace: 'AWS/NATGateway',
71
+ statistic: aws_cloudwatch_1.Stats.SUM,
72
+ unit: aws_cloudwatch_1.Unit.COUNT,
73
+ label: availabilityZoneId + ' packets in from source',
74
+ dimensionsMap: {
75
+ NatGatewayId: natgw.attrNatGatewayId,
76
+ },
77
+ period: period,
78
+ });
79
+ // Calculate packets in from destination
80
+ packetsInFromDestinationMetrics[`${keyprefix}${index}3`] = new aws_cloudwatch_1.Metric({
81
+ metricName: 'PacketsInFromDestination',
82
+ namespace: 'AWS/NATGateway',
83
+ statistic: aws_cloudwatch_1.Stats.SUM,
84
+ unit: aws_cloudwatch_1.Unit.COUNT,
85
+ label: availabilityZoneId + ' packets in from destination',
86
+ dimensionsMap: {
87
+ NatGatewayId: natgw.attrNatGatewayId,
88
+ },
89
+ period: period,
90
+ });
91
+ });
92
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
93
+ let packetDropTotal = new aws_cloudwatch_1.MathExpression({
94
+ expression: Object.keys(packetDropCountMetrics).join("+"),
95
+ usingMetrics: packetDropCountMetrics,
96
+ period: period
97
+ });
98
+ let packetsInFromSourceTotal = new aws_cloudwatch_1.MathExpression({
99
+ expression: Object.keys(packetsInFromSourceMetrics).join("+"),
100
+ usingMetrics: packetsInFromSourceMetrics,
101
+ period: period
102
+ });
103
+ let packetsInFromDestinationTotal = new aws_cloudwatch_1.MathExpression({
104
+ expression: Object.keys(packetsInFromDestinationMetrics).join("+"),
105
+ usingMetrics: packetsInFromDestinationMetrics,
106
+ period: period
107
+ });
108
+ let usingMetrics = {};
109
+ usingMetrics[`${keyprefix}1`] = packetDropTotal;
110
+ usingMetrics[`${keyprefix}2`] = packetsInFromSourceTotal;
111
+ usingMetrics[`${keyprefix}3`] = packetsInFromDestinationTotal;
112
+ // Calculate a percentage of dropped packets for the NAT GW
113
+ return new aws_cloudwatch_1.MathExpression({
114
+ expression: `(${keyprefix}1 / (${keyprefix}2 + ${keyprefix}3)) * 100`,
115
+ usingMetrics: usingMetrics,
116
+ label: availabilityZoneId,
117
+ period: period,
118
+ color: color
119
+ });
120
+ }
121
+ /**
122
+ * Get the packet count for all NAT Gateways that belong to the provided AZ
123
+ * @param natgws
124
+ * @param availabilityZoneId
125
+ * @param period
126
+ * @returns
127
+ */
128
+ static getTotalPacketCountMetricForAZ(natgws, availabilityZoneId, period, prefix, color) {
129
+ let keyprefix = prefix ? prefix : MetricsHelper_1.MetricsHelper.nextChar();
130
+ let usingMetrics = {};
131
+ natgws.forEach((natgw, index) => {
132
+ // Calculate packets in from source
133
+ usingMetrics[`${keyprefix}${index}1`] = new aws_cloudwatch_1.Metric({
134
+ metricName: 'PacketsInFromSource',
135
+ namespace: 'AWS/NATGateway',
136
+ statistic: aws_cloudwatch_1.Stats.SUM,
137
+ unit: aws_cloudwatch_1.Unit.COUNT,
138
+ label: availabilityZoneId + ' packets in from source',
139
+ dimensionsMap: {
140
+ NatGatewayId: natgw.attrNatGatewayId,
141
+ },
142
+ period: period,
143
+ });
144
+ // Calculate packets in from destination
145
+ usingMetrics[`${keyprefix}${index}2`] = new aws_cloudwatch_1.Metric({
146
+ metricName: 'PacketsInFromDestination',
147
+ namespace: 'AWS/NATGateway',
148
+ statistic: aws_cloudwatch_1.Stats.SUM,
149
+ unit: aws_cloudwatch_1.Unit.COUNT,
150
+ label: availabilityZoneId + ' packets in from destination',
151
+ dimensionsMap: {
152
+ NatGatewayId: natgw.attrNatGatewayId,
153
+ },
154
+ period: period,
155
+ });
156
+ });
157
+ // Calculate total packets in from sources and destinations
158
+ return new aws_cloudwatch_1.MathExpression({
159
+ expression: Object.keys(usingMetrics).join("+"),
160
+ usingMetrics: usingMetrics,
161
+ label: availabilityZoneId,
162
+ period: period,
163
+ color: color
164
+ });
165
+ }
166
+ /**
167
+ * Returns an alarm indicating if the quantity of packet drops in a single AZ across all NAT Gateways in that
168
+ * AZ exceeds a threshold compared to all packet loss across all AZs.
169
+ *
170
+ * For example:
171
+ *
172
+ * A = 150 packets
173
+ * B = 175 packets
174
+ * C = 160 packets
175
+ *
176
+ * And the selected AZ is "A", then the calculation is 150 / (150 + 175 + 160).
177
+ *
178
+ * @param scope
179
+ * @param natgws
180
+ * @param availabilityZoneId
181
+ * @param availabilityZone
182
+ * @param threshold
183
+ * @param period
184
+ * @param evaluationPeriods
185
+ * @param datapointsToAlarm
186
+ * @returns
187
+ */
188
+ static isAZAnOutlierForPacketLossNATGW(scope, natgws, algorithm, availabilityZone, azMapper, threshold, period, evaluationPeriods, datapointsToAlarm) {
189
+ let azPacketDropCountMetrics = {};
190
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(availabilityZone.substring(availabilityZone.length - 1));
191
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
192
+ Object.keys(natgws).forEach((az) => {
193
+ let azLetter = az.substring(az.length - 1);
194
+ let azId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
195
+ azPacketDropCountMetrics[azLetter] = NatGatewayMetrics.getDroppedPacketCountMetricForAZ(natgws[az], azId, period, keyprefix);
196
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
197
+ });
198
+ switch (algorithm) {
199
+ case PacketLossOutlierAlgorithm_1.PacketLossOutlierAlgorithm.STATIC:
200
+ default:
201
+ return new aws_cloudwatch_1.Alarm(scope, availabilityZone.substring(availabilityZone.length - 1) + "-packet-loss-outlier", {
202
+ metric: new aws_cloudwatch_1.MathExpression({
203
+ expression: `(${availabilityZone.substring(availabilityZone.length - 1)} / (${Object.keys(azPacketDropCountMetrics).join("+")})) * 100`,
204
+ usingMetrics: azPacketDropCountMetrics,
205
+ period: period,
206
+ label: availabilityZoneId + "-packet-loss-percentage-of-total"
207
+ }),
208
+ threshold: threshold,
209
+ evaluationPeriods: evaluationPeriods,
210
+ datapointsToAlarm: datapointsToAlarm,
211
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
212
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
213
+ });
214
+ }
215
+ }
216
+ /**
217
+ * Creates an alarm to determine is the packet loss rate in a single AZ across all NAT Gateways provided
218
+ * for that AZ exceed the provided threshold.
219
+ * @param scope
220
+ * @param natgws
221
+ * @param availabilityZoneId
222
+ * @param availabilityZone
223
+ * @param threshold
224
+ * @param period
225
+ * @param evaluationPeriods
226
+ * @param datapointsToAlarm
227
+ * @returns
228
+ */
229
+ static isThereAnAZPacketLossImpactNATGW(scope, natgws, availabilityZoneId, availabilityZone, threshold, period, evaluationPeriods, datapointsToAlarm) {
230
+ // Calculate a percentage of dropped packets for the NAT GW
231
+ let packetDropPercentage = NatGatewayMetrics.getDroppedPacketRateMetricForAZ(natgws, availabilityZoneId, period);
232
+ // Create an alarm for this NAT GW if packet drops exceed the specified threshold
233
+ return new aws_cloudwatch_1.Alarm(scope, availabilityZone.substring(availabilityZone.length - 1) + "-packet-drop-impact-alarm", {
234
+ alarmName: availabilityZoneId +
235
+ '-packet-drop-impact',
236
+ actionsEnabled: false,
237
+ metric: packetDropPercentage,
238
+ threshold: threshold,
239
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
240
+ evaluationPeriods: evaluationPeriods,
241
+ datapointsToAlarm: datapointsToAlarm,
242
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
243
+ });
244
+ }
245
+ /**
246
+ * Gets the count of all packets from all NAT Gateways in each provided Availability Zone.
247
+ * @param natgws
248
+ * @param azMapper
249
+ * @param period
250
+ * @returns
251
+ */
252
+ static getTotalPacketCountForEveryAZ(natgws, azMapper, period) {
253
+ let usingMetrics = {};
254
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
255
+ Object.keys(natgws).forEach((availabilityZone, index) => {
256
+ let azLetter = availabilityZone.substring(availabilityZone.length - 1);
257
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
258
+ usingMetrics[azLetter] = this.getTotalPacketCountMetricForAZ(natgws[availabilityZone], availabilityZoneId, period, keyprefix, MetricsHelper_1.MetricsHelper.colors[index]);
259
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
260
+ });
261
+ return usingMetrics;
262
+ }
263
+ /**
264
+ * Gets the count of packet drops from all NAT Gateways in each provided Availability Zone.
265
+ * @param natgws
266
+ * @param azMapper
267
+ * @param period
268
+ * @returns
269
+ */
270
+ static getTotalPacketDropsForEveryAZ(natgws, azMapper, period) {
271
+ let usingMetrics = {};
272
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
273
+ Object.keys(natgws).forEach((availabilityZone, index) => {
274
+ let azLetter = availabilityZone.substring(availabilityZone.length - 1);
275
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
276
+ usingMetrics[azLetter] = this.getDroppedPacketCountMetricForAZ(natgws[availabilityZone], availabilityZoneId, period, keyprefix, MetricsHelper_1.MetricsHelper.colors[index]);
277
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
278
+ });
279
+ return usingMetrics;
280
+ }
281
+ /**
282
+ * Gets the packet drop rate from all NAT Gateways in each provided Availability Zone.
283
+ * @param natgws
284
+ * @param azMapper
285
+ * @param period
286
+ * @returns
287
+ */
288
+ static getTotalPacketDropRateForEveryAZ(natgws, azMapper, period) {
289
+ let usingMetrics = {};
290
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
291
+ Object.keys(natgws).forEach((availabilityZone, index) => {
292
+ let azLetter = availabilityZone.substring(availabilityZone.length - 1);
293
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
294
+ usingMetrics[azLetter] = this.getDroppedPacketRateMetricForAZ(natgws[availabilityZone], availabilityZoneId, period, keyprefix, MetricsHelper_1.MetricsHelper.colors[index]);
295
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
296
+ });
297
+ return usingMetrics;
298
+ }
299
+ static generateNatGatewayWidgets(natgws, azMapper, period, packetDropRateThreshold) {
300
+ let widgets = [];
301
+ widgets.push(new aws_cloudwatch_1.TextWidget({
302
+ markdown: 'NAT Gateway Metrics',
303
+ height: 2,
304
+ width: 24,
305
+ }));
306
+ let totalPacketsMetrics = NatGatewayMetrics.getTotalPacketCountForEveryAZ(natgws, azMapper, period);
307
+ let packetDropMetrics = NatGatewayMetrics.getTotalPacketDropsForEveryAZ(natgws, azMapper, period);
308
+ let packetDropRateMetrics = NatGatewayMetrics.getTotalPacketDropRateForEveryAZ(natgws, azMapper, period);
309
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
310
+ height: 6,
311
+ width: 8,
312
+ title: aws_cdk_lib_1.Aws.REGION + ' NAT Gateway Total Packets',
313
+ region: aws_cdk_lib_1.Aws.REGION,
314
+ left: Object.values(totalPacketsMetrics),
315
+ statistic: 'Sum',
316
+ leftYAxis: {
317
+ min: 0,
318
+ label: 'Count',
319
+ showUnits: false,
320
+ }
321
+ }));
322
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
323
+ height: 6,
324
+ width: 8,
325
+ title: aws_cdk_lib_1.Aws.REGION + ' NAT Gateway Dropped Packets',
326
+ region: aws_cdk_lib_1.Aws.REGION,
327
+ left: Object.values(packetDropMetrics),
328
+ statistic: 'Sum',
329
+ leftYAxis: {
330
+ min: 0,
331
+ label: 'Count',
332
+ showUnits: false,
333
+ }
334
+ }));
335
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
336
+ height: 6,
337
+ width: 8,
338
+ title: aws_cdk_lib_1.Aws.REGION + ' NAT Gateway Dropped Packet Rate',
339
+ region: aws_cdk_lib_1.Aws.REGION,
340
+ left: Object.values(packetDropRateMetrics),
341
+ leftYAxis: {
342
+ min: 0,
343
+ label: 'Percent',
344
+ showUnits: false,
345
+ },
346
+ leftAnnotations: [
347
+ {
348
+ label: "High Severity",
349
+ value: packetDropRateThreshold
350
+ }
351
+ ]
352
+ }));
353
+ return widgets;
354
+ }
355
+ }
356
+ exports.NatGatewayMetrics = NatGatewayMetrics;
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmF0R2F0ZXdheU1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy9OYXRHYXRld2F5TWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw4REFBMkQ7QUFDM0QsK0RBQWlMO0FBQ2pMLDZDQUE0QztBQUc1QyxnR0FBNkY7QUFFN0Y7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQUUxQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsZ0NBQWdDLENBQ25DLE1BQXVCLEVBQ3ZCLGtCQUEwQixFQUMxQixNQUFnQixFQUNoQixNQUFlLEVBQ2YsS0FBYztRQUdkLElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyw2QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25FLElBQUksc0JBQXNCLEdBQTZCLEVBQUUsQ0FBQztRQUUxRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBb0IsRUFBRSxLQUFhLEVBQUMsRUFBRTtZQUVsRCxzQkFBc0IsQ0FBQyxHQUFHLFNBQVMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksdUJBQU0sQ0FBQztnQkFDMUQsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsU0FBUyxFQUFFLGdCQUFnQjtnQkFDM0IsU0FBUyxFQUFFLHNCQUFLLENBQUMsR0FBRztnQkFDcEIsSUFBSSxFQUFFLHFCQUFJLENBQUMsS0FBSztnQkFDaEIsS0FBSyxFQUFFLGtCQUFrQjtnQkFDekIsYUFBYSxFQUFFO29CQUNiLFlBQVksRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2lCQUNyQztnQkFDRCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLCtCQUFjLENBQUM7WUFDeEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMs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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuTmF0R2F0ZXdheSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBNZXRyaWNzSGVscGVyIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9NZXRyaWNzSGVscGVyXCI7XG5pbXBvcnQgeyBBbGFybSwgQ29tcGFyaXNvbk9wZXJhdG9yLCBHcmFwaFdpZGdldCwgSUFsYXJtLCBJTWV0cmljLCBJV2lkZ2V0LCBNYXRoRXhwcmVzc2lvbiwgTWV0cmljLCBTdGF0cywgVGV4dFdpZGdldCwgVHJlYXRNaXNzaW5nRGF0YSwgVW5pdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgQXdzLCBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJQXZhaWxhYmlsaXR5Wm9uZU1hcHBlciB9IGZyb20gXCIuLi9hem1hcHBlci9JQXZhaWxhYmlsaXR5Wm9uZU1hcHBlclwiO1xuaW1wb3J0IHsgUGFja2V0TG9zc091dGxpZXJBbGdvcml0aG0gfSBmcm9tIFwiLi4vb3V0bGllci1kZXRlY3Rpb24vUGFja2V0TG9zc091dGxpZXJBbGdvcml0aG1cIjtcblxuLyoqXG4gKiBQcm92aWRlcyBmdW5jdGlvbnMgZm9yIGdldHRpbmcgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBhbGFybXMgZm9yIE5BVCBHYXRld2F5cy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hdEdhdGV3YXlNZXRyaWNzIHtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvdW50IG9mIHBhY2tldCBkcm9wcyBmb3IgYWxsIE5BVCBHYXRld2F5cyB0aGF0IGJlbG9uZyB0byB0aGUgcHJvdmlkZWQgQVpcbiAgICAgKiBAcGFyYW0gbmF0Z3dzIFxuICAgICAqIEBwYXJhbSBhdmFpbGFiaWxpdHlab25lSWQgXG4gICAgICogQHBhcmFtIHBlcmlvZCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RHJvcHBlZFBhY2tldENvdW50TWV0cmljRm9yQVooXG4gICAgICAgIG5hdGd3czogQ2ZuTmF0R2F0ZXdheVtdLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICAgICAgcHJlZml4Pzogc3RyaW5nLFxuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICkgOiBJTWV0cmljIFxuICAgIHtcbiAgICAgICAgbGV0IGtleXByZWZpeDogc3RyaW5nID0gcHJlZml4ID8gcHJlZml4IDogTWV0cmljc0hlbHBlci5uZXh0Q2hhcigpO1xuICAgICAgICBsZXQgcGFja2V0RHJvcENvdW50TWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG5cbiAgICAgICAgbmF0Z3dzLmZvckVhY2goKG5hdGd3OiBDZm5OYXRHYXRld2F5LCBpbmRleDogbnVtYmVyKT0+IHtcbiAgICAgICAgXG4gICAgICAgICAgICBwYWNrZXREcm9wQ291bnRNZXRyaWNzW2Ake2tleXByZWZpeH0ke2luZGV4fWBdID0gbmV3IE1ldHJpYyh7XG4gICAgICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzRHJvcENvdW50JyxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05BVEdhdGV3YXknLFxuICAgICAgICAgICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgICAgICAgIE5hdEdhdGV3YXlJZDogbmF0Z3cuYXR0ck5hdEdhdGV3YXlJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXMocGFja2V0RHJvcENvdW50TWV0cmljcykuam9pbihcIitcIiksXG4gICAgICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXREcm9wQ291bnRNZXRyaWNzLFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQsIFxuICAgICAgICAgIGNvbG9yOiBjb2xvclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBhY2tldCBkcm9wIHJhdGUgZm9yIGFsbCBOQVQgR2F0ZXdheXMgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3ZpZGVkIEFaXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmlsaXR5Wm9uZUlkIFxuICAgICAqIEBwYXJhbSBwZXJpb2QgXG4gICAgICogQHJldHVybnMgUGVyY2VudCBvZiBwYWNrZXQgZHJvcHMgbGlrZSA1MiVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RHJvcHBlZFBhY2tldFJhdGVNZXRyaWNGb3JBWihcbiAgICAgICAgbmF0Z3dzOiBDZm5OYXRHYXRld2F5W10sXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgICAgICBwcmVmaXg/OiBzdHJpbmcsXG4gICAgICAgIGNvbG9yPzogc3RyaW5nXG4gICAgKSA6IElNZXRyaWMgXG4gICAge1xuICAgICAgICBcbiAgICAgICAgbGV0IGtleXByZWZpeCA9IHByZWZpeCA/IHByZWZpeCA6IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgICAgICBsZXQgcGFja2V0RHJvcENvdW50TWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIGxldCBwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIGxldCBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25NZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIG5hdGd3cy5mb3JFYWNoKChuYXRndzogQ2ZuTmF0R2F0ZXdheSwgaW5kZXg6IG51bWJlcik9PiB7XG5cbiAgICAgICAgICBwYWNrZXREcm9wQ291bnRNZXRyaWNzW2Ake2tleXByZWZpeH0ke2luZGV4fTFgXSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgICAgbWV0cmljTmFtZTogJ1BhY2tldHNEcm9wQ291bnQnLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05BVEdhdGV3YXknLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgcGFja2V0IGRyb3BzJyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIH0pO1xuICAgICAgXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHBhY2tldHMgaW4gZnJvbSBzb3VyY2VcbiAgICAgICAgICBwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH0yYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzSW5Gcm9tU291cmNlJyxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldHMgaW4gZnJvbSBzb3VyY2UnLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgfSk7XG4gICAgICBcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgcGFja2V0cyBpbiBmcm9tIGRlc3RpbmF0aW9uXG4gICAgICAgICAgcGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH0zYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzSW5Gcm9tRGVzdGluYXRpb24nLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05BVEdhdGV3YXknLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgcGFja2V0cyBpbiBmcm9tIGRlc3RpbmF0aW9uJyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG5cbiAgICAgICAgbGV0IHBhY2tldERyb3BUb3RhbDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXMocGFja2V0RHJvcENvdW50TWV0cmljcykuam9pbihcIitcIiksXG4gICAgICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXREcm9wQ291bnRNZXRyaWNzLFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwYWNrZXRzSW5Gcm9tU291cmNlVG90YWw6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHBhY2tldHNJbkZyb21Tb3VyY2VNZXRyaWNzKS5qb2luKFwiK1wiKSxcbiAgICAgICAgICB1c2luZ01ldHJpY3M6IHBhY2tldHNJbkZyb21Tb3VyY2VNZXRyaWNzLFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25Ub3RhbDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXMocGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljcykuam9pbihcIitcIiksXG4gICAgICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25NZXRyaWNzLFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG4gICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlwcmVmaXh9MWBdID0gcGFja2V0RHJvcFRvdGFsO1xuICAgICAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTJgXSA9IHBhY2tldHNJbkZyb21Tb3VyY2VUb3RhbDtcbiAgICAgICAgdXNpbmdNZXRyaWNzW2Ake2tleXByZWZpeH0zYF0gPSBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25Ub3RhbDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgYSBwZXJjZW50YWdlIG9mIGRyb3BwZWQgcGFja2V0cyBmb3IgdGhlIE5BVCBHV1xuICAgICAgICByZXR1cm4gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICBleHByZXNzaW9uOiBgKCR7a2V5cHJlZml4fTEgLyAoJHtrZXlwcmVmaXh9MiArICR7a2V5cHJlZml4fTMpKSAqIDEwMGAsXG4gICAgICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICBjb2xvcjogY29sb3JcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwYWNrZXQgY291bnQgZm9yIGFsbCBOQVQgR2F0ZXdheXMgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3ZpZGVkIEFaXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmlsaXR5Wm9uZUlkIFxuICAgICAqIEBwYXJhbSBwZXJpb2QgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgc3RhdGljIGdldFRvdGFsUGFja2V0Q291bnRNZXRyaWNGb3JBWihcbiAgICAgICAgbmF0Z3dzOiBDZm5OYXRHYXRld2F5W10sXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgICAgICBwcmVmaXg/OiBzdHJpbmcsXG4gICAgICAgIGNvbG9yPzogc3RyaW5nXG4gICAgKSA6IElNZXRyaWMgXG4gICAge1xuICAgICAgICBsZXQga2V5cHJlZml4ID0gcHJlZml4ID8gcHJlZml4IDogTWV0cmljc0hlbHBlci5uZXh0Q2hhcigpO1xuICAgICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIG5hdGd3cy5mb3JFYWNoKChuYXRndzogQ2ZuTmF0R2F0ZXdheSwgaW5kZXg6IG51bWJlcik9PiB7XG4gICAgICBcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgcGFja2V0cyBpbiBmcm9tIHNvdXJjZVxuICAgICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH0xYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzSW5Gcm9tU291cmNlJyxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldHMgaW4gZnJvbSBzb3VyY2UnLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgfSk7XG4gICAgICBcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgcGFja2V0cyBpbiBmcm9tIGRlc3RpbmF0aW9uXG4gICAgICAgICAgdXNpbmdNZXRyaWNzW2Ake2tleXByZWZpeH0ke2luZGV4fTJgXSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgICAgbWV0cmljTmFtZTogJ1BhY2tldHNJbkZyb21EZXN0aW5hdGlvbicsXG4gICAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXRzIGluIGZyb20gZGVzdGluYXRpb24nLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBwYWNrZXRzIGluIGZyb20gc291cmNlcyBhbmQgZGVzdGluYXRpb25zXG4gICAgICAgIHJldHVybiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbihcIitcIiksXG4gICAgICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICBjb2xvcjogY29sb3JcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgKiBSZXR1cm5zIGFuIGFsYXJtIGluZGljYXRpbmcgaWYgdGhlIHF1YW50aXR5IG9mIHBhY2tldCBkcm9wcyBpbiBhIHNpbmdsZSBBWiBhY3Jvc3MgYWxsIE5BVCBHYXRld2F5cyBpbiB0aGF0XG4gICAgICAgKiBBWiBleGNlZWRzIGEgdGhyZXNob2xkIGNvbXBhcmVkIHRvIGFsbCBwYWNrZXQgbG9zcyBhY3Jvc3MgYWxsIEFacy5cbiAgICAgICAqIFxuICAgICAgICogRm9yIGV4YW1wbGU6XG4gICAgICAgKiBcbiAgICAgICAqIEEgPSAxNTAgcGFja2V0c1xuICAgICAgICogQiA9IDE3NSBwYWNrZXRzXG4gICAgICAgKiBDID0gMTYwIHBhY2tldHNcbiAgICAgICAqIFxuICAgICAgICogQW5kIHRoZSBzZWxlY3RlZCBBWiBpcyBcIkFcIiwgdGhlbiB0aGUgY2FsY3VsYXRpb24gaXMgMTUwIC8gKDE1MCArIDE3NSArIDE2MCkuXG4gICAgICAgKiBcbiAgICAgICAqIEBwYXJhbSBzY29wZSBcbiAgICAgICAqIEBwYXJhbSBuYXRnd3MgXG4gICAgICAgKiBAcGFyYW0gYXZhaWxhYmlsaXR5Wm9uZUlkIFxuICAgICAgICogQHBhcmFtIGF2YWlsYWJpbGl0eVpvbmUgXG4gICAgICAgKiBAcGFyYW0gdGhyZXNob2xkIFxuICAgICAgICogQHBhcmFtIHBlcmlvZCBcbiAgICAgICAqIEBwYXJhbSBldmFsdWF0aW9uUGVyaW9kcyBcbiAgICAgICAqIEBwYXJhbSBkYXRhcG9pbnRzVG9BbGFybSBcbiAgICAgICAqIEByZXR1cm5zIFxuICAgICAgICovXG4gICAgc3RhdGljIGlzQVpBbk91dGxpZXJGb3JQYWNrZXRMb3NzTkFUR1coXG4gICAgICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgICAgICBuYXRnd3M6IHtba2V5OiBzdHJpbmddOiBDZm5OYXRHYXRld2F5W119LCBcbiAgICAgICAgYWxnb3JpdGhtOiBQYWNrZXRMb3NzT3V0bGllckFsZ29yaXRobSxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgICAgICBhek1hcHBlcjogSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXIsXG4gICAgICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyLFxuICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogbnVtYmVyXG4gICAgKSA6IElBbGFybSB7XG4gICAgICAgIGxldCBhelBhY2tldERyb3BDb3VudE1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBhek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgbGV0IGtleXByZWZpeDogc3RyaW5nID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcigpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKG5hdGd3cykuZm9yRWFjaCgoYXo6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGxldCBhekxldHRlciA9IGF6LnN1YnN0cmluZyhhei5sZW5ndGggLSAxKTtcbiAgICAgICAgICBsZXQgYXpJZCA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgICAgICAgICBhelBhY2tldERyb3BDb3VudE1ldHJpY3NbYXpMZXR0ZXJdID0gTmF0R2F0ZXdheU1ldHJpY3MuZ2V0RHJvcHBlZFBhY2tldENvdW50TWV0cmljRm9yQVoobmF0Z3dzW2F6XSwgYXpJZCwgcGVyaW9kLCBrZXlwcmVmaXgpO1xuXG4gICAgICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobSkge1xuICAgICAgICAgIGNhc2UgUGFja2V0TG9zc091dGxpZXJBbGdvcml0aG0uU1RBVElDOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsYXJtKFxuICAgICAgICAgICAgICBzY29wZSwgXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSkgKyBcIi1wYWNrZXQtbG9zcy1vdXRsaWVyXCIsIFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIG1ldHJpYzogbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogYCgke2F2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSl9IC8gKCR7T2JqZWN0LmtleXMoYXpQYWNrZXREcm9wQ291bnRNZXRyaWNzKS5qb2luKFwiK1wiKX0pKSAqIDEwMGAsXG4gICAgICAgICAgICAgICAgICAgIHVzaW5nTWV0cmljczogYXpQYWNrZXREcm9wQ291bnRNZXRyaWNzLFxuICAgICAgICAgICAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiLXBhY2tldC1sb3NzLXBlcmNlbnRhZ2Utb2YtdG90YWxcIlxuICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgICAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9ICAgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFsYXJtIHRvIGRldGVybWluZSBpcyB0aGUgcGFja2V0IGxvc3MgcmF0ZSBpbiBhIHNpbmdsZSBBWiBhY3Jvc3MgYWxsIE5BVCBHYXRld2F5cyBwcm92aWRlZFxuICAgICAqIGZvciB0aGF0IEFaIGV4Y2VlZCB0aGUgcHJvdmlkZWQgdGhyZXNob2xkLlxuICAgICAqIEBwYXJhbSBzY29wZSBcbiAgICAgKiBAcGFyYW0gbmF0Z3dzIFxuICAgICAqIEBwYXJhbSBhdmFpbGFiaWxpdHlab25lSWQgXG4gICAgICogQHBhcmFtIGF2YWlsYWJpbGl0eVpvbmUgXG4gICAgICogQHBhcmFtIHRocmVzaG9sZCBcbiAgICAgKiBAcGFyYW0gcGVyaW9kIFxuICAgICAqIEBwYXJhbSBldmFsdWF0aW9uUGVyaW9kcyBcbiAgICAgKiBAcGFyYW0gZGF0YXBvaW50c1RvQWxhcm0gXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgc3RhdGljIGlzVGhlcmVBbkFaUGFja2V0TG9zc0ltcGFjdE5BVEdXKFxuICAgICAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICAgICAgbmF0Z3dzOiBDZm5OYXRHYXRld2F5W10sIFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgICAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcixcbiAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IG51bWJlclxuICAgICAgKSA6IElBbGFybSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBhIHBlcmNlbnRhZ2Ugb2YgZHJvcHBlZCBwYWNrZXRzIGZvciB0aGUgTkFUIEdXXG4gICAgICAgIGxldCBwYWNrZXREcm9wUGVyY2VudGFnZTogSU1ldHJpYyA9IE5hdEdhdGV3YXlNZXRyaWNzLmdldERyb3BwZWRQYWNrZXRSYXRlTWV0cmljRm9yQVoobmF0Z3dzLCBhdmFpbGFiaWxpdHlab25lSWQsIHBlcmlvZCk7XG4gICAgXG4gICAgICAgIC8vIENyZWF0ZSBhbiBhbGFybSBmb3IgdGhpcyBOQVQgR1cgaWYgcGFja2V0IGRyb3BzIGV4Y2VlZCB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZFxuICAgICAgICByZXR1cm4gbmV3IEFsYXJtKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSkgKyBcIi1wYWNrZXQtZHJvcC1pbXBhY3QtYWxhcm1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGFybU5hbWU6XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArXG4gICAgICAgICAgICAgICctcGFja2V0LWRyb3AtaW1wYWN0JyxcbiAgICAgICAgICAgIGFjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIG1ldHJpYzogcGFja2V0RHJvcFBlcmNlbnRhZ2UsXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb3VudCBvZiBhbGwgcGFja2V0cyBmcm9tIGFsbCBOQVQgR2F0ZXdheXMgaW4gZWFjaCBwcm92aWRlZCBBdmFpbGFiaWxpdHkgWm9uZS5cbiAgICAgKiBAcGFyYW0gbmF0Z3dzIFxuICAgICAqIEBwYXJhbSBhek1hcHBlciBcbiAgICAgKiBAcGFyYW0gcGVyaW9kIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUb3RhbFBhY2tldENvdW50Rm9yRXZlcnlBWihcbiAgICAgICAgbmF0Z3dzOiB7W2tleTogc3RyaW5nXTogQ2ZuTmF0R2F0ZXdheVtdfSxcbiAgICAgICAgYXpNYXBwZXI6IElBdmFpbGFiaWxpdHlab25lTWFwcGVyLFxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uXG4gICAgKSA6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfVxuICAgIHtcbiAgICAgICAgbGV0IHVzaW5nTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIGxldCBrZXlwcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhuYXRnd3MpLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgICAgdXNpbmdNZXRyaWNzW2F6TGV0dGVyXSA9IHRoaXMuZ2V0VG90YWxQYWNrZXRDb3VudE1ldHJpY0ZvckFaKG5hdGd3c1thdmFpbGFiaWxpdHlab25lXSwgYXZhaWxhYmlsaXR5Wm9uZUlkLCBwZXJpb2QsIGtleXByZWZpeCwgTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdKTtcblxuICAgICAgICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdXNpbmdNZXRyaWNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvdW50IG9mIHBhY2tldCBkcm9wcyBmcm9tIGFsbCBOQVQgR2F0ZXdheXMgaW4gZWFjaCBwcm92aWRlZCBBdmFpbGFiaWxpdHkgWm9uZS5cbiAgICAgKiBAcGFyYW0gbmF0Z3dzIFxuICAgICAqIEBwYXJhbSBhek1hcHBlciBcbiAgICAgKiBAcGFyYW0gcGVyaW9kIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUb3RhbFBhY2tldERyb3BzRm9yRXZlcnlBWihcbiAgICAgICAgbmF0Z3dzOiB7W2tleTogc3RyaW5nXTogQ2ZuTmF0R2F0ZXdheVtdfSxcbiAgICAgICAgYXpNYXBwZXI6IElBdmFpbGFiaWxpdHlab25lTWFwcGVyLFxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uXG4gICAgKSA6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfVxuICAgIHtcbiAgICAgICAgbGV0IHVzaW5nTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIGxldCBrZXlwcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhuYXRnd3MpLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgICAgdXNpbmdNZXRyaWNzW2F6TGV0dGVyXSA9IHRoaXMuZ2V0RHJvcHBlZFBhY2tldENvdW50TWV0cmljRm9yQVoobmF0Z3dzW2F2YWlsYWJpbGl0eVpvbmVdLCBhdmFpbGFiaWxpdHlab25lSWQsIHBlcmlvZCwga2V5cHJlZml4LCBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF0pO1xuXG4gICAgICAgICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB1c2luZ01ldHJpY3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFja2V0IGRyb3AgcmF0ZSBmcm9tIGFsbCBOQVQgR2F0ZXdheXMgaW4gZWFjaCBwcm92aWRlZCBBdmFpbGFiaWxpdHkgWm9uZS5cbiAgICAgKiBAcGFyYW0gbmF0Z3dzIFxuICAgICAqIEBwYXJhbSBhek1hcHBlciBcbiAgICAgKiBAcGFyYW0gcGVyaW9kIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUb3RhbFBhY2tldERyb3BSYXRlRm9yRXZlcnlBWihcbiAgICAgICAgbmF0Z3dzOiB7W2tleTogc3RyaW5nXTogQ2ZuTmF0R2F0ZXdheVtdfSxcbiAgICAgICAgYXpNYXBwZXI6IElBdmFpbGFiaWxpdHlab25lTWFwcGVyLFxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uXG4gICAgKSA6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfVxuICAgIHtcbiAgICAgICAgbGV0IHVzaW5nTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIGxldCBrZXlwcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhuYXRnd3MpLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgICAgdXNpbmdNZXRyaWNzW2F6TGV0dGVyXSA9IHRoaXMuZ2V0RHJvcHBlZFBhY2tldFJhdGVNZXRyaWNGb3JBWihuYXRnd3NbYXZhaWxhYmlsaXR5Wm9uZV0sIGF2YWlsYWJpbGl0eVpvbmVJZCwgcGVyaW9kLCBrZXlwcmVmaXgsIE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XSk7XG5cbiAgICAgICAgICAgIGtleXByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5cHJlZml4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHVzaW5nTWV0cmljcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVOYXRHYXRld2F5V2lkZ2V0cyhcbiAgICAgIG5hdGd3czoge1trZXk6IHN0cmluZ106IENmbk5hdEdhdGV3YXlbXX0sXG4gICAgICBhek1hcHBlcjogSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXIsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgICAgcGFja2V0RHJvcFJhdGVUaHJlc2hvbGQ6IG51bWJlcixcbiAgICApOiBJV2lkZ2V0W10ge1xuICAgICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuICBcbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICAgIG1hcmtkb3duOiAnTkFUIEdhdGV3YXkgTWV0cmljcycsXG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICBcbiAgICAgIGxldCB0b3RhbFBhY2tldHNNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSBOYXRHYXRld2F5TWV0cmljcy5nZXRUb3RhbFBhY2tldENvdW50Rm9yRXZlcnlBWihuYXRnd3MsIGF6TWFwcGVyLCBwZXJpb2QpO1xuICAgICAgbGV0IHBhY2tldERyb3BNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSBOYXRHYXRld2F5TWV0cmljcy5nZXRUb3RhbFBhY2tldERyb3BzRm9yRXZlcnlBWihuYXRnd3MsIGF6TWFwcGVyLCBwZXJpb2QpO1xuICAgICAgbGV0IHBhY2tldERyb3BSYXRlTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0gTmF0R2F0ZXdheU1ldHJpY3MuZ2V0VG90YWxQYWNrZXREcm9wUmF0ZUZvckV2ZXJ5QVoobmF0Z3dzLCBhek1hcHBlciwgcGVyaW9kKTtcbiAgXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBBd3MuUkVHSU9OICsgJyBOQVQgR2F0ZXdheSBUb3RhbCBQYWNrZXRzJyxcbiAgICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgICAgbGVmdDogT2JqZWN0LnZhbHVlcyh0b3RhbFBhY2tldHNNZXRyaWNzKSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICBcbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IEF3cy5SRUdJT04gKyAnIE5BVCBHYXRld2F5IERyb3BwZWQgUGFja2V0cycsXG4gICAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICAgIGxlZnQ6IE9iamVjdC52YWx1ZXMocGFja2V0RHJvcE1ldHJpY3MpLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIFxuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0aXRsZTogQXdzLlJFR0lPTiArICcgTkFUIEdhdGV3YXkgRHJvcHBlZCBQYWNrZXQgUmF0ZScsXG4gICAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICAgIGxlZnQ6IE9iamVjdC52YWx1ZXMocGFja2V0RHJvcFJhdGVNZXRyaWNzKSxcbiAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnUGVyY2VudCcsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiBcIkhpZ2ggU2V2ZXJpdHlcIixcbiAgICAgICAgICAgICAgdmFsdWU6IHBhY2tldERyb3BSYXRlVGhyZXNob2xkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIFxuICAgICAgcmV0dXJuIHdpZGdldHM7XG4gICAgfVxufSJdfQ==
@@ -29,5 +29,5 @@ export declare class RegionalLatencyMetrics {
29
29
  * @param props
30
30
  * @returns
31
31
  */
32
- static createRegionalServiceLatencyCountMetrics(props: ServiceLatencyMetricProps): IMetric[];
32
+ static createRegionalServiceLatencyCountMetrics(props: ServiceLatencyMetricProps, includeRegionCountAggregate?: boolean): IMetric[];
33
33
  }
@@ -41,30 +41,37 @@ class RegionalLatencyMetrics {
41
41
  * @param props
42
42
  * @returns
43
43
  */
44
- static createRegionalServiceLatencyCountMetrics(props) {
45
- let usingMetrics = {};
46
- let operationMetrics = [];
47
- let keyPrefix = MetricsHelper_1.MetricsHelper.nextChar('');
48
- props.latencyMetricProps.forEach((prop, index) => {
49
- let operationRegionalMetric = this.createRegionalLatencyCountMetric(prop);
50
- operationMetrics.push(operationRegionalMetric);
51
- usingMetrics[`${keyPrefix}${index}`] = operationRegionalMetric;
52
- keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
53
- });
54
- if (Object.keys(usingMetrics).length == 1) {
55
- operationMetrics.push(Object.values(usingMetrics)[0]);
44
+ static createRegionalServiceLatencyCountMetrics(props, includeRegionCountAggregate) {
45
+ if (includeRegionCountAggregate) {
46
+ let usingMetrics = {};
47
+ let operationMetrics = [];
48
+ let keyPrefix = MetricsHelper_1.MetricsHelper.nextChar();
49
+ props.latencyMetricProps.forEach((prop, index) => {
50
+ let operationRegionalMetric = this.createRegionalLatencyCountMetric(prop);
51
+ operationMetrics.push(operationRegionalMetric);
52
+ usingMetrics[`${keyPrefix}${index}`] = operationRegionalMetric;
53
+ keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
54
+ });
55
+ if (Object.keys(usingMetrics).length == 1) {
56
+ operationMetrics.push(Object.values(usingMetrics)[0]);
57
+ }
58
+ else {
59
+ let math = new aws_cloudwatch_1.MathExpression({
60
+ usingMetrics: usingMetrics,
61
+ period: props.period,
62
+ label: props.label,
63
+ expression: Object.keys(usingMetrics).join('+'),
64
+ });
65
+ operationMetrics.splice(0, 0, math);
66
+ }
67
+ return operationMetrics;
56
68
  }
57
69
  else {
58
- let math = new aws_cloudwatch_1.MathExpression({
59
- usingMetrics: usingMetrics,
60
- period: props.period,
61
- label: props.label,
62
- expression: Object.keys(usingMetrics).join('+'),
70
+ return props.latencyMetricProps.map((prop) => {
71
+ return this.createRegionalLatencyCountMetric(prop);
63
72
  });
64
- operationMetrics.splice(0, 0, math);
65
73
  }
66
- return operationMetrics;
67
74
  }
68
75
  }
69
76
  exports.RegionalLatencyMetrics = RegionalLatencyMetrics;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uYWxMYXRlbmN5TWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXRyaWNzL1JlZ2lvbmFsTGF0ZW5jeU1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBa0M7QUFDbEMsK0RBQXFFO0FBQ3JFLG1GQUFnRjtBQUloRiw4REFBMkQ7QUFFM0QsTUFBYSxzQkFBc0I7SUFDakM7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyw0QkFBNEIsQ0FDakMsS0FBaUM7UUFFakMsT0FBTyw2REFBNkIsQ0FBQyxvQkFBb0IsQ0FDdkQsS0FBSyxFQUNMLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQ3JELGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDdkMsS0FBaUM7UUFFakMsT0FBTyw2REFBNkIsQ0FBQywwQkFBMEIsQ0FDN0QsS0FBSyxFQUNMLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQ3JELGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGdDQUFnQyxDQUNyQyxLQUFpQztRQUVqQyxPQUFPLDZEQUE2QixDQUFDLHdCQUF3QixDQUMzRCxLQUFLLEVBQ0wsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FDckQsaUJBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsd0NBQXdDLENBQzdDLEtBQWdDO1FBRWhDLElBQUksWUFBWSxHQUErQixFQUFFLENBQUM7UUFDbEQsSUFBSSxnQkFBZ0IsR0FBYyxFQUFFLENBQUM7UUFDckMsSUFBSSxTQUFTLEdBQVcsNkJBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FDOUIsQ0FBQyxJQUF3QixFQUFFLEtBQWEsRUFBRSxFQUFFO1lBQzFDLElBQUksdUJBQXVCLEdBQ3pCLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU5QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUMvQyxZQUFZLENBQUMsR0FBRyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQztZQUMvRCxTQUFTLEdBQUcsNkJBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLElBQUksR0FBWSxJQUFJLCtCQUFjLENBQUM7Z0JBQ3JDLFlBQVksRUFBRSxZQUFZO2dCQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUNoRCxDQUFDLENBQUM7WUFFSCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUEzRkQsd0RBMkZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgQXdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgSU1ldHJpYywgTWF0aEV4cHJlc3Npb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4vQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1Byb3BzIH0gZnJvbSAnLi9wcm9wcy9MYXRlbmN5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMgfSBmcm9tICcuL3Byb3BzL1JlZ2lvbmFsTGF0ZW5jeU1ldHJpY1Byb3BzJztcbmltcG9ydCB7IFNlcnZpY2VMYXRlbmN5TWV0cmljUHJvcHMgfSBmcm9tICcuL3Byb3BzL1NlcnZpY2VMYXRlbmN5TWVyaWNQcm9wcyc7XG5pbXBvcnQgeyBNZXRyaWNzSGVscGVyIH0gZnJvbSAnLi4vdXRpbGl0aWVzL01ldHJpY3NIZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgUmVnaW9uYWxMYXRlbmN5TWV0cmljcyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbWV0cmljcyBmb3IgcmVnaW9uYWwgbGF0ZW5jeSwgb25lIG1ldHJpYyBwZXIgbWV0cmljIG5hbWUgZm9yIHRoZVxuICAgKiBzcGVjaWZpZWQgdHlwZSBvZiBsYXRlbmN5IG1ldHJpYy4gWW91IHdpbGwgbmVlZCB0byBwZXJmb3JtIHNvbWUgYWdncmVnYXRpb25cbiAgICogb2YgdGhlc2UgbWV0cmljcyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBtZXRyaWMgbmFtZSB0aGF0IGNvcnJlcG9uZHMgdG9cbiAgICogU3VjY2Vzc0xhdGVuY3kgb3IgRmF1bHRMYXRlbmN5LCBsaWtlIGRvaW5nIGFuIGF2ZXJhZ2UuXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVJlZ2lvbmFsTGF0ZW5jeU1ldHJpY3MoXG4gICAgcHJvcHM6IFJlZ2lvbmFsTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICApOiBJTWV0cmljW10ge1xuICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVMYXRlbmN5TWV0cmljcyhcbiAgICAgIHByb3BzLFxuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgQXdzLlJFR0lPTixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcmVnaW9uYWwgYXZlcmFnZSBsYXRlbmN5IG1ldHJpYywgYXZlcmFnZXMgdGhlIHZhbHVlcyBmcm9tIGFsbCBvZiB0aGVcbiAgICogbWV0cmljIG5hbWVzIHRoYXQgcmVwcmVzZW50IGVpdGhlciBTdWNjZXNzTGF0ZW5jeSBvciBGYXVsdExhdGVuY3lcbiAgICogQHBhcmFtIHByb3BzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlUmVnaW9uYWxBdmVyYWdlTGF0ZW5jeU1ldHJpYyhcbiAgICBwcm9wczogUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMsXG4gICk6IElNZXRyaWMge1xuICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVBdmVyYWdlTGF0ZW5jeU1ldHJpYyhcbiAgICAgIHByb3BzLFxuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgQXdzLlJFR0lPTixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY291bnQgb2YgaGlnaCBsYXRlbmN5IG1ldHJpY3MgZm9yIGVpdGhlciBTdWNjZXNzTGF0ZW5jeSBvciBGYXVsdExhdGVuY3lcbiAgICogQHBhcmFtIHByb3BzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlUmVnaW9uYWxMYXRlbmN5Q291bnRNZXRyaWMoXG4gICAgcHJvcHM6IFJlZ2lvbmFsTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICApOiBJTWV0cmljIHtcbiAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlTGF0ZW5jeUNvdW50TWV0cmljKFxuICAgICAgcHJvcHMsXG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICBBd3MuUkVHSU9OLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3VudCBvZiBoaWdoIGxhdGVuY3kgcmVzcG9uc2VzIGZvciBhbGwgY3JpdGljYWwgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVSZWdpb25hbFNlcnZpY2VMYXRlbmN5Q291bnRNZXRyaWNzKFxuICAgIHByb3BzOiBTZXJ2aWNlTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICApOiBJTWV0cmljW10ge1xuICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG4gICAgbGV0IG9wZXJhdGlvbk1ldHJpY3M6IElNZXRyaWNbXSA9IFtdO1xuICAgIGxldCBrZXlQcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoJycpO1xuXG4gICAgcHJvcHMubGF0ZW5jeU1ldHJpY1Byb3BzLmZvckVhY2goXG4gICAgICAocHJvcDogTGF0ZW5jeU1ldHJpY1Byb3BzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBvcGVyYXRpb25SZWdpb25hbE1ldHJpYzogSU1ldHJpYyA9XG4gICAgICAgICAgdGhpcy5jcmVhdGVSZWdpb25hbExhdGVuY3lDb3VudE1ldHJpYyhwcm9wKTtcblxuICAgICAgICBvcGVyYXRpb25NZXRyaWNzLnB1c2gob3BlcmF0aW9uUmVnaW9uYWxNZXRyaWMpO1xuICAgICAgICB1c2luZ01ldHJpY3NbYCR7a2V5UHJlZml4fSR7aW5kZXh9YF0gPSBvcGVyYXRpb25SZWdpb25hbE1ldHJpYztcbiAgICAgICAga2V5UHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlQcmVmaXgpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykubGVuZ3RoID09IDEpIHtcbiAgICAgIG9wZXJhdGlvbk1ldHJpY3MucHVzaChPYmplY3QudmFsdWVzKHVzaW5nTWV0cmljcylbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWF0aDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICBwZXJpb2Q6IHByb3BzLnBlcmlvZCxcbiAgICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmpvaW4oJysnKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcGVyYXRpb25NZXRyaWNzLnNwbGljZSgwLCAwLCBtYXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3BlcmF0aW9uTWV0cmljcztcbiAgfVxufVxuIl19
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uYWxMYXRlbmN5TWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXRyaWNzL1JlZ2lvbmFsTGF0ZW5jeU1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBa0M7QUFDbEMsK0RBQXFFO0FBQ3JFLG1GQUFnRjtBQUloRiw4REFBMkQ7QUFFM0QsTUFBYSxzQkFBc0I7SUFDakM7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyw0QkFBNEIsQ0FDakMsS0FBaUM7UUFFakMsT0FBTyw2REFBNkIsQ0FBQyxvQkFBb0IsQ0FDdkQsS0FBSyxFQUNMLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQ3JELGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDdkMsS0FBaUM7UUFFakMsT0FBTyw2REFBNkIsQ0FBQywwQkFBMEIsQ0FDN0QsS0FBSyxFQUNMLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQ3JELGlCQUFHLENBQUMsTUFBTSxDQUNYLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGdDQUFnQyxDQUNyQyxLQUFpQztRQUVqQyxPQUFPLDZEQUE2QixDQUFDLHdCQUF3QixDQUMzRCxLQUFLLEVBQ0wsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FDckQsaUJBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsd0NBQXdDLENBQzdDLEtBQWdDLEVBQ2hDLDJCQUFxQztRQUdyQyxJQUFJLDJCQUEyQixFQUFFLENBQUM7WUFDaEMsSUFBSSxZQUFZLEdBQStCLEVBQUUsQ0FBQztZQUNsRCxJQUFJLGdCQUFnQixHQUFjLEVBQUUsQ0FBQztZQUNyQyxJQUFJLFNBQVMsR0FBVyw2QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRWpELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQzlCLENBQUMsSUFBd0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSx1QkFBdUIsR0FDekIsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUU5QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFDL0MsWUFBWSxDQUFDLEdBQUcsU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7Z0JBQy9ELFNBQVMsR0FBRyw2QkFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQ0YsQ0FBQztZQUVGLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksSUFBSSxHQUFZLElBQUksK0JBQWMsQ0FBQztvQkFDckMsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO29CQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2lCQUNoRCxDQUFDLENBQUM7Z0JBRUgsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQzthQUNJLENBQUM7WUFDSixPQUFPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUF3QixFQUFFLEVBQUU7Z0JBQy9ELE9BQU8sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXBHRCx3REFvR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5pbXBvcnQgeyBBd3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJTWV0cmljLCBNYXRoRXhwcmVzc2lvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi9BdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBMYXRlbmN5TWV0cmljUHJvcHMgfSBmcm9tICcuL3Byb3BzL0xhdGVuY3lNZXRyaWNQcm9wcyc7XG5pbXBvcnQgeyBSZWdpb25hbExhdGVuY3lNZXRyaWNQcm9wcyB9IGZyb20gJy4vcHJvcHMvUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgU2VydmljZUxhdGVuY3lNZXRyaWNQcm9wcyB9IGZyb20gJy4vcHJvcHMvU2VydmljZUxhdGVuY3lNZXJpY1Byb3BzJztcbmltcG9ydCB7IE1ldHJpY3NIZWxwZXIgfSBmcm9tICcuLi91dGlsaXRpZXMvTWV0cmljc0hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBSZWdpb25hbExhdGVuY3lNZXRyaWNzIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBtZXRyaWNzIGZvciByZWdpb25hbCBsYXRlbmN5LCBvbmUgbWV0cmljIHBlciBtZXRyaWMgbmFtZSBmb3IgdGhlXG4gICAqIHNwZWNpZmllZCB0eXBlIG9mIGxhdGVuY3kgbWV0cmljLiBZb3Ugd2lsbCBuZWVkIHRvIHBlcmZvcm0gc29tZSBhZ2dyZWdhdGlvblxuICAgKiBvZiB0aGVzZSBtZXRyaWNzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIG1ldHJpYyBuYW1lIHRoYXQgY29ycmVwb25kcyB0b1xuICAgKiBTdWNjZXNzTGF0ZW5jeSBvciBGYXVsdExhdGVuY3ksIGxpa2UgZG9pbmcgYW4gYXZlcmFnZS5cbiAgICogQHBhcmFtIHByb3BzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlUmVnaW9uYWxMYXRlbmN5TWV0cmljcyhcbiAgICBwcm9wczogUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMsXG4gICk6IElNZXRyaWNbXSB7XG4gICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUxhdGVuY3lNZXRyaWNzKFxuICAgICAgcHJvcHMsXG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICBBd3MuUkVHSU9OLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSByZWdpb25hbCBhdmVyYWdlIGxhdGVuY3kgbWV0cmljLCBhdmVyYWdlcyB0aGUgdmFsdWVzIGZyb20gYWxsIG9mIHRoZVxuICAgKiBtZXRyaWMgbmFtZXMgdGhhdCByZXByZXNlbnQgZWl0aGVyIFN1Y2Nlc3NMYXRlbmN5IG9yIEZhdWx0TGF0ZW5jeVxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVSZWdpb25hbEF2ZXJhZ2VMYXRlbmN5TWV0cmljKFxuICAgIHByb3BzOiBSZWdpb25hbExhdGVuY3lNZXRyaWNQcm9wcyxcbiAgKTogSU1ldHJpYyB7XG4gICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2ZXJhZ2VMYXRlbmN5TWV0cmljKFxuICAgICAgcHJvcHMsXG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICBBd3MuUkVHSU9OLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3VudCBvZiBoaWdoIGxhdGVuY3kgbWV0cmljcyBmb3IgZWl0aGVyIFN1Y2Nlc3NMYXRlbmN5IG9yIEZhdWx0TGF0ZW5jeVxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVSZWdpb25hbExhdGVuY3lDb3VudE1ldHJpYyhcbiAgICBwcm9wczogUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMsXG4gICk6IElNZXRyaWMge1xuICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVMYXRlbmN5Q291bnRNZXRyaWMoXG4gICAgICBwcm9wcyxcbiAgICAgIHByb3BzLm1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgIEF3cy5SRUdJT04sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvdW50IG9mIGhpZ2ggbGF0ZW5jeSByZXNwb25zZXMgZm9yIGFsbCBjcml0aWNhbCBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVJlZ2lvbmFsU2VydmljZUxhdGVuY3lDb3VudE1ldHJpY3MoXG4gICAgcHJvcHM6IFNlcnZpY2VMYXRlbmN5TWV0cmljUHJvcHMsXG4gICAgaW5jbHVkZVJlZ2lvbkNvdW50QWdncmVnYXRlPzogYm9vbGVhblxuICApOiBJTWV0cmljW10ge1xuICAgIFxuICAgIGlmIChpbmNsdWRlUmVnaW9uQ291bnRBZ2dyZWdhdGUpIHtcbiAgICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG4gICAgICBsZXQgb3BlcmF0aW9uTWV0cmljczogSU1ldHJpY1tdID0gW107XG4gICAgICBsZXQga2V5UHJlZml4OiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICAgIHByb3BzLmxhdGVuY3lNZXRyaWNQcm9wcy5mb3JFYWNoKFxuICAgICAgICAocHJvcDogTGF0ZW5jeU1ldHJpY1Byb3BzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgbGV0IG9wZXJhdGlvblJlZ2lvbmFsTWV0cmljOiBJTWV0cmljID1cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVnaW9uYWxMYXRlbmN5Q291bnRNZXRyaWMocHJvcCk7XG4gIFxuICAgICAgICAgIG9wZXJhdGlvbk1ldHJpY3MucHVzaChvcGVyYXRpb25SZWdpb25hbE1ldHJpYyk7XG4gICAgICAgICAgdXNpbmdNZXRyaWNzW2Ake2tleVByZWZpeH0ke2luZGV4fWBdID0gb3BlcmF0aW9uUmVnaW9uYWxNZXRyaWM7XG4gICAgICAgICAga2V5UHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlQcmVmaXgpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgXG4gICAgICBpZiAoT2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5sZW5ndGggPT0gMSkge1xuICAgICAgICBvcGVyYXRpb25NZXRyaWNzLnB1c2goT2JqZWN0LnZhbHVlcyh1c2luZ01ldHJpY3MpWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRoOiBJTWV0cmljID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICB1c2luZ01ldHJpY3M6IHVzaW5nTWV0cmljcyxcbiAgICAgICAgICBwZXJpb2Q6IHByb3BzLnBlcmlvZCxcbiAgICAgICAgICBsYWJlbDogcHJvcHMubGFiZWwsXG4gICAgICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyksXG4gICAgICAgIH0pO1xuICBcbiAgICAgICAgb3BlcmF0aW9uTWV0cmljcy5zcGxpY2UoMCwgMCwgbWF0aCk7XG4gICAgICB9XG4gIFxuICAgICAgcmV0dXJuIG9wZXJhdGlvbk1ldHJpY3M7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHByb3BzLmxhdGVuY3lNZXRyaWNQcm9wcy5tYXAoKHByb3A6IExhdGVuY3lNZXRyaWNQcm9wcykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpb25hbExhdGVuY3lDb3VudE1ldHJpYyhwcm9wKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
+ import { Duration } from 'aws-cdk-lib';
1
2
  import { IMetric } from 'aws-cdk-lib/aws-cloudwatch';
2
- import { ServiceAvailabilityMetricProps } from './props/ServiceAvailabilityMetricProps';
3
3
  import { ZonalAvailabilityMetricProps } from './props/ZonalAvailabilityMetricProps';
4
4
  export declare class ZonalAvailabilityMetrics {
5
5
  /**
@@ -9,11 +9,5 @@ export declare class ZonalAvailabilityMetrics {
9
9
  * @returns The metric at index 0 is the metric math expression for the whole service. The following metrics
10
10
  * are the metrics for each operation included in the request availability metric props.
11
11
  */
12
- static createZonalServiceAvailabilityMetrics(props: ServiceAvailabilityMetricProps): IMetric[];
13
- /**
14
- * Creates a zonal availability metric
15
- * @param props
16
- * @returns
17
- */
18
- static createZonalAvailabilityMetric(props: ZonalAvailabilityMetricProps): IMetric;
12
+ static createZonalServiceAvailabilityMetrics(metrics: ZonalAvailabilityMetricProps[], period: Duration, label: string): IMetric[];
19
13
  }