@cdklabs/multi-az-observability 0.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +10177 -0
- package/API.md +5119 -0
- package/LICENSE +202 -0
- package/README.md +175 -0
- package/cdk.json +68 -0
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +214 -0
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +763 -0
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.d.ts +22 -0
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +21 -0
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +34 -0
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +39 -0
- package/lib/alarmsandrules/CanaryOperationRegionalAlarmsAndRules.d.ts +7 -0
- package/lib/alarmsandrules/CanaryOperationRegionalAlarmsAndRules.js +11 -0
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.d.ts +16 -0
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +17 -0
- package/lib/alarmsandrules/IBaseOperationRegionalAlarmsAndRules.d.ts +18 -0
- package/lib/alarmsandrules/IBaseOperationRegionalAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +30 -0
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/ICanaryOperationRegionalAlarmsAndRules.d.ts +6 -0
- package/lib/alarmsandrules/ICanaryOperationRegionalAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/ICanaryOperationZonalAlarmsAndRules.d.ts +12 -0
- package/lib/alarmsandrules/ICanaryOperationZonalAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/IOperationAlarmsAndRules.d.ts +55 -0
- package/lib/alarmsandrules/IOperationAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.d.ts +15 -0
- package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/IServerSideOperationZonalAlarmsAndRules.d.ts +36 -0
- package/lib/alarmsandrules/IServerSideOperationZonalAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/IServiceAlarmsAndRules.d.ts +44 -0
- package/lib/alarmsandrules/IServiceAlarmsAndRules.js +3 -0
- package/lib/alarmsandrules/InsightRuleBody.d.ts +67 -0
- package/lib/alarmsandrules/InsightRuleBody.js +46 -0
- package/lib/alarmsandrules/OperationAlarmsAndRules.d.ts +59 -0
- package/lib/alarmsandrules/OperationAlarmsAndRules.js +135 -0
- package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.d.ts +19 -0
- package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.js +22 -0
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.d.ts +40 -0
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +46 -0
- package/lib/alarmsandrules/ServiceAlarmsAndRules.d.ts +48 -0
- package/lib/alarmsandrules/ServiceAlarmsAndRules.js +166 -0
- package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.d.ts +24 -0
- package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +62 -0
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/CanaryOperationRegionalAlarmsAndRulesProps.d.ts +6 -0
- package/lib/alarmsandrules/props/CanaryOperationRegionalAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/CanaryOperationZonalAlarmsAndRulesProps.d.ts +6 -0
- package/lib/alarmsandrules/props/CanaryOperationZonalAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.d.ts +45 -0
- package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/ServerSideOperationRegionalAlarmsAndRulesProps.d.ts +6 -0
- package/lib/alarmsandrules/props/ServerSideOperationRegionalAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/ServerSideOperationZonalAlarmsAndRulesProps.d.ts +6 -0
- package/lib/alarmsandrules/props/ServerSideOperationZonalAlarmsAndRulesProps.js +3 -0
- package/lib/alarmsandrules/props/ServiceAlarmsAndRulesProps.d.ts +13 -0
- package/lib/alarmsandrules/props/ServiceAlarmsAndRulesProps.js +3 -0
- package/lib/azmapper/AvailabilityZoneMapper.d.ts +86 -0
- package/lib/azmapper/AvailabilityZoneMapper.js +200 -0
- package/lib/azmapper/IAvailabilityZoneMapper.d.ts +86 -0
- package/lib/azmapper/IAvailabilityZoneMapper.js +3 -0
- package/lib/azmapper/props/AvailabilityZoneMapperProps.d.ts +13 -0
- package/lib/azmapper/props/AvailabilityZoneMapperProps.js +3 -0
- package/lib/azmapper/src/index.py +107 -0
- package/lib/canaries/CanaryFunction.d.ts +16 -0
- package/lib/canaries/CanaryFunction.js +152 -0
- package/lib/canaries/CanaryTest.d.ts +10 -0
- package/lib/canaries/CanaryTest.js +84 -0
- package/lib/canaries/ICanaryFunction.d.ts +6 -0
- package/lib/canaries/ICanaryFunction.js +3 -0
- package/lib/canaries/props/AddCanaryTestProps.d.ts +66 -0
- package/lib/canaries/props/AddCanaryTestProps.js +3 -0
- package/lib/canaries/props/CanaryFunctionProps.d.ts +29 -0
- package/lib/canaries/props/CanaryFunctionProps.js +3 -0
- package/lib/canaries/props/CanaryTestProps.d.ts +21 -0
- package/lib/canaries/props/CanaryTestProps.js +3 -0
- package/lib/canaries/props/NetworkConfigurationProps.d.ts +16 -0
- package/lib/canaries/props/NetworkConfigurationProps.js +3 -0
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/dashboards/BasicServiceDashboard.d.ts +10 -0
- package/lib/dashboards/BasicServiceDashboard.js +130 -0
- package/lib/dashboards/ContributorInsightsWidget.d.ts +22 -0
- package/lib/dashboards/ContributorInsightsWidget.js +55 -0
- package/lib/dashboards/IOperationAvailabilityAndLatencyDashboard.d.ts +10 -0
- package/lib/dashboards/IOperationAvailabilityAndLatencyDashboard.js +3 -0
- package/lib/dashboards/IServiceAvailabilityAndLatencyDashboard.d.ts +10 -0
- package/lib/dashboards/IServiceAvailabilityAndLatencyDashboard.js +3 -0
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +20 -0
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +588 -0
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +24 -0
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +475 -0
- package/lib/dashboards/props/BasicServiceDashboardProps.d.ts +23 -0
- package/lib/dashboards/props/BasicServiceDashboardProps.js +3 -0
- package/lib/dashboards/props/ContributorInsightWidgetProps.d.ts +31 -0
- package/lib/dashboards/props/ContributorInsightWidgetProps.js +3 -0
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +84 -0
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +3 -0
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +37 -0
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +3 -0
- package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +37 -0
- package/lib/dashboards/props/OperationLatencyWidgetProps.js +3 -0
- package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.d.ts +30 -0
- package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.js +3 -0
- package/lib/index.d.ts +35 -0
- package/lib/index.js +30 -0
- package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +36 -0
- package/lib/metrics/ApplicationLoadBalancerMetrics.js +150 -0
- package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +61 -0
- package/lib/metrics/AvailabilityAndLatencyMetrics.js +212 -0
- package/lib/metrics/NetworkLoadBalancerMetrics.d.ts +19 -0
- package/lib/metrics/NetworkLoadBalancerMetrics.js +48 -0
- package/lib/metrics/RegionalAvailabilityMetrics.d.ts +19 -0
- package/lib/metrics/RegionalAvailabilityMetrics.js +71 -0
- package/lib/metrics/RegionalLatencyMetrics.d.ts +33 -0
- package/lib/metrics/RegionalLatencyMetrics.js +69 -0
- package/lib/metrics/ZonalAvailabilityMetrics.d.ts +19 -0
- package/lib/metrics/ZonalAvailabilityMetrics.js +71 -0
- package/lib/metrics/ZonalLatencyMetrics.d.ts +29 -0
- package/lib/metrics/ZonalLatencyMetrics.js +65 -0
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +23 -0
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +3 -0
- package/lib/metrics/props/AvailabilityMetricProps.d.ts +11 -0
- package/lib/metrics/props/AvailabilityMetricProps.js +3 -0
- package/lib/metrics/props/LatencyMetricProps.d.ts +15 -0
- package/lib/metrics/props/LatencyMetricProps.js +3 -0
- package/lib/metrics/props/RegionalAvailabilityMetricProps.d.ts +6 -0
- package/lib/metrics/props/RegionalAvailabilityMetricProps.js +3 -0
- package/lib/metrics/props/RegionalLatencyMetricProps.d.ts +6 -0
- package/lib/metrics/props/RegionalLatencyMetricProps.js +3 -0
- package/lib/metrics/props/ServiceAvailabilityMetricProps.d.ts +23 -0
- package/lib/metrics/props/ServiceAvailabilityMetricProps.js +3 -0
- package/lib/metrics/props/ServiceLatencyMericProps.d.ts +23 -0
- package/lib/metrics/props/ServiceLatencyMericProps.js +3 -0
- package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +10 -0
- package/lib/metrics/props/ZonalAvailabilityMetricProps.js +3 -0
- package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +10 -0
- package/lib/metrics/props/ZonalLatencyMetricProps.js +3 -0
- package/lib/monitoring/src/monitoring-layer.zip +0 -0
- package/lib/outlier-detection/IOutlierDetectionFunction.d.ts +12 -0
- package/lib/outlier-detection/IOutlierDetectionFunction.js +3 -0
- package/lib/outlier-detection/OutlierDetectionFunction.d.ts +16 -0
- package/lib/outlier-detection/OutlierDetectionFunction.js +126 -0
- package/lib/outlier-detection/props/OutlierDetectionFunctionProps.d.ts +12 -0
- package/lib/outlier-detection/props/OutlierDetectionFunctionProps.js +3 -0
- package/lib/outlier-detection/src/outlier-detection.zip +0 -0
- package/lib/outlier-detection/src/scipy-layer.zip +0 -0
- package/lib/services/BasicServiceMultiAZObservability.d.ts +64 -0
- package/lib/services/BasicServiceMultiAZObservability.js +504 -0
- package/lib/services/CanaryMetrics.d.ts +17 -0
- package/lib/services/CanaryMetrics.js +19 -0
- package/lib/services/CanaryTestMetricsOverride.d.ts +39 -0
- package/lib/services/CanaryTestMetricsOverride.js +23 -0
- package/lib/services/ContributorInsightRuleDetails.d.ts +42 -0
- package/lib/services/ContributorInsightRuleDetails.js +23 -0
- package/lib/services/IBasicServiceMultiAZObservability.d.ts +45 -0
- package/lib/services/IBasicServiceMultiAZObservability.js +3 -0
- package/lib/services/ICanaryMetrics.d.ts +14 -0
- package/lib/services/ICanaryMetrics.js +3 -0
- package/lib/services/ICanaryTestMetricsOverride.d.ts +36 -0
- package/lib/services/ICanaryTestMetricsOverride.js +3 -0
- package/lib/services/IContributorInsightRuleDetails.d.ts +38 -0
- package/lib/services/IContributorInsightRuleDetails.js +3 -0
- package/lib/services/IInstrumentedServiceMultiAZObservability.d.ts +39 -0
- package/lib/services/IInstrumentedServiceMultiAZObservability.js +3 -0
- package/lib/services/IOperation.d.ts +75 -0
- package/lib/services/IOperation.js +3 -0
- package/lib/services/IOperationMetricDetails.d.ts +78 -0
- package/lib/services/IOperationMetricDetails.js +3 -0
- package/lib/services/IService.d.ts +76 -0
- package/lib/services/IService.js +3 -0
- package/lib/services/IServiceMetricDetails.d.ts +68 -0
- package/lib/services/IServiceMetricDetails.js +3 -0
- package/lib/services/InstrumentedServiceMultiAZObservability.d.ts +55 -0
- package/lib/services/InstrumentedServiceMultiAZObservability.js +310 -0
- package/lib/services/Operation.d.ts +78 -0
- package/lib/services/Operation.js +34 -0
- package/lib/services/OperationMetricDetails.d.ts +82 -0
- package/lib/services/OperationMetricDetails.js +50 -0
- package/lib/services/Service.d.ts +80 -0
- package/lib/services/Service.js +36 -0
- package/lib/services/ServiceMetricDetails.d.ts +71 -0
- package/lib/services/ServiceMetricDetails.js +28 -0
- package/lib/services/props/BasicServiceMultiAZObservabilityProps.d.ts +126 -0
- package/lib/services/props/BasicServiceMultiAZObservabilityProps.js +3 -0
- package/lib/services/props/CanaryMetricProps.d.ts +14 -0
- package/lib/services/props/CanaryMetricProps.js +3 -0
- package/lib/services/props/CanaryTestMetricsOverrideProps.d.ts +47 -0
- package/lib/services/props/CanaryTestMetricsOverrideProps.js +3 -0
- package/lib/services/props/ContributorInsightRuleDetailsProps.d.ts +38 -0
- package/lib/services/props/ContributorInsightRuleDetailsProps.js +3 -0
- package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.d.ts +88 -0
- package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.js +3 -0
- package/lib/services/props/MetricDimensions.d.ts +61 -0
- package/lib/services/props/MetricDimensions.js +63 -0
- package/lib/services/props/OperationMetricDetailsProps.d.ts +97 -0
- package/lib/services/props/OperationMetricDetailsProps.js +3 -0
- package/lib/services/props/OperationProps.d.ts +93 -0
- package/lib/services/props/OperationProps.js +3 -0
- package/lib/services/props/ServiceMetricDetailsProps.d.ts +68 -0
- package/lib/services/props/ServiceMetricDetailsProps.js +3 -0
- package/lib/services/props/ServiceProps.d.ts +69 -0
- package/lib/services/props/ServiceProps.js +3 -0
- package/lib/utilities/AvailabilityMetricType.d.ts +26 -0
- package/lib/utilities/AvailabilityMetricType.js +33 -0
- package/lib/utilities/LatencyMetricType.d.ts +13 -0
- package/lib/utilities/LatencyMetricType.js +20 -0
- package/lib/utilities/OutlierDetectionAlgorithm.d.ts +42 -0
- package/lib/utilities/OutlierDetectionAlgorithm.js +49 -0
- package/lib/utilities/StackWithDynamicSource.d.ts +14 -0
- package/lib/utilities/StackWithDynamicSource.js +82 -0
- package/package.json +176 -0
- package/rosetta/default.ts-fixture +13 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Dashboard } from 'aws-cdk-lib/aws-cloudwatch';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { IServiceAvailabilityAndLatencyDashboard } from './IServiceAvailabilityAndLatencyDashboard';
|
|
4
|
+
import { ServiceAvailabilityAndLatencyDashboardProps } from './props/ServiceAvailabilityAndLatencyDashboardProps';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a service level availability and latency dashboard
|
|
7
|
+
*/
|
|
8
|
+
export declare class ServiceAvailabilityAndLatencyDashboard extends Construct implements IServiceAvailabilityAndLatencyDashboard {
|
|
9
|
+
private static generateTPSWidgets;
|
|
10
|
+
private static generateServerSideAndCanaryAvailabilityWidgets;
|
|
11
|
+
private static generateServerSideAndCanaryLatencyWidgets;
|
|
12
|
+
private static generateAvailabilityWidgets;
|
|
13
|
+
private static generateLatencyMetricWidgets;
|
|
14
|
+
private static createRegionalAvailabilityMetricProps;
|
|
15
|
+
private static createRegionalLatencyMetricProps;
|
|
16
|
+
private static createZonalAvailabilityMetricProps;
|
|
17
|
+
private static createZonalLatencyMetricProps;
|
|
18
|
+
private static generateLoadBalancerWidgets;
|
|
19
|
+
/**
|
|
20
|
+
* The service level dashboard
|
|
21
|
+
*/
|
|
22
|
+
dashboard: Dashboard;
|
|
23
|
+
constructor(scope: Construct, id: string, props: ServiceAvailabilityAndLatencyDashboardProps);
|
|
24
|
+
}
|
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServiceAvailabilityAndLatencyDashboard = void 0;
|
|
4
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
5
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
8
|
+
const constructs_1 = require("constructs");
|
|
9
|
+
const ApplicationLoadBalancerMetrics_1 = require("../metrics/ApplicationLoadBalancerMetrics");
|
|
10
|
+
const AvailabilityAndLatencyMetrics_1 = require("../metrics/AvailabilityAndLatencyMetrics");
|
|
11
|
+
const RegionalAvailabilityMetrics_1 = require("../metrics/RegionalAvailabilityMetrics");
|
|
12
|
+
const RegionalLatencyMetrics_1 = require("../metrics/RegionalLatencyMetrics");
|
|
13
|
+
const ZonalAvailabilityMetrics_1 = require("../metrics/ZonalAvailabilityMetrics");
|
|
14
|
+
const ZonalLatencyMetrics_1 = require("../metrics/ZonalLatencyMetrics");
|
|
15
|
+
const AvailabilityMetricType_1 = require("../utilities/AvailabilityMetricType");
|
|
16
|
+
const LatencyMetricType_1 = require("../utilities/LatencyMetricType");
|
|
17
|
+
/**
|
|
18
|
+
* Creates a service level availability and latency dashboard
|
|
19
|
+
*/
|
|
20
|
+
class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
21
|
+
static generateTPSWidgets(props, availabilityZoneIds) {
|
|
22
|
+
let widgets = [];
|
|
23
|
+
widgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: '**TPS Metrics**' }));
|
|
24
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
25
|
+
height: 6,
|
|
26
|
+
width: 24,
|
|
27
|
+
title: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' TPS',
|
|
28
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
29
|
+
left: RegionalAvailabilityMetrics_1.RegionalAvailabilityMetrics.createRegionalServiceAvailabilityMetrics({
|
|
30
|
+
label: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' tps',
|
|
31
|
+
period: props.service.period,
|
|
32
|
+
availabilityMetricProps: props.service.operations
|
|
33
|
+
.filter((x) => x.critical)
|
|
34
|
+
.map((x) => {
|
|
35
|
+
return {
|
|
36
|
+
label: x.operationName,
|
|
37
|
+
metricDetails: x.serverSideAvailabilityMetricDetails,
|
|
38
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
39
|
+
};
|
|
40
|
+
}),
|
|
41
|
+
}),
|
|
42
|
+
statistic: 'Sum',
|
|
43
|
+
leftYAxis: {
|
|
44
|
+
label: 'TPS',
|
|
45
|
+
showUnits: false,
|
|
46
|
+
},
|
|
47
|
+
}));
|
|
48
|
+
for (let i = 0; i < availabilityZoneIds.length; i++) {
|
|
49
|
+
let availabilityZoneId = availabilityZoneIds[i];
|
|
50
|
+
let zonalMetricProps = {
|
|
51
|
+
availabilityMetricProps: props.service.operations
|
|
52
|
+
.filter((x) => x.critical)
|
|
53
|
+
.map((x) => {
|
|
54
|
+
return {
|
|
55
|
+
availabilityZoneId: availabilityZoneId,
|
|
56
|
+
label: x.operationName,
|
|
57
|
+
metricDetails: x.serverSideAvailabilityMetricDetails,
|
|
58
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
59
|
+
};
|
|
60
|
+
}),
|
|
61
|
+
period: props.service.period,
|
|
62
|
+
label: availabilityZoneId + 'tps',
|
|
63
|
+
};
|
|
64
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
65
|
+
height: 6,
|
|
66
|
+
width: 8,
|
|
67
|
+
title: availabilityZoneId + ' TPS',
|
|
68
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
69
|
+
left: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(zonalMetricProps),
|
|
70
|
+
statistic: 'Sum',
|
|
71
|
+
leftYAxis: {
|
|
72
|
+
label: 'TPS',
|
|
73
|
+
showUnits: false,
|
|
74
|
+
},
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
return widgets;
|
|
78
|
+
}
|
|
79
|
+
static generateServerSideAndCanaryAvailabilityWidgets(props, availabilityZoneIds) {
|
|
80
|
+
let widgets = [];
|
|
81
|
+
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
82
|
+
height: 2,
|
|
83
|
+
width: 24,
|
|
84
|
+
markdown: '**Server-side Availability**\n(Each critical operation is equally weighted regardless of request volume)',
|
|
85
|
+
}));
|
|
86
|
+
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateAvailabilityWidgets(props, false, availabilityZoneIds));
|
|
87
|
+
if (props.service.operations.filter((x) => x.critical && x.canaryMetricDetails !== undefined).length > 0) {
|
|
88
|
+
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
89
|
+
height: 2,
|
|
90
|
+
width: 24,
|
|
91
|
+
markdown: '**Canary Measured Availability**\n(Each operation is equally weighted regardless of request volume)',
|
|
92
|
+
}));
|
|
93
|
+
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateAvailabilityWidgets(props, true, availabilityZoneIds));
|
|
94
|
+
}
|
|
95
|
+
return widgets;
|
|
96
|
+
}
|
|
97
|
+
static generateServerSideAndCanaryLatencyWidgets(props, availabilityZoneIds) {
|
|
98
|
+
let widgets = [];
|
|
99
|
+
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
100
|
+
height: 2,
|
|
101
|
+
width: 24,
|
|
102
|
+
markdown: '**Server-side Latency**\n(Each critical operation is equally weighted regardless of request volume)',
|
|
103
|
+
}));
|
|
104
|
+
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateLatencyMetricWidgets(props, false, availabilityZoneIds));
|
|
105
|
+
if (props.service.operations.filter((x) => x.critical && x.canaryMetricDetails !== undefined).length > 0) {
|
|
106
|
+
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
107
|
+
height: 2,
|
|
108
|
+
width: 24,
|
|
109
|
+
markdown: '**Canary Measured Latency**\n(Each operation is equally weighted regardless of request volume)',
|
|
110
|
+
}));
|
|
111
|
+
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateLatencyMetricWidgets(props, true, availabilityZoneIds));
|
|
112
|
+
}
|
|
113
|
+
return widgets;
|
|
114
|
+
}
|
|
115
|
+
static generateAvailabilityWidgets(props, isCanary, availabilityZoneIds) {
|
|
116
|
+
let widgets = [];
|
|
117
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
118
|
+
height: 6,
|
|
119
|
+
width: 24,
|
|
120
|
+
title: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' Availability',
|
|
121
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
122
|
+
left: RegionalAvailabilityMetrics_1.RegionalAvailabilityMetrics.createRegionalServiceAvailabilityMetrics({
|
|
123
|
+
label: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' availability',
|
|
124
|
+
period: props.service.period,
|
|
125
|
+
availabilityMetricProps: this.createRegionalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), isCanary, AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE),
|
|
126
|
+
}),
|
|
127
|
+
statistic: 'Sum',
|
|
128
|
+
leftYAxis: {
|
|
129
|
+
max: 100,
|
|
130
|
+
min: 95,
|
|
131
|
+
label: 'Availability',
|
|
132
|
+
showUnits: false,
|
|
133
|
+
},
|
|
134
|
+
right: RegionalAvailabilityMetrics_1.RegionalAvailabilityMetrics.createRegionalServiceAvailabilityMetrics({
|
|
135
|
+
label: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' faults',
|
|
136
|
+
period: props.service.period,
|
|
137
|
+
availabilityMetricProps: this.createRegionalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), isCanary, AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT),
|
|
138
|
+
}),
|
|
139
|
+
rightYAxis: {
|
|
140
|
+
label: 'Faults',
|
|
141
|
+
showUnits: false,
|
|
142
|
+
min: 0,
|
|
143
|
+
max: Math.ceil(props.service.faultCountThreshold * 1.5),
|
|
144
|
+
},
|
|
145
|
+
rightAnnotations: [
|
|
146
|
+
{
|
|
147
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
148
|
+
label: 'High severity',
|
|
149
|
+
value: props.service.faultCountThreshold,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
}));
|
|
153
|
+
for (let i = 0; i < availabilityZoneIds.length; i++) {
|
|
154
|
+
let availabilityZoneId = availabilityZoneIds[i];
|
|
155
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
156
|
+
height: 6,
|
|
157
|
+
width: 8,
|
|
158
|
+
title: availabilityZoneId + ' Availability',
|
|
159
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
160
|
+
left: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics({
|
|
161
|
+
label: availabilityZoneId + ' availability',
|
|
162
|
+
period: props.service.period,
|
|
163
|
+
availabilityMetricProps: this.createZonalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), availabilityZoneId, isCanary, AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE),
|
|
164
|
+
}),
|
|
165
|
+
statistic: 'Sum',
|
|
166
|
+
leftYAxis: {
|
|
167
|
+
max: 100,
|
|
168
|
+
min: 95,
|
|
169
|
+
label: 'Availability',
|
|
170
|
+
showUnits: false,
|
|
171
|
+
},
|
|
172
|
+
right: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics({
|
|
173
|
+
label: availabilityZoneId + ' faults',
|
|
174
|
+
period: props.service.period,
|
|
175
|
+
availabilityMetricProps: this.createZonalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), availabilityZoneId, isCanary, AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT),
|
|
176
|
+
}),
|
|
177
|
+
rightYAxis: {
|
|
178
|
+
label: 'Faults',
|
|
179
|
+
showUnits: false,
|
|
180
|
+
min: 0,
|
|
181
|
+
max: Math.ceil(props.service.faultCountThreshold * 1.5),
|
|
182
|
+
},
|
|
183
|
+
rightAnnotations: [
|
|
184
|
+
{
|
|
185
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
186
|
+
label: 'High severity',
|
|
187
|
+
value: props.service.faultCountThreshold,
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
return widgets;
|
|
193
|
+
}
|
|
194
|
+
static generateLatencyMetricWidgets(props, isCanary, availabilityZoneIds) {
|
|
195
|
+
let widgets = [];
|
|
196
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
197
|
+
height: 6,
|
|
198
|
+
width: 24,
|
|
199
|
+
title: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' Latency',
|
|
200
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
201
|
+
left: RegionalLatencyMetrics_1.RegionalLatencyMetrics.createRegionalServiceLatencyCountMetrics({
|
|
202
|
+
label: aws_cdk_lib_1.Fn.ref('AWS::Region') + ' latency',
|
|
203
|
+
period: props.service.period,
|
|
204
|
+
latencyMetricProps: this.createRegionalLatencyMetricProps(props.service.operations.filter((x) => x.critical), isCanary, LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY),
|
|
205
|
+
}),
|
|
206
|
+
statistic: 'Sum',
|
|
207
|
+
leftYAxis: {
|
|
208
|
+
max: props.service.faultCountThreshold * 1.5,
|
|
209
|
+
min: 0,
|
|
210
|
+
label: 'High latency count',
|
|
211
|
+
showUnits: false,
|
|
212
|
+
},
|
|
213
|
+
leftAnnotations: [
|
|
214
|
+
{
|
|
215
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
216
|
+
label: 'High severity',
|
|
217
|
+
value: props.service.faultCountThreshold,
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
}));
|
|
221
|
+
for (let i = 0; i < availabilityZoneIds.length; i++) {
|
|
222
|
+
let availabilityZoneId = availabilityZoneIds[i];
|
|
223
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
224
|
+
height: 6,
|
|
225
|
+
width: 8,
|
|
226
|
+
title: availabilityZoneId + ' Latency',
|
|
227
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
228
|
+
left: ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalServiceLatencyMetrics({
|
|
229
|
+
label: availabilityZoneId + ' latency',
|
|
230
|
+
period: props.service.period,
|
|
231
|
+
latencyMetricProps: this.createZonalLatencyMetricProps(props.service.operations.filter((x) => x.critical), availabilityZoneId, isCanary, LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY),
|
|
232
|
+
}),
|
|
233
|
+
statistic: 'Sum',
|
|
234
|
+
leftYAxis: {
|
|
235
|
+
max: props.service.faultCountThreshold * 1.5,
|
|
236
|
+
min: 0,
|
|
237
|
+
label: 'High latency count',
|
|
238
|
+
showUnits: false,
|
|
239
|
+
},
|
|
240
|
+
leftAnnotations: [
|
|
241
|
+
{
|
|
242
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
243
|
+
label: 'High severity',
|
|
244
|
+
value: props.service.faultCountThreshold,
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
return widgets;
|
|
250
|
+
}
|
|
251
|
+
static createRegionalAvailabilityMetricProps(criticalOperations, isCanary, metricType) {
|
|
252
|
+
return criticalOperations
|
|
253
|
+
.reduce((filtered, value) => {
|
|
254
|
+
if (isCanary && value.canaryMetricDetails) {
|
|
255
|
+
filtered.push(value.canaryMetricDetails.canaryAvailabilityMetricDetails);
|
|
256
|
+
}
|
|
257
|
+
else if (!isCanary) {
|
|
258
|
+
filtered.push(value.serverSideAvailabilityMetricDetails);
|
|
259
|
+
}
|
|
260
|
+
return filtered;
|
|
261
|
+
}, [])
|
|
262
|
+
.map((x) => {
|
|
263
|
+
return {
|
|
264
|
+
label: x.operationName + ' ' + metricType.toString().replace('_', ' '),
|
|
265
|
+
metricDetails: x,
|
|
266
|
+
metricType: metricType,
|
|
267
|
+
};
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
static createRegionalLatencyMetricProps(criticalOperations, isCanary, metricType) {
|
|
271
|
+
return criticalOperations
|
|
272
|
+
.reduce((filtered, value) => {
|
|
273
|
+
if (isCanary && value.canaryMetricDetails) {
|
|
274
|
+
filtered.push(value.canaryMetricDetails.canaryLatencyMetricDetails);
|
|
275
|
+
}
|
|
276
|
+
else if (!isCanary) {
|
|
277
|
+
filtered.push(value.serverSideLatencyMetricDetails);
|
|
278
|
+
}
|
|
279
|
+
return filtered;
|
|
280
|
+
}, [])
|
|
281
|
+
.map((x) => {
|
|
282
|
+
return {
|
|
283
|
+
label: x.operationName + ' ' + metricType.toString().replace('_', ' '),
|
|
284
|
+
metricDetails: x,
|
|
285
|
+
metricType: metricType,
|
|
286
|
+
statistic: 'TC(' + x.successAlarmThreshold + ':)',
|
|
287
|
+
};
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
static createZonalAvailabilityMetricProps(criticalOperations, availabilityZoneId, isCanary, metricType) {
|
|
291
|
+
return criticalOperations
|
|
292
|
+
.reduce((filtered, value) => {
|
|
293
|
+
if (isCanary &&
|
|
294
|
+
value.canaryMetricDetails !== undefined &&
|
|
295
|
+
value.canaryMetricDetails != null) {
|
|
296
|
+
filtered.push(value.canaryMetricDetails.canaryAvailabilityMetricDetails);
|
|
297
|
+
}
|
|
298
|
+
else if (!isCanary) {
|
|
299
|
+
filtered.push(value.serverSideAvailabilityMetricDetails);
|
|
300
|
+
}
|
|
301
|
+
return filtered;
|
|
302
|
+
}, [])
|
|
303
|
+
.map((x) => {
|
|
304
|
+
return {
|
|
305
|
+
label: x.operationName + ' ' + metricType.toString().replace('_', ' '),
|
|
306
|
+
metricDetails: x,
|
|
307
|
+
metricType: metricType,
|
|
308
|
+
availabilityZoneId: availabilityZoneId,
|
|
309
|
+
};
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
static createZonalLatencyMetricProps(criticalOperations, availabilityZoneId, isCanary, metricType) {
|
|
313
|
+
return criticalOperations
|
|
314
|
+
.reduce((filtered, value) => {
|
|
315
|
+
if (isCanary &&
|
|
316
|
+
value.canaryMetricDetails !== undefined &&
|
|
317
|
+
value.canaryMetricDetails != null) {
|
|
318
|
+
filtered.push(value.canaryMetricDetails.canaryLatencyMetricDetails);
|
|
319
|
+
}
|
|
320
|
+
else if (!isCanary) {
|
|
321
|
+
filtered.push(value.serverSideLatencyMetricDetails);
|
|
322
|
+
}
|
|
323
|
+
return filtered;
|
|
324
|
+
}, [])
|
|
325
|
+
.map((x) => {
|
|
326
|
+
return {
|
|
327
|
+
label: x.operationName + ' ' + metricType.toString().replace('_', ' '),
|
|
328
|
+
metricDetails: x,
|
|
329
|
+
metricType: metricType,
|
|
330
|
+
availabilityZoneId: availabilityZoneId,
|
|
331
|
+
statistic: 'TC(' + x.successAlarmThreshold + ':)',
|
|
332
|
+
};
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
static generateLoadBalancerWidgets(props, title, availabilityZoneNames) {
|
|
336
|
+
let albWidgets = [];
|
|
337
|
+
let loadBalancerFullName = props.service.loadBalancer.loadBalancerFullName;
|
|
338
|
+
albWidgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: title }));
|
|
339
|
+
albWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
340
|
+
height: 8,
|
|
341
|
+
width: 24,
|
|
342
|
+
title: aws_cdk_lib_1.Fn.sub('${AWS::Region} Fault Rate'),
|
|
343
|
+
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
344
|
+
left: [
|
|
345
|
+
ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.createRegionalApplicationLoadBalancerFaultRateMetric(loadBalancerFullName, props.service.period),
|
|
346
|
+
],
|
|
347
|
+
leftYAxis: {
|
|
348
|
+
max: 35,
|
|
349
|
+
min: 0,
|
|
350
|
+
label: 'Fault Rate',
|
|
351
|
+
showUnits: false,
|
|
352
|
+
},
|
|
353
|
+
leftAnnotations: [
|
|
354
|
+
{
|
|
355
|
+
value: 1,
|
|
356
|
+
visible: true,
|
|
357
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
358
|
+
label: 'High severity',
|
|
359
|
+
},
|
|
360
|
+
],
|
|
361
|
+
}));
|
|
362
|
+
availabilityZoneNames.forEach((availabilityZoneName) => {
|
|
363
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(availabilityZoneName.substring(availabilityZoneName.length - 1));
|
|
364
|
+
albWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
365
|
+
height: 6,
|
|
366
|
+
width: 8,
|
|
367
|
+
title: availabilityZoneId + ' Fault Rate',
|
|
368
|
+
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
369
|
+
left: [
|
|
370
|
+
ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.createZonalApplicationLoadBalancerFaultRateMetric(loadBalancerFullName, availabilityZoneName, props.service.period),
|
|
371
|
+
],
|
|
372
|
+
leftYAxis: {
|
|
373
|
+
max: 35,
|
|
374
|
+
min: 0,
|
|
375
|
+
label: 'Fault Rate',
|
|
376
|
+
showUnits: false,
|
|
377
|
+
},
|
|
378
|
+
leftAnnotations: [
|
|
379
|
+
{
|
|
380
|
+
value: 1,
|
|
381
|
+
visible: true,
|
|
382
|
+
color: aws_cloudwatch_1.Color.RED,
|
|
383
|
+
label: 'High severity',
|
|
384
|
+
},
|
|
385
|
+
],
|
|
386
|
+
}));
|
|
387
|
+
});
|
|
388
|
+
return albWidgets;
|
|
389
|
+
}
|
|
390
|
+
constructor(scope, id, props) {
|
|
391
|
+
super(scope, id);
|
|
392
|
+
let topLevelAggregateAlarmWidgets = [];
|
|
393
|
+
let availabilityZoneIds = props.service.availabilityZoneNames.map((x) => {
|
|
394
|
+
return props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(x.substring(x.length - 1));
|
|
395
|
+
});
|
|
396
|
+
topLevelAggregateAlarmWidgets.push(new aws_cloudwatch_1.TextWidget({
|
|
397
|
+
height: 2,
|
|
398
|
+
width: 24,
|
|
399
|
+
markdown: '***Availability and Latency Alarms***',
|
|
400
|
+
}));
|
|
401
|
+
topLevelAggregateAlarmWidgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
|
|
402
|
+
height: 2,
|
|
403
|
+
width: 24,
|
|
404
|
+
alarms: [props.aggregateRegionalAlarm],
|
|
405
|
+
title: 'Customer Experience - Regional Aggregate Impact Alarm (measures fault count in aggregate across all critical operations)',
|
|
406
|
+
}));
|
|
407
|
+
let keyPrefix = AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.nextChar('');
|
|
408
|
+
let perOperationAZFaultsMetrics = [];
|
|
409
|
+
for (let i = 0; i < availabilityZoneIds.length; i++) {
|
|
410
|
+
let counter = 1;
|
|
411
|
+
let availabilityZoneId = availabilityZoneIds[i];
|
|
412
|
+
topLevelAggregateAlarmWidgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
|
|
413
|
+
height: 2,
|
|
414
|
+
width: 8,
|
|
415
|
+
alarms: [props.zonalAggregateAlarms[i]],
|
|
416
|
+
title: availabilityZoneId +
|
|
417
|
+
' Zonal Isolated Impact Alarm (any critical operation in this AZ shows impact from server-side or canary)',
|
|
418
|
+
}));
|
|
419
|
+
let usingMetrics = {};
|
|
420
|
+
props.service.operations
|
|
421
|
+
.filter((x) => x.critical == true)
|
|
422
|
+
.forEach((x) => {
|
|
423
|
+
usingMetrics[`${keyPrefix}${counter++}`] =
|
|
424
|
+
ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalAvailabilityMetric({
|
|
425
|
+
availabilityZoneId: availabilityZoneId,
|
|
426
|
+
metricDetails: x.serverSideAvailabilityMetricDetails,
|
|
427
|
+
label: availabilityZoneId + ' ' + x.operationName + ' fault count',
|
|
428
|
+
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
429
|
+
keyPrefix: keyPrefix,
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
let zonalFaultCount = new aws_cloudwatch_1.MathExpression({
|
|
433
|
+
expression: Object.keys(usingMetrics).join('+'),
|
|
434
|
+
label: availabilityZoneId + ' fault count',
|
|
435
|
+
usingMetrics: usingMetrics,
|
|
436
|
+
});
|
|
437
|
+
perOperationAZFaultsMetrics.push(zonalFaultCount);
|
|
438
|
+
keyPrefix = AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.nextChar(keyPrefix);
|
|
439
|
+
}
|
|
440
|
+
let azContributorWidgets = [
|
|
441
|
+
new aws_cloudwatch_1.TextWidget({
|
|
442
|
+
height: 2,
|
|
443
|
+
width: 24,
|
|
444
|
+
markdown: '**AZ Contributors To Faults**',
|
|
445
|
+
}),
|
|
446
|
+
new aws_cloudwatch_1.GraphWidget({
|
|
447
|
+
height: 6,
|
|
448
|
+
width: 24,
|
|
449
|
+
title: 'AZ Fault Count',
|
|
450
|
+
period: props.service.period,
|
|
451
|
+
left: perOperationAZFaultsMetrics,
|
|
452
|
+
}),
|
|
453
|
+
];
|
|
454
|
+
topLevelAggregateAlarmWidgets.concat(ServiceAvailabilityAndLatencyDashboard.generateTPSWidgets(props, availabilityZoneIds));
|
|
455
|
+
this.dashboard = new aws_cloudwatch_1.Dashboard(this, 'TopLevelDashboard', {
|
|
456
|
+
dashboardName: props.service.serviceName.toLowerCase() +
|
|
457
|
+
aws_cdk_lib_1.Fn.sub('-service-availability-and-latency-${AWS::Region}'),
|
|
458
|
+
defaultInterval: props.interval,
|
|
459
|
+
periodOverride: aws_cloudwatch_1.PeriodOverride.INHERIT,
|
|
460
|
+
widgets: [
|
|
461
|
+
topLevelAggregateAlarmWidgets,
|
|
462
|
+
azContributorWidgets,
|
|
463
|
+
ServiceAvailabilityAndLatencyDashboard.generateServerSideAndCanaryAvailabilityWidgets(props, availabilityZoneIds),
|
|
464
|
+
ServiceAvailabilityAndLatencyDashboard.generateServerSideAndCanaryLatencyWidgets(props, availabilityZoneIds),
|
|
465
|
+
],
|
|
466
|
+
});
|
|
467
|
+
let lb = props.service.loadBalancer?.node
|
|
468
|
+
.defaultChild;
|
|
469
|
+
if (lb !== undefined && lb != null && lb.type == 'application') {
|
|
470
|
+
this.dashboard.addWidgets(...ServiceAvailabilityAndLatencyDashboard.generateLoadBalancerWidgets(props, 'Application Load Balancer Metrics', props.service.availabilityZoneNames));
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
exports.ServiceAvailabilityAndLatencyDashboard = ServiceAvailabilityAndLatencyDashboard;
|
|
475
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGFzaGJvYXJkcy9TZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBQ3RDLDZDQUFpQztBQUNqQywrREFVb0M7QUFLcEMsMkNBQXVDO0FBR3ZDLDhGQUEyRjtBQUMzRiw0RkFBeUY7QUFHekYsd0ZBQXFGO0FBQ3JGLDhFQUEyRTtBQUMzRSxrRkFBK0U7QUFDL0Usd0VBQXFFO0FBR3JFLGdGQUE2RTtBQUM3RSxzRUFBbUU7QUFFbkU7O0dBRUc7QUFDSCxNQUFhLHNDQUNYLFNBQVEsc0JBQVM7SUFFVCxNQUFNLENBQUMsa0JBQWtCLENBQy9CLEtBQWtELEVBQ2xELG1CQUE2QjtRQUU3QixJQUFJLE9BQU8sR0FBYyxFQUFFLENBQUM7UUFFNUIsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLDJCQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FDdEUsQ0FBQztRQUVGLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSw0QkFBVyxDQUFDO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNO1lBQ3JDLE1BQU0sRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDN0IsSUFBSSxFQUFFLHlEQUEyQixDQUFDLHdDQUF3QyxDQUN4RTtnQkFDRSxLQUFLLEVBQUUsZ0JBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTTtnQkFDckMsTUFBTSxFQUFFLEtBQUssQ0FB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QUFvQixLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJO2FBQ3ZELFlBQStCLENBQUM7UUFFbkMsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDdkIsR0FBRyxzQ0FBc0MsQ0FBQywyQkFBMkIsQ0FDbkUsS0FBSyxFQUNMLG1DQUFtQyxFQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUNwQyxDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBanNCRCx3RkFpc0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgRm4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBBbGFybVN0YXR1c1dpZGdldCxcbiAgQ29sb3IsXG4gIERhc2hib2FyZCxcbiAgR3JhcGhXaWRnZXQsXG4gIElNZXRyaWMsXG4gIElXaWRnZXQsXG4gIE1hdGhFeHByZXNzaW9uLFxuICBQZXJpb2RPdmVycmlkZSxcbiAgVGV4dFdpZGdldCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHtcbiAgQmFzZUxvYWRCYWxhbmNlcixcbiAgQ2ZuTG9hZEJhbGFuY2VyLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IElTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB9IGZyb20gJy4vSVNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkJztcbmltcG9ydCB7IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMgfSBmcm9tICcuL3Byb3BzL1NlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9BcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL0F2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzIH0gZnJvbSAnLi4vbWV0cmljcy9wcm9wcy9BdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyc7XG5pbXBvcnQgeyBMYXRlbmN5TWV0cmljUHJvcHMgfSBmcm9tICcuLi9tZXRyaWNzL3Byb3BzL0xhdGVuY3lNZXRyaWNQcm9wcyc7XG5pbXBvcnQgeyBSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL1JlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljcyc7XG5pbXBvcnQgeyBSZWdpb25hbExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9SZWdpb25hbExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzJztcbmltcG9ydCB7IFpvbmFsTGF0ZW5jeU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL1pvbmFsTGF0ZW5jeU1ldHJpY3MnO1xuaW1wb3J0IHsgSU9wZXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL0lPcGVyYXRpb24nO1xuaW1wb3J0IHsgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHMgfSBmcm9tICcuLi9zZXJ2aWNlcy9JT3BlcmF0aW9uTWV0cmljRGV0YWlscyc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0F2YWlsYWJpbGl0eU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvTGF0ZW5jeU1ldHJpY1R5cGUnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZXJ2aWNlIGxldmVsIGF2YWlsYWJpbGl0eSBhbmQgbGF0ZW5jeSBkYXNoYm9hcmRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkXG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgSVNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVUUFNXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHsgaGVpZ2h0OiAyLCB3aWR0aDogMjQsIG1hcmtkb3duOiAnKipUUFMgTWV0cmljcyoqJyB9KSxcbiAgICApO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHRpdGxlOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJykgKyAnIFRQUycsXG4gICAgICAgIHJlZ2lvbjogRm4ucmVmKCdBV1M6OlJlZ2lvbicpLFxuICAgICAgICBsZWZ0OiBSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MuY3JlYXRlUmVnaW9uYWxTZXJ2aWNlQXZhaWxhYmlsaXR5TWV0cmljcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyB0cHMnLFxuICAgICAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzOiBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbClcbiAgICAgICAgICAgICAgLm1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBsYWJlbDogeC5vcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogeC5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ1RQUycsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF2YWlsYWJpbGl0eVpvbmVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmVJZHNbaV07XG5cbiAgICAgIGxldCB6b25hbE1ldHJpY1Byb3BzID0ge1xuICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogcHJvcHMuc2VydmljZS5vcGVyYXRpb25zXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbClcbiAgICAgICAgICAubWFwKCh4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgbGFiZWw6IHgub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogeC5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5SRVFVRVNUX0NPVU5ULFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICd0cHMnLFxuICAgICAgfTtcblxuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0aXRsZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBUUFMnLFxuICAgICAgICAgIHJlZ2lvbjogRm4ucmVmKCdBV1M6OlJlZ2lvbicpLFxuICAgICAgICAgIGxlZnQ6IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVab25hbFNlcnZpY2VBdmFpbGFiaWxpdHlNZXRyaWNzKFxuICAgICAgICAgICAgem9uYWxNZXRyaWNQcm9wcyxcbiAgICAgICAgICApLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBsYWJlbDogJ1RQUycsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlU2VydmVyU2lkZUFuZENhbmFyeUF2YWlsYWJpbGl0eVdpZGdldHMoXG4gICAgcHJvcHM6IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkczogc3RyaW5nW10sXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246XG4gICAgICAgICAgJyoqU2VydmVyLXNpZGUgQXZhaWxhYmlsaXR5KipcXG4oRWFjaCBjcml0aWNhbCBvcGVyYXRpb24gaXMgZXF1YWxseSB3ZWlnaHRlZCByZWdhcmRsZXNzIG9mIHJlcXVlc3Qgdm9sdW1lKScsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgd2lkZ2V0cyA9IHdpZGdldHMuY29uY2F0KFxuICAgICAgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuZ2VuZXJhdGVBdmFpbGFiaWxpdHlXaWRnZXRzKFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZHMsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAoeCkgPT4geC5jcml0aWNhbCAmJiB4LmNhbmFyeU1ldHJpY0RldGFpbHMgIT09IHVuZGVmaW5lZCxcbiAgICAgICkubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICBtYXJrZG93bjpcbiAgICAgICAgICAgICcqKkNhbmFyeSBNZWFzdXJlZCBBdmFpbGFiaWxpdHkqKlxcbihFYWNoIG9wZXJhdGlvbiBpcyBlcXVhbGx5IHdlaWdodGVkIHJlZ2FyZGxlc3Mgb2YgcmVxdWVzdCB2b2x1bWUpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB3aWRnZXRzID0gd2lkZ2V0cy5jb25jYXQoXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlQXZhaWxhYmlsaXR5V2lkZ2V0cyhcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZHMsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB3aWRnZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVTZXJ2ZXJTaWRlQW5kQ2FuYXJ5TGF0ZW5jeVdpZGdldHMoXG4gICAgcHJvcHM6IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkczogc3RyaW5nW10sXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246XG4gICAgICAgICAgJyoqU2VydmVyLXNpZGUgTGF0ZW5jeSoqXFxuKEVhY2ggY3JpdGljYWwgb3BlcmF0aW9uIGlzIGVxdWFsbHkgd2VpZ2h0ZWQgcmVnYXJkbGVzcyBvZiByZXF1ZXN0IHZvbHVtZSknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMgPSB3aWRnZXRzLmNvbmNhdChcbiAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlTGF0ZW5jeU1ldHJpY1dpZGdldHMoXG4gICAgICAgIHByb3BzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkcyxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoXG4gICAgICAgICh4KSA9PiB4LmNyaXRpY2FsICYmIHguY2FuYXJ5TWV0cmljRGV0YWlscyAhPT0gdW5kZWZpbmVkLFxuICAgICAgKS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICAgIG1hcmtkb3duOlxuICAgICAgICAgICAgJyoqQ2FuYXJ5IE1lYXN1cmVkIExhdGVuY3kqKlxcbihFYWNoIG9wZXJhdGlvbiBpcyBlcXVhbGx5IHdlaWdodGVkIHJlZ2FyZGxlc3Mgb2YgcmVxdWVzdCB2b2x1bWUpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB3aWRnZXRzID0gd2lkZ2V0cy5jb25jYXQoXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlTGF0ZW5jeU1ldHJpY1dpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQXZhaWxhYmlsaXR5V2lkZ2V0cyhcbiAgICBwcm9wczogU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBhdmFpbGFiaWxpdHlab25lSWRzOiBzdHJpbmdbXSxcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgdGl0bGU6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgIGxlZnQ6IFJlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVSZWdpb25hbFNlcnZpY2VBdmFpbGFiaWxpdHlNZXRyaWNzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJykgKyAnIGF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5TWV0cmljUHJvcHM6IHRoaXMuY3JlYXRlUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyhcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCksXG4gICAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgbWluOiA5NSxcbiAgICAgICAgICBsYWJlbDogJ0F2YWlsYWJpbGl0eScsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHQ6XG4gICAgICAgICAgUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3Moe1xuICAgICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgZmF1bHRzJyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgICAgaXNDYW5hcnksXG4gICAgICAgICAgICAgIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICByaWdodFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdGYXVsdHMnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIG1heDogTWF0aC5jZWlsKHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCAqIDEuNSksXG4gICAgICAgIH0sXG4gICAgICAgIHJpZ2h0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIHNldmVyaXR5JyxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5zZXJ2aWNlLmZhdWx0Q291bnRUaHJlc2hvbGQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF2YWlsYWJpbGl0eVpvbmVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVmdDogWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3Moe1xuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBpc0NhbmFyeSxcbiAgICAgICAgICAgICAgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICAgIG1pbjogOTUsXG4gICAgICAgICAgICBsYWJlbDogJ0F2YWlsYWJpbGl0eScsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmlnaHQ6IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVab25hbFNlcnZpY2VBdmFpbGFiaWxpdHlNZXRyaWNzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBmYXVsdHMnLFxuICAgICAgICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgICBpc0NhbmFyeSxcbiAgICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHJpZ2h0WUF4aXM6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnRmF1bHRzJyxcbiAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICBtYXg6IE1hdGguY2VpbChwcm9wcy5zZXJ2aWNlLmZhdWx0Q291bnRUaHJlc2hvbGQgKiAxLjUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmlnaHRBbm5vdGF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgICB2YWx1ZTogcHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUxhdGVuY3lNZXRyaWNXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyBMYXRlbmN5JyxcbiAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgIGxlZnQ6IFJlZ2lvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlUmVnaW9uYWxTZXJ2aWNlTGF0ZW5jeUNvdW50TWV0cmljcyh7XG4gICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgbGF0ZW5jeScsXG4gICAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICBsYXRlbmN5TWV0cmljUHJvcHM6IHRoaXMuY3JlYXRlUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMoXG4gICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtYXg6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCAqIDEuNSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbGFiZWw6ICdIaWdoIGxhdGVuY3kgY291bnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgdmFsdWU6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXZhaWxhYmlsaXR5Wm9uZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IGF2YWlsYWJpbGl0eVpvbmVJZHNbaV07XG5cbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgTGF0ZW5jeScsXG4gICAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVmdDogWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbFNlcnZpY2VMYXRlbmN5TWV0cmljcyh7XG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBsYXRlbmN5JyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBsYXRlbmN5TWV0cmljUHJvcHM6IHRoaXMuY3JlYXRlWm9uYWxMYXRlbmN5TWV0cmljUHJvcHMoXG4gICAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgICBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBtYXg6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCAqIDEuNSxcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBsYXRlbmN5IGNvdW50JyxcbiAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sb3I6IENvbG9yLlJFRCxcbiAgICAgICAgICAgICAgbGFiZWw6ICdIaWdoIHNldmVyaXR5JyxcbiAgICAgICAgICAgICAgdmFsdWU6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB3aWRnZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyhcbiAgICBjcml0aWNhbE9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLFxuICApOiBBdmFpbGFiaWxpdHlNZXRyaWNQcm9wc1tdIHtcbiAgICByZXR1cm4gY3JpdGljYWxPcGVyYXRpb25zXG4gICAgICAucmVkdWNlKChmaWx0ZXJlZCwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzQ2FuYXJ5ICYmIHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKFxuICAgICAgICAgICAgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FuYXJ5KSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSwgW10gYXMgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHNbXSlcbiAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIHgub3BlcmF0aW9uTmFtZSArICcgJyArIG1ldHJpY1R5cGUudG9TdHJpbmcoKS5yZXBsYWNlKCdfJywgJyAnKSxcbiAgICAgICAgICBtZXRyaWNEZXRhaWxzOiB4LFxuICAgICAgICAgIG1ldHJpY1R5cGU6IG1ldHJpY1R5cGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlZ2lvbmFsTGF0ZW5jeU1ldHJpY1Byb3BzKFxuICAgIGNyaXRpY2FsT3BlcmF0aW9uczogSU9wZXJhdGlvbltdLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuLFxuICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLFxuICApOiBMYXRlbmN5TWV0cmljUHJvcHNbXSB7XG4gICAgcmV0dXJuIGNyaXRpY2FsT3BlcmF0aW9uc1xuICAgICAgLnJlZHVjZSgoZmlsdGVyZWQsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc0NhbmFyeSAmJiB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzKSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYW5hcnkpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHZhbHVlLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSwgW10gYXMgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHNbXSlcbiAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIHgub3BlcmF0aW9uTmFtZSArICcgJyArIG1ldHJpY1R5cGUudG9TdHJpbmcoKS5yZXBsYWNlKCdfJywgJyAnKSxcbiAgICAgICAgICBtZXRyaWNEZXRhaWxzOiB4LFxuICAgICAgICAgIG1ldHJpY1R5cGU6IG1ldHJpY1R5cGUsXG4gICAgICAgICAgc3RhdGlzdGljOiAnVEMoJyArIHguc3VjY2Vzc0FsYXJtVGhyZXNob2xkICsgJzopJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyhcbiAgICBjcml0aWNhbE9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSxcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLFxuICApOiBBdmFpbGFiaWxpdHlNZXRyaWNQcm9wc1tdIHtcbiAgICByZXR1cm4gY3JpdGljYWxPcGVyYXRpb25zXG4gICAgICAucmVkdWNlKChmaWx0ZXJlZCwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQ2FuYXJ5ICYmXG4gICAgICAgICAgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscyAhPSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2goXG4gICAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYW5hcnkpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHZhbHVlLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICB9LCBbXSBhcyBJT3BlcmF0aW9uTWV0cmljRGV0YWlsc1tdKVxuICAgICAgLm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgeC5vcGVyYXRpb25OYW1lICsgJyAnICsgbWV0cmljVHlwZS50b1N0cmluZygpLnJlcGxhY2UoJ18nLCAnICcpLFxuICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHgsXG4gICAgICAgICAgbWV0cmljVHlwZTogbWV0cmljVHlwZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlWm9uYWxMYXRlbmN5TWV0cmljUHJvcHMoXG4gICAgY3JpdGljYWxPcGVyYXRpb25zOiBJT3BlcmF0aW9uW10sXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgaXNDYW5hcnk6IGJvb2xlYW4sXG4gICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUsXG4gICk6IExhdGVuY3lNZXRyaWNQcm9wc1tdIHtcbiAgICByZXR1cm4gY3JpdGljYWxPcGVyYXRpb25zXG4gICAgICAucmVkdWNlKChmaWx0ZXJlZCwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQ2FuYXJ5ICYmXG4gICAgICAgICAgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscyAhPSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2godmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FuYXJ5KSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICAgIH0sIFtdIGFzIElPcGVyYXRpb25NZXRyaWNEZXRhaWxzW10pXG4gICAgICAubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWUgKyAnICcgKyBtZXRyaWNUeXBlLnRvU3RyaW5nKCkucmVwbGFjZSgnXycsICcgJyksXG4gICAgICAgICAgbWV0cmljRGV0YWlsczogeCxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBtZXRyaWNUeXBlLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1RDKCcgKyB4LnN1Y2Nlc3NBbGFybVRocmVzaG9sZCArICc6KScsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlTG9hZEJhbGFuY2VyV2lkZ2V0cyhcbiAgICBwcm9wczogU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVOYW1lczogc3RyaW5nW10sXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IGFsYldpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuICAgIGxldCBsb2FkQmFsYW5jZXJGdWxsTmFtZTogc3RyaW5nID0gKFxuICAgICAgcHJvcHMuc2VydmljZS5sb2FkQmFsYW5jZXIgYXMgQmFzZUxvYWRCYWxhbmNlclxuICAgICkubG9hZEJhbGFuY2VyRnVsbE5hbWU7XG5cbiAgICBhbGJXaWRnZXRzLnB1c2gobmV3IFRleHRXaWRnZXQoeyBoZWlnaHQ6IDIsIHdpZHRoOiAyNCwgbWFya2Rvd246IHRpdGxlIH0pKTtcbiAgICBhbGJXaWRnZXRzLnB1c2goXG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgdGl0bGU6IEZuLnN1YignJHtBV1M6OlJlZ2lvbn0gRmF1bHQgUmF0ZScpLFxuICAgICAgICByZWdpb246IEZuLnN1YignJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcy5jcmVhdGVSZWdpb25hbEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyRmF1bHRSYXRlTWV0cmljKFxuICAgICAgICAgICAgbG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtYXg6IDM1LFxuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBsYWJlbDogJ0ZhdWx0IFJhdGUnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmVOYW1lKSA9PiB7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPVxuICAgICAgICBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZU5hbWUubGVuZ3RoIC0gMSksXG4gICAgICAgICk7XG5cbiAgICAgIGFsYldpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgRmF1bHQgUmF0ZScsXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogW1xuICAgICAgICAgICAgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzLmNyZWF0ZVpvbmFsQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJGYXVsdFJhdGVNZXRyaWMoXG4gICAgICAgICAgICAgIGxvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZSxcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBtYXg6IDM1LFxuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdGYXVsdCBSYXRlJyxcbiAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBzZXZlcml0eScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGJXaWRnZXRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBsZXZlbCBkYXNoYm9hcmRcbiAgICovXG4gIGRhc2hib2FyZDogRGFzaGJvYXJkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGxldCB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkczogc3RyaW5nW10gPSBwcm9wcy5zZXJ2aWNlLmF2YWlsYWJpbGl0eVpvbmVOYW1lcy5tYXAoXG4gICAgICAoeCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoXG4gICAgICAgICAgeC5zdWJzdHJpbmcoeC5sZW5ndGggLSAxKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBtYXJrZG93bjogJyoqKkF2YWlsYWJpbGl0eSBhbmQgTGF0ZW5jeSBBbGFybXMqKionLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzLnB1c2goXG4gICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgYWxhcm1zOiBbcHJvcHMuYWdncmVnYXRlUmVnaW9uYWxBbGFybV0sXG4gICAgICAgIHRpdGxlOlxuICAgICAgICAgICdDdXN0b21lciBFeHBlcmllbmNlIC0gUmVnaW9uYWwgQWdncmVnYXRlIEltcGFjdCBBbGFybSAobWVhc3VyZXMgZmF1bHQgY291bnQgaW4gYWdncmVnYXRlIGFjcm9zcyBhbGwgY3JpdGljYWwgb3BlcmF0aW9ucyknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCBrZXlQcmVmaXg6IHN0cmluZyA9IEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLm5leHRDaGFyKCcnKTtcbiAgICBsZXQgcGVyT3BlcmF0aW9uQVpGYXVsdHNNZXRyaWNzOiBJTWV0cmljW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXZhaWxhYmlsaXR5Wm9uZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNvdW50ZXI6IG51bWJlciA9IDE7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICBhbGFybXM6IFtwcm9wcy56b25hbEFnZ3JlZ2F0ZUFsYXJtc1tpXV0sXG4gICAgICAgICAgdGl0bGU6XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgK1xuICAgICAgICAgICAgJyBab25hbCBJc29sYXRlZCBJbXBhY3QgQWxhcm0gKGFueSBjcml0aWNhbCBvcGVyYXRpb24gaW4gdGhpcyBBWiBzaG93cyBpbXBhY3QgZnJvbSBzZXJ2ZXItc2lkZSBvciBjYW5hcnkpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnNcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCA9PSB0cnVlKVxuICAgICAgICAuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlQcmVmaXh9JHtjb3VudGVyKyt9YF0gPVxuICAgICAgICAgICAgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHguc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArICcgJyArIHgub3BlcmF0aW9uTmFtZSArICcgZmF1bHQgY291bnQnLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgbGV0IHpvbmFsRmF1bHRDb3VudDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpLFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBmYXVsdCBjb3VudCcsXG4gICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgfSk7XG5cbiAgICAgIHBlck9wZXJhdGlvbkFaRmF1bHRzTWV0cmljcy5wdXNoKHpvbmFsRmF1bHRDb3VudCk7XG4gICAgICBrZXlQcmVmaXggPSBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5uZXh0Q2hhcihrZXlQcmVmaXgpO1xuICAgIH1cblxuICAgIGxldCBhekNvbnRyaWJ1dG9yV2lkZ2V0czogSVdpZGdldFtdID0gW1xuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246ICcqKkFaIENvbnRyaWJ1dG9ycyBUbyBGYXVsdHMqKicsXG4gICAgICB9KSxcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogJ0FaIEZhdWx0IENvdW50JyxcbiAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgbGVmdDogcGVyT3BlcmF0aW9uQVpGYXVsdHNNZXRyaWNzLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzLmNvbmNhdChcbiAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlVFBTV2lkZ2V0cyhcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZHMsXG4gICAgICApLFxuICAgICk7XG5cbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEYXNoYm9hcmQodGhpcywgJ1RvcExldmVsRGFzaGJvYXJkJywge1xuICAgICAgZGFzaGJvYXJkTmFtZTpcbiAgICAgICAgcHJvcHMuc2VydmljZS5zZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgRm4uc3ViKCctc2VydmljZS1hdmFpbGFiaWxpdHktYW5kLWxhdGVuY3ktJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgIGRlZmF1bHRJbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBwZXJpb2RPdmVycmlkZTogUGVyaW9kT3ZlcnJpZGUuSU5IRVJJVCxcbiAgICAgIHdpZGdldHM6IFtcbiAgICAgICAgdG9wTGV2ZWxBZ2dyZWdhdGVBbGFybVdpZGdldHMsXG4gICAgICAgIGF6Q29udHJpYnV0b3JXaWRnZXRzLFxuICAgICAgICBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5nZW5lcmF0ZVNlcnZlclNpZGVBbmRDYW5hcnlBdmFpbGFiaWxpdHlXaWRnZXRzKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZHMsXG4gICAgICAgICksXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlU2VydmVyU2lkZUFuZENhbmFyeUxhdGVuY3lXaWRnZXRzKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZHMsXG4gICAgICAgICksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgbGV0IGxiOiBDZm5Mb2FkQmFsYW5jZXIgPSBwcm9wcy5zZXJ2aWNlLmxvYWRCYWxhbmNlcj8ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2FkQmFsYW5jZXI7XG5cbiAgICBpZiAobGIgIT09IHVuZGVmaW5lZCAmJiBsYiAhPSBudWxsICYmIGxiLnR5cGUgPT0gJ2FwcGxpY2F0aW9uJykge1xuICAgICAgdGhpcy5kYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgICAgLi4uU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuZ2VuZXJhdGVMb2FkQmFsYW5jZXJXaWRnZXRzKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICdBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIE1ldHJpY3MnLFxuICAgICAgICAgIHByb3BzLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Duration } from 'aws-cdk-lib';
|
|
2
|
+
import { IAlarm, IMetric } from 'aws-cdk-lib/aws-cloudwatch';
|
|
3
|
+
import { AvailabilityZoneMapper } from '../../azmapper/AvailabilityZoneMapper';
|
|
4
|
+
export interface BasicServiceDashboardProps {
|
|
5
|
+
readonly serviceName: string;
|
|
6
|
+
readonly zonalLoadBalancerIsolatedImpactAlarms?: {
|
|
7
|
+
[key: string]: IAlarm;
|
|
8
|
+
};
|
|
9
|
+
readonly zonalNatGatewayIsolatedImpactAlarms?: {
|
|
10
|
+
[key: string]: IAlarm;
|
|
11
|
+
};
|
|
12
|
+
readonly zonalAggregateIsolatedImpactAlarms: {
|
|
13
|
+
[key: string]: IAlarm;
|
|
14
|
+
};
|
|
15
|
+
readonly zonalLoadBalancerFaultRateMetrics?: {
|
|
16
|
+
[key: string]: IMetric;
|
|
17
|
+
};
|
|
18
|
+
readonly zonalNatGatewayPacketDropMetrics?: {
|
|
19
|
+
[key: string]: IMetric;
|
|
20
|
+
};
|
|
21
|
+
readonly interval?: Duration;
|
|
22
|
+
readonly azMapper: AvailabilityZoneMapper;
|
|
23
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzaWNTZXJ2aWNlRGFzaGJvYXJkUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGFzaGJvYXJkcy9wcm9wcy9CYXNpY1NlcnZpY2VEYXNoYm9hcmRQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJQWxhcm0sIElNZXRyaWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlab25lTWFwcGVyIH0gZnJvbSAnLi4vLi4vYXptYXBwZXIvQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzaWNTZXJ2aWNlRGFzaGJvYXJkUHJvcHMge1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHpvbmFsTG9hZEJhbGFuY2VySXNvbGF0ZWRJbXBhY3RBbGFybXM/OiB7IFtrZXk6IHN0cmluZ106IElBbGFybSB9O1xuXG4gIHJlYWRvbmx5IHpvbmFsTmF0R2F0ZXdheUlzb2xhdGVkSW1wYWN0QWxhcm1zPzogeyBba2V5OiBzdHJpbmddOiBJQWxhcm0gfTtcblxuICByZWFkb25seSB6b25hbEFnZ3JlZ2F0ZUlzb2xhdGVkSW1wYWN0QWxhcm1zOiB7IFtrZXk6IHN0cmluZ106IElBbGFybSB9O1xuXG4gIHJlYWRvbmx5IHpvbmFsTG9hZEJhbGFuY2VyRmF1bHRSYXRlTWV0cmljcz86IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9O1xuXG4gIHJlYWRvbmx5IHpvbmFsTmF0R2F0ZXdheVBhY2tldERyb3BNZXRyaWNzPzogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH07XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICByZWFkb25seSBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcjtcbn1cbiJdfQ==
|