Skip to content

Commit 0f97cda

Browse files
feat(elbv2): Accept imported load balancer and target groups (#329)
After CDK 2.65.0, it is now possible to obtain metrics through the interfaces. This opens up the possibility of creating dashboards for the imported versions of these resources. PS: The tests have such large diffs because of the extra indentation. The code is very similar, I just added the extra factory (`lbResourcesFactory`), but git is confused here. --- _By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license_
1 parent a1ebb92 commit 0f97cda

18 files changed

+7915
-2418
lines changed

.projen/deps.json

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.projen/tasks.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.projenrc.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { awscdk, javascript, DependencyType } = require("projen");
22
const { workflows } = require("projen/lib/github");
33

4-
const CDK_VERSION = "2.60.0";
4+
const CDK_VERSION = "2.65.0";
55

66
const project = new awscdk.AwsCdkConstructLibrary({
77
name: "cdk-monitoring-constructs",
@@ -11,7 +11,7 @@ const project = new awscdk.AwsCdkConstructLibrary({
1111
keywords: ["cloudwatch", "monitoring"],
1212

1313
defaultReleaseBranch: "main",
14-
majorVersion: 2,
14+
majorVersion: 3,
1515
stability: "experimental",
1616

1717
cdkVersion: CDK_VERSION,

API.md

Lines changed: 54 additions & 54 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ In your `package.json`:
2626
```json
2727
{
2828
"dependencies": {
29-
"cdk-monitoring-constructs": "^2.0.0",
29+
"cdk-monitoring-constructs": "^3.0.0",
3030

3131
// peer dependencies of cdk-monitoring-constructs
32-
"@aws-cdk/aws-apigatewayv2-alpha": "^2.60.0-alpha.0",
33-
"@aws-cdk/aws-redshift-alpha": "^2.60.0-alpha.0",
34-
"@aws-cdk/aws-synthetics-alpha": "^2.60.0-alpha.0",
35-
"aws-cdk-lib": "^2.60.0",
32+
"@aws-cdk/aws-apigatewayv2-alpha": "^2.65.0-alpha.0",
33+
"@aws-cdk/aws-redshift-alpha": "^2.65.0-alpha.0",
34+
"@aws-cdk/aws-synthetics-alpha": "^2.65.0-alpha.0",
35+
"aws-cdk-lib": "^2.65.0",
3636
"constructs": "^10.0.5"
3737

3838
// ...your other dependencies...

lib/monitoring/aws-ecs-patterns/Ec2ServiceMonitoring.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import {
1010
NetworkLoadBalancedEc2Service,
1111
} from "aws-cdk-lib/aws-ecs-patterns";
1212
import {
13-
ApplicationLoadBalancer,
14-
ApplicationTargetGroup,
15-
NetworkLoadBalancer,
16-
NetworkTargetGroup,
13+
IApplicationLoadBalancer,
14+
IApplicationTargetGroup,
15+
INetworkLoadBalancer,
16+
INetworkTargetGroup,
1717
} from "aws-cdk-lib/aws-elasticloadbalancingv2";
1818

1919
import { BaseServiceMetricFactory } from "./BaseServiceMetricFactory";
@@ -135,8 +135,8 @@ export interface Ec2ApplicationLoadBalancerMonitoringProps
135135
export interface CustomEc2ServiceMonitoringProps
136136
extends BaseLoadBalancedEc2ServiceMonitoringProps {
137137
readonly ec2Service: Ec2Service;
138-
readonly loadBalancer?: ApplicationLoadBalancer | NetworkLoadBalancer;
139-
readonly targetGroup?: ApplicationTargetGroup | NetworkTargetGroup;
138+
readonly loadBalancer?: IApplicationLoadBalancer | INetworkLoadBalancer;
139+
readonly targetGroup?: IApplicationTargetGroup | INetworkTargetGroup;
140140
}
141141

142142
export class Ec2ServiceMonitoring extends Monitoring {
@@ -186,8 +186,8 @@ export class Ec2ServiceMonitoring extends Monitoring {
186186
if (this.hasLoadBalancer) {
187187
this.loadBalancerMetricFactory = createLoadBalancerMetricFactory(
188188
this.metricFactory,
189-
props.loadBalancer,
190-
props.targetGroup
189+
props.loadBalancer!,
190+
props.targetGroup!
191191
);
192192
this.healthyTaskCountMetric =
193193
this.loadBalancerMetricFactory.metricHealthyTaskCount();

lib/monitoring/aws-ecs-patterns/FargateServiceMonitoring.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import {
1010
NetworkLoadBalancedFargateService,
1111
} from "aws-cdk-lib/aws-ecs-patterns";
1212
import {
13-
ApplicationLoadBalancer,
14-
ApplicationTargetGroup,
15-
NetworkLoadBalancer,
16-
NetworkTargetGroup,
13+
IApplicationLoadBalancer,
14+
IApplicationTargetGroup,
15+
INetworkLoadBalancer,
16+
INetworkTargetGroup,
1717
} from "aws-cdk-lib/aws-elasticloadbalancingv2";
1818

1919
import { BaseServiceMetricFactory } from "./BaseServiceMetricFactory";
@@ -135,8 +135,8 @@ export interface FargateApplicationLoadBalancerMonitoringProps
135135
export interface CustomFargateServiceMonitoringProps
136136
extends BaseLoadBalancedFargateServiceMonitoringProps {
137137
readonly fargateService: FargateService;
138-
readonly loadBalancer?: ApplicationLoadBalancer | NetworkLoadBalancer;
139-
readonly targetGroup?: ApplicationTargetGroup | NetworkTargetGroup;
138+
readonly loadBalancer?: IApplicationLoadBalancer | INetworkLoadBalancer;
139+
readonly targetGroup?: IApplicationTargetGroup | INetworkTargetGroup;
140140
}
141141

142142
export class FargateServiceMonitoring extends Monitoring {
@@ -189,8 +189,8 @@ export class FargateServiceMonitoring extends Monitoring {
189189
if (this.hasLoadBalancer) {
190190
this.loadBalancerMetricFactory = createLoadBalancerMetricFactory(
191191
this.metricFactory,
192-
props.loadBalancer,
193-
props.targetGroup
192+
props.loadBalancer!,
193+
props.targetGroup!
194194
);
195195
this.healthyTaskCountMetric =
196196
this.loadBalancerMetricFactory.metricHealthyTaskCount();

lib/monitoring/aws-loadbalancing/ApplicationLoadBalancerMetricFactory.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
2-
ApplicationLoadBalancer,
3-
ApplicationTargetGroup,
2+
IApplicationLoadBalancer,
3+
IApplicationTargetGroup,
44
} from "aws-cdk-lib/aws-elasticloadbalancingv2";
55

66
import { ILoadBalancerMetricFactory } from "./LoadBalancerMetricFactory";
@@ -15,8 +15,8 @@ import {
1515
* Props to create ApplicationLoadBalancerMetricFactory.
1616
*/
1717
export interface ApplicationLoadBalancerMetricFactoryProps {
18-
readonly applicationLoadBalancer: ApplicationLoadBalancer;
19-
readonly applicationTargetGroup: ApplicationTargetGroup;
18+
readonly applicationLoadBalancer: IApplicationLoadBalancer;
19+
readonly applicationTargetGroup: IApplicationTargetGroup;
2020
}
2121

2222
/**
@@ -26,8 +26,8 @@ export class ApplicationLoadBalancerMetricFactory
2626
implements ILoadBalancerMetricFactory
2727
{
2828
protected readonly metricFactory: MetricFactory;
29-
protected readonly applicationLoadBalancer: ApplicationLoadBalancer;
30-
protected readonly applicationTargetGroup: ApplicationTargetGroup;
29+
protected readonly applicationLoadBalancer: IApplicationLoadBalancer;
30+
protected readonly applicationTargetGroup: IApplicationTargetGroup;
3131

3232
constructor(
3333
metricFactory: MetricFactory,
@@ -40,7 +40,7 @@ export class ApplicationLoadBalancerMetricFactory
4040

4141
metricHealthyTaskCount() {
4242
return this.metricFactory.adaptMetric(
43-
this.applicationTargetGroup.metricHealthyHostCount({
43+
this.applicationTargetGroup.metrics.healthyHostCount({
4444
label: "Healthy Tasks",
4545
color: HealthyMetricColor,
4646
statistic: MetricStatistic.MIN,
@@ -50,7 +50,7 @@ export class ApplicationLoadBalancerMetricFactory
5050

5151
metricUnhealthyTaskCount() {
5252
return this.metricFactory.adaptMetric(
53-
this.applicationTargetGroup.metricUnhealthyHostCount({
53+
this.applicationTargetGroup.metrics.unhealthyHostCount({
5454
label: "Unhealthy Tasks",
5555
color: UnhealthyMetricColor,
5656
statistic: MetricStatistic.MAX,
@@ -70,23 +70,23 @@ export class ApplicationLoadBalancerMetricFactory
7070

7171
metricActiveConnectionCount() {
7272
return this.metricFactory.adaptMetric(
73-
this.applicationLoadBalancer.metricActiveConnectionCount({
73+
this.applicationLoadBalancer.metrics.activeConnectionCount({
7474
label: "Active",
7575
})
7676
);
7777
}
7878

7979
metricNewConnectionCount() {
8080
return this.metricFactory.adaptMetric(
81-
this.applicationLoadBalancer.metricNewConnectionCount({
81+
this.applicationLoadBalancer.metrics.newConnectionCount({
8282
label: "New",
8383
})
8484
);
8585
}
8686

8787
metricProcessedBytesMin() {
8888
return this.metricFactory.adaptMetric(
89-
this.applicationLoadBalancer.metricProcessedBytes({
89+
this.applicationLoadBalancer.metrics.processedBytes({
9090
statistic: MetricStatistic.MIN,
9191
label: "Processed Bytes (min)",
9292
})

lib/monitoring/aws-loadbalancing/LoadBalancerMetricFactory.ts

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,42 @@
11
import {
2-
ApplicationLoadBalancer,
3-
ApplicationTargetGroup,
4-
NetworkLoadBalancer,
5-
NetworkTargetGroup,
2+
IApplicationLoadBalancer,
3+
IApplicationTargetGroup,
4+
INetworkLoadBalancer,
5+
INetworkTargetGroup,
66
} from "aws-cdk-lib/aws-elasticloadbalancingv2";
77

88
import { ApplicationLoadBalancerMetricFactory } from "./ApplicationLoadBalancerMetricFactory";
99
import { NetworkLoadBalancerMetricFactory } from "./NetworkLoadBalancerMetricFactory";
1010
import { MetricFactory, MetricWithAlarmSupport } from "../../common";
1111

12+
// It's not possible to use instanceOf with typescript interfaces, so we have to use type guards to differentiate
13+
// between the interfaces. As another problem, the LoadBalancer/TargetGroup for both Network and Application types
14+
// don't have distinguished fields that could be used to differentiate between both types, so we resort to using
15+
// the name of the class below.
16+
//
17+
// Ideally the 2 interfaces would provide a specific field to distinguish both types.
18+
function isApplicationLoadBalancer(
19+
loadBalancer: INetworkLoadBalancer | IApplicationLoadBalancer
20+
): loadBalancer is IApplicationLoadBalancer {
21+
return loadBalancer.constructor.name.indexOf("Application") != -1;
22+
}
23+
function isNetworkLoadBalancer(
24+
loadBalancer: INetworkLoadBalancer | IApplicationLoadBalancer
25+
): loadBalancer is INetworkLoadBalancer {
26+
return loadBalancer.constructor.name.indexOf("Network") != -1;
27+
}
28+
29+
function isApplicationTargetGroup(
30+
targetGroup: INetworkTargetGroup | IApplicationTargetGroup
31+
): targetGroup is IApplicationTargetGroup {
32+
return targetGroup.constructor.name.indexOf("Application") != -1;
33+
}
34+
function isNetworkTargetGroup(
35+
targetGroup: INetworkTargetGroup | IApplicationTargetGroup
36+
): targetGroup is INetworkTargetGroup {
37+
return targetGroup.constructor.name.indexOf("Network") != -1;
38+
}
39+
1240
/**
1341
* Factory method to create appropriate metric factory based on the load balancer and target group type.
1442
* @param metricFactory metric factory
@@ -17,28 +45,28 @@ import { MetricFactory, MetricWithAlarmSupport } from "../../common";
1745
*/
1846
export function createLoadBalancerMetricFactory(
1947
metricFactory: MetricFactory,
20-
loadBalancer: any,
21-
targetGroup: any
48+
loadBalancer: INetworkLoadBalancer | IApplicationLoadBalancer,
49+
targetGroup: INetworkTargetGroup | IApplicationTargetGroup
2250
): ILoadBalancerMetricFactory {
2351
if (
24-
loadBalancer instanceof NetworkLoadBalancer &&
25-
targetGroup instanceof NetworkTargetGroup
52+
isNetworkLoadBalancer(loadBalancer) &&
53+
isNetworkTargetGroup(targetGroup)
2654
) {
2755
return new NetworkLoadBalancerMetricFactory(metricFactory, {
2856
networkLoadBalancer: loadBalancer,
2957
networkTargetGroup: targetGroup,
3058
});
3159
} else if (
32-
loadBalancer instanceof ApplicationLoadBalancer &&
33-
targetGroup instanceof ApplicationTargetGroup
60+
isApplicationLoadBalancer(loadBalancer) &&
61+
isApplicationTargetGroup(targetGroup)
3462
) {
3563
return new ApplicationLoadBalancerMetricFactory(metricFactory, {
3664
applicationLoadBalancer: loadBalancer,
3765
applicationTargetGroup: targetGroup,
3866
});
3967
} else {
4068
throw new Error(
41-
"Invalid type of load balancer or target group (only ALB and ELB is supported)."
69+
"Invalid type of load balancer or target group (only ALB and NLB are supported)."
4270
);
4371
}
4472
}

0 commit comments

Comments
 (0)