Skip to content

Commit 6a9e43f

Browse files
feat(elbv2): add metrics to INetworkTargetGroup and IApplicationTargetGroup (#23993)
This PR follows the same conventions as #23853 By moving the metrics methods to the `INetworkTargetGroup` and `IApplicationTargetGroup` interfaces it allows to create these metrics also for Target Groups that are imported via the `fromTargetGroupAttributes()` method. To create the metrics for Target Groups requires (1) the full name of the Target Group and (2) the full name of the Load Balancer. For (1): it is readily available given that all imported Target Groups need to provide its ARN. For (2), it is an optional value, so the `.metrics` parameter will throw an error if it was not provided. To solve this problem I did: - Introduce a new interface for each TG type: `INetworkTargetGroupMetrics`, `IApplicationTargetGroupMetrics` - Create a concrete implementation for the new interfaces (1 for each): `NetworkTargetGroupMetrics` and `ApplicationTargetGroupMetrics` - Make each concrete implementation of each Load Balancer to also provide a `metrics` field. The concrete implementations of the load balancers are: `ImportedApplicationTargetGroup`, and `ApplicationLoadBalancer` (and the same for the NLB classes). I chose to create a new interface because code can be reused across the 3 concrete implementations of each Load Balancer. I deprecated the `metricXXX()` methods of each load balancer because I think it is cleaner to access metrics through the new `metrics` attribute/interface. There is a small **gotcha** here because the parameter of the `fromTargetGroupAttributes()` method that refers to the LB is: `loadBalancerArns`, which has its documentation as: > A Token representing the list of ARNs for the load balancer routing to this target group I'm not treating this parameter as a collection of ARNs, but as a single ARN. Also, I'm not treating it only as a token, but hardcoded ARNs can also be supplied, which "sort of" violates its interface. This attribute is weird though because Target Groups cannot have multiple Load Balancers as of today, although its documentation doesn't clearly express that is the case. fix: #10850 ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 350665d commit 6a9e43f

14 files changed

+1145
-90
lines changed

packages/@aws-cdk/aws-elasticloadbalancingv2/README.md

+37-1
Original file line numberDiff line numberDiff line change
@@ -607,11 +607,47 @@ const listener = elbv2.NetworkListener.fromLookup(this, 'ALBListener', {
607607

608608
## Metrics
609609

610-
You may create metrics for each Load Balancer through the `metrics` attribute:
610+
You may create metrics for Load Balancers and Target Groups through the `metrics` attribute:
611+
612+
**Load Balancer:**
611613

612614
```ts
613615
declare const alb: elbv2.IApplicationLoadBalancer;
614616

615617
const albMetrics: elbv2.IApplicationLoadBalancerMetrics = alb.metrics;
616618
const metricConnectionCount: cloudwatch.Metric = albMetrics.activeConnectionCount();
617619
```
620+
621+
**Target Group:**
622+
623+
```ts
624+
declare const targetGroup: elbv2.IApplicationTargetGroup;
625+
626+
const targetGroupMetrics: elbv2.IApplicationTargetGroupMetrics = targetGroup.metrics;
627+
const metricHealthyHostCount: cloudwatch.Metric = targetGroupMetrics.healthyHostCount();
628+
```
629+
630+
Metrics are also available to imported resources:
631+
632+
```ts
633+
declare const stack: Stack;
634+
635+
const targetGroup = elbv2.ApplicationTargetGroup.fromTargetGroupAttributes(stack, 'MyTargetGroup', {
636+
targetGroupArn: Fn.importValue('TargetGroupArn'),
637+
loadBalancerArns: Fn.importValue('LoadBalancerArn'),
638+
});
639+
640+
const targetGroupMetrics: elbv2.IApplicationTargetGroupMetrics = targetGroup.metrics;
641+
```
642+
643+
Notice that TargetGroups must be imported by supplying the Load Balancer too, otherwise accessing the `metrics` will
644+
throw an error:
645+
646+
```ts
647+
declare const stack: Stack;
648+
const targetGroup = elbv2.ApplicationTargetGroup.fromTargetGroupAttributes(stack, 'MyTargetGroup', {
649+
targetGroupArn: Fn.importValue('TargetGroupArn'),
650+
});
651+
652+
const targetGroupMetrics: elbv2.IApplicationTargetGroupMetrics = targetGroup.metrics; // throws an Error()
653+
```

0 commit comments

Comments
 (0)