@cdklabs/multi-az-observability 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (84) hide show
  1. package/.jsii +372 -115
  2. package/API.md +292 -74
  3. package/README.md +21 -14
  4. package/cdk.json +1 -1
  5. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +6 -6
  6. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +31 -28
  7. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +0 -4
  8. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +6 -5
  9. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +8 -6
  10. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -4
  11. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
  12. package/lib/alarmsandrules/OperationAlarmsAndRules.js +10 -12
  13. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +14 -12
  14. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +2 -2
  15. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
  16. package/lib/azmapper/AvailabilityZoneMapper.js +4 -3
  17. package/lib/basic_observability/BasicServiceDashboard.d.ts +1 -2
  18. package/lib/basic_observability/BasicServiceDashboard.js +58 -78
  19. package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
  20. package/lib/basic_observability/BasicServiceMultiAZObservability.js +100 -312
  21. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +50 -0
  22. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
  23. package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
  24. package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
  25. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -38
  26. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
  27. package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
  28. package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
  29. package/lib/canaries/CanaryFunction.js +7 -6
  30. package/lib/canaries/src/canary.zip +0 -0
  31. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +3 -6
  32. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +359 -498
  33. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +0 -1
  34. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +56 -113
  35. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +4 -8
  36. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
  37. package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
  38. package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
  39. package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
  40. package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
  41. package/lib/index.d.ts +5 -0
  42. package/lib/index.js +8 -2
  43. package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +65 -4
  44. package/lib/metrics/ApplicationLoadBalancerMetrics.js +629 -40
  45. package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
  46. package/lib/metrics/AvailabilityAndLatencyMetrics.js +115 -24
  47. package/lib/metrics/NatGatewayMetrics.d.ts +110 -0
  48. package/lib/metrics/NatGatewayMetrics.js +300 -0
  49. package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
  50. package/lib/metrics/RegionalLatencyMetrics.js +27 -20
  51. package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
  52. package/lib/metrics/ZonalAvailabilityMetrics.js +10 -25
  53. package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
  54. package/lib/metrics/ZonalLatencyMetrics.js +33 -23
  55. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
  56. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
  57. package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
  58. package/lib/metrics/props/LatencyMetricProps.js +1 -1
  59. package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
  60. package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
  61. package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
  62. package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
  63. package/lib/monitoring/src/monitoring-layer.zip +0 -0
  64. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
  65. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
  66. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts +18 -0
  67. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
  68. package/lib/outlier-detection/OutlierDetectionFunction.js +6 -5
  69. package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
  70. package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
  71. package/lib/outlier-detection/src/outlier-detection.zip +0 -0
  72. package/lib/outlier-detection/src/scipy-layer.zip +0 -0
  73. package/lib/services/CanaryMetrics.js +1 -1
  74. package/lib/services/CanaryTestMetricsOverride.js +1 -1
  75. package/lib/services/ContributorInsightRuleDetails.js +1 -1
  76. package/lib/services/InstrumentedServiceMultiAZObservability.js +3 -3
  77. package/lib/services/Operation.js +1 -1
  78. package/lib/services/OperationMetricDetails.js +1 -1
  79. package/lib/services/Service.js +1 -1
  80. package/lib/services/ServiceMetricDetails.js +1 -1
  81. package/lib/services/props/MetricDimensions.js +1 -1
  82. package/lib/utilities/MetricsHelper.d.ts +14 -10
  83. package/lib/utilities/MetricsHelper.js +18 -11
  84. package/package.json +8 -8
