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