1
- import { GraphWidget , IMetric , IWidget } from "aws-cdk-lib/aws-cloudwatch" ;
1
+ import {
2
+ GraphWidget ,
3
+ HorizontalAnnotation ,
4
+ IMetric ,
5
+ IWidget ,
6
+ } from "aws-cdk-lib/aws-cloudwatch" ;
2
7
3
8
import { EC2MetricFactory , EC2MetricFactoryProps } from "./EC2MetricFactory" ;
4
9
import {
5
10
BaseMonitoringProps ,
6
11
CountAxisFromZero ,
7
12
DefaultGraphWidgetHeight ,
8
13
DefaultSummaryWidgetHeight ,
14
+ MetricWithAlarmSupport ,
9
15
Monitoring ,
10
16
MonitoringScope ,
11
17
PercentageAxisFromZeroToHundred ,
12
18
QuarterWidth ,
13
19
SizeAxisBytesFromZero ,
14
20
ThirdWidth ,
15
21
} from "../../common" ;
22
+ import {
23
+ EC2AlarmFactory ,
24
+ NetworkInThreshold ,
25
+ NetworkOutThreshold ,
26
+ } from "../../common/monitoring/alarms/EC2AlarmFactory" ;
16
27
import {
17
28
MonitoringHeaderWidget ,
18
29
MonitoringNamingStrategy ,
19
30
} from "../../dashboard" ;
20
31
21
32
export interface EC2MonitoringOptions
22
33
extends EC2MetricFactoryProps ,
23
- BaseMonitoringProps { }
34
+ BaseMonitoringProps {
35
+ readonly addNetworkOutTotalBytesExceedThresholdAlarm ?: Record <
36
+ string ,
37
+ NetworkOutThreshold
38
+ > ;
39
+
40
+ readonly addNetworkInTotalBytesExceedThresholdAlarm ?: Record <
41
+ string ,
42
+ NetworkInThreshold
43
+ > ;
44
+ }
24
45
25
46
export interface EC2MonitoringProps extends EC2MonitoringOptions { }
26
47
27
48
export class EC2Monitoring extends Monitoring {
28
49
readonly family : string ;
29
50
readonly title : string ;
30
51
52
+ readonly ec2AlarmFactory : EC2AlarmFactory ;
53
+
31
54
readonly cpuUtilisationMetrics : IMetric [ ] ;
32
55
readonly diskReadBytesMetrics : IMetric [ ] ;
33
56
readonly diskWriteBytesMetrics : IMetric [ ] ;
34
57
readonly diskReadOpsMetrics : IMetric [ ] ;
35
58
readonly diskWriteOpsMetrics : IMetric [ ] ;
36
- readonly networkInMetrics : IMetric [ ] ;
37
- readonly networkOutMetrics : IMetric [ ] ;
59
+ readonly networkInMetrics : MetricWithAlarmSupport [ ] ;
60
+ readonly networkOutMetrics : MetricWithAlarmSupport [ ] ;
61
+
62
+ readonly networkInSumMetrics : MetricWithAlarmSupport [ ] ;
63
+ readonly networkOutSumMetrics : MetricWithAlarmSupport [ ] ;
64
+
65
+ readonly networkInSumLimitAnnotations : HorizontalAnnotation [ ] ;
66
+ readonly networkOutSumLimitAnnotations : HorizontalAnnotation [ ] ;
38
67
39
68
constructor ( scope : MonitoringScope , props : EC2MonitoringProps ) {
40
69
super ( scope , props ) ;
@@ -48,11 +77,28 @@ export class EC2Monitoring extends Monitoring {
48
77
} ) ;
49
78
this . family = props . autoScalingGroup ? "EC2 Auto Scaling Group" : "EC2" ;
50
79
this . title = namingStrategy . resolveHumanReadableName ( ) ;
80
+ this . networkOutSumLimitAnnotations = [ ] ;
81
+ this . networkInSumLimitAnnotations = [ ] ;
51
82
52
83
const metricFactory = new EC2MetricFactory (
53
84
scope . createMetricFactory ( ) ,
54
85
props ,
55
86
) ;
87
+
88
+ // using different fallback alarm construct name
89
+ // as alarms don't allow whitespace
90
+ const fallbackAlarmConstructName = props . autoScalingGroup
91
+ ? props . autoScalingGroup . autoScalingGroupName
92
+ : "All-Instances" ;
93
+ const namingAlarmStrategy = new MonitoringNamingStrategy ( {
94
+ ...props ,
95
+ fallbackConstructName : fallbackAlarmConstructName ,
96
+ } ) ;
97
+ const alarmFactory = this . createAlarmFactory (
98
+ namingAlarmStrategy . resolveAlarmFriendlyName ( ) ,
99
+ ) ;
100
+ this . ec2AlarmFactory = new EC2AlarmFactory ( alarmFactory ) ;
101
+
56
102
this . cpuUtilisationMetrics =
57
103
metricFactory . metricAverageCpuUtilisationPercent ( ) ;
58
104
this . diskReadBytesMetrics = metricFactory . metricAverageDiskReadBytes ( ) ;
@@ -61,6 +107,47 @@ export class EC2Monitoring extends Monitoring {
61
107
this . diskWriteOpsMetrics = metricFactory . metricAverageDiskWriteOps ( ) ;
62
108
this . networkInMetrics = metricFactory . metricAverageNetworkInRateBytes ( ) ;
63
109
this . networkOutMetrics = metricFactory . metricAverageNetworkOutRateBytes ( ) ;
110
+
111
+ this . networkInSumMetrics = metricFactory . metricSumNetworkInRateBytes ( ) ;
112
+ this . networkOutSumMetrics = metricFactory . metricSumNetworkOutRateBytes ( ) ;
113
+
114
+ for ( const disambiguator in props . addNetworkInTotalBytesExceedThresholdAlarm ) {
115
+ const alarmProps =
116
+ props . addNetworkInTotalBytesExceedThresholdAlarm [ disambiguator ] ;
117
+
118
+ const createdAlarms = this . networkInMetrics . map ( ( metric ) => {
119
+ const createdAlarm = this . ec2AlarmFactory . addNetworkInAlarm (
120
+ metric ,
121
+ alarmProps ,
122
+ disambiguator ,
123
+ ) ;
124
+ this . addAlarm ( createdAlarm ) ;
125
+ return createdAlarm ;
126
+ } ) ;
127
+
128
+ if ( createdAlarms . length > 0 ) {
129
+ this . networkInSumLimitAnnotations . push ( createdAlarms [ 0 ] . annotation ) ;
130
+ }
131
+ }
132
+
133
+ for ( const disambiguator in props . addNetworkOutTotalBytesExceedThresholdAlarm ) {
134
+ const alarmProps =
135
+ props . addNetworkOutTotalBytesExceedThresholdAlarm [ disambiguator ] ;
136
+ const createdAlarms = this . networkOutSumMetrics . map ( ( metric ) => {
137
+ const createdAlarm = this . ec2AlarmFactory . addNetworkOutAlarm (
138
+ metric ,
139
+ alarmProps ,
140
+ disambiguator ,
141
+ ) ;
142
+ this . addAlarm ( createdAlarm ) ;
143
+ return createdAlarm ;
144
+ } ) ;
145
+
146
+ if ( createdAlarms . length > 0 ) {
147
+ this . networkOutSumLimitAnnotations . push ( createdAlarms [ 0 ] . annotation ) ;
148
+ }
149
+ }
150
+ props . useCreatedAlarms ?. consume ( this . createdAlarms ( ) ) ;
64
151
}
65
152
66
153
summaryWidgets ( ) : IWidget [ ] {
@@ -135,6 +222,12 @@ export class EC2Monitoring extends Monitoring {
135
222
title : "Network" ,
136
223
left : [ ...this . networkInMetrics , ...this . networkOutMetrics ] ,
137
224
leftYAxis : SizeAxisBytesFromZero ,
225
+ right : [ ...this . networkInSumMetrics , ...this . networkOutSumMetrics ] ,
226
+ rightYAxis : SizeAxisBytesFromZero ,
227
+ rightAnnotations : [
228
+ ...this . networkInSumLimitAnnotations ,
229
+ ...this . networkOutSumLimitAnnotations ,
230
+ ] ,
138
231
} ) ;
139
232
}
140
233
}
0 commit comments