@@ -0,0 +1,300 @@
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 PacketLossOutlierAlgorithm_1 = require("../outlier-detection/PacketLossOutlierAlgorithm");
7
+ /**
8
+ * Provides functions for getting CloudWatch metrics and alarms for NAT Gateways.
9
+ */
10
+ class NatGatewayMetrics {
11
+ /**
12
+ * Gets the count of packet drops for all NAT Gateways that belong to the provided AZ
13
+ * @param natgws
14
+ * @param availabilityZoneId
15
+ * @param period
16
+ * @returns
17
+ */
18
+ static getDroppedPacketCountMetricForAZ(natgws, availabilityZoneId, period, prefix, color) {
19
+ let keyprefix = prefix ? prefix : MetricsHelper_1.MetricsHelper.nextChar();
20
+ let packetDropCountMetrics = {};
21
+ natgws.forEach((natgw, index) => {
22
+ packetDropCountMetrics[`${keyprefix}${index}`] = new aws_cloudwatch_1.Metric({
23
+ metricName: 'PacketsDropCount',
24
+ namespace: 'AWS/NATGateway',
25
+ statistic: aws_cloudwatch_1.Stats.SUM,
26
+ unit: aws_cloudwatch_1.Unit.COUNT,
27
+ label: availabilityZoneId,
28
+ dimensionsMap: {
29
+ NatGatewayId: natgw.attrNatGatewayId,
30
+ },
31
+ period: period,
32
+ });
33
+ });
34
+ return new aws_cloudwatch_1.MathExpression({
35
+ expression: Object.keys(packetDropCountMetrics).join("+"),
36
+ usingMetrics: packetDropCountMetrics,
37
+ period: period,
38
+ label: availabilityZoneId,
39
+ color: color
40
+ });
41
+ }
42
+ /**
43
+ * Get the packet drop rate for all NAT Gateways that belong to the provided AZ
44
+ * @param natgws
45
+ * @param availabilityZoneId
46
+ * @param period
47
+ * @returns Percent of packet drops like 52%
48
+ */
49
+ static getDroppedPacketRateMetricForAZ(natgws, availabilityZoneId, period, prefix, color) {
50
+ let keyprefix = prefix ? prefix : MetricsHelper_1.MetricsHelper.nextChar();
51
+ let packetDropCountMetrics = {};
52
+ let packetsInFromSourceMetrics = {};
53
+ let packetsInFromDestinationMetrics = {};
54
+ natgws.forEach((natgw, index) => {
55
+ packetDropCountMetrics[`${keyprefix}${index}1`] = new aws_cloudwatch_1.Metric({
56
+ metricName: 'PacketsDropCount',
57
+ namespace: 'AWS/NATGateway',
58
+ statistic: aws_cloudwatch_1.Stats.SUM,
59
+ unit: aws_cloudwatch_1.Unit.COUNT,
60
+ label: availabilityZoneId + ' packet drops',
61
+ dimensionsMap: {
62
+ NatGatewayId: natgw.attrNatGatewayId,
63
+ },
64
+ period: period,
65
+ });
66
+ // Calculate packets in from source
67
+ packetsInFromSourceMetrics[`${keyprefix}${index}2`] = new aws_cloudwatch_1.Metric({
68
+ metricName: 'PacketsInFromSource',
69
+ namespace: 'AWS/NATGateway',
70
+ statistic: aws_cloudwatch_1.Stats.SUM,
71
+ unit: aws_cloudwatch_1.Unit.COUNT,
72
+ label: availabilityZoneId + ' packets in from source',
73
+ dimensionsMap: {
74
+ NatGatewayId: natgw.attrNatGatewayId,
75
+ },
76
+ period: period,
77
+ });
78
+ // Calculate packets in from destination
79
+ packetsInFromDestinationMetrics[`${keyprefix}${index}3`] = new aws_cloudwatch_1.Metric({
80
+ metricName: 'PacketsInFromDestination',
81
+ namespace: 'AWS/NATGateway',
82
+ statistic: aws_cloudwatch_1.Stats.SUM,
83
+ unit: aws_cloudwatch_1.Unit.COUNT,
84
+ label: availabilityZoneId + ' packets in from destination',
85
+ dimensionsMap: {
86
+ NatGatewayId: natgw.attrNatGatewayId,
87
+ },
88
+ period: period,
89
+ });
90
+ });
91
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
92
+ let packetDropTotal = new aws_cloudwatch_1.MathExpression({
93
+ expression: Object.keys(packetDropCountMetrics).join("+"),
94
+ usingMetrics: packetDropCountMetrics,
95
+ period: period
96
+ });
97
+ let packetsInFromSourceTotal = new aws_cloudwatch_1.MathExpression({
98
+ expression: Object.keys(packetsInFromSourceMetrics).join("+"),
99
+ usingMetrics: packetsInFromSourceMetrics,
100
+ period: period
101
+ });
102
+ let packetsInFromDestinationTotal = new aws_cloudwatch_1.MathExpression({
103
+ expression: Object.keys(packetsInFromDestinationMetrics).join("+"),
104
+ usingMetrics: packetsInFromDestinationMetrics,
105
+ period: period
106
+ });
107
+ let usingMetrics = {};
108
+ usingMetrics[`${keyprefix}1`] = packetDropTotal;
109
+ usingMetrics[`${keyprefix}2`] = packetsInFromSourceTotal;
110
+ usingMetrics[`${keyprefix}3`] = packetsInFromDestinationTotal;
111
+ // Calculate a percentage of dropped packets for the NAT GW
112
+ return new aws_cloudwatch_1.MathExpression({
113
+ expression: `(${keyprefix}1 / (${keyprefix}2 + ${keyprefix}3)) * 100`,
114
+ usingMetrics: usingMetrics,
115
+ label: availabilityZoneId,
116
+ period: period,
117
+ color: color
118
+ });
119
+ }
120
+ /**
121
+ * Get the packet count for all NAT Gateways that belong to the provided AZ
122
+ * @param natgws
123
+ * @param availabilityZoneId
124
+ * @param period
125
+ * @returns
126
+ */
127
+ static getTotalPacketCountMetricForAZ(natgws, availabilityZoneId, period, prefix, color) {
128
+ let keyprefix = prefix ? prefix : MetricsHelper_1.MetricsHelper.nextChar();
129
+ let usingMetrics = {};
130
+ natgws.forEach((natgw, index) => {
131
+ // Calculate packets in from source
132
+ usingMetrics[`${keyprefix}${index}1`] = new aws_cloudwatch_1.Metric({
133
+ metricName: 'PacketsInFromSource',
134
+ namespace: 'AWS/NATGateway',
135
+ statistic: aws_cloudwatch_1.Stats.SUM,
136
+ unit: aws_cloudwatch_1.Unit.COUNT,
137
+ label: availabilityZoneId + ' packets in from source',
138
+ dimensionsMap: {
139
+ NatGatewayId: natgw.attrNatGatewayId,
140
+ },
141
+ period: period,
142
+ });
143
+ // Calculate packets in from destination
144
+ usingMetrics[`${keyprefix}${index}2`] = new aws_cloudwatch_1.Metric({
145
+ metricName: 'PacketsInFromDestination',
146
+ namespace: 'AWS/NATGateway',
147
+ statistic: aws_cloudwatch_1.Stats.SUM,
148
+ unit: aws_cloudwatch_1.Unit.COUNT,
149
+ label: availabilityZoneId + ' packets in from destination',
150
+ dimensionsMap: {
151
+ NatGatewayId: natgw.attrNatGatewayId,
152
+ },
153
+ period: period,
154
+ });
155
+ });
156
+ // Calculate total packets in from sources and destinations
157
+ return new aws_cloudwatch_1.MathExpression({
158
+ expression: Object.keys(usingMetrics).join("+"),
159
+ usingMetrics: usingMetrics,
160
+ label: availabilityZoneId,
161
+ period: period,
162
+ color: color
163
+ });
164
+ }
165
+ /**
166
+ * Returns an alarm indicating if the quantity of packet drops in a single AZ across all NAT Gateways in that
167
+ * AZ exceeds a threshold compared to all packet loss across all AZs.
168
+ *
169
+ * For example:
170
+ *
171
+ * A = 150 packets
172
+ * B = 175 packets
173
+ * C = 160 packets
174
+ *
175
+ * And the selected AZ is "A", then the calculation is 150 / (150 + 175 + 160).
176
+ *
177
+ * @param scope
178
+ * @param natgws
179
+ * @param availabilityZoneId
180
+ * @param availabilityZone
181
+ * @param threshold
182
+ * @param period
183
+ * @param evaluationPeriods
184
+ * @param datapointsToAlarm
185
+ * @returns
186
+ */
187
+ static isAZAnOutlierForPacketLossNATGW(scope, natgws, algorithm, availabilityZone, azMapper, threshold, period, evaluationPeriods, datapointsToAlarm) {
188
+ let azPacketDropCountMetrics = {};
189
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(availabilityZone.substring(availabilityZone.length - 1));
190
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
191
+ Object.keys(natgws).forEach((az) => {
192
+ let azLetter = az.substring(az.length - 1);
193
+ let azId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
194
+ azPacketDropCountMetrics[azLetter] = NatGatewayMetrics.getDroppedPacketCountMetricForAZ(natgws[az], azId, period, keyprefix);
195
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
196
+ });
197
+ switch (algorithm) {
198
+ case PacketLossOutlierAlgorithm_1.PacketLossOutlierAlgorithm.STATIC:
199
+ default:
200
+ return new aws_cloudwatch_1.Alarm(scope, availabilityZone.substring(availabilityZone.length - 1) + "-packet-loss-outlier", {
201
+ metric: new aws_cloudwatch_1.MathExpression({
202
+ expression: `(${availabilityZone.substring(availabilityZone.length - 1)} / (${Object.keys(azPacketDropCountMetrics).join("+")})) * 100`,
203
+ usingMetrics: azPacketDropCountMetrics,
204
+ period: period,
205
+ label: availabilityZoneId + "-packet-loss-percentage-of-total"
206
+ }),
207
+ threshold: threshold,
208
+ evaluationPeriods: evaluationPeriods,
209
+ datapointsToAlarm: datapointsToAlarm,
210
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
211
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
212
+ });
213
+ }
214
+ }
215
+ /**
216
+ * Creates an alarm to determine is the packet loss rate in a single AZ across all NAT Gateways provided
217
+ * for that AZ exceed the provided threshold.
218
+ * @param scope
219
+ * @param natgws
220
+ * @param availabilityZoneId
221
+ * @param availabilityZone
222
+ * @param threshold
223
+ * @param period
224
+ * @param evaluationPeriods
225
+ * @param datapointsToAlarm
226
+ * @returns
227
+ */
228
+ static isThereAnAZPacketLossImpactNATGW(scope, natgws, availabilityZoneId, availabilityZone, threshold, period, evaluationPeriods, datapointsToAlarm) {
229
+ // Calculate a percentage of dropped packets for the NAT GW
230
+ let packetDropPercentage = NatGatewayMetrics.getDroppedPacketRateMetricForAZ(natgws, availabilityZoneId, period);
231
+ // Create an alarm for this NAT GW if packet drops exceed the specified threshold
232
+ return new aws_cloudwatch_1.Alarm(scope, availabilityZone.substring(availabilityZone.length - 1) + "-packet-drop-impact-alarm", {
233
+ alarmName: availabilityZoneId +
234
+ '-packet-drop-impact',
235
+ actionsEnabled: false,
236
+ metric: packetDropPercentage,
237
+ threshold: threshold,
238
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
239
+ evaluationPeriods: evaluationPeriods,
240
+ datapointsToAlarm: datapointsToAlarm,
241
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
242
+ });
243
+ }
244
+ /**
245
+ * Gets the count of all packets from all NAT Gateways in each provided Availability Zone.
246
+ * @param natgws
247
+ * @param azMapper
248
+ * @param period
249
+ * @returns
250
+ */
251
+ static getTotalPacketCountForEveryAZ(natgws, azMapper, period) {
252
+ let usingMetrics = {};
253
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
254
+ Object.keys(natgws).forEach((availabilityZone, index) => {
255
+ let azLetter = availabilityZone.substring(availabilityZone.length - 1);
256
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
257
+ usingMetrics[azLetter] = this.getTotalPacketCountMetricForAZ(natgws[availabilityZone], availabilityZoneId, period, keyprefix, MetricsHelper_1.MetricsHelper.colors[index]);
258
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
259
+ });
260
+ return usingMetrics;
261
+ }
262
+ /**
263
+ * Gets the count of packet drops from all NAT Gateways in each provided Availability Zone.
264
+ * @param natgws
265
+ * @param azMapper
266
+ * @param period
267
+ * @returns
268
+ */
269
+ static getTotalPacketDropsForEveryAZ(natgws, azMapper, period) {
270
+ let usingMetrics = {};
271
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
272
+ Object.keys(natgws).forEach((availabilityZone, index) => {
273
+ let azLetter = availabilityZone.substring(availabilityZone.length - 1);
274
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
275
+ usingMetrics[azLetter] = this.getDroppedPacketCountMetricForAZ(natgws[availabilityZone], availabilityZoneId, period, keyprefix, MetricsHelper_1.MetricsHelper.colors[index]);
276
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
277
+ });
278
+ return usingMetrics;
279
+ }
280
+ /**
281
+ * Gets the packet drop rate from all NAT Gateways in each provided Availability Zone.
282
+ * @param natgws
283
+ * @param azMapper
284
+ * @param period
285
+ * @returns
286
+ */
287
+ static getTotalPacketDropRateForEveryAZ(natgws, azMapper, period) {
288
+ let usingMetrics = {};
289
+ let keyprefix = MetricsHelper_1.MetricsHelper.nextChar();
290
+ Object.keys(natgws).forEach((availabilityZone, index) => {
291
+ let azLetter = availabilityZone.substring(availabilityZone.length - 1);
292
+ let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
293
+ usingMetrics[azLetter] = this.getDroppedPacketRateMetricForAZ(natgws[availabilityZone], availabilityZoneId, period, keyprefix, MetricsHelper_1.MetricsHelper.colors[index]);
294
+ keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
295
+ });
296
+ return usingMetrics;
297
+ }
298
+ }
299
+ exports.NatGatewayMetrics = NatGatewayMetrics;
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmF0R2F0ZXdheU1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy9OYXRHYXRld2F5TWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw4REFBMkQ7QUFDM0QsK0RBQStJO0FBSS9JLGdHQUE2RjtBQUU3Rjs7R0FFRztBQUNILE1BQWEsaUJBQWlCO0lBRTFCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FDbkMsTUFBdUIsRUFDdkIsa0JBQTBCLEVBQzFCLE1BQWdCLEVBQ2hCLE1BQWUsRUFDZixLQUFjO1FBR2QsSUFBSSxTQUFTLEdBQVcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDZCQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkUsSUFBSSxzQkFBc0IsR0FBNkIsRUFBRSxDQUFDO1FBRTFELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFvQixFQUFFLEtBQWEsRUFBQyxFQUFFO1lBRWxELHNCQUFzQixDQUFDLEdBQUcsU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSx1QkFBTSxDQUFDO2dCQUMxRCxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixTQUFTLEVBQUUsc0JBQUssQ0FBQyxHQUFHO2dCQUNwQixJQUFJLEVBQUUscUJBQUksQ0FBQyxLQUFLO2dCQUNoQixLQUFLLEVBQUUsa0JBQWtCO2dCQUN6QixhQUFhLEVBQUU7b0JBQ2IsWUFBWSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3JDO2dCQUNELE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksK0JBQWMsQ0FBQztZQUN4QixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFD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K0IsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLDZCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFNUosU0FBUyxHQUFHLDZCQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztDQUNKO0FBM1lELDhDQTJZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk5hdEdhdGV3YXkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgTWV0cmljc0hlbHBlciB9IGZyb20gXCIuLi91dGlsaXRpZXMvTWV0cmljc0hlbHBlclwiO1xuaW1wb3J0IHsgQWxhcm0sIENvbXBhcmlzb25PcGVyYXRvciwgSUFsYXJtLCBJTWV0cmljLCBNYXRoRXhwcmVzc2lvbiwgTWV0cmljLCBTdGF0cywgVHJlYXRNaXNzaW5nRGF0YSwgVW5pdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tIFwiLi4vYXptYXBwZXIvSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXJcIjtcbmltcG9ydCB7IFBhY2tldExvc3NPdXRsaWVyQWxnb3JpdGhtIH0gZnJvbSBcIi4uL291dGxpZXItZGV0ZWN0aW9uL1BhY2tldExvc3NPdXRsaWVyQWxnb3JpdGhtXCI7XG5cbi8qKlxuICogUHJvdmlkZXMgZnVuY3Rpb25zIGZvciBnZXR0aW5nIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgYWxhcm1zIGZvciBOQVQgR2F0ZXdheXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXRHYXRld2F5TWV0cmljcyB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb3VudCBvZiBwYWNrZXQgZHJvcHMgZm9yIGFsbCBOQVQgR2F0ZXdheXMgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3ZpZGVkIEFaXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmlsaXR5Wm9uZUlkIFxuICAgICAqIEBwYXJhbSBwZXJpb2QgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgc3RhdGljIGdldERyb3BwZWRQYWNrZXRDb3VudE1ldHJpY0ZvckFaKFxuICAgICAgICBuYXRnd3M6IENmbk5hdEdhdGV3YXlbXSxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgICAgIHByZWZpeD86IHN0cmluZyxcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICApIDogSU1ldHJpYyBcbiAgICB7XG4gICAgICAgIGxldCBrZXlwcmVmaXg6IHN0cmluZyA9IHByZWZpeCA/IHByZWZpeCA6IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcbiAgICAgICAgbGV0IHBhY2tldERyb3BDb3VudE1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuXG4gICAgICAgIG5hdGd3cy5mb3JFYWNoKChuYXRndzogQ2ZuTmF0R2F0ZXdheSwgaW5kZXg6IG51bWJlcik9PiB7XG4gICAgICAgIFxuICAgICAgICAgICAgcGFja2V0RHJvcENvdW50TWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH1gXSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgICAgICBtZXRyaWNOYW1lOiAnUGFja2V0c0Ryb3BDb3VudCcsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHBhY2tldERyb3BDb3VudE1ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgICAgIHVzaW5nTWV0cmljczogcGFja2V0RHJvcENvdW50TWV0cmljcyxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkLCBcbiAgICAgICAgICBjb2xvcjogY29sb3JcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwYWNrZXQgZHJvcCByYXRlIGZvciBhbGwgTkFUIEdhdGV3YXlzIHRoYXQgYmVsb25nIHRvIHRoZSBwcm92aWRlZCBBWlxuICAgICAqIEBwYXJhbSBuYXRnd3MgXG4gICAgICogQHBhcmFtIGF2YWlsYWJpbGl0eVpvbmVJZCBcbiAgICAgKiBAcGFyYW0gcGVyaW9kIFxuICAgICAqIEByZXR1cm5zIFBlcmNlbnQgb2YgcGFja2V0IGRyb3BzIGxpa2UgNTIlXG4gICAgICovXG4gICAgc3RhdGljIGdldERyb3BwZWRQYWNrZXRSYXRlTWV0cmljRm9yQVooXG4gICAgICAgIG5hdGd3czogQ2ZuTmF0R2F0ZXdheVtdLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICAgICAgcHJlZml4Pzogc3RyaW5nLFxuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICkgOiBJTWV0cmljIFxuICAgIHtcbiAgICAgICAgXG4gICAgICAgIGxldCBrZXlwcmVmaXggPSBwcmVmaXggPyBwcmVmaXggOiBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICAgICAgbGV0IHBhY2tldERyb3BDb3VudE1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgICAgICBsZXQgcGFja2V0c0luRnJvbVNvdXJjZU1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgICAgICBsZXQgcGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIFxuICAgICAgICBuYXRnd3MuZm9yRWFjaCgobmF0Z3c6IENmbk5hdEdhdGV3YXksIGluZGV4OiBudW1iZXIpPT4ge1xuXG4gICAgICAgICAgcGFja2V0RHJvcENvdW50TWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH0xYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzRHJvcENvdW50JyxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldCBkcm9wcycsXG4gICAgICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgICAgIE5hdEdhdGV3YXlJZDogbmF0Z3cuYXR0ck5hdEdhdGV3YXlJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgICAgIC8vIENhbGN1bGF0ZSBwYWNrZXRzIGluIGZyb20gc291cmNlXG4gICAgICAgICAgcGFja2V0c0luRnJvbVNvdXJjZU1ldHJpY3NbYCR7a2V5cHJlZml4fSR7aW5kZXh9MmBdID0gbmV3IE1ldHJpYyh7XG4gICAgICAgICAgICBtZXRyaWNOYW1lOiAnUGFja2V0c0luRnJvbVNvdXJjZScsXG4gICAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXRzIGluIGZyb20gc291cmNlJyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIH0pO1xuICAgICAgXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHBhY2tldHMgaW4gZnJvbSBkZXN0aW5hdGlvblxuICAgICAgICAgIHBhY2tldHNJbkZyb21EZXN0aW5hdGlvbk1ldHJpY3NbYCR7a2V5cHJlZml4fSR7aW5kZXh9M2BdID0gbmV3IE1ldHJpYyh7XG4gICAgICAgICAgICBtZXRyaWNOYW1lOiAnUGFja2V0c0luRnJvbURlc3RpbmF0aW9uJyxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldHMgaW4gZnJvbSBkZXN0aW5hdGlvbicsXG4gICAgICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgICAgIE5hdEdhdGV3YXlJZDogbmF0Z3cuYXR0ck5hdEdhdGV3YXlJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuXG4gICAgICAgIGxldCBwYWNrZXREcm9wVG90YWw6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHBhY2tldERyb3BDb3VudE1ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgICAgIHVzaW5nTWV0cmljczogcGFja2V0RHJvcENvdW50TWV0cmljcyxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcGFja2V0c0luRnJvbVNvdXJjZVRvdGFsOiBJTWV0cmljID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyhwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljcykuam9pbihcIitcIiksXG4gICAgICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljcyxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcGFja2V0c0luRnJvbURlc3RpbmF0aW9uVG90YWw6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHBhY2tldHNJbkZyb21EZXN0aW5hdGlvbk1ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgICAgIHVzaW5nTWV0cmljczogcGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljcyxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuICAgICAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTFgXSA9IHBhY2tldERyb3BUb3RhbDtcbiAgICAgICAgdXNpbmdNZXRyaWNzW2Ake2tleXByZWZpeH0yYF0gPSBwYWNrZXRzSW5Gcm9tU291cmNlVG90YWw7XG4gICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlwcmVmaXh9M2BdID0gcGFja2V0c0luRnJvbURlc3RpbmF0aW9uVG90YWw7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGEgcGVyY2VudGFnZSBvZiBkcm9wcGVkIHBhY2tldHMgZm9yIHRoZSBOQVQgR1dcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgZXhwcmVzc2lvbjogYCgke2tleXByZWZpeH0xIC8gKCR7a2V5cHJlZml4fTIgKyAke2tleXByZWZpeH0zKSkgKiAxMDBgLFxuICAgICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgY29sb3I6IGNvbG9yXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGFja2V0IGNvdW50IGZvciBhbGwgTkFUIEdhdGV3YXlzIHRoYXQgYmVsb25nIHRvIHRoZSBwcm92aWRlZCBBWlxuICAgICAqIEBwYXJhbSBuYXRnd3MgXG4gICAgICogQHBhcmFtIGF2YWlsYWJpbGl0eVpvbmVJZCBcbiAgICAgKiBAcGFyYW0gcGVyaW9kIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUb3RhbFBhY2tldENvdW50TWV0cmljRm9yQVooXG4gICAgICAgIG5hdGd3czogQ2ZuTmF0R2F0ZXdheVtdLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICAgICAgcHJlZml4Pzogc3RyaW5nLFxuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICkgOiBJTWV0cmljIFxuICAgIHtcbiAgICAgICAgbGV0IGtleXByZWZpeCA9IHByZWZpeCA/IHByZWZpeCA6IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcbiAgICAgICAgbGV0IHVzaW5nTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgICAgIFxuICAgICAgICBuYXRnd3MuZm9yRWFjaCgobmF0Z3c6IENmbk5hdEdhdGV3YXksIGluZGV4OiBudW1iZXIpPT4ge1xuICAgICAgXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHBhY2tldHMgaW4gZnJvbSBzb3VyY2VcbiAgICAgICAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fSR7aW5kZXh9MWBdID0gbmV3IE1ldHJpYyh7XG4gICAgICAgICAgICBtZXRyaWNOYW1lOiAnUGFja2V0c0luRnJvbVNvdXJjZScsXG4gICAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXRzIGluIGZyb20gc291cmNlJyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIH0pO1xuICAgICAgXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHBhY2tldHMgaW4gZnJvbSBkZXN0aW5hdGlvblxuICAgICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH0yYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzSW5Gcm9tRGVzdGluYXRpb24nLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05BVEdhdGV3YXknLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgcGFja2V0cyBpbiBmcm9tIGRlc3RpbmF0aW9uJyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgcGFja2V0cyBpbiBmcm9tIHNvdXJjZXMgYW5kIGRlc3RpbmF0aW9uc1xuICAgICAgICByZXR1cm4gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgY29sb3I6IGNvbG9yXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICogUmV0dXJucyBhbiBhbGFybSBpbmRpY2F0aW5nIGlmIHRoZSBxdWFudGl0eSBvZiBwYWNrZXQgZHJvcHMgaW4gYSBzaW5nbGUgQVogYWNyb3NzIGFsbCBOQVQgR2F0ZXdheXMgaW4gdGhhdFxuICAgICAgICogQVogZXhjZWVkcyBhIHRocmVzaG9sZCBjb21wYXJlZCB0byBhbGwgcGFja2V0IGxvc3MgYWNyb3NzIGFsbCBBWnMuXG4gICAgICAgKiBcbiAgICAgICAqIEZvciBleGFtcGxlOlxuICAgICAgICogXG4gICAgICAgKiBBID0gMTUwIHBhY2tldHNcbiAgICAgICAqIEIgPSAxNzUgcGFja2V0c1xuICAgICAgICogQyA9IDE2MCBwYWNrZXRzXG4gICAgICAgKiBcbiAgICAgICAqIEFuZCB0aGUgc2VsZWN0ZWQgQVogaXMgXCJBXCIsIHRoZW4gdGhlIGNhbGN1bGF0aW9uIGlzIDE1MCAvICgxNTAgKyAxNzUgKyAxNjApLlxuICAgICAgICogXG4gICAgICAgKiBAcGFyYW0gc2NvcGUgXG4gICAgICAgKiBAcGFyYW0gbmF0Z3dzIFxuICAgICAgICogQHBhcmFtIGF2YWlsYWJpbGl0eVpvbmVJZCBcbiAgICAgICAqIEBwYXJhbSBhdmFpbGFiaWxpdHlab25lIFxuICAgICAgICogQHBhcmFtIHRocmVzaG9sZCBcbiAgICAgICAqIEBwYXJhbSBwZXJpb2QgXG4gICAgICAgKiBAcGFyYW0gZXZhbHVhdGlvblBlcmlvZHMgXG4gICAgICAgKiBAcGFyYW0gZGF0YXBvaW50c1RvQWxhcm0gXG4gICAgICAgKiBAcmV0dXJucyBcbiAgICAgICAqL1xuICAgIHN0YXRpYyBpc0FaQW5PdXRsaWVyRm9yUGFja2V0TG9zc05BVEdXKFxuICAgICAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICAgICAgbmF0Z3dzOiB7W2tleTogc3RyaW5nXTogQ2ZuTmF0R2F0ZXdheVtdfSwgXG4gICAgICAgIGFsZ29yaXRobTogUGFja2V0TG9zc091dGxpZXJBbGdvcml0aG0sXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZyxcbiAgICAgICAgYXpNYXBwZXI6IElBdmFpbGFiaWxpdHlab25lTWFwcGVyLFxuICAgICAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcixcbiAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IG51bWJlclxuICAgICkgOiBJQWxhcm0ge1xuICAgICAgICBsZXQgYXpQYWNrZXREcm9wQ291bnRNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKSk7XG4gICAgICAgIGxldCBrZXlwcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhuYXRnd3MpLmZvckVhY2goKGF6OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBsZXQgYXpMZXR0ZXIgPSBhei5zdWJzdHJpbmcoYXoubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgbGV0IGF6SWQgPSBhek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG4gICAgICAgICAgYXpQYWNrZXREcm9wQ291bnRNZXRyaWNzW2F6TGV0dGVyXSA9IE5hdEdhdGV3YXlNZXRyaWNzLmdldERyb3BwZWRQYWNrZXRDb3VudE1ldHJpY0ZvckFaKG5hdGd3c1thel0sIGF6SWQsIHBlcmlvZCwga2V5cHJlZml4KTtcblxuICAgICAgICAgIGtleXByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5cHJlZml4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0pIHtcbiAgICAgICAgICBjYXNlIFBhY2tldExvc3NPdXRsaWVyQWxnb3JpdGhtLlNUQVRJQzpcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgICAgICAgICAgc2NvcGUsIFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpICsgXCItcGFja2V0LWxvc3Mtb3V0bGllclwiLCBcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICBtZXRyaWM6IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGAoJHthdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpfSAvICgke09iamVjdC5rZXlzKGF6UGFja2V0RHJvcENvdW50TWV0cmljcykuam9pbihcIitcIil9KSkgKiAxMDBgLFxuICAgICAgICAgICAgICAgICAgICB1c2luZ01ldHJpY3M6IGF6UGFja2V0RHJvcENvdW50TWV0cmljcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIi1wYWNrZXQtbG9zcy1wZXJjZW50YWdlLW9mLXRvdGFsXCJcbiAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICAgICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5JR05PUkVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSAgICAgXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbGFybSB0byBkZXRlcm1pbmUgaXMgdGhlIHBhY2tldCBsb3NzIHJhdGUgaW4gYSBzaW5nbGUgQVogYWNyb3NzIGFsbCBOQVQgR2F0ZXdheXMgcHJvdmlkZWRcbiAgICAgKiBmb3IgdGhhdCBBWiBleGNlZWQgdGhlIHByb3ZpZGVkIHRocmVzaG9sZC5cbiAgICAgKiBAcGFyYW0gc2NvcGUgXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmlsaXR5Wm9uZUlkIFxuICAgICAqIEBwYXJhbSBhdmFpbGFiaWxpdHlab25lIFxuICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgXG4gICAgICogQHBhcmFtIHBlcmlvZCBcbiAgICAgKiBAcGFyYW0gZXZhbHVhdGlvblBlcmlvZHMgXG4gICAgICogQHBhcmFtIGRhdGFwb2ludHNUb0FsYXJtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHN0YXRpYyBpc1RoZXJlQW5BWlBhY2tldExvc3NJbXBhY3ROQVRHVyhcbiAgICAgICAgc2NvcGU6IElDb25zdHJ1Y3QsXG4gICAgICAgIG5hdGd3czogQ2ZuTmF0R2F0ZXdheVtdLCBcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZyxcbiAgICAgICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXIsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXJcbiAgICAgICkgOiBJQWxhcm0ge1xuICAgICAgICAvLyBDYWxjdWxhdGUgYSBwZXJjZW50YWdlIG9mIGRyb3BwZWQgcGFja2V0cyBmb3IgdGhlIE5BVCBHV1xuICAgICAgICBsZXQgcGFja2V0RHJvcFBlcmNlbnRhZ2U6IElNZXRyaWMgPSBOYXRHYXRld2F5TWV0cmljcy5nZXREcm9wcGVkUGFja2V0UmF0ZU1ldHJpY0ZvckFaKG5hdGd3cywgYXZhaWxhYmlsaXR5Wm9uZUlkLCBwZXJpb2QpO1xuICAgIFxuICAgICAgICAvLyBDcmVhdGUgYW4gYWxhcm0gZm9yIHRoaXMgTkFUIEdXIGlmIHBhY2tldCBkcm9wcyBleGNlZWQgdGhlIHNwZWNpZmllZCB0aHJlc2hvbGRcbiAgICAgICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpICsgXCItcGFja2V0LWRyb3AtaW1wYWN0LWFsYXJtXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxhcm1OYW1lOlxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgK1xuICAgICAgICAgICAgICAnLXBhY2tldC1kcm9wLWltcGFjdCcsXG4gICAgICAgICAgICBhY3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICBtZXRyaWM6IHBhY2tldERyb3BQZXJjZW50YWdlLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5JR05PUkVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY291bnQgb2YgYWxsIHBhY2tldHMgZnJvbSBhbGwgTkFUIEdhdGV3YXlzIGluIGVhY2ggcHJvdmlkZWQgQXZhaWxhYmlsaXR5IFpvbmUuXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXpNYXBwZXIgXG4gICAgICogQHBhcmFtIHBlcmlvZCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VG90YWxQYWNrZXRDb3VudEZvckV2ZXJ5QVooXG4gICAgICAgIG5hdGd3czoge1trZXk6IHN0cmluZ106IENmbk5hdEdhdGV3YXlbXX0sXG4gICAgICAgIGF6TWFwcGVyOiBJQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvblxuICAgICkgOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY31cbiAgICB7XG4gICAgICAgIGxldCB1c2luZ01ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgICAgICBsZXQga2V5cHJlZml4OiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMobmF0Z3dzKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSBhek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICAgIHVzaW5nTWV0cmljc1thekxldHRlcl0gPSB0aGlzLmdldFRvdGFsUGFja2V0Q291bnRNZXRyaWNGb3JBWihuYXRnd3NbYXZhaWxhYmlsaXR5Wm9uZV0sIGF2YWlsYWJpbGl0eVpvbmVJZCwgcGVyaW9kLCBrZXlwcmVmaXgsIE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XSk7XG5cbiAgICAgICAgICAgIGtleXByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5cHJlZml4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHVzaW5nTWV0cmljcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb3VudCBvZiBwYWNrZXQgZHJvcHMgZnJvbSBhbGwgTkFUIEdhdGV3YXlzIGluIGVhY2ggcHJvdmlkZWQgQXZhaWxhYmlsaXR5IFpvbmUuXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXpNYXBwZXIgXG4gICAgICogQHBhcmFtIHBlcmlvZCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VG90YWxQYWNrZXREcm9wc0ZvckV2ZXJ5QVooXG4gICAgICAgIG5hdGd3czoge1trZXk6IHN0cmluZ106IENmbk5hdEdhdGV3YXlbXX0sXG4gICAgICAgIGF6TWFwcGVyOiBJQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvblxuICAgICkgOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY31cbiAgICB7XG4gICAgICAgIGxldCB1c2luZ01ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgICAgICBsZXQga2V5cHJlZml4OiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMobmF0Z3dzKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSBhek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICAgIHVzaW5nTWV0cmljc1thekxldHRlcl0gPSB0aGlzLmdldERyb3BwZWRQYWNrZXRDb3VudE1ldHJpY0ZvckFaKG5hdGd3c1thdmFpbGFiaWxpdHlab25lXSwgYXZhaWxhYmlsaXR5Wm9uZUlkLCBwZXJpb2QsIGtleXByZWZpeCwgTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdKTtcblxuICAgICAgICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdXNpbmdNZXRyaWNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhY2tldCBkcm9wIHJhdGUgZnJvbSBhbGwgTkFUIEdhdGV3YXlzIGluIGVhY2ggcHJvdmlkZWQgQXZhaWxhYmlsaXR5IFpvbmUuXG4gICAgICogQHBhcmFtIG5hdGd3cyBcbiAgICAgKiBAcGFyYW0gYXpNYXBwZXIgXG4gICAgICogQHBhcmFtIHBlcmlvZCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VG90YWxQYWNrZXREcm9wUmF0ZUZvckV2ZXJ5QVooXG4gICAgICAgIG5hdGd3czoge1trZXk6IHN0cmluZ106IENmbk5hdEdhdGV3YXlbXX0sXG4gICAgICAgIGF6TWFwcGVyOiBJQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvblxuICAgICkgOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY31cbiAgICB7XG4gICAgICAgIGxldCB1c2luZ01ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgICAgICBsZXQga2V5cHJlZml4OiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMobmF0Z3dzKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSBhek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICAgIHVzaW5nTWV0cmljc1thekxldHRlcl0gPSB0aGlzLmdldERyb3BwZWRQYWNrZXRSYXRlTWV0cmljRm9yQVoobmF0Z3dzW2F2YWlsYWJpbGl0eVpvbmVdLCBhdmFpbGFiaWxpdHlab25lSWQsIHBlcmlvZCwga2V5cHJlZml4LCBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF0pO1xuXG4gICAgICAgICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB1c2luZ01ldHJpY3M7XG4gICAgfVxufSJdfQ==
@@ -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
  }
