@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.
- package/.jsii +372 -115
- package/API.md +292 -74
- package/README.md +21 -14
- package/cdk.json +1 -1
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +6 -6
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +31 -28
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +0 -4
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +6 -5
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +8 -6
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -4
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/OperationAlarmsAndRules.js +10 -12
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +14 -12
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +2 -2
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
- package/lib/azmapper/AvailabilityZoneMapper.js +4 -3
- package/lib/basic_observability/BasicServiceDashboard.d.ts +1 -2
- package/lib/basic_observability/BasicServiceDashboard.js +58 -78
- package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
- package/lib/basic_observability/BasicServiceMultiAZObservability.js +100 -312
- package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +50 -0
- package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
- package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
- package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -38
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
- package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
- package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
- package/lib/canaries/CanaryFunction.js +7 -6
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +3 -6
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +359 -498
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +0 -1
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +56 -113
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +4 -8
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
- package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
- package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
- package/lib/index.d.ts +5 -0
- package/lib/index.js +8 -2
- package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +65 -4
- package/lib/metrics/ApplicationLoadBalancerMetrics.js +629 -40
- package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
- package/lib/metrics/AvailabilityAndLatencyMetrics.js +115 -24
- package/lib/metrics/NatGatewayMetrics.d.ts +110 -0
- package/lib/metrics/NatGatewayMetrics.js +300 -0
- package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
- package/lib/metrics/RegionalLatencyMetrics.js +27 -20
- package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
- package/lib/metrics/ZonalAvailabilityMetrics.js +10 -25
- package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
- package/lib/metrics/ZonalLatencyMetrics.js +33 -23
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
- package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
- package/lib/metrics/props/LatencyMetricProps.js +1 -1
- package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
- package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
- package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
- package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
- package/lib/monitoring/src/monitoring-layer.zip +0 -0
- package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
- package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
- package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts +18 -0
- package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
- package/lib/outlier-detection/OutlierDetectionFunction.js +6 -5
- package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
- package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
- package/lib/outlier-detection/src/outlier-detection.zip +0 -0
- package/lib/outlier-detection/src/scipy-layer.zip +0 -0
- package/lib/services/CanaryMetrics.js +1 -1
- package/lib/services/CanaryTestMetricsOverride.js +1 -1
- package/lib/services/ContributorInsightRuleDetails.js +1 -1
- package/lib/services/InstrumentedServiceMultiAZObservability.js +3 -3
- package/lib/services/Operation.js +1 -1
- package/lib/services/OperationMetricDetails.js +1 -1
- package/lib/services/Service.js +1 -1
- package/lib/services/ServiceMetricDetails.js +1 -1
- package/lib/services/props/MetricDimensions.js +1 -1
- package/lib/utilities/MetricsHelper.d.ts +14 -10
- package/lib/utilities/MetricsHelper.js +18 -11
- 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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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,
|
|
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(
|
|
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(
|
|
18
|
+
static createZonalServiceAvailabilityMetrics(metrics, period, label) {
|
|
19
19
|
let usingMetrics = {};
|
|
20
20
|
let operationMetrics = [];
|
|
21
|
-
|
|
22
|
-
|
|
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[`${
|
|
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 (
|
|
28
|
+
switch (metrics[0].metricType) {
|
|
36
29
|
case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE:
|
|
37
|
-
expression = `(${Object.keys(usingMetrics).join('+')}) / ${
|
|
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('+')}) / ${
|
|
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:
|
|
55
|
-
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,
|
|
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
|
}
|