@cdklabs/multi-az-observability 0.0.1-alpha.59 → 0.0.1-alpha.60
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 +3 -3
- package/.jsii.tabl.json +1 -0
- package/README.md +167 -152
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +2 -2
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.d.ts +3 -3
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +1 -1
- package/lib/azmapper/AvailabilityZoneMapper.js +1 -1
- package/lib/basic_observability/BasicServiceMultiAZObservability.js +1 -1
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/monitoring/src/monitoring-layer.zip +0 -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/CanaryTestAvailabilityMetricsOverride.js +1 -1
- package/lib/services/CanaryTestLatencyMetricsOverride.js +1 -1
- package/lib/services/CanaryTestMetricsOverride.js +1 -1
- package/lib/services/ContributorInsightRuleDetails.js +1 -1
- package/lib/services/InstrumentedServiceMultiAZObservability.js +1 -1
- package/lib/services/Operation.js +1 -1
- package/lib/services/OperationAvailabilityMetricDetails.js +1 -1
- package/lib/services/OperationLatencyMetricDetails.js +1 -1
- package/lib/services/OperationMetricDetails.js +1 -1
- package/lib/services/Service.js +1 -1
- package/lib/services/ServiceAvailabilityMetricDetails.js +1 -1
- package/lib/services/ServiceLatencyMetricDetails.js +1 -1
- package/lib/services/ServiceMetricDetails.js +1 -1
- package/lib/services/props/MetricDimensions.js +1 -1
- package/package.json +6 -6
- package/rosetta/default.ts-fixture +72 -0
- package/rosetta/service.ts-fixture +144 -0
package/.jsii
CHANGED
|
@@ -3973,7 +3973,7 @@
|
|
|
3973
3973
|
},
|
|
3974
3974
|
"name": "@cdklabs/multi-az-observability",
|
|
3975
3975
|
"readme": {
|
|
3976
|
-
"markdown": "  \n\n# multi-az-observability\nThis is a CDK construct for multi-AZ observability to help detect single-AZ impairments. This is currently an `alpha` version, but is being used in the AWS [Advanced Multi-AZ Resilience Patterns](https://catalog.workshops.aws/multi-az-gray-failures/en-US) workshop.\n\nThere is a lot of available information to think through and combine to provide signals about single-AZ impact. To simplify the setup and use reasonable defaults, this construct (available in [TypeScript](https://www.npmjs.com/package/@cdklabs/multi-az-observability), [Go](https://github.com/cdklabs/cdk-multi-az-observability-go), [Python](https://pypi.org/project/cdklabs.multi-az-observability/), [.NET](https://www.nuget.org/packages/Cdklabs.MultiAZObservability), and [Java](https://central.sonatype.com/artifact/io.github.cdklabs/cdk-multi-az-observability)) sets up the necessary observability. To use the CDK construct, you first define your service like this:\n\n```csharp\nvar wildRydesService = new Service(new ServiceProps(){\n ServiceName = \"WildRydes\",\n BaseUrl = \"http://www.example.com\",\n FaultCountThreshold = 25,\n AvailabilityZoneNames = vpc.AvailabilityZones,\n Period = Duration.Seconds(60),\n LoadBalancer = loadBalancer,\n DefaultAvailabilityMetricDetails = new ServiceAvailabilityMetricDetails(new ServiceAvailabilityMetricDetailsProps() {\n AlarmStatistic = \"Sum\",\n DatapointsToAlarm = 2,\n EvaluationPeriods = 3,\n FaultAlarmThreshold = 1,\n FaultMetricNames = new string[] { \"Fault\", \"Failure\" },\n GraphedFaultStatistics = new string[] { \"Sum\" },\n GraphedSuccessStatistics = new string[] { \"Sum\" },\n MetricNamespace = metricsNamespace,\n Period = Duration.Seconds(60),\n SuccessAlarmThreshold = 99,\n SuccessMetricNames = new string[] {\"Success\"},\n Unit = Unit.COUNT,\n }),\n DefaultLatencyMetricDetails = new ServiceLatencyMetricDetails(new ServiceLatencyMetricDetailsProps(){\n AlarmStatistic = \"p99\",\n DatapointsToAlarm = 2,\n EvaluationPeriods = 3,\n FaultMetricNames = new string[] { \"FaultLatency\" },\n GraphedFaultStatistics = new string[] { \"p50\" },\n GraphedSuccessStatistics = new string[] { \"p50\", \"p99\", \"tm50\", \"tm99\" },\n MetricNamespace = metricsNamespace,\n Period = Duration.Seconds(60),\n SuccessAlarmThreshold = Duration.Millis(100),\n SuccessMetricNames = new string[] {\"SuccessLatency\"},\n Unit = Unit.MILLISECONDS,\n }),\n DefaultContributorInsightRuleDetails = new ContributorInsightRuleDetails(new ContributorInsightRuleDetailsProps() {\n AvailabilityZoneIdJsonPath = azIdJsonPath,\n FaultMetricJsonPath = faultMetricJsonPath,\n InstanceIdJsonPath = instanceIdJsonPath,\n LogGroups = serverLogGroups,\n OperationNameJsonPath = operationNameJsonPath,\n SuccessLatencyMetricJsonPath = successLatencyMetricJsonPath\n }),\n CanaryTestProps = new AddCanaryTestProps() {\n RequestCount = 60,\n RegionalRequestCount = 60,\n LoadBalancer = loadBalancer,\n Schedule = \"rate(1 minute)\",\n Timeout = Duration.Seconds(3),\n NetworkConfiguration = new NetworkConfigurationProps() {\n Vpc = vpc,\n SubnetSelection = new SubnetSelection() { SubnetType = SubnetType.PRIVATE_ISOLATED }\n }\n }\n}\n\nwildRydesService.AddOperation(new Operation(new OperationProps() {\n OperationName = \"Signin\",\n Path = \"/signin\",\n Service = wildRydesService,\n Critical = true,\n HttpMethods = new string[] { \"GET\" },\n ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {\n OperationName = \"Signin\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Signin\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultAvailabilityMetricDetails),\n ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {\n OperationName = \"Signin\",\n SuccessAlarmThreshold = Duration.Millis(150),\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Signin\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultLatencyMetricDetails),\n CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {\n SuccessAlarmThreshold = Duration.Millis(500)\n })\n})\nwildRydesService.AddOperation(new Operation(new OperationProps() {\n OperationName = \"Pay\",\n Path = \"/pay\",\n Service = wildRydesService,\n HttpMethods = new string[] { \"GET\" },\n Critical = true,\n ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {\n OperationName = \"Pay\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Pay\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultAvailabilityMetricDetails),\n ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {\n OperationName = \"Pay\",\n SuccessAlarmThreshold = Duration.Millis(200),\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Pay\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultLatencyMetricDetails),\n CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {\n SuccessAlarmThreshold = Duration.Millis(500)\n })\n})\nwildRydesService.AddOperation(new Operation(new OperationProps() {\n OperationName = \"Ride\",\n Path = \"/ride\",\n Service = wildRydesService,\n HttpMethods = new string[] { \"GET\" },\n Critical = true,\n ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {\n OperationName = \"Ride\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Ride\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultAvailabilityMetricDetails),\n ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {\n OperationName = \"Ride\",\n SuccessAlarmThreshold = Duration.Millis(350),\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Ride\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultLatencyMetricDetails),\n CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {\n SuccessAlarmThreshold = Duration.Millis(650)\n })\n})\nwildRydesService.AddOperation(new Operation(new OperationProps() {\n OperationName = \"Home\",\n Path = \"/home\",\n Service = wildRydesService,\n HttpMethods = new string[] { \"GET\" },\n Critical = true,\n ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {\n OperationName = \"Home\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Home\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultAvailabilityMetricDetails),\n ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {\n OperationName = \"Home\",\n SuccessAlarmThreshold = Duration.Millis(100),\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ \"Operation\", \"Home\"}}, \"AZ-ID\", \"Region\")\n }, wildRydesService.DefaultLatencyMetricDetails),\n CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {\n SuccessAlarmThreshold = Duration.Millis(500)\n })\n}));\n```\n\nThen you provide that service definition to the CDK construct.\n\n```csharp\nInstrumentedServiceMultiAZObservability multiAvailabilityZoneObservability = new InstrumentedServiceMultiAZObservability(this, \"MultiAZObservability\", new InstrumentedServiceMultiAZObservabilityProps() {\n Service = wildRydesService,\n CreateDashboards = true,\n Interval = Duration.Minutes(60), // The interval for the dashboard\n OutlierDetectionAlgorithm = OutlierDetectionAlgorithm.STATIC\n});\n```\n\nYou define some characteristics of the service, default values for metrics and alarms, and then add operations as well as any overrides for default values that you need. The construct can also automatically create synthetic canaries that test each operation with a very simple HTTP check, or you can configure your own synthetics and just tell the construct about the metric details and optionally log files. This creates metrics, alarms, and dashboards that can be used to detect single-AZ impact. You can access these alarms from the `multiAvailabilityZoneObservability` object and use them in your CDK project to start automation, send SNS notifications, or incorporate in your own dashboards.\n\nIf you don't have service specific logs and custom metrics with per-AZ dimensions, you can still use the construct to evaluate ALB and/or NAT Gateway metrics to find single AZ impairments.\n\n```csharp\nBasicServiceMultiAZObservability multiAZObservability = new BasicServiceMultiAZObservability(this, \"basic-service-\", new BasicServiceMultiAZObservabilityProps() {\n ApplicationLoadBalancerProps = new ApplicationLoadBalancerDetectionProps() {\n ApplicationLoadBalancers = [ myALB ],\n LatencyStatistic = Stats.Percentile(99),\n FaultCountPercentThreshold = 1,\n LatencyThreshold = Duration.Millis(500)\n },\n NatGatewayProps = new NatGatewayDetectionProps() {\n PacketLossPercentThreshold = 0.01,\n NatGateways = {\n { \"us-east-1a\", [ natGateway1 ] },\n { \"us-east-1b\", [ natGateway2 ] },\n { \"us-east-1c\", [ natGateway3 ] }\n },\n },\n CreateDashboard = true,\n DatapointsToAlarm = 2,\n EvaluationPeriods = 3,\n ServiceName = \"WildRydes\",\n Period = Duration.Seconds(60),\n Interval = Duration.Minutes(60),\n});\n```\n\nIf you provide a load balancer, the construct assumes it is deployed in each AZ of the VPC the load balancer is associated with and will look for HTTP metrics using those AZs as dimensions.\n\nBoth options support running workloads on EC2, ECS, Lambda, and EKS."
|
|
3976
|
+
"markdown": "  \n\n# multi-az-observability\nThis is a CDK construct for multi-AZ observability to help detect single-AZ impairments. This is currently an `alpha` version, but is being used in the AWS [Advanced Multi-AZ Resilience Patterns](https://catalog.workshops.aws/multi-az-gray-failures/en-US) workshop.\n\nThere is a lot of available information to think through and combine to provide signals about single-AZ impact. To simplify the setup and use reasonable defaults, this construct (available in [TypeScript](https://www.npmjs.com/package/@cdklabs/multi-az-observability), [Go](https://github.com/cdklabs/cdk-multi-az-observability-go), [Python](https://pypi.org/project/cdklabs.multi-az-observability/), [.NET](https://www.nuget.org/packages/Cdklabs.MultiAZObservability), and [Java](https://central.sonatype.com/artifact/io.github.cdklabs/cdk-multi-az-observability)) sets up the necessary observability. To use the CDK construct, you first define your service like this:\n\n```typescript\nlet service: IService = new Service({\n serviceName: 'test',\n availabilityZoneNames: vpc.availabilityZones,\n baseUrl: 'http://www.example.com',\n faultCountThreshold: 25,\n period: Duration.seconds(60),\n loadBalancer: loadBalancer,\n targetGroups: [ targetGroup1, targetGroup2 ],\n defaultAvailabilityMetricDetails: new ServiceAvailabilityMetricDetails({\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['Success'],\n faultMetricNames: ['Fault', 'Error'],\n alarmStatistic: 'Sum',\n unit: Unit.COUNT,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: 99.9,\n faultAlarmThreshold: 0.1,\n graphedFaultStatistics: ['Sum'],\n graphedSuccessStatistics: ['Sum'],\n }),\n defaultLatencyMetricDetails: new ServiceLatencyMetricDetails({\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['SuccessLatency'],\n faultMetricNames: ['FaultLatency'],\n alarmStatistic: 'p99',\n unit: Unit.MILLISECONDS,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: Duration.millis(150),\n graphedFaultStatistics: ['p99'],\n graphedSuccessStatistics: ['p50', 'p99', 'tm99'],\n }),\n defaultContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n logGroups: [logGroup],\n }),\n canaryTestProps: {\n requestCount: 10,\n schedule: 'rate(1 minute)',\n loadBalancer: loadBalancer,\n networkConfiguration: {\n vpc: vpc,\n subnetSelection: { subnetType: SubnetType.PRIVATE_ISOLATED },\n },\n },\n minimumUnhealthyTargets: {\n percentage: 0.1\n }\n });\n\nlet rideOperation: Operation = {\n operationName: 'ride',\n service: service,\n path: '/ride',\n critical: true,\n httpMethods: ['GET'],\n serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n logGroups: [logGroup],\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n }),\n serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(\n {\n operationName: 'ride',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultAvailabilityMetricDetails,\n ),\n serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(\n {\n operationName: 'ride',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultLatencyMetricDetails,\n ),\n};\n\nlet payOperation: Operation = {\n operationName: 'pay',\n service: service,\n path: '/pay',\n critical: true,\n httpMethods: ['GET'],\n serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n logGroups: [logGroup],\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n }),\n serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(\n {\n operationName: 'pay',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultAvailabilityMetricDetails,\n ),\n serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(\n {\n operationName: 'pay',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultLatencyMetricDetails,\n ),\n};\n\nservice.addOperation(rideOperation);\nservice.addOperation(payOperation);\n```\n\nThen you provide that service definition to the CDK construct.\n\n```typescript fixture=service\nnew InstrumentedServiceMultiAZObservability(stack, 'MAZObservability', {\n createDashboards: true,\n service: service,\n interval: Duration.minutes(60)\n});\n```\n\nYou define some characteristics of the service, default values for metrics and alarms, and then add operations as well as any overrides for default values that you need. The construct can also automatically create synthetic canaries that test each operation with a very simple HTTP check, or you can configure your own synthetics and just tell the construct about the metric details and optionally log files. This creates metrics, alarms, and dashboards that can be used to detect single-AZ impact. You can access these alarms from the `multiAvailabilityZoneObservability` object and use them in your CDK project to start automation, send SNS notifications, or incorporate in your own dashboards.\n\nIf you don't have service specific logs and custom metrics with per-AZ dimensions, you can still use the construct to evaluate ALB and/or NAT Gateway metrics to find single AZ impairments.\n\n```typescript\nnew BasicServiceMultiAZObservability(stack, 'MAZObservability', {\n applicationLoadBalancerProps: {\n albTargetGroupMap: [\n {\n applicationLoadBalancer: new ApplicationLoadBalancer(stack, 'alb', {\n vpc: vpc,\n crossZoneEnabled: true,\n }),\n targetGroups: [\n targetGroup1,\n targetGroup2\n ]\n }\n ],\n faultCountPercentThreshold: 1,\n latencyStatistic: Stats.percentile(99),\n latencyThreshold: Duration.millis(200),\n latencyOutlierAlgorithm: ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC,\n latencyOutlierThreshold: 45\n },\n natGatewayProps: {\n natGateways: {\n \"us-east-1a\": [ natGateway1 ],\n \"us-east-1b\": [ natGateway2 ],\n \"us-east-1c\": [ natGateway3 ]\n },\n packetLossPercentThreshold: 0.01\n },\n serviceName: 'test',\n period: Duration.seconds(60),\n createDashboard: true,\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n});\n```\n\nIf you provide a load balancer, the construct assumes it is deployed in each AZ of the VPC the load balancer is associated with and will look for HTTP metrics using those AZs as dimensions.\n\nBoth options support running workloads on EC2, ECS, Lambda, and EKS."
|
|
3977
3977
|
},
|
|
3978
3978
|
"repository": {
|
|
3979
3979
|
"type": "git",
|
|
@@ -12029,6 +12029,6 @@
|
|
|
12029
12029
|
"symbolId": "src/services/props/ServiceProps:ServiceProps"
|
|
12030
12030
|
}
|
|
12031
12031
|
},
|
|
12032
|
-
"version": "0.0.1-alpha.
|
|
12033
|
-
"fingerprint": "
|
|
12032
|
+
"version": "0.0.1-alpha.60",
|
|
12033
|
+
"fingerprint": "vmNybvDZy76vT0q/chsRZH6amzv40rcTPPzD6mtao88="
|
|
12034
12034
|
}
|
package/.jsii.tabl.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":"2","toolVersion":"5.9.7","snippets":{"d6c731d0c6229dd65c37f28bef8d6a5c0cf4ce8724edcae8fd56141a3841bffa":{"translations":{"python":{"source":"service = Service(\n service_name=\"test\",\n availability_zone_names=vpc.availability_zones,\n base_url=\"http://www.example.com\",\n fault_count_threshold=25,\n period=Duration.seconds(60),\n load_balancer=load_balancer,\n target_groups=[target_group1, target_group2],\n default_availability_metric_details=ServiceAvailabilityMetricDetails(\n metric_namespace=\"front-end/metrics\",\n success_metric_names=[\"Success\"],\n fault_metric_names=[\"Fault\", \"Error\"],\n alarm_statistic=\"Sum\",\n unit=Unit.COUNT,\n period=Duration.seconds(60),\n evaluation_periods=5,\n datapoints_to_alarm=3,\n success_alarm_threshold=99.9,\n fault_alarm_threshold=0.1,\n graphed_fault_statistics=[\"Sum\"],\n graphed_success_statistics=[\"Sum\"]\n ),\n default_latency_metric_details=ServiceLatencyMetricDetails(\n metric_namespace=\"front-end/metrics\",\n success_metric_names=[\"SuccessLatency\"],\n fault_metric_names=[\"FaultLatency\"],\n alarm_statistic=\"p99\",\n unit=Unit.MILLISECONDS,\n period=Duration.seconds(60),\n evaluation_periods=5,\n datapoints_to_alarm=3,\n success_alarm_threshold=Duration.millis(150),\n graphed_fault_statistics=[\"p99\"],\n graphed_success_statistics=[\"p50\", \"p99\", \"tm99\"]\n ),\n default_contributor_insight_rule_details=ContributorInsightRuleDetails(\n success_latency_metric_json_path=\"$.SuccessLatency\",\n fault_metric_json_path=\"$.Faults\",\n operation_name_json_path=\"$.Operation\",\n instance_id_json_path=\"$.InstanceId\",\n availability_zone_id_json_path=\"$.AZ-ID\",\n log_groups=[log_group]\n ),\n canary_test_props=AddCanaryTestProps(\n request_count=10,\n schedule=\"rate(1 minute)\",\n load_balancer=load_balancer,\n network_configuration=NetworkConfigurationProps(\n vpc=vpc,\n subnet_selection=SubnetSelection(subnet_type=SubnetType.PRIVATE_ISOLATED)\n )\n ),\n minimum_unhealthy_targets=MinimumUnhealthyTargets(\n percentage=0.1\n )\n)\n\nride_operation = {\n \"operation_name\": \"ride\",\n \"service\": service,\n \"path\": \"/ride\",\n \"critical\": True,\n \"http_methods\": [\"GET\"],\n \"server_side_contributor_insight_rule_details\": ContributorInsightRuleDetails(\n log_groups=[log_group],\n success_latency_metric_json_path=\"$.SuccessLatency\",\n fault_metric_json_path=\"$.Faults\",\n operation_name_json_path=\"$.Operation\",\n instance_id_json_path=\"$.InstanceId\",\n availability_zone_id_json_path=\"$.AZ-ID\"\n ),\n \"server_side_availability_metric_details\": OperationAvailabilityMetricDetails(OperationAvailabilityMetricDetailsProps(\n operation_name=\"ride\",\n metric_dimensions=MetricDimensions({\"Operation\": \"ride\"}, \"AZ-ID\", \"Region\")\n ), service.default_availability_metric_details),\n \"server_side_latency_metric_details\": OperationLatencyMetricDetails(OperationLatencyMetricDetailsProps(\n operation_name=\"ride\",\n metric_dimensions=MetricDimensions({\"Operation\": \"ride\"}, \"AZ-ID\", \"Region\")\n ), service.default_latency_metric_details)\n}\n\npay_operation = {\n \"operation_name\": \"pay\",\n \"service\": service,\n \"path\": \"/pay\",\n \"critical\": True,\n \"http_methods\": [\"GET\"],\n \"server_side_contributor_insight_rule_details\": ContributorInsightRuleDetails(\n log_groups=[log_group],\n success_latency_metric_json_path=\"$.SuccessLatency\",\n fault_metric_json_path=\"$.Faults\",\n operation_name_json_path=\"$.Operation\",\n instance_id_json_path=\"$.InstanceId\",\n availability_zone_id_json_path=\"$.AZ-ID\"\n ),\n \"server_side_availability_metric_details\": OperationAvailabilityMetricDetails(OperationAvailabilityMetricDetailsProps(\n operation_name=\"pay\",\n metric_dimensions=MetricDimensions({\"Operation\": \"ride\"}, \"AZ-ID\", \"Region\")\n ), service.default_availability_metric_details),\n \"server_side_latency_metric_details\": OperationLatencyMetricDetails(OperationLatencyMetricDetailsProps(\n operation_name=\"pay\",\n metric_dimensions=MetricDimensions({\"Operation\": \"ride\"}, \"AZ-ID\", \"Region\")\n ), service.default_latency_metric_details)\n}\n\nservice.add_operation(ride_operation)\nservice.add_operation(pay_operation)","version":"2"},"csharp":{"source":"var service = new Service(new ServiceProps {\n ServiceName = \"test\",\n AvailabilityZoneNames = vpc.AvailabilityZones,\n BaseUrl = \"http://www.example.com\",\n FaultCountThreshold = 25,\n Period = Duration.Seconds(60),\n LoadBalancer = loadBalancer,\n TargetGroups = new [] { targetGroup1, targetGroup2 },\n DefaultAvailabilityMetricDetails = new ServiceAvailabilityMetricDetails(new ServiceAvailabilityMetricDetailsProps {\n MetricNamespace = \"front-end/metrics\",\n SuccessMetricNames = new [] { \"Success\" },\n FaultMetricNames = new [] { \"Fault\", \"Error\" },\n AlarmStatistic = \"Sum\",\n Unit = Unit.COUNT,\n Period = Duration.Seconds(60),\n EvaluationPeriods = 5,\n DatapointsToAlarm = 3,\n SuccessAlarmThreshold = 99.9,\n FaultAlarmThreshold = 0.1,\n GraphedFaultStatistics = new [] { \"Sum\" },\n GraphedSuccessStatistics = new [] { \"Sum\" }\n }),\n DefaultLatencyMetricDetails = new ServiceLatencyMetricDetails(new ServiceLatencyMetricDetailsProps {\n MetricNamespace = \"front-end/metrics\",\n SuccessMetricNames = new [] { \"SuccessLatency\" },\n FaultMetricNames = new [] { \"FaultLatency\" },\n AlarmStatistic = \"p99\",\n Unit = Unit.MILLISECONDS,\n Period = Duration.Seconds(60),\n EvaluationPeriods = 5,\n DatapointsToAlarm = 3,\n SuccessAlarmThreshold = Duration.Millis(150),\n GraphedFaultStatistics = new [] { \"p99\" },\n GraphedSuccessStatistics = new [] { \"p50\", \"p99\", \"tm99\" }\n }),\n DefaultContributorInsightRuleDetails = new ContributorInsightRuleDetails(new ContributorInsightRuleDetailsProps {\n SuccessLatencyMetricJsonPath = \"$.SuccessLatency\",\n FaultMetricJsonPath = \"$.Faults\",\n OperationNameJsonPath = \"$.Operation\",\n InstanceIdJsonPath = \"$.InstanceId\",\n AvailabilityZoneIdJsonPath = \"$.AZ-ID\",\n LogGroups = new [] { logGroup }\n }),\n CanaryTestProps = new AddCanaryTestProps {\n RequestCount = 10,\n Schedule = \"rate(1 minute)\",\n LoadBalancer = loadBalancer,\n NetworkConfiguration = new NetworkConfigurationProps {\n Vpc = vpc,\n SubnetSelection = new SubnetSelection { SubnetType = SubnetType.PRIVATE_ISOLATED }\n }\n },\n MinimumUnhealthyTargets = new MinimumUnhealthyTargets {\n Percentage = 0.1\n }\n});\n\nvar rideOperation = new Dictionary<string, object> {\n { \"operationName\", \"ride\" },\n { \"service\", service },\n { \"path\", \"/ride\" },\n { \"critical\", true },\n { \"httpMethods\", new [] { \"GET\" } },\n { \"serverSideContributorInsightRuleDetails\", new ContributorInsightRuleDetails(new ContributorInsightRuleDetailsProps {\n LogGroups = new [] { logGroup },\n SuccessLatencyMetricJsonPath = \"$.SuccessLatency\",\n FaultMetricJsonPath = \"$.Faults\",\n OperationNameJsonPath = \"$.Operation\",\n InstanceIdJsonPath = \"$.InstanceId\",\n AvailabilityZoneIdJsonPath = \"$.AZ-ID\"\n }) },\n { \"serverSideAvailabilityMetricDetails\", new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps {\n OperationName = \"ride\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> { { \"Operation\", \"ride\" } }, \"AZ-ID\", \"Region\")\n }, service.DefaultAvailabilityMetricDetails) },\n { \"serverSideLatencyMetricDetails\", new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps {\n OperationName = \"ride\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> { { \"Operation\", \"ride\" } }, \"AZ-ID\", \"Region\")\n }, service.DefaultLatencyMetricDetails) }\n};\n\nvar payOperation = new Dictionary<string, object> {\n { \"operationName\", \"pay\" },\n { \"service\", service },\n { \"path\", \"/pay\" },\n { \"critical\", true },\n { \"httpMethods\", new [] { \"GET\" } },\n { \"serverSideContributorInsightRuleDetails\", new ContributorInsightRuleDetails(new ContributorInsightRuleDetailsProps {\n LogGroups = new [] { logGroup },\n SuccessLatencyMetricJsonPath = \"$.SuccessLatency\",\n FaultMetricJsonPath = \"$.Faults\",\n OperationNameJsonPath = \"$.Operation\",\n InstanceIdJsonPath = \"$.InstanceId\",\n AvailabilityZoneIdJsonPath = \"$.AZ-ID\"\n }) },\n { \"serverSideAvailabilityMetricDetails\", new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps {\n OperationName = \"pay\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> { { \"Operation\", \"ride\" } }, \"AZ-ID\", \"Region\")\n }, service.DefaultAvailabilityMetricDetails) },\n { \"serverSideLatencyMetricDetails\", new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps {\n OperationName = \"pay\",\n MetricDimensions = new MetricDimensions(new Dictionary<string, string> { { \"Operation\", \"ride\" } }, \"AZ-ID\", \"Region\")\n }, service.DefaultLatencyMetricDetails) }\n};\n\nservice.AddOperation(rideOperation);\nservice.AddOperation(payOperation);","version":"1"},"java":{"source":"IService service = Service.Builder.create()\n .serviceName(\"test\")\n .availabilityZoneNames(vpc.getAvailabilityZones())\n .baseUrl(\"http://www.example.com\")\n .faultCountThreshold(25)\n .period(Duration.seconds(60))\n .loadBalancer(loadBalancer)\n .targetGroups(List.of(targetGroup1, targetGroup2))\n .defaultAvailabilityMetricDetails(ServiceAvailabilityMetricDetails.Builder.create()\n .metricNamespace(\"front-end/metrics\")\n .successMetricNames(List.of(\"Success\"))\n .faultMetricNames(List.of(\"Fault\", \"Error\"))\n .alarmStatistic(\"Sum\")\n .unit(Unit.COUNT)\n .period(Duration.seconds(60))\n .evaluationPeriods(5)\n .datapointsToAlarm(3)\n .successAlarmThreshold(99.9)\n .faultAlarmThreshold(0.1)\n .graphedFaultStatistics(List.of(\"Sum\"))\n .graphedSuccessStatistics(List.of(\"Sum\"))\n .build())\n .defaultLatencyMetricDetails(ServiceLatencyMetricDetails.Builder.create()\n .metricNamespace(\"front-end/metrics\")\n .successMetricNames(List.of(\"SuccessLatency\"))\n .faultMetricNames(List.of(\"FaultLatency\"))\n .alarmStatistic(\"p99\")\n .unit(Unit.MILLISECONDS)\n .period(Duration.seconds(60))\n .evaluationPeriods(5)\n .datapointsToAlarm(3)\n .successAlarmThreshold(Duration.millis(150))\n .graphedFaultStatistics(List.of(\"p99\"))\n .graphedSuccessStatistics(List.of(\"p50\", \"p99\", \"tm99\"))\n .build())\n .defaultContributorInsightRuleDetails(ContributorInsightRuleDetails.Builder.create()\n .successLatencyMetricJsonPath(\"$.SuccessLatency\")\n .faultMetricJsonPath(\"$.Faults\")\n .operationNameJsonPath(\"$.Operation\")\n .instanceIdJsonPath(\"$.InstanceId\")\n .availabilityZoneIdJsonPath(\"$.AZ-ID\")\n .logGroups(List.of(logGroup))\n .build())\n .canaryTestProps(AddCanaryTestProps.builder()\n .requestCount(10)\n .schedule(\"rate(1 minute)\")\n .loadBalancer(loadBalancer)\n .networkConfiguration(NetworkConfigurationProps.builder()\n .vpc(vpc)\n .subnetSelection(SubnetSelection.builder().subnetType(SubnetType.PRIVATE_ISOLATED).build())\n .build())\n .build())\n .minimumUnhealthyTargets(MinimumUnhealthyTargets.builder()\n .percentage(0.1)\n .build())\n .build();\n\nOperation rideOperation = Map.of(\n \"operationName\", \"ride\",\n \"service\", service,\n \"path\", \"/ride\",\n \"critical\", true,\n \"httpMethods\", List.of(\"GET\"),\n \"serverSideContributorInsightRuleDetails\", ContributorInsightRuleDetails.Builder.create()\n .logGroups(List.of(logGroup))\n .successLatencyMetricJsonPath(\"$.SuccessLatency\")\n .faultMetricJsonPath(\"$.Faults\")\n .operationNameJsonPath(\"$.Operation\")\n .instanceIdJsonPath(\"$.InstanceId\")\n .availabilityZoneIdJsonPath(\"$.AZ-ID\")\n .build(),\n \"serverSideAvailabilityMetricDetails\", new OperationAvailabilityMetricDetails(OperationAvailabilityMetricDetailsProps.builder()\n .operationName(\"ride\")\n .metricDimensions(new MetricDimensions(Map.of(\"Operation\", \"ride\"), \"AZ-ID\", \"Region\"))\n .build(), service.getDefaultAvailabilityMetricDetails()),\n \"serverSideLatencyMetricDetails\", new OperationLatencyMetricDetails(OperationLatencyMetricDetailsProps.builder()\n .operationName(\"ride\")\n .metricDimensions(new MetricDimensions(Map.of(\"Operation\", \"ride\"), \"AZ-ID\", \"Region\"))\n .build(), service.getDefaultLatencyMetricDetails()));\n\nOperation payOperation = Map.of(\n \"operationName\", \"pay\",\n \"service\", service,\n \"path\", \"/pay\",\n \"critical\", true,\n \"httpMethods\", List.of(\"GET\"),\n \"serverSideContributorInsightRuleDetails\", ContributorInsightRuleDetails.Builder.create()\n .logGroups(List.of(logGroup))\n .successLatencyMetricJsonPath(\"$.SuccessLatency\")\n .faultMetricJsonPath(\"$.Faults\")\n .operationNameJsonPath(\"$.Operation\")\n .instanceIdJsonPath(\"$.InstanceId\")\n .availabilityZoneIdJsonPath(\"$.AZ-ID\")\n .build(),\n \"serverSideAvailabilityMetricDetails\", new OperationAvailabilityMetricDetails(OperationAvailabilityMetricDetailsProps.builder()\n .operationName(\"pay\")\n .metricDimensions(new MetricDimensions(Map.of(\"Operation\", \"ride\"), \"AZ-ID\", \"Region\"))\n .build(), service.getDefaultAvailabilityMetricDetails()),\n \"serverSideLatencyMetricDetails\", new OperationLatencyMetricDetails(OperationLatencyMetricDetailsProps.builder()\n .operationName(\"pay\")\n .metricDimensions(new MetricDimensions(Map.of(\"Operation\", \"ride\"), \"AZ-ID\", \"Region\"))\n .build(), service.getDefaultLatencyMetricDetails()));\n\nservice.addOperation(rideOperation);\nservice.addOperation(payOperation);","version":"1"},"go":{"source":"service := multi-az-observability.NewService(&ServiceProps{\n\tServiceName: jsii.String(\"test\"),\n\tAvailabilityZoneNames: vpc.AvailabilityZones,\n\tBaseUrl: jsii.String(\"http://www.example.com\"),\n\tFaultCountThreshold: jsii.Number(25),\n\tPeriod: awscdk.Duration_Seconds(jsii.Number(60)),\n\tLoadBalancer: loadBalancer,\n\tTargetGroups: []iTargetGroup{\n\t\ttargetGroup1,\n\t\ttargetGroup2,\n\t},\n\tDefaultAvailabilityMetricDetails: multi-az-observability.NewServiceAvailabilityMetricDetails(&ServiceAvailabilityMetricDetailsProps{\n\t\tMetricNamespace: jsii.String(\"front-end/metrics\"),\n\t\tSuccessMetricNames: []*string{\n\t\t\tjsii.String(\"Success\"),\n\t\t},\n\t\tFaultMetricNames: []*string{\n\t\t\tjsii.String(\"Fault\"),\n\t\t\tjsii.String(\"Error\"),\n\t\t},\n\t\tAlarmStatistic: jsii.String(\"Sum\"),\n\t\tUnit: awscdk.Unit_COUNT,\n\t\tPeriod: awscdk.Duration_*Seconds(jsii.Number(60)),\n\t\tEvaluationPeriods: jsii.Number(5),\n\t\tDatapointsToAlarm: jsii.Number(3),\n\t\tSuccessAlarmThreshold: jsii.Number(99.9),\n\t\tFaultAlarmThreshold: jsii.Number(0.1),\n\t\tGraphedFaultStatistics: []*string{\n\t\t\tjsii.String(\"Sum\"),\n\t\t},\n\t\tGraphedSuccessStatistics: []*string{\n\t\t\tjsii.String(\"Sum\"),\n\t\t},\n\t}),\n\tDefaultLatencyMetricDetails: multi-az-observability.NewServiceLatencyMetricDetails(&ServiceLatencyMetricDetailsProps{\n\t\tMetricNamespace: jsii.String(\"front-end/metrics\"),\n\t\tSuccessMetricNames: []*string{\n\t\t\tjsii.String(\"SuccessLatency\"),\n\t\t},\n\t\tFaultMetricNames: []*string{\n\t\t\tjsii.String(\"FaultLatency\"),\n\t\t},\n\t\tAlarmStatistic: jsii.String(\"p99\"),\n\t\tUnit: awscdk.Unit_MILLISECONDS,\n\t\tPeriod: awscdk.Duration_*Seconds(jsii.Number(60)),\n\t\tEvaluationPeriods: jsii.Number(5),\n\t\tDatapointsToAlarm: jsii.Number(3),\n\t\tSuccessAlarmThreshold: awscdk.Duration_Millis(jsii.Number(150)),\n\t\tGraphedFaultStatistics: []*string{\n\t\t\tjsii.String(\"p99\"),\n\t\t},\n\t\tGraphedSuccessStatistics: []*string{\n\t\t\tjsii.String(\"p50\"),\n\t\t\tjsii.String(\"p99\"),\n\t\t\tjsii.String(\"tm99\"),\n\t\t},\n\t}),\n\tDefaultContributorInsightRuleDetails: multi-az-observability.NewContributorInsightRuleDetails(&ContributorInsightRuleDetailsProps{\n\t\tSuccessLatencyMetricJsonPath: jsii.String(\"$.SuccessLatency\"),\n\t\tFaultMetricJsonPath: jsii.String(\"$.Faults\"),\n\t\tOperationNameJsonPath: jsii.String(\"$.Operation\"),\n\t\tInstanceIdJsonPath: jsii.String(\"$.InstanceId\"),\n\t\tAvailabilityZoneIdJsonPath: jsii.String(\"$.AZ-ID\"),\n\t\tLogGroups: []iLogGroup{\n\t\t\tlogGroup,\n\t\t},\n\t}),\n\tCanaryTestProps: &AddCanaryTestProps{\n\t\tRequestCount: jsii.Number(10),\n\t\tSchedule: jsii.String(\"rate(1 minute)\"),\n\t\tLoadBalancer: loadBalancer,\n\t\tNetworkConfiguration: &NetworkConfigurationProps{\n\t\t\tVpc: vpc,\n\t\t\tSubnetSelection: &SubnetSelection{\n\t\t\t\tSubnetType: awscdk.SubnetType_PRIVATE_ISOLATED,\n\t\t\t},\n\t\t},\n\t},\n\tMinimumUnhealthyTargets: &MinimumUnhealthyTargets{\n\t\tPercentage: jsii.Number(0.1),\n\t},\n})\n\nrideOperation := map[string]interface{}{\n\t\"operationName\": jsii.String(\"ride\"),\n\t\"service\": service,\n\t\"path\": jsii.String(\"/ride\"),\n\t\"critical\": jsii.Boolean(true),\n\t\"httpMethods\": []*string{\n\t\tjsii.String(\"GET\"),\n\t},\n\t\"serverSideContributorInsightRuleDetails\": multi-az-observability.NewContributorInsightRuleDetails(&ContributorInsightRuleDetailsProps{\n\t\t\"logGroups\": []*iLogGroup{\n\t\t\tlogGroup,\n\t\t},\n\t\t\"successLatencyMetricJsonPath\": jsii.String(\"$.SuccessLatency\"),\n\t\t\"faultMetricJsonPath\": jsii.String(\"$.Faults\"),\n\t\t\"operationNameJsonPath\": jsii.String(\"$.Operation\"),\n\t\t\"instanceIdJsonPath\": jsii.String(\"$.InstanceId\"),\n\t\t\"availabilityZoneIdJsonPath\": jsii.String(\"$.AZ-ID\"),\n\t}),\n\t\"serverSideAvailabilityMetricDetails\": multi-az-observability.NewOperationAvailabilityMetricDetails(&OperationAvailabilityMetricDetailsProps{\n\t\t\"operationName\": jsii.String(\"ride\"),\n\t\t\"metricDimensions\": multi-az-observability.NewMetricDimensions(map[string]*string{\n\t\t\t\"Operation\": jsii.String(\"ride\"),\n\t\t}, jsii.String(\"AZ-ID\"), jsii.String(\"Region\")),\n\t}, service.defaultAvailabilityMetricDetails),\n\t\"serverSideLatencyMetricDetails\": multi-az-observability.NewOperationLatencyMetricDetails(&OperationLatencyMetricDetailsProps{\n\t\t\"operationName\": jsii.String(\"ride\"),\n\t\t\"metricDimensions\": multi-az-observability.NewMetricDimensions(map[string]*string{\n\t\t\t\"Operation\": jsii.String(\"ride\"),\n\t\t}, jsii.String(\"AZ-ID\"), jsii.String(\"Region\")),\n\t}, service.defaultLatencyMetricDetails),\n}\n\npayOperation := map[string]interface{}{\n\t\"operationName\": jsii.String(\"pay\"),\n\t\"service\": service,\n\t\"path\": jsii.String(\"/pay\"),\n\t\"critical\": jsii.Boolean(true),\n\t\"httpMethods\": []*string{\n\t\tjsii.String(\"GET\"),\n\t},\n\t\"serverSideContributorInsightRuleDetails\": multi-az-observability.NewContributorInsightRuleDetails(&ContributorInsightRuleDetailsProps{\n\t\t\"logGroups\": []*iLogGroup{\n\t\t\tlogGroup,\n\t\t},\n\t\t\"successLatencyMetricJsonPath\": jsii.String(\"$.SuccessLatency\"),\n\t\t\"faultMetricJsonPath\": jsii.String(\"$.Faults\"),\n\t\t\"operationNameJsonPath\": jsii.String(\"$.Operation\"),\n\t\t\"instanceIdJsonPath\": jsii.String(\"$.InstanceId\"),\n\t\t\"availabilityZoneIdJsonPath\": jsii.String(\"$.AZ-ID\"),\n\t}),\n\t\"serverSideAvailabilityMetricDetails\": multi-az-observability.NewOperationAvailabilityMetricDetails(&OperationAvailabilityMetricDetailsProps{\n\t\t\"operationName\": jsii.String(\"pay\"),\n\t\t\"metricDimensions\": multi-az-observability.NewMetricDimensions(map[string]*string{\n\t\t\t\"Operation\": jsii.String(\"ride\"),\n\t\t}, jsii.String(\"AZ-ID\"), jsii.String(\"Region\")),\n\t}, service.defaultAvailabilityMetricDetails),\n\t\"serverSideLatencyMetricDetails\": multi-az-observability.NewOperationLatencyMetricDetails(&OperationLatencyMetricDetailsProps{\n\t\t\"operationName\": jsii.String(\"pay\"),\n\t\t\"metricDimensions\": multi-az-observability.NewMetricDimensions(map[string]*string{\n\t\t\t\"Operation\": jsii.String(\"ride\"),\n\t\t}, jsii.String(\"AZ-ID\"), jsii.String(\"Region\")),\n\t}, service.defaultLatencyMetricDetails),\n}\n\nservice.AddOperation(rideOperation)\nservice.AddOperation(payOperation)","version":"1"},"$":{"source":"let service: IService = new Service({\n serviceName: 'test',\n availabilityZoneNames: vpc.availabilityZones,\n baseUrl: 'http://www.example.com',\n faultCountThreshold: 25,\n period: Duration.seconds(60),\n loadBalancer: loadBalancer,\n targetGroups: [ targetGroup1, targetGroup2 ],\n defaultAvailabilityMetricDetails: new ServiceAvailabilityMetricDetails({\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['Success'],\n faultMetricNames: ['Fault', 'Error'],\n alarmStatistic: 'Sum',\n unit: Unit.COUNT,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: 99.9,\n faultAlarmThreshold: 0.1,\n graphedFaultStatistics: ['Sum'],\n graphedSuccessStatistics: ['Sum'],\n }),\n defaultLatencyMetricDetails: new ServiceLatencyMetricDetails({\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['SuccessLatency'],\n faultMetricNames: ['FaultLatency'],\n alarmStatistic: 'p99',\n unit: Unit.MILLISECONDS,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: Duration.millis(150),\n graphedFaultStatistics: ['p99'],\n graphedSuccessStatistics: ['p50', 'p99', 'tm99'],\n }),\n defaultContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n logGroups: [logGroup],\n }),\n canaryTestProps: {\n requestCount: 10,\n schedule: 'rate(1 minute)',\n loadBalancer: loadBalancer,\n networkConfiguration: {\n vpc: vpc,\n subnetSelection: { subnetType: SubnetType.PRIVATE_ISOLATED },\n },\n },\n minimumUnhealthyTargets: {\n percentage: 0.1\n }\n });\n\nlet rideOperation: Operation = {\n operationName: 'ride',\n service: service,\n path: '/ride',\n critical: true,\n httpMethods: ['GET'],\n serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n logGroups: [logGroup],\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n }),\n serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(\n {\n operationName: 'ride',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultAvailabilityMetricDetails,\n ),\n serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(\n {\n operationName: 'ride',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultLatencyMetricDetails,\n ),\n};\n\nlet payOperation: Operation = {\n operationName: 'pay',\n service: service,\n path: '/pay',\n critical: true,\n httpMethods: ['GET'],\n serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n logGroups: [logGroup],\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n }),\n serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(\n {\n operationName: 'pay',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultAvailabilityMetricDetails,\n ),\n serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(\n {\n operationName: 'pay',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultLatencyMetricDetails,\n ),\n};\n\nservice.addOperation(rideOperation);\nservice.addOperation(payOperation);","version":"0"}},"location":{"api":{"api":"moduleReadme","moduleFqn":"@cdklabs/multi-az-observability"},"field":{"field":"markdown","line":8}},"didCompile":true,"fqnsReferenced":["@cdklabs/multi-az-observability.AddCanaryTestProps","@cdklabs/multi-az-observability.ContributorInsightRuleDetails","@cdklabs/multi-az-observability.ContributorInsightRuleDetailsProps","@cdklabs/multi-az-observability.IContributorInsightRuleDetails","@cdklabs/multi-az-observability.IOperation","@cdklabs/multi-az-observability.IOperationAvailabilityMetricDetails","@cdklabs/multi-az-observability.IOperationLatencyMetricDetails","@cdklabs/multi-az-observability.IService","@cdklabs/multi-az-observability.IService#addOperation","@cdklabs/multi-az-observability.IService#defaultAvailabilityMetricDetails","@cdklabs/multi-az-observability.IService#defaultLatencyMetricDetails","@cdklabs/multi-az-observability.IServiceAvailabilityMetricDetails","@cdklabs/multi-az-observability.IServiceLatencyMetricDetails","@cdklabs/multi-az-observability.MetricDimensions","@cdklabs/multi-az-observability.MinimumUnhealthyTargets","@cdklabs/multi-az-observability.NetworkConfigurationProps","@cdklabs/multi-az-observability.Operation","@cdklabs/multi-az-observability.OperationAvailabilityMetricDetails","@cdklabs/multi-az-observability.OperationAvailabilityMetricDetailsProps","@cdklabs/multi-az-observability.OperationLatencyMetricDetails","@cdklabs/multi-az-observability.OperationLatencyMetricDetailsProps","@cdklabs/multi-az-observability.Service","@cdklabs/multi-az-observability.ServiceAvailabilityMetricDetails","@cdklabs/multi-az-observability.ServiceAvailabilityMetricDetailsProps","@cdklabs/multi-az-observability.ServiceLatencyMetricDetails","@cdklabs/multi-az-observability.ServiceLatencyMetricDetailsProps","@cdklabs/multi-az-observability.ServiceProps","aws-cdk-lib.Duration","aws-cdk-lib.Duration#millis","aws-cdk-lib.Duration#seconds","aws-cdk-lib.aws_cloudwatch.Unit","aws-cdk-lib.aws_cloudwatch.Unit#COUNT","aws-cdk-lib.aws_cloudwatch.Unit#MILLISECONDS","aws-cdk-lib.aws_ec2.IVpc","aws-cdk-lib.aws_ec2.SubnetSelection","aws-cdk-lib.aws_ec2.SubnetType","aws-cdk-lib.aws_ec2.SubnetType#PRIVATE_ISOLATED","aws-cdk-lib.aws_ec2.Vpc#availabilityZones","aws-cdk-lib.aws_elasticloadbalancingv2.ILoadBalancerV2"],"fullSource":"// Fixture with packages imported, but nothing else\nimport { Construct } from 'constructs';\nimport {\n Stack,\n Aws,\n Duration\n} from 'aws-cdk-lib';\nimport {\n CfnNatGateway,\n SelectedSubnets,\n SubnetType,\n Vpc,\n} from 'aws-cdk-lib/aws-ec2';\nimport { ApplicationLoadBalancer, ApplicationTargetGroup } from 'aws-cdk-lib/aws-elasticloadbalancingv2';\nimport { Stats, Unit } from 'aws-cdk-lib/aws-cloudwatch';\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs';\n\nimport { BasicServiceMultiAZObservability } from '@cdklabs/multi-az-observability';\nimport { Service } from '@cdklabs/multi-az-observability';\nimport { InstrumentedServiceMultiAZObservability } from '@cdklabs/multi-az-observability';\nimport { IOperation } from '@cdklabs/multi-az-observability';\nimport { IService } from '@cdklabs/multi-az-observability';\nimport { Operation } from '@cdklabs/multi-az-observability';\nimport { ApplicationLoadBalancerLatencyOutlierAlgorithm } from '@cdklabs/multi-az-observability';\nimport { MetricDimensions } from '@cdklabs/multi-az-observability';\nimport { OperationAvailabilityMetricDetails } from '@cdklabs/multi-az-observability';\nimport { OperationLatencyMetricDetails } from '@cdklabs/multi-az-observability';\nimport { ServiceAvailabilityMetricDetails, ServiceLatencyMetricDetails, ContributorInsightRuleDetails } from '@cdklabs/multi-az-observability';\n\nclass Fixture extends Stack {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n let stack = scope;\n let azs: string[] = [\n Aws.REGION + 'a',\n Aws.REGION + 'b',\n Aws.REGION + 'c',\n ];\n\n let vpc = new Vpc(stack, 'vpc', {\n availabilityZones: azs,\n subnetConfiguration: [\n {\n subnetType: SubnetType.PRIVATE_WITH_EGRESS,\n name: 'private_with_egress_subnets',\n cidrMask: 24,\n },\n ],\n createInternetGateway: false,\n natGateways: 0,\n restrictDefaultSecurityGroup: false,\n });\n\n let subnets: SelectedSubnets = vpc.selectSubnets({\n subnetType: SubnetType.PRIVATE_WITH_EGRESS,\n });\n\n let natGateway1 = new CfnNatGateway(stack, 'AZ1NatGateway', {\n subnetId: subnets.subnetIds[0],\n });\n let natGateway2 = new CfnNatGateway(stack, 'AZ2NatGateway', {\n subnetId: subnets.subnetIds[1],\n });\n let natGateway3 = new CfnNatGateway(stack, 'AZ3NatGateway', {\n subnetId: subnets.subnetIds[2],\n });\n\n let loadBalancer = new ApplicationLoadBalancer(stack, 'alb', {\n vpc: vpc,\n crossZoneEnabled: true,\n });\n\n\n let targetGroup1: ApplicationTargetGroup = new ApplicationTargetGroup(stack, \"tg1\", {\n\n });\n\n let targetGroup2: ApplicationTargetGroup = new ApplicationTargetGroup(stack, \"tg2\", {\n\n });\n\n let logGroup: ILogGroup = new LogGroup(stack, 'Logs', {});\n // Code snippet begins after !show marker below\n/// !show\nlet service: IService = new Service({\n serviceName: 'test',\n availabilityZoneNames: vpc.availabilityZones,\n baseUrl: 'http://www.example.com',\n faultCountThreshold: 25,\n period: Duration.seconds(60),\n loadBalancer: loadBalancer,\n targetGroups: [ targetGroup1, targetGroup2 ],\n defaultAvailabilityMetricDetails: new ServiceAvailabilityMetricDetails({\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['Success'],\n faultMetricNames: ['Fault', 'Error'],\n alarmStatistic: 'Sum',\n unit: Unit.COUNT,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: 99.9,\n faultAlarmThreshold: 0.1,\n graphedFaultStatistics: ['Sum'],\n graphedSuccessStatistics: ['Sum'],\n }),\n defaultLatencyMetricDetails: new ServiceLatencyMetricDetails({\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['SuccessLatency'],\n faultMetricNames: ['FaultLatency'],\n alarmStatistic: 'p99',\n unit: Unit.MILLISECONDS,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: Duration.millis(150),\n graphedFaultStatistics: ['p99'],\n graphedSuccessStatistics: ['p50', 'p99', 'tm99'],\n }),\n defaultContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n logGroups: [logGroup],\n }),\n canaryTestProps: {\n requestCount: 10,\n schedule: 'rate(1 minute)',\n loadBalancer: loadBalancer,\n networkConfiguration: {\n vpc: vpc,\n subnetSelection: { subnetType: SubnetType.PRIVATE_ISOLATED },\n },\n },\n minimumUnhealthyTargets: {\n percentage: 0.1\n }\n });\n\nlet rideOperation: Operation = {\n operationName: 'ride',\n service: service,\n path: '/ride',\n critical: true,\n httpMethods: ['GET'],\n serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n logGroups: [logGroup],\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n }),\n serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(\n {\n operationName: 'ride',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultAvailabilityMetricDetails,\n ),\n serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(\n {\n operationName: 'ride',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultLatencyMetricDetails,\n ),\n};\n\nlet payOperation: Operation = {\n operationName: 'pay',\n service: service,\n path: '/pay',\n critical: true,\n httpMethods: ['GET'],\n serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({\n logGroups: [logGroup],\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n }),\n serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(\n {\n operationName: 'pay',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultAvailabilityMetricDetails,\n ),\n serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(\n {\n operationName: 'pay',\n metricDimensions: new MetricDimensions(\n { Operation: 'ride' },\n 'AZ-ID',\n 'Region',\n ),\n },\n service.defaultLatencyMetricDetails,\n ),\n};\n\nservice.addOperation(rideOperation);\nservice.addOperation(payOperation);\n/// !hide\n// Code snippet ended before !hide marker above\n }\n}","syntaxKindCounter":{"9":13,"11":55,"80":149,"112":2,"184":3,"210":14,"211":20,"212":14,"214":6,"215":14,"244":3,"245":2,"261":3,"262":3,"304":89},"fqnsFingerprint":"d7bf974337b7acf92cf4bf31c641ee864b91e311214c027fa842ca3862b1510b"},"8f8a40601c508a0b17d63f904d6925eb8577c14f5863523571474b238a4526d2":{"translations":{"python":{"source":"InstrumentedServiceMultiAZObservability(stack, \"MAZObservability\",\n create_dashboards=True,\n service=service,\n interval=Duration.minutes(60)\n)","version":"2"},"csharp":{"source":"new InstrumentedServiceMultiAZObservability(stack, \"MAZObservability\", new InstrumentedServiceMultiAZObservabilityProps {\n CreateDashboards = true,\n Service = service,\n Interval = Duration.Minutes(60)\n});","version":"1"},"java":{"source":"InstrumentedServiceMultiAZObservability.Builder.create(stack, \"MAZObservability\")\n .createDashboards(true)\n .service(service)\n .interval(Duration.minutes(60))\n .build();","version":"1"},"go":{"source":"multi-az-observability.NewInstrumentedServiceMultiAZObservability(stack, jsii.String(\"MAZObservability\"), &InstrumentedServiceMultiAZObservabilityProps{\n\tCreateDashboards: jsii.Boolean(true),\n\tService: service,\n\tInterval: awscdk.Duration_Minutes(jsii.Number(60)),\n})","version":"1"},"$":{"source":"new InstrumentedServiceMultiAZObservability(stack, 'MAZObservability', {\n createDashboards: true,\n service: service,\n interval: Duration.minutes(60)\n});","version":"0"}},"location":{"api":{"api":"moduleReadme","moduleFqn":"@cdklabs/multi-az-observability"},"field":{"field":"markdown","line":148}},"didCompile":true,"fqnsReferenced":["@cdklabs/multi-az-observability.AddCanaryTestProps","@cdklabs/multi-az-observability.IContributorInsightRuleDetails","@cdklabs/multi-az-observability.IService","@cdklabs/multi-az-observability.IServiceAvailabilityMetricDetails","@cdklabs/multi-az-observability.IServiceLatencyMetricDetails","@cdklabs/multi-az-observability.InstrumentedServiceMultiAZObservability","@cdklabs/multi-az-observability.InstrumentedServiceMultiAZObservabilityProps","@cdklabs/multi-az-observability.MinimumUnhealthyTargets","@cdklabs/multi-az-observability.NetworkConfigurationProps","aws-cdk-lib.Duration","aws-cdk-lib.Duration#minutes","aws-cdk-lib.aws_cloudwatch.Unit","aws-cdk-lib.aws_ec2.IVpc","aws-cdk-lib.aws_ec2.SubnetSelection","aws-cdk-lib.aws_ec2.SubnetType","aws-cdk-lib.aws_elasticloadbalancingv2.ILoadBalancerV2"],"fullSource":"// Fixture with packages imported, but nothing else\nimport { Construct } from 'constructs';\nimport {\n Stack,\n Aws,\n Duration\n} from 'aws-cdk-lib';\nimport {\n CfnNatGateway,\n SelectedSubnets,\n SubnetType,\n Vpc,\n} from 'aws-cdk-lib/aws-ec2';\nimport { ApplicationLoadBalancer, ApplicationTargetGroup } from 'aws-cdk-lib/aws-elasticloadbalancingv2';\nimport { Stats, Unit } from 'aws-cdk-lib/aws-cloudwatch';\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs';\n\nimport { BasicServiceMultiAZObservability } from '@cdklabs/multi-az-observability';\nimport { Service } from '@cdklabs/multi-az-observability';\nimport { InstrumentedServiceMultiAZObservability } from '@cdklabs/multi-az-observability';\nimport { IOperation } from '@cdklabs/multi-az-observability';\nimport { IService } from '@cdklabs/multi-az-observability';\nimport { Operation } from '@cdklabs/multi-az-observability';\nimport { ApplicationLoadBalancerLatencyOutlierAlgorithm } from '@cdklabs/multi-az-observability';\nimport { MetricDimensions } from '@cdklabs/multi-az-observability';\nimport { OperationAvailabilityMetricDetails } from '@cdklabs/multi-az-observability';\nimport { OperationLatencyMetricDetails } from '@cdklabs/multi-az-observability';\nimport { ServiceAvailabilityMetricDetails, ServiceLatencyMetricDetails, ContributorInsightRuleDetails } from '@cdklabs/multi-az-observability';\n\nclass Fixture extends Stack {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n let stack = scope;\n let azs: string[] = [\n Aws.REGION + 'a',\n Aws.REGION + 'b',\n Aws.REGION + 'c',\n ];\n\n let vpc = new Vpc(stack, 'vpc', {\n availabilityZones: azs,\n subnetConfiguration: [\n {\n subnetType: SubnetType.PRIVATE_WITH_EGRESS,\n name: 'private_with_egress_subnets',\n cidrMask: 24,\n },\n ],\n createInternetGateway: false,\n natGateways: 0,\n restrictDefaultSecurityGroup: false,\n });\n\n let subnets: SelectedSubnets = vpc.selectSubnets({\n subnetType: SubnetType.PRIVATE_WITH_EGRESS,\n });\n\n let natGateway1 = new CfnNatGateway(stack, 'AZ1NatGateway', {\n subnetId: subnets.subnetIds[0],\n });\n let natGateway2 = new CfnNatGateway(stack, 'AZ2NatGateway', {\n subnetId: subnets.subnetIds[1],\n });\n let natGateway3 = new CfnNatGateway(stack, 'AZ3NatGateway', {\n subnetId: subnets.subnetIds[2],\n });\n\n\n let loadBalancer = new ApplicationLoadBalancer(stack, 'alb', {\n vpc: vpc,\n crossZoneEnabled: true,\n });\n\n\n let targetGroup1: ApplicationTargetGroup = new ApplicationTargetGroup(stack, \"tg1\", {\n\n });\n\n let targetGroup2: ApplicationTargetGroup = new ApplicationTargetGroup(stack, \"tg2\", {\n\n });\n\n let logGroup: ILogGroup = new LogGroup(stack, 'Logs', {});\n \n let service: IService = new Service({\n serviceName: 'test',\n availabilityZoneNames: vpc.availabilityZones,\n baseUrl: 'http://www.example.com',\n faultCountThreshold: 25,\n period: Duration.seconds(60),\n loadBalancer: loadBalancer,\n targetGroups: [ targetGroup1, targetGroup2 ],\n defaultAvailabilityMetricDetails: {\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['Success'],\n faultMetricNames: ['Fault', 'Error'],\n alarmStatistic: 'Sum',\n unit: Unit.COUNT,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: 99.9,\n faultAlarmThreshold: 0.1,\n graphedFaultStatistics: ['Sum'],\n graphedSuccessStatistics: ['Sum'],\n },\n defaultLatencyMetricDetails: {\n metricNamespace: 'front-end/metrics',\n successMetricNames: ['SuccessLatency'],\n faultMetricNames: ['FaultLatency'],\n alarmStatistic: 'p99',\n unit: Unit.MILLISECONDS,\n period: Duration.seconds(60),\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n successAlarmThreshold: Duration.millis(150),\n graphedFaultStatistics: ['p99'],\n graphedSuccessStatistics: ['p50', 'p99', 'tm99'],\n },\n defaultContributorInsightRuleDetails: {\n successLatencyMetricJsonPath: '$.SuccessLatency',\n faultMetricJsonPath: '$.Faults',\n operationNameJsonPath: '$.Operation',\n instanceIdJsonPath: '$.InstanceId',\n availabilityZoneIdJsonPath: '$.AZ-ID',\n logGroups: [logGroup],\n },\n canaryTestProps: {\n requestCount: 10,\n schedule: 'rate(1 minute)',\n loadBalancer: loadBalancer,\n networkConfiguration: {\n vpc: vpc,\n subnetSelection: { subnetType: SubnetType.PRIVATE_ISOLATED },\n },\n },\n minimumUnhealthyTargets: {\n percentage: 0.1\n }\n });\n \n // Code snippet begins after !show marker below\n/// !show\nnew InstrumentedServiceMultiAZObservability(stack, 'MAZObservability', {\n createDashboards: true,\n service: service,\n interval: Duration.minutes(60)\n});\n/// !hide\n// Code snippet ended before !hide marker above\n }\n}","syntaxKindCounter":{"9":1,"11":1,"80":8,"112":1,"211":1,"212":1,"214":1,"215":1,"245":1,"304":3},"fqnsFingerprint":"44ff012ac81c7ee07b82b44d7c2480e0673305f1fd2f1f437ab66a70c4ed001d"},"1b1b41f6e5a09b1d72d9908a4dbaee85d8c1d07ab57bd6735674bf95da7e3271":{"translations":{"python":{"source":"BasicServiceMultiAZObservability(stack, \"MAZObservability\",\n application_load_balancer_props=ApplicationLoadBalancerDetectionProps(\n alb_target_group_map=[AlbTargetGroupMap(\n application_load_balancer=ApplicationLoadBalancer(stack, \"alb\",\n vpc=vpc,\n cross_zone_enabled=True\n ),\n target_groups=[target_group1, target_group2\n ]\n )\n ],\n fault_count_percent_threshold=1,\n latency_statistic=Stats.percentile(99),\n latency_threshold=Duration.millis(200),\n latency_outlier_algorithm=ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC,\n latency_outlier_threshold=45\n ),\n nat_gateway_props=NatGatewayDetectionProps(\n nat_gateways={\n \"us-east-1a\": [nat_gateway1],\n \"us-east-1b\": [nat_gateway2],\n \"us-east-1c\": [nat_gateway3]\n },\n packet_loss_percent_threshold=0.01\n ),\n service_name=\"test\",\n period=Duration.seconds(60),\n create_dashboard=True,\n evaluation_periods=5,\n datapoints_to_alarm=3\n)","version":"2"},"csharp":{"source":"new BasicServiceMultiAZObservability(stack, \"MAZObservability\", new BasicServiceMultiAZObservabilityProps {\n ApplicationLoadBalancerProps = new ApplicationLoadBalancerDetectionProps {\n AlbTargetGroupMap = new [] { new AlbTargetGroupMap {\n ApplicationLoadBalancer = new ApplicationLoadBalancer(stack, \"alb\", new ApplicationLoadBalancerProps {\n Vpc = vpc,\n CrossZoneEnabled = true\n }),\n TargetGroups = new [] { targetGroup1, targetGroup2 }\n } },\n FaultCountPercentThreshold = 1,\n LatencyStatistic = Stats.Percentile(99),\n LatencyThreshold = Duration.Millis(200),\n LatencyOutlierAlgorithm = ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC,\n LatencyOutlierThreshold = 45\n },\n NatGatewayProps = new NatGatewayDetectionProps {\n NatGateways = new Dictionary<string, CfnNatGateway[]> {\n { \"us-east-1a\", new [] { natGateway1 } },\n { \"us-east-1b\", new [] { natGateway2 } },\n { \"us-east-1c\", new [] { natGateway3 } }\n },\n PacketLossPercentThreshold = 0.01\n },\n ServiceName = \"test\",\n Period = Duration.Seconds(60),\n CreateDashboard = true,\n EvaluationPeriods = 5,\n DatapointsToAlarm = 3\n});","version":"1"},"java":{"source":"BasicServiceMultiAZObservability.Builder.create(stack, \"MAZObservability\")\n .applicationLoadBalancerProps(ApplicationLoadBalancerDetectionProps.builder()\n .albTargetGroupMap(List.of(AlbTargetGroupMap.builder()\n .applicationLoadBalancer(ApplicationLoadBalancer.Builder.create(stack, \"alb\")\n .vpc(vpc)\n .crossZoneEnabled(true)\n .build())\n .targetGroups(List.of(targetGroup1, targetGroup2))\n .build()))\n .faultCountPercentThreshold(1)\n .latencyStatistic(Stats.percentile(99))\n .latencyThreshold(Duration.millis(200))\n .latencyOutlierAlgorithm(ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC)\n .latencyOutlierThreshold(45)\n .build())\n .natGatewayProps(NatGatewayDetectionProps.builder()\n .natGateways(Map.of(\n \"us-east-1a\", List.of(natGateway1),\n \"us-east-1b\", List.of(natGateway2),\n \"us-east-1c\", List.of(natGateway3)))\n .packetLossPercentThreshold(0.01)\n .build())\n .serviceName(\"test\")\n .period(Duration.seconds(60))\n .createDashboard(true)\n .evaluationPeriods(5)\n .datapointsToAlarm(3)\n .build();","version":"1"},"go":{"source":"multi-az-observability.NewBasicServiceMultiAZObservability(stack, jsii.String(\"MAZObservability\"), &BasicServiceMultiAZObservabilityProps{\n\tApplicationLoadBalancerProps: &ApplicationLoadBalancerDetectionProps{\n\t\tAlbTargetGroupMap: []albTargetGroupMap{\n\t\t\t&albTargetGroupMap{\n\t\t\t\tApplicationLoadBalancer: awscdk.NewApplicationLoadBalancer(stack, jsii.String(\"alb\"), &ApplicationLoadBalancerProps{\n\t\t\t\t\tVpc: vpc,\n\t\t\t\t\tCrossZoneEnabled: jsii.Boolean(true),\n\t\t\t\t}),\n\t\t\t\tTargetGroups: []iTargetGroup{\n\t\t\t\t\ttargetGroup1,\n\t\t\t\t\ttargetGroup2,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tFaultCountPercentThreshold: jsii.Number(1),\n\t\tLatencyStatistic: awscdk.Stats_Percentile(jsii.Number(99)),\n\t\tLatencyThreshold: awscdk.Duration_Millis(jsii.Number(200)),\n\t\tLatencyOutlierAlgorithm: multi-az-observability.ApplicationLoadBalancerLatencyOutlierAlgorithm_STATIC,\n\t\tLatencyOutlierThreshold: jsii.Number(45),\n\t},\n\tNatGatewayProps: &NatGatewayDetectionProps{\n\t\tNatGateways: map[string][]cfnNatGateway{\n\t\t\t\"us-east-1a\": []*cfnNatGateway{\n\t\t\t\tnatGateway1,\n\t\t\t},\n\t\t\t\"us-east-1b\": []*cfnNatGateway{\n\t\t\t\tnatGateway2,\n\t\t\t},\n\t\t\t\"us-east-1c\": []*cfnNatGateway{\n\t\t\t\tnatGateway3,\n\t\t\t},\n\t\t},\n\t\tPacketLossPercentThreshold: jsii.Number(0.01),\n\t},\n\tServiceName: jsii.String(\"test\"),\n\tPeriod: awscdk.Duration_Seconds(jsii.Number(60)),\n\tCreateDashboard: jsii.Boolean(true),\n\tEvaluationPeriods: jsii.Number(5),\n\tDatapointsToAlarm: jsii.Number(3),\n})","version":"1"},"$":{"source":"new BasicServiceMultiAZObservability(stack, 'MAZObservability', {\n applicationLoadBalancerProps: {\n albTargetGroupMap: [\n {\n applicationLoadBalancer: new ApplicationLoadBalancer(stack, 'alb', {\n vpc: vpc,\n crossZoneEnabled: true,\n }),\n targetGroups: [\n targetGroup1,\n targetGroup2\n ]\n }\n ],\n faultCountPercentThreshold: 1,\n latencyStatistic: Stats.percentile(99),\n latencyThreshold: Duration.millis(200),\n latencyOutlierAlgorithm: ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC,\n latencyOutlierThreshold: 45\n },\n natGatewayProps: {\n natGateways: {\n \"us-east-1a\": [ natGateway1 ],\n \"us-east-1b\": [ natGateway2 ],\n \"us-east-1c\": [ natGateway3 ]\n },\n packetLossPercentThreshold: 0.01\n },\n serviceName: 'test',\n period: Duration.seconds(60),\n createDashboard: true,\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n});","version":"0"}},"location":{"api":{"api":"moduleReadme","moduleFqn":"@cdklabs/multi-az-observability"},"field":{"field":"markdown","line":160}},"didCompile":true,"fqnsReferenced":["@cdklabs/multi-az-observability.ApplicationLoadBalancerDetectionProps","@cdklabs/multi-az-observability.ApplicationLoadBalancerLatencyOutlierAlgorithm","@cdklabs/multi-az-observability.ApplicationLoadBalancerLatencyOutlierAlgorithm#STATIC","@cdklabs/multi-az-observability.BasicServiceMultiAZObservability","@cdklabs/multi-az-observability.BasicServiceMultiAZObservabilityProps","@cdklabs/multi-az-observability.NatGatewayDetectionProps","aws-cdk-lib.Duration","aws-cdk-lib.Duration#millis","aws-cdk-lib.Duration#seconds","aws-cdk-lib.aws_cloudwatch.Stats#percentile","aws-cdk-lib.aws_ec2.IVpc","aws-cdk-lib.aws_ec2.SubnetType","aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer","aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancerProps","aws-cdk-lib.aws_elasticloadbalancingv2.IApplicationLoadBalancer"],"fullSource":"// Fixture with packages imported, but nothing else\nimport { Construct } from 'constructs';\nimport {\n Stack,\n Aws,\n Duration\n} from 'aws-cdk-lib';\nimport {\n CfnNatGateway,\n SelectedSubnets,\n SubnetType,\n Vpc,\n} from 'aws-cdk-lib/aws-ec2';\nimport { ApplicationLoadBalancer, ApplicationTargetGroup } from 'aws-cdk-lib/aws-elasticloadbalancingv2';\nimport { Stats, Unit } from 'aws-cdk-lib/aws-cloudwatch';\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs';\n\nimport { BasicServiceMultiAZObservability } from '@cdklabs/multi-az-observability';\nimport { Service } from '@cdklabs/multi-az-observability';\nimport { InstrumentedServiceMultiAZObservability } from '@cdklabs/multi-az-observability';\nimport { IOperation } from '@cdklabs/multi-az-observability';\nimport { IService } from '@cdklabs/multi-az-observability';\nimport { Operation } from '@cdklabs/multi-az-observability';\nimport { ApplicationLoadBalancerLatencyOutlierAlgorithm } from '@cdklabs/multi-az-observability';\nimport { MetricDimensions } from '@cdklabs/multi-az-observability';\nimport { OperationAvailabilityMetricDetails } from '@cdklabs/multi-az-observability';\nimport { OperationLatencyMetricDetails } from '@cdklabs/multi-az-observability';\nimport { ServiceAvailabilityMetricDetails, ServiceLatencyMetricDetails, ContributorInsightRuleDetails } from '@cdklabs/multi-az-observability';\n\nclass Fixture extends Stack {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n let stack = scope;\n let azs: string[] = [\n Aws.REGION + 'a',\n Aws.REGION + 'b',\n Aws.REGION + 'c',\n ];\n\n let vpc = new Vpc(stack, 'vpc', {\n availabilityZones: azs,\n subnetConfiguration: [\n {\n subnetType: SubnetType.PRIVATE_WITH_EGRESS,\n name: 'private_with_egress_subnets',\n cidrMask: 24,\n },\n ],\n createInternetGateway: false,\n natGateways: 0,\n restrictDefaultSecurityGroup: false,\n });\n\n let subnets: SelectedSubnets = vpc.selectSubnets({\n subnetType: SubnetType.PRIVATE_WITH_EGRESS,\n });\n\n let natGateway1 = new CfnNatGateway(stack, 'AZ1NatGateway', {\n subnetId: subnets.subnetIds[0],\n });\n let natGateway2 = new CfnNatGateway(stack, 'AZ2NatGateway', {\n subnetId: subnets.subnetIds[1],\n });\n let natGateway3 = new CfnNatGateway(stack, 'AZ3NatGateway', {\n subnetId: subnets.subnetIds[2],\n });\n\n let loadBalancer = new ApplicationLoadBalancer(stack, 'alb', {\n vpc: vpc,\n crossZoneEnabled: true,\n });\n\n\n let targetGroup1: ApplicationTargetGroup = new ApplicationTargetGroup(stack, \"tg1\", {\n\n });\n\n let targetGroup2: ApplicationTargetGroup = new ApplicationTargetGroup(stack, \"tg2\", {\n\n });\n\n let logGroup: ILogGroup = new LogGroup(stack, 'Logs', {});\n // Code snippet begins after !show marker below\n/// !show\nnew BasicServiceMultiAZObservability(stack, 'MAZObservability', {\n applicationLoadBalancerProps: {\n albTargetGroupMap: [\n {\n applicationLoadBalancer: new ApplicationLoadBalancer(stack, 'alb', {\n vpc: vpc,\n crossZoneEnabled: true,\n }),\n targetGroups: [\n targetGroup1,\n targetGroup2\n ]\n }\n ],\n faultCountPercentThreshold: 1,\n latencyStatistic: Stats.percentile(99),\n latencyThreshold: Duration.millis(200),\n latencyOutlierAlgorithm: ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC,\n latencyOutlierThreshold: 45\n },\n natGatewayProps: {\n natGateways: {\n \"us-east-1a\": [ natGateway1 ],\n \"us-east-1b\": [ natGateway2 ],\n \"us-east-1c\": [ natGateway3 ]\n },\n packetLossPercentThreshold: 0.01\n },\n serviceName: 'test',\n period: Duration.seconds(60),\n createDashboard: true,\n evaluationPeriods: 5,\n datapointsToAlarm: 3,\n});\n/// !hide\n// Code snippet ended before !hide marker above\n }\n}","syntaxKindCounter":{"9":8,"11":6,"80":37,"112":2,"210":5,"211":6,"212":4,"214":3,"215":2,"245":1,"304":22},"fqnsFingerprint":"6e2510bd797b000f375170c033b0b2965832deabf6aeea65ee51714f0c1f1777"}}}
|
package/README.md
CHANGED
|
@@ -5,148 +5,151 @@ This is a CDK construct for multi-AZ observability to help detect single-AZ impa
|
|
|
5
5
|
|
|
6
6
|
There is a lot of available information to think through and combine to provide signals about single-AZ impact. To simplify the setup and use reasonable defaults, this construct (available in [TypeScript](https://www.npmjs.com/package/@cdklabs/multi-az-observability), [Go](https://github.com/cdklabs/cdk-multi-az-observability-go), [Python](https://pypi.org/project/cdklabs.multi-az-observability/), [.NET](https://www.nuget.org/packages/Cdklabs.MultiAZObservability), and [Java](https://central.sonatype.com/artifact/io.github.cdklabs/cdk-multi-az-observability)) sets up the necessary observability. To use the CDK construct, you first define your service like this:
|
|
7
7
|
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
8
|
+
```typescript
|
|
9
|
+
let service: IService = new Service({
|
|
10
|
+
serviceName: 'test',
|
|
11
|
+
availabilityZoneNames: vpc.availabilityZones,
|
|
12
|
+
baseUrl: 'http://www.example.com',
|
|
13
|
+
faultCountThreshold: 25,
|
|
14
|
+
period: Duration.seconds(60),
|
|
15
|
+
loadBalancer: loadBalancer,
|
|
16
|
+
targetGroups: [ targetGroup1, targetGroup2 ],
|
|
17
|
+
defaultAvailabilityMetricDetails: new ServiceAvailabilityMetricDetails({
|
|
18
|
+
metricNamespace: 'front-end/metrics',
|
|
19
|
+
successMetricNames: ['Success'],
|
|
20
|
+
faultMetricNames: ['Fault', 'Error'],
|
|
21
|
+
alarmStatistic: 'Sum',
|
|
22
|
+
unit: Unit.COUNT,
|
|
23
|
+
period: Duration.seconds(60),
|
|
24
|
+
evaluationPeriods: 5,
|
|
25
|
+
datapointsToAlarm: 3,
|
|
26
|
+
successAlarmThreshold: 99.9,
|
|
27
|
+
faultAlarmThreshold: 0.1,
|
|
28
|
+
graphedFaultStatistics: ['Sum'],
|
|
29
|
+
graphedSuccessStatistics: ['Sum'],
|
|
29
30
|
}),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
defaultLatencyMetricDetails: new ServiceLatencyMetricDetails({
|
|
32
|
+
metricNamespace: 'front-end/metrics',
|
|
33
|
+
successMetricNames: ['SuccessLatency'],
|
|
34
|
+
faultMetricNames: ['FaultLatency'],
|
|
35
|
+
alarmStatistic: 'p99',
|
|
36
|
+
unit: Unit.MILLISECONDS,
|
|
37
|
+
period: Duration.seconds(60),
|
|
38
|
+
evaluationPeriods: 5,
|
|
39
|
+
datapointsToAlarm: 3,
|
|
40
|
+
successAlarmThreshold: Duration.millis(150),
|
|
41
|
+
graphedFaultStatistics: ['p99'],
|
|
42
|
+
graphedSuccessStatistics: ['p50', 'p99', 'tm99'],
|
|
42
43
|
}),
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
defaultContributorInsightRuleDetails: new ContributorInsightRuleDetails({
|
|
45
|
+
successLatencyMetricJsonPath: '$.SuccessLatency',
|
|
46
|
+
faultMetricJsonPath: '$.Faults',
|
|
47
|
+
operationNameJsonPath: '$.Operation',
|
|
48
|
+
instanceIdJsonPath: '$.InstanceId',
|
|
49
|
+
availabilityZoneIdJsonPath: '$.AZ-ID',
|
|
50
|
+
logGroups: [logGroup],
|
|
50
51
|
}),
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
52
|
+
canaryTestProps: {
|
|
53
|
+
requestCount: 10,
|
|
54
|
+
schedule: 'rate(1 minute)',
|
|
55
|
+
loadBalancer: loadBalancer,
|
|
56
|
+
networkConfiguration: {
|
|
57
|
+
vpc: vpc,
|
|
58
|
+
subnetSelection: { subnetType: SubnetType.PRIVATE_ISOLATED },
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
minimumUnhealthyTargets: {
|
|
62
|
+
percentage: 0.1
|
|
61
63
|
}
|
|
62
|
-
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
let rideOperation: Operation = {
|
|
67
|
+
operationName: 'ride',
|
|
68
|
+
service: service,
|
|
69
|
+
path: '/ride',
|
|
70
|
+
critical: true,
|
|
71
|
+
httpMethods: ['GET'],
|
|
72
|
+
serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({
|
|
73
|
+
logGroups: [logGroup],
|
|
74
|
+
successLatencyMetricJsonPath: '$.SuccessLatency',
|
|
75
|
+
faultMetricJsonPath: '$.Faults',
|
|
76
|
+
operationNameJsonPath: '$.Operation',
|
|
77
|
+
instanceIdJsonPath: '$.InstanceId',
|
|
78
|
+
availabilityZoneIdJsonPath: '$.AZ-ID',
|
|
79
|
+
}),
|
|
80
|
+
serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(
|
|
81
|
+
{
|
|
82
|
+
operationName: 'ride',
|
|
83
|
+
metricDimensions: new MetricDimensions(
|
|
84
|
+
{ Operation: 'ride' },
|
|
85
|
+
'AZ-ID',
|
|
86
|
+
'Region',
|
|
87
|
+
),
|
|
88
|
+
},
|
|
89
|
+
service.defaultAvailabilityMetricDetails,
|
|
90
|
+
),
|
|
91
|
+
serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(
|
|
92
|
+
{
|
|
93
|
+
operationName: 'ride',
|
|
94
|
+
metricDimensions: new MetricDimensions(
|
|
95
|
+
{ Operation: 'ride' },
|
|
96
|
+
'AZ-ID',
|
|
97
|
+
'Region',
|
|
98
|
+
),
|
|
99
|
+
},
|
|
100
|
+
service.defaultLatencyMetricDetails,
|
|
101
|
+
),
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
let payOperation: Operation = {
|
|
105
|
+
operationName: 'pay',
|
|
106
|
+
service: service,
|
|
107
|
+
path: '/pay',
|
|
108
|
+
critical: true,
|
|
109
|
+
httpMethods: ['GET'],
|
|
110
|
+
serverSideContributorInsightRuleDetails: new ContributorInsightRuleDetails({
|
|
111
|
+
logGroups: [logGroup],
|
|
112
|
+
successLatencyMetricJsonPath: '$.SuccessLatency',
|
|
113
|
+
faultMetricJsonPath: '$.Faults',
|
|
114
|
+
operationNameJsonPath: '$.Operation',
|
|
115
|
+
instanceIdJsonPath: '$.InstanceId',
|
|
116
|
+
availabilityZoneIdJsonPath: '$.AZ-ID',
|
|
117
|
+
}),
|
|
118
|
+
serverSideAvailabilityMetricDetails: new OperationAvailabilityMetricDetails(
|
|
119
|
+
{
|
|
120
|
+
operationName: 'pay',
|
|
121
|
+
metricDimensions: new MetricDimensions(
|
|
122
|
+
{ Operation: 'ride' },
|
|
123
|
+
'AZ-ID',
|
|
124
|
+
'Region',
|
|
125
|
+
),
|
|
126
|
+
},
|
|
127
|
+
service.defaultAvailabilityMetricDetails,
|
|
128
|
+
),
|
|
129
|
+
serverSideLatencyMetricDetails: new OperationLatencyMetricDetails(
|
|
130
|
+
{
|
|
131
|
+
operationName: 'pay',
|
|
132
|
+
metricDimensions: new MetricDimensions(
|
|
133
|
+
{ Operation: 'ride' },
|
|
134
|
+
'AZ-ID',
|
|
135
|
+
'Region',
|
|
136
|
+
),
|
|
137
|
+
},
|
|
138
|
+
service.defaultLatencyMetricDetails,
|
|
139
|
+
),
|
|
140
|
+
};
|
|
63
141
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
Path = "/signin",
|
|
67
|
-
Service = wildRydesService,
|
|
68
|
-
Critical = true,
|
|
69
|
-
HttpMethods = new string[] { "GET" },
|
|
70
|
-
ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {
|
|
71
|
-
OperationName = "Signin",
|
|
72
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Signin"}}, "AZ-ID", "Region")
|
|
73
|
-
}, wildRydesService.DefaultAvailabilityMetricDetails),
|
|
74
|
-
ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {
|
|
75
|
-
OperationName = "Signin",
|
|
76
|
-
SuccessAlarmThreshold = Duration.Millis(150),
|
|
77
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Signin"}}, "AZ-ID", "Region")
|
|
78
|
-
}, wildRydesService.DefaultLatencyMetricDetails),
|
|
79
|
-
CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {
|
|
80
|
-
SuccessAlarmThreshold = Duration.Millis(500)
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
wildRydesService.AddOperation(new Operation(new OperationProps() {
|
|
84
|
-
OperationName = "Pay",
|
|
85
|
-
Path = "/pay",
|
|
86
|
-
Service = wildRydesService,
|
|
87
|
-
HttpMethods = new string[] { "GET" },
|
|
88
|
-
Critical = true,
|
|
89
|
-
ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {
|
|
90
|
-
OperationName = "Pay",
|
|
91
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Pay"}}, "AZ-ID", "Region")
|
|
92
|
-
}, wildRydesService.DefaultAvailabilityMetricDetails),
|
|
93
|
-
ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {
|
|
94
|
-
OperationName = "Pay",
|
|
95
|
-
SuccessAlarmThreshold = Duration.Millis(200),
|
|
96
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Pay"}}, "AZ-ID", "Region")
|
|
97
|
-
}, wildRydesService.DefaultLatencyMetricDetails),
|
|
98
|
-
CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {
|
|
99
|
-
SuccessAlarmThreshold = Duration.Millis(500)
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
wildRydesService.AddOperation(new Operation(new OperationProps() {
|
|
103
|
-
OperationName = "Ride",
|
|
104
|
-
Path = "/ride",
|
|
105
|
-
Service = wildRydesService,
|
|
106
|
-
HttpMethods = new string[] { "GET" },
|
|
107
|
-
Critical = true,
|
|
108
|
-
ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {
|
|
109
|
-
OperationName = "Ride",
|
|
110
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Ride"}}, "AZ-ID", "Region")
|
|
111
|
-
}, wildRydesService.DefaultAvailabilityMetricDetails),
|
|
112
|
-
ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {
|
|
113
|
-
OperationName = "Ride",
|
|
114
|
-
SuccessAlarmThreshold = Duration.Millis(350),
|
|
115
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Ride"}}, "AZ-ID", "Region")
|
|
116
|
-
}, wildRydesService.DefaultLatencyMetricDetails),
|
|
117
|
-
CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {
|
|
118
|
-
SuccessAlarmThreshold = Duration.Millis(650)
|
|
119
|
-
})
|
|
120
|
-
})
|
|
121
|
-
wildRydesService.AddOperation(new Operation(new OperationProps() {
|
|
122
|
-
OperationName = "Home",
|
|
123
|
-
Path = "/home",
|
|
124
|
-
Service = wildRydesService,
|
|
125
|
-
HttpMethods = new string[] { "GET" },
|
|
126
|
-
Critical = true,
|
|
127
|
-
ServerSideAvailabilityMetricDetails = new OperationAvailabilityMetricDetails(new OperationAvailabilityMetricDetailsProps() {
|
|
128
|
-
OperationName = "Home",
|
|
129
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Home"}}, "AZ-ID", "Region")
|
|
130
|
-
}, wildRydesService.DefaultAvailabilityMetricDetails),
|
|
131
|
-
ServerSideLatencyMetricDetails = new OperationLatencyMetricDetails(new OperationLatencyMetricDetailsProps() {
|
|
132
|
-
OperationName = "Home",
|
|
133
|
-
SuccessAlarmThreshold = Duration.Millis(100),
|
|
134
|
-
MetricDimensions = new MetricDimensions(new Dictionary<string, string> {{ "Operation", "Home"}}, "AZ-ID", "Region")
|
|
135
|
-
}, wildRydesService.DefaultLatencyMetricDetails),
|
|
136
|
-
CanaryTestLatencyMetricsOverride = new CanaryTestLatencyMetricsOverride(new CanaryTestLatencyMetricsOverrideProps() {
|
|
137
|
-
SuccessAlarmThreshold = Duration.Millis(500)
|
|
138
|
-
})
|
|
139
|
-
}));
|
|
142
|
+
service.addOperation(rideOperation);
|
|
143
|
+
service.addOperation(payOperation);
|
|
140
144
|
```
|
|
141
145
|
|
|
142
146
|
Then you provide that service definition to the CDK construct.
|
|
143
147
|
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
OutlierDetectionAlgorithm = OutlierDetectionAlgorithm.STATIC
|
|
148
|
+
```typescript fixture=service
|
|
149
|
+
new InstrumentedServiceMultiAZObservability(stack, 'MAZObservability', {
|
|
150
|
+
createDashboards: true,
|
|
151
|
+
service: service,
|
|
152
|
+
interval: Duration.minutes(60)
|
|
150
153
|
});
|
|
151
154
|
```
|
|
152
155
|
|
|
@@ -154,28 +157,40 @@ You define some characteristics of the service, default values for metrics and a
|
|
|
154
157
|
|
|
155
158
|
If you don't have service specific logs and custom metrics with per-AZ dimensions, you can still use the construct to evaluate ALB and/or NAT Gateway metrics to find single AZ impairments.
|
|
156
159
|
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
160
|
+
```typescript
|
|
161
|
+
new BasicServiceMultiAZObservability(stack, 'MAZObservability', {
|
|
162
|
+
applicationLoadBalancerProps: {
|
|
163
|
+
albTargetGroupMap: [
|
|
164
|
+
{
|
|
165
|
+
applicationLoadBalancer: new ApplicationLoadBalancer(stack, 'alb', {
|
|
166
|
+
vpc: vpc,
|
|
167
|
+
crossZoneEnabled: true,
|
|
168
|
+
}),
|
|
169
|
+
targetGroups: [
|
|
170
|
+
targetGroup1,
|
|
171
|
+
targetGroup2
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
faultCountPercentThreshold: 1,
|
|
176
|
+
latencyStatistic: Stats.percentile(99),
|
|
177
|
+
latencyThreshold: Duration.millis(200),
|
|
178
|
+
latencyOutlierAlgorithm: ApplicationLoadBalancerLatencyOutlierAlgorithm.STATIC,
|
|
179
|
+
latencyOutlierThreshold: 45
|
|
164
180
|
},
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
{ "us-east-1c", [ natGateway3 ] }
|
|
181
|
+
natGatewayProps: {
|
|
182
|
+
natGateways: {
|
|
183
|
+
"us-east-1a": [ natGateway1 ],
|
|
184
|
+
"us-east-1b": [ natGateway2 ],
|
|
185
|
+
"us-east-1c": [ natGateway3 ]
|
|
171
186
|
},
|
|
187
|
+
packetLossPercentThreshold: 0.01
|
|
172
188
|
},
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
Interval = Duration.Minutes(60),
|
|
189
|
+
serviceName: 'test',
|
|
190
|
+
period: Duration.seconds(60),
|
|
191
|
+
createDashboard: true,
|
|
192
|
+
evaluationPeriods: 5,
|
|
193
|
+
datapointsToAlarm: 3,
|
|
179
194
|
});
|
|
180
195
|
```
|
|
181
196
|
|