@@ -15,26 +15,19 @@ class ZonalAvailabilityMetrics {
15
15
  * @returns The metric at index 0 is the metric math expression for the whole service. The following metrics
16
16
  * are the metrics for each operation included in the request availability metric props.
17
17
  */
18
- static createZonalServiceAvailabilityMetrics(props) {
18
+ static createZonalServiceAvailabilityMetrics(metrics, period, label) {
19
19
  let usingMetrics = {};
20
20
  let operationMetrics = [];
21
- let counter = 0;
22
- props.availabilityMetricProps.forEach((prop) => {
23
- let keyPrefix = (prop.keyPrefix === undefined || prop.keyPrefix == ''
24
- ? ''
25
- : prop.keyPrefix.toLowerCase() + '_') +
26
- prop.metricDetails.operationName.toLowerCase() +
27
- '_' +
28
- prop.metricType.toString().toLowerCase();
29
- let zonalOperationAvailabilityMetric = this.createZonalAvailabilityMetric(prop);
21
+ metrics.forEach((prop, index) => {
22
+ let zonalOperationAvailabilityMetric = AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric(prop, prop.metricDetails.metricDimensions.zonalDimensions(prop.availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
30
23
  operationMetrics.push(zonalOperationAvailabilityMetric);
31
- usingMetrics[`${keyPrefix}${counter++}`] =
24
+ usingMetrics[`${prop.availabilityZone.substring(prop.availabilityZone.length - 1)}_${prop.metricDetails.operationName}_${prop.metricType.toString().toLowerCase()}_${index}`] =
32
25
  zonalOperationAvailabilityMetric;
33
26
  });
34
27
  let expression = '';
35
- switch (props.availabilityMetricProps[0].metricType) {
28
+ switch (metrics[0].metricType) {
36
29
  case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE:
37
- expression = `(${Object.keys(usingMetrics).join('+')}) / ${props.availabilityMetricProps.length}`;
30
+ expression = `(${Object.keys(usingMetrics).join('+')}) / ${metrics.length}`;
38
31
  break;
39
32
  case AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT:
40
33
  expression = `${Object.keys(usingMetrics).join('+')}`;
@@ -43,7 +36,7 @@ class ZonalAvailabilityMetrics {
43
36
  expression = `${Object.keys(usingMetrics).join('+')}`;
44
37
  break;
45
38
  case AvailabilityMetricType_1.AvailabilityMetricType.FAULT_RATE:
46
- expression = `(${Object.keys(usingMetrics).join('+')}) / ${props.availabilityMetricProps.length}`;
39
+ expression = `(${Object.keys(usingMetrics).join('+')}) / ${metrics.length}`;
47
40
  break;
48
41
  case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_COUNT:
49
42
  expression = `${Object.keys(usingMetrics).join('+')}`;
@@ -51,21 +44,13 @@ class ZonalAvailabilityMetrics {
51
44
  }
52
45
  let math = new aws_cloudwatch_1.MathExpression({
53
46
  usingMetrics: usingMetrics,
54
- period: props.period,
55
- label: props.label,
47
+ period: period,
48
+ label: label,
56
49
  expression: expression,
57
50
  });
58
51
  operationMetrics.splice(0, 0, math);
59
52
  return operationMetrics;
60
53
  }
61
- /**
62
- * Creates a zonal availability metric
63
- * @param props
64
- * @returns
65
- */
66
- static createZonalAvailabilityMetric(props) {
67
- return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric(props, props.metricDetails.metricDimensions.zonalDimensions(props.availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
68
- }
69
54
  }
70
55
  exports.ZonalAvailabilityMetrics = ZonalAvailabilityMetrics;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21ldHJpY3MvWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQWtDO0FBQ2xDLCtEQUFxRTtBQUNyRSxtRkFBZ0Y7QUFHaEYsZ0ZBQTZFO0FBRTdFLE1BQWEsd0JBQXdCO0lBQ25DOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxxQ0FBcUMsQ0FDMUMsS0FBcUM7UUFFckMsSUFBSSxZQUFZLEdBQStCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLGdCQUFnQixHQUFjLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sR0FBVyxDQUFDLENBQUM7UUFFeEIsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzdDLElBQUksU0FBUyxHQUNYLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFO2dCQUNuRCxDQUFDLENBQUMsRUFBRTtnQkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDOUMsR0FBRztnQkFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRTNDLElBQUksZ0NBQWdDLEdBQ2xDLElBQUksQ0FBQyw2QkFBNkIsQ0FDaEMsSUFBb0MsQ0FDckMsQ0FBQztZQUVKLGdCQUFnQixDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3hELFlBQVksQ0FBQyxHQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxnQ0FBZ0MsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxHQUFXLEVBQUUsQ0FBQztRQUU1QixRQUFRLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxLQUFLLCtDQUFzQixDQUFDLFlBQVk7Z0JBQ3RDLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEcsTUFBTTtZQUNSLEtBQUssK0NBQXNCLENBQUMsYUFBYTtnQkFDdkMsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTTtZQUNSLEtBQUssK0NBQXNCLENBQUMsV0FBVztnQkFDckMsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTTtZQUNSLEtBQUssK0NBQXNCLENBQUMsVUFBVTtnQkFDcEMsVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsRyxNQUFNO1lBQ1IsS0FBSywrQ0FBc0IsQ0FBQyxhQUFhO2dCQUN2QyxVQUFVLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxNQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksSUFBSSxHQUFZLElBQUksK0JBQWMsQ0FBQztZQUNyQyxZQUFZLEVBQUUsWUFBWTtZQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUVILGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXBDLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsNkJBQTZCLENBQ2xDLEtBQW1DO1FBRW5DLE9BQU8sNkRBQTZCLENBQUMsd0JBQXdCLENBQzNELEtBQUssRUFDTCxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUN4QixpQkFBRyxDQUFDLE1BQU0sQ0FDWCxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFqRkQsNERBaUZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgQXdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgSU1ldHJpYywgTWF0aEV4cHJlc3Npb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4vQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MnO1xuaW1wb3J0IHsgU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzIH0gZnJvbSAnLi9wcm9wcy9TZXJ2aWNlQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyB9IGZyb20gJy4vcHJvcHMvWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0F2YWlsYWJpbGl0eU1ldHJpY1R5cGUnO1xuXG5leHBvcnQgY2xhc3MgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB6b25hbCBzZXJ2aWNlIGxldmVsIGF2YWlsYWJpbGl0eSBtZXRyaWNzLCBvbmUgbWV0cmljIGZvclxuICAgKiBlYWNoIG9wZXJhdGlvbiBhdCB0aGUgem9uYWwgbGV2ZWwgYW5kIHRoZSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnMgVGhlIG1ldHJpYyBhdCBpbmRleCAwIGlzIHRoZSBtZXRyaWMgbWF0aCBleHByZXNzaW9uIGZvciB0aGUgd2hvbGUgc2VydmljZS4gVGhlIGZvbGxvd2luZyBtZXRyaWNzXG4gICAqIGFyZSB0aGUgbWV0cmljcyBmb3IgZWFjaCBvcGVyYXRpb24gaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QgYXZhaWxhYmlsaXR5IG1ldHJpYyBwcm9wcy5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVab25hbFNlcnZpY2VBdmFpbGFiaWxpdHlNZXRyaWNzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMsXG4gICk6IElNZXRyaWNbXSB7XG4gICAgbGV0IHVzaW5nTWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0gPSB7fTtcbiAgICBsZXQgb3BlcmF0aW9uTWV0cmljczogSU1ldHJpY1tdID0gW107XG4gICAgbGV0IGNvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgICBwcm9wcy5hdmFpbGFiaWxpdHlNZXRyaWNQcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBsZXQga2V5UHJlZml4OiBzdHJpbmcgPVxuICAgICAgICAocHJvcC5rZXlQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBwcm9wLmtleVByZWZpeCA9PSAnJ1xuICAgICAgICAgID8gJydcbiAgICAgICAgICA6IHByb3Aua2V5UHJlZml4LnRvTG93ZXJDYXNlKCkgKyAnXycpICtcbiAgICAgICAgcHJvcC5tZXRyaWNEZXRhaWxzLm9wZXJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKSArXG4gICAgICAgICdfJyArXG4gICAgICAgIHByb3AubWV0cmljVHlwZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGxldCB6b25hbE9wZXJhdGlvbkF2YWlsYWJpbGl0eU1ldHJpYzogSU1ldHJpYyA9XG4gICAgICAgIHRoaXMuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoXG4gICAgICAgICAgcHJvcCBhcyBab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzLFxuICAgICAgICApO1xuXG4gICAgICBvcGVyYXRpb25NZXRyaWNzLnB1c2goem9uYWxPcGVyYXRpb25BdmFpbGFiaWxpdHlNZXRyaWMpO1xuICAgICAgdXNpbmdNZXRyaWNzW2Ake2tleVByZWZpeH0ke2NvdW50ZXIrK31gXSA9XG4gICAgICAgIHpvbmFsT3BlcmF0aW9uQXZhaWxhYmlsaXR5TWV0cmljO1xuICAgIH0pO1xuXG4gICAgbGV0IGV4cHJlc3Npb246IHN0cmluZyA9ICcnO1xuXG4gICAgc3dpdGNoIChwcm9wcy5hdmFpbGFiaWxpdHlNZXRyaWNQcm9wc1swXS5tZXRyaWNUeXBlKSB7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFOlxuICAgICAgICBleHByZXNzaW9uID0gYCgke09iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpfSkgLyAke3Byb3BzLmF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzLmxlbmd0aH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5SRVFVRVNUX0NPVU5UOlxuICAgICAgICBleHByZXNzaW9uID0gYCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQ6XG4gICAgICAgIGV4cHJlc3Npb24gPSBgJHtPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmpvaW4oJysnKX1gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5GQVVMVF9SQVRFOlxuICAgICAgICBleHByZXNzaW9uID0gYCgke09iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpfSkgLyAke3Byb3BzLmF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzLmxlbmd0aH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX0NPVU5UOlxuICAgICAgICBleHByZXNzaW9uID0gYCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBtYXRoOiBJTWV0cmljID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgcGVyaW9kOiBwcm9wcy5wZXJpb2QsXG4gICAgICBsYWJlbDogcHJvcHMubGFiZWwsXG4gICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLFxuICAgIH0pO1xuXG4gICAgb3BlcmF0aW9uTWV0cmljcy5zcGxpY2UoMCwgMCwgbWF0aCk7XG5cbiAgICByZXR1cm4gb3BlcmF0aW9uTWV0cmljcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgem9uYWwgYXZhaWxhYmlsaXR5IG1ldHJpY1xuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyhcbiAgICBwcm9wczogWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyxcbiAgKTogSU1ldHJpYyB7XG4gICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyhcbiAgICAgIHByb3BzLFxuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICBBd3MuUkVHSU9OXG4gICAgICApLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21ldHJpY3MvWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQTRDO0FBQzVDLCtEQUFxRTtBQUNyRSxtRkFBZ0Y7QUFFaEYsZ0ZBQTZFO0FBRTdFLE1BQWEsd0JBQXdCO0lBQ25DOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxxQ0FBcUMsQ0FDMUMsT0FBdUMsRUFDdkMsTUFBZ0IsRUFDaEIsS0FBYTtRQUViLElBQUksWUFBWSxHQUErQixFQUFFLENBQUM7UUFDbEQsSUFBSSxnQkFBZ0IsR0FBYyxFQUFFLENBQUM7UUFFckMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQWtDLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFFcEUsSUFBSSxnQ0FBZ0MsR0FDbEMsNkRBQTZCLENBQUMsNkJBQTZCLENBQ3pELElBQUksRUFDSixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixpQkFBRyxDQUFDLE1BQU0sQ0FDWCxDQUNGLENBQUM7WUFFSixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUN4RCxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLElBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDN0ssZ0NBQWdDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsR0FBVyxFQUFFLENBQUM7UUFFNUIsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUIsS0FBSywrQ0FBc0IsQ0FBQyxZQUFZO2dCQUN0QyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzVFLE1BQU07WUFDUixLQUFLLCtDQUFzQixDQUFDLGFBQWE7Z0JBQ3ZDLFVBQVUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELE1BQU07WUFDUixLQUFLLCtDQUFzQixDQUFDLFdBQVc7Z0JBQ3JDLFVBQVUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELE1BQU07WUFDUixLQUFLLCtDQUFzQixDQUFDLFVBQVU7Z0JBQ3BDLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDNUUsTUFBTTtZQUNSLEtBQUssK0NBQXNCLENBQUMsYUFBYTtnQkFDdkMsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTTtRQUNWLENBQUM7UUFDRCxJQUFJLElBQUksR0FBWSxJQUFJLCtCQUFjLENBQUM7WUFDckMsWUFBWSxFQUFFLFlBQVk7WUFDMUIsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsS0FBSztZQUNaLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUVILGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXBDLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBOURELDREQThEQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEF3cywgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJTWV0cmljLCBNYXRoRXhwcmVzc2lvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi9BdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzIH0gZnJvbSAnLi9wcm9wcy9ab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvQXZhaWxhYmlsaXR5TWV0cmljVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBab25hbEF2YWlsYWJpbGl0eU1ldHJpY3Mge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHpvbmFsIHNlcnZpY2UgbGV2ZWwgYXZhaWxhYmlsaXR5IG1ldHJpY3MsIG9uZSBtZXRyaWMgZm9yXG4gICAqIGVhY2ggb3BlcmF0aW9uIGF0IHRoZSB6b25hbCBsZXZlbCBhbmQgdGhlIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJucyBUaGUgbWV0cmljIGF0IGluZGV4IDAgaXMgdGhlIG1ldHJpYyBtYXRoIGV4cHJlc3Npb24gZm9yIHRoZSB3aG9sZSBzZXJ2aWNlLiBUaGUgZm9sbG93aW5nIG1ldHJpY3NcbiAgICogYXJlIHRoZSBtZXRyaWNzIGZvciBlYWNoIG9wZXJhdGlvbiBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCBhdmFpbGFiaWxpdHkgbWV0cmljIHByb3BzLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVpvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3MoXG4gICAgbWV0cmljczogWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wc1tdLFxuICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgbGFiZWw6IHN0cmluZ1xuICApOiBJTWV0cmljW10ge1xuICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG4gICAgbGV0IG9wZXJhdGlvbk1ldHJpY3M6IElNZXRyaWNbXSA9IFtdO1xuXG4gICAgbWV0cmljcy5mb3JFYWNoKChwcm9wOiBab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzLCBpbmRleDogbnVtYmVyKSA9PiB7XG5cbiAgICAgIGxldCB6b25hbE9wZXJhdGlvbkF2YWlsYWJpbGl0eU1ldHJpYzogSU1ldHJpYyA9XG4gICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICAgcHJvcC5tZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgcHJvcC5hdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICBvcGVyYXRpb25NZXRyaWNzLnB1c2goem9uYWxPcGVyYXRpb25BdmFpbGFiaWxpdHlNZXRyaWMpO1xuICAgICAgdXNpbmdNZXRyaWNzW2Ake3Byb3AuYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcocHJvcC5hdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpfV8ke3Byb3AubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lfV8keyBwcm9wLm1ldHJpY1R5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIH1fJHtpbmRleH1gXSA9XG4gICAgICAgIHpvbmFsT3BlcmF0aW9uQXZhaWxhYmlsaXR5TWV0cmljO1xuICAgIH0pO1xuXG4gICAgbGV0IGV4cHJlc3Npb246IHN0cmluZyA9ICcnO1xuXG4gICAgc3dpdGNoIChtZXRyaWNzWzBdLm1ldHJpY1R5cGUpIHtcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEU6XG4gICAgICAgIGV4cHJlc3Npb24gPSBgKCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyl9KSAvICR7bWV0cmljcy5sZW5ndGh9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVDpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAke09iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5UOlxuICAgICAgICBleHByZXNzaW9uID0gYCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfUkFURTpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAoJHtPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmpvaW4oJysnKX0pIC8gJHttZXRyaWNzLmxlbmd0aH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX0NPVU5UOlxuICAgICAgICBleHByZXNzaW9uID0gYCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBtYXRoOiBJTWV0cmljID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICBsYWJlbDogbGFiZWwsXG4gICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLFxuICAgIH0pO1xuXG4gICAgb3BlcmF0aW9uTWV0cmljcy5zcGxpY2UoMCwgMCwgbWF0aCk7XG5cbiAgICByZXR1cm4gb3BlcmF0aW9uTWV0cmljcztcbiAgfVxufVxuIl19
@@ -8,6 +8,7 @@ export declare class ZonalLatencyMetrics {
8
8
  * @returns
9
9
  */
10
10
  static createZonalLatencyMetrics(props: ZonalLatencyMetricProps): IMetric[];
11
+ static createZonalLatencyMetric(props: ZonalLatencyMetricProps): IMetric;
11
12
  /**
12
13
  * Creates an average zonal latency metric
13
14
  * @param props
@@ -25,5 +26,5 @@ export declare class ZonalLatencyMetrics {
25
26
  * @param props
26
27
  * @returns
27
28
  */
28
- static createZonalServiceLatencyMetrics(props: ServiceLatencyMetricProps): IMetric[];
29
+ static createZonalServiceLatencyMetrics(props: ServiceLatencyMetricProps, includeAZCountAggregate?: boolean): IMetric[];
29
30
  }