cfn-guardian 0.11.10 → 0.11.12
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.
- checksums.yaml +4 -4
- data/.github/workflows/push.yml +5 -5
- data/.github/workflows/release-image.yml +2 -2
- data/Dockerfile +1 -1
- data/cfn-guardian.gemspec +1 -1
- data/docs/alarm_templates.md +14 -0
- data/lib/cfnguardian/compile.rb +2 -0
- data/lib/cfnguardian/display_formatter.rb +3 -1
- data/lib/cfnguardian/models/alarm.rb +30 -0
- data/lib/cfnguardian/resources/application_targetgroup.rb +0 -1
- data/lib/cfnguardian/resources/kafka_cluster.rb +74 -0
- data/lib/cfnguardian/resources/kafka_topic.rb +20 -0
- data/lib/cfnguardian/stacks/resources.rb +1 -1
- data/lib/cfnguardian/tagger.rb +1 -1
- data/lib/cfnguardian/version.rb +1 -1
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21cb58528975cc592785f0ca44fe361afd0b9594d7323525f818a97811a3ba4b
|
4
|
+
data.tar.gz: 2e2696e21720d357e96fc5ec5c188c0cc843c274a097759409eb93b555853be4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 797f9f5716587ad2882ec691169b7e360e5c2adfae5854c3877be5e164450a942b82afeb1bdf4a68859b21d87ea10ddb7c147138f575325e12c15b72cbed9c53
|
7
|
+
data.tar.gz: 42427429d68e4382bf3e541c6cef4d2740394079698582fa7304efff9a71ba5deb39f3e221c7046f1b194d97e9c96a13e07184d215b4cf889b9fc0d8c464cc5a
|
data/.github/workflows/push.yml
CHANGED
@@ -18,17 +18,17 @@ jobs:
|
|
18
18
|
uses: rlespinasse/github-slug-action@v3.x
|
19
19
|
|
20
20
|
- name: Set up Docker Buildx
|
21
|
-
uses: docker/setup-buildx-action@
|
21
|
+
uses: docker/setup-buildx-action@v3
|
22
22
|
|
23
23
|
- name: Login to GitHub Container Repository
|
24
|
-
uses: docker/login-action@
|
24
|
+
uses: docker/login-action@v3
|
25
25
|
with:
|
26
26
|
registry: ghcr.io
|
27
|
-
username: ${{ github.
|
28
|
-
password: ${{ secrets.
|
27
|
+
username: ${{ github.actor }}
|
28
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
29
29
|
|
30
30
|
- name: Build and push Container Image to GitHub Container Repository
|
31
|
-
uses: docker/build-push-action@
|
31
|
+
uses: docker/build-push-action@v6
|
32
32
|
with:
|
33
33
|
context: .
|
34
34
|
file: ./Dockerfile
|
@@ -20,8 +20,8 @@ jobs:
|
|
20
20
|
uses: docker/login-action@v1
|
21
21
|
with:
|
22
22
|
registry: ghcr.io
|
23
|
-
username: ${{ github.
|
24
|
-
password: ${{ secrets.
|
23
|
+
username: ${{ github.actor }}
|
24
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
25
25
|
|
26
26
|
- name: Build and push Container Image to GitHub Container Repository
|
27
27
|
uses: docker/build-push-action@v2
|
data/Dockerfile
CHANGED
data/cfn-guardian.gemspec
CHANGED
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
|
|
38
38
|
spec.add_dependency 'aws-sdk-codecommit', '~> 1.53', '<2'
|
39
39
|
spec.add_dependency 'aws-sdk-codepipeline', '~> 1.55', '<2'
|
40
40
|
|
41
|
-
spec.add_runtime_dependency('rexml', '
|
41
|
+
spec.add_runtime_dependency('rexml', '3.3.0')
|
42
42
|
|
43
43
|
spec.add_development_dependency "bundler", "~> 2.0"
|
44
44
|
spec.add_development_dependency "rake", "~> 13.0"
|
data/docs/alarm_templates.md
CHANGED
@@ -29,6 +29,7 @@ cfn-guardian show-alarms --defaults --group ApplicationTargetGroup --alarm Targe
|
|
29
29
|
| ActionsEnabled | true |
|
30
30
|
| AlarmAction | Critical |
|
31
31
|
| TreatMissingData | notBreaching |
|
32
|
+
| OkActionDisabled | false |
|
32
33
|
+-------------------------+----------------------------------+
|
33
34
|
```
|
34
35
|
|
@@ -113,6 +114,19 @@ Templates:
|
|
113
114
|
CPUUtilizationHigh: false
|
114
115
|
```
|
115
116
|
|
117
|
+
## Disabling The OK Action On An Alarm
|
118
|
+
|
119
|
+
You can disable the OK action on an alarm by setting the OkActionDisabled flag to `true`. You might want to do this if you just want to receive alarm notifications rather than treat it as stateful.
|
120
|
+
|
121
|
+
```yaml
|
122
|
+
Templates:
|
123
|
+
# define the resource group
|
124
|
+
Ec2Instance:
|
125
|
+
# define the Alarm and set the OkActionDisabled value to true
|
126
|
+
CPUUtilizationHigh:
|
127
|
+
OkActionDisabled: true
|
128
|
+
```
|
129
|
+
|
116
130
|
## M Out Of N Metric Data Points
|
117
131
|
|
118
132
|
This can be good to alert on groups of spikes with in a certain time frame without getting alerts for individual spikes.
|
data/lib/cfnguardian/compile.rb
CHANGED
@@ -30,6 +30,8 @@ require 'cfnguardian/resources/internal_http'
|
|
30
30
|
require 'cfnguardian/resources/port'
|
31
31
|
require 'cfnguardian/resources/internal_port'
|
32
32
|
require 'cfnguardian/resources/nrpe'
|
33
|
+
require 'cfnguardian/resources/kafka_cluster'
|
34
|
+
require 'cfnguardian/resources/kafka_topic'
|
33
35
|
require 'cfnguardian/resources/lambda'
|
34
36
|
require 'cfnguardian/resources/network_targetgroup'
|
35
37
|
require 'cfnguardian/resources/rds_cluster'
|
@@ -32,6 +32,7 @@ module CfnGuardian
|
|
32
32
|
['EvaluateLowSampleCountPercentile', alarm.evaluate_low_sample_count_percentile],
|
33
33
|
['Unit', alarm.unit],
|
34
34
|
['AlarmAction', alarm.alarm_action],
|
35
|
+
['OkActionDisabled', alarm.ok_action_disabled],
|
35
36
|
['TreatMissingData', alarm.treat_missing_data]
|
36
37
|
]
|
37
38
|
|
@@ -72,7 +73,8 @@ module CfnGuardian
|
|
72
73
|
['EvaluateLowSampleCountPercentile', alarm.evaluate_low_sample_count_percentile, metric_alarm.evaluate_low_sample_count_percentile],
|
73
74
|
['Unit', alarm.unit, metric_alarm.unit],
|
74
75
|
['TreatMissingData', alarm.treat_missing_data, metric_alarm.treat_missing_data],
|
75
|
-
['AlarmAction', alarm.alarm_action, alarm.alarm_action]
|
76
|
+
['AlarmAction', alarm.alarm_action, alarm.alarm_action],
|
77
|
+
['OkActionDisabled', alarm.ok_action_disabled]
|
76
78
|
]
|
77
79
|
|
78
80
|
rows.select! {|row| !row[1].nil?}.each {|row| colour_compare_row(row)}
|
@@ -19,6 +19,7 @@ module CfnGuardian
|
|
19
19
|
:comparison_operator,
|
20
20
|
:statistic,
|
21
21
|
:actions_enabled,
|
22
|
+
:ok_action_disabled,
|
22
23
|
:enabled,
|
23
24
|
:resource_id,
|
24
25
|
:resource_name,
|
@@ -45,6 +46,7 @@ module CfnGuardian
|
|
45
46
|
@comparison_operator = 'GreaterThanThreshold'
|
46
47
|
@statistic = 'Maximum'
|
47
48
|
@actions_enabled = true
|
49
|
+
@ok_action_disabled = false
|
48
50
|
@datapoints_to_alarm = nil
|
49
51
|
@extended_statistic = nil
|
50
52
|
@evaluate_low_sample_count_percentile = nil
|
@@ -394,6 +396,34 @@ module CfnGuardian
|
|
394
396
|
end
|
395
397
|
end
|
396
398
|
|
399
|
+
class KafkaClusterAlarm < BaseAlarm
|
400
|
+
def initialize(resource,broker)
|
401
|
+
super(resource)
|
402
|
+
@group = 'KafkaCluster'
|
403
|
+
@namespace = 'AWS/Kafka'
|
404
|
+
@dimensions = { 'Cluster Name': resource['Id'], 'Broker ID': broker }
|
405
|
+
@statistic = 'Average'
|
406
|
+
@evaluation_periods = 1
|
407
|
+
@datapoints_to_alarm = 1
|
408
|
+
@period = 300
|
409
|
+
@treat_missing_data = 'breaching'
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
class KafkaTopicAlarm < BaseAlarm
|
414
|
+
def initialize(resource,broker)
|
415
|
+
super(resource)
|
416
|
+
@group = 'KafkaTopic'
|
417
|
+
@namespace = 'AWS/Kafka'
|
418
|
+
@dimensions = { 'Cluster Name': resource['ClusterName'], 'Broker ID': broker, Topic: resource['Id'] }
|
419
|
+
@statistic = 'Average'
|
420
|
+
@evaluation_periods = 1
|
421
|
+
@datapoints_to_alarm = 1
|
422
|
+
@period = 300
|
423
|
+
@treat_missing_data = 'breaching'
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
397
427
|
class LambdaAlarm < BaseAlarm
|
398
428
|
def initialize(resource)
|
399
429
|
super(resource)
|
@@ -9,7 +9,6 @@ module CfnGuardian::Resource
|
|
9
9
|
alarm.statistic = 'Minimum'
|
10
10
|
alarm.threshold = 2
|
11
11
|
alarm.evaluation_periods = 1
|
12
|
-
alarm.comparison_operator = 'LessThanThreshold'
|
13
12
|
@alarms.push(alarm)
|
14
13
|
|
15
14
|
alarm = CfnGuardian::Models::ApplicationTargetGroupAlarm.new(@resource)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module CfnGuardian::Resource
|
2
|
+
class KafkaCluster < Base
|
3
|
+
|
4
|
+
def initialize(resource, override_group = nil)
|
5
|
+
super(resource, override_group)
|
6
|
+
@brokers_list = resource['Brokers']
|
7
|
+
end
|
8
|
+
|
9
|
+
def default_alarms
|
10
|
+
@brokers_list.each do |broker|
|
11
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
12
|
+
alarm.name = "Broker#{broker}-CPUUserCritical"
|
13
|
+
alarm.metric_name = 'CpuUser'
|
14
|
+
alarm.threshold = 80
|
15
|
+
@alarms.push(alarm)
|
16
|
+
|
17
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
18
|
+
alarm.name = "Broker#{broker}-CPUUserWarning"
|
19
|
+
alarm.metric_name = 'CpuUser'
|
20
|
+
alarm.threshold = 50
|
21
|
+
alarm.alarm_action = 'Warning'
|
22
|
+
@alarms.push(alarm)
|
23
|
+
|
24
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
25
|
+
alarm.name = "Broker#{broker}-KafkaDataLogsDiskUsedCritical"
|
26
|
+
alarm.metric_name = 'KafkaDataLogsDiskUsed'
|
27
|
+
alarm.threshold = 85
|
28
|
+
@alarms.push(alarm)
|
29
|
+
|
30
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
31
|
+
alarm.name = "Broker#{broker}-KafkaDataLogsDiskUsedWarning"
|
32
|
+
alarm.metric_name = 'KafkaDataLogsDiskUsed'
|
33
|
+
alarm.threshold = 70
|
34
|
+
alarm.alarm_action = 'Warning'
|
35
|
+
@alarms.push(alarm)
|
36
|
+
|
37
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
38
|
+
alarm.name = "Broker#{broker}-BurstBalance"
|
39
|
+
alarm.metric_name = 'BurstBalance'
|
40
|
+
alarm.threshold = 1
|
41
|
+
alarm.comparison_operator = 'LessThanThreshold'
|
42
|
+
@alarms.push(alarm)
|
43
|
+
|
44
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
45
|
+
alarm.name = "Broker#{broker}-MemoryFreeCritical"
|
46
|
+
alarm.metric_name = 'MemoryFree'
|
47
|
+
alarm.threshold = 10
|
48
|
+
alarm.comparison_operator = 'LessThanThreshold'
|
49
|
+
@alarms.push(alarm)
|
50
|
+
|
51
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
52
|
+
alarm.name = "Broker#{broker}-MemoryFreeWarning"
|
53
|
+
alarm.metric_name = 'MemoryFree'
|
54
|
+
alarm.threshold = 50
|
55
|
+
alarm.alarm_action = 'Warning'
|
56
|
+
alarm.comparison_operator = 'LessThanThreshold'
|
57
|
+
@alarms.push(alarm)
|
58
|
+
|
59
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
60
|
+
alarm.name = "Broker#{broker}-NetworkRxErrorsCritical"
|
61
|
+
alarm.metric_name = 'NetworkRxErrors'
|
62
|
+
alarm.threshold = 10
|
63
|
+
@alarms.push(alarm)
|
64
|
+
|
65
|
+
alarm = CfnGuardian::Models::KafkaClusterAlarm.new(@resource,broker)
|
66
|
+
alarm.name = "Broker#{broker}-NetworkRxErrorsWarning"
|
67
|
+
alarm.metric_name = 'NetworkRxErrors'
|
68
|
+
alarm.threshold = 5
|
69
|
+
alarm.alarm_action = 'Warning'
|
70
|
+
@alarms.push(alarm)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CfnGuardian::Resource
|
2
|
+
class KafkaTopic < Base
|
3
|
+
|
4
|
+
def initialize(resource, override_group = nil)
|
5
|
+
super(resource, override_group)
|
6
|
+
@brokers_list = resource['Brokers']
|
7
|
+
end
|
8
|
+
|
9
|
+
def default_alarms
|
10
|
+
@brokers_list.each do |broker|
|
11
|
+
alarm = CfnGuardian::Models::KafkaTopicAlarm.new(@resource,broker)
|
12
|
+
alarm.name = "Broker#{broker}-MessagesInPerSec"
|
13
|
+
alarm.metric_name = 'MessagesInPerSec'
|
14
|
+
alarm.threshold = 5
|
15
|
+
alarm.comparison_operator = 'LessThanThreshold'
|
16
|
+
@alarms.push(alarm)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -48,7 +48,7 @@ module CfnGuardian
|
|
48
48
|
MetricName alarm.metric_name
|
49
49
|
Namespace alarm.namespace
|
50
50
|
AlarmActions actions
|
51
|
-
OKActions actions
|
51
|
+
OKActions actions unless alarm.ok_action_disabled
|
52
52
|
TreatMissingData alarm.treat_missing_data unless alarm.treat_missing_data.nil?
|
53
53
|
DatapointsToAlarm alarm.datapoints_to_alarm unless alarm.datapoints_to_alarm.nil?
|
54
54
|
ExtendedStatistic alarm.extended_statistic unless alarm.extended_statistic.nil?
|
data/lib/cfnguardian/tagger.rb
CHANGED
@@ -63,7 +63,7 @@ module CfnGuardian
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def get_tags_to_delete(current_tags, new_tags)
|
66
|
-
return current_tags.select {|tag| !new_tags.has_key?(tag.key)}.map {|tag| tag.key}
|
66
|
+
return current_tags.select {|tag| !new_tags.has_key?(tag.key) && !tag.key.start_with?('aws:') }.map { |tag| tag.key }
|
67
67
|
end
|
68
68
|
|
69
69
|
def tags_changed?(current_tags, new_tags)
|
data/lib/cfnguardian/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfn-guardian
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guslington
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -228,16 +228,16 @@ dependencies:
|
|
228
228
|
name: rexml
|
229
229
|
requirement: !ruby/object:Gem::Requirement
|
230
230
|
requirements:
|
231
|
-
- -
|
231
|
+
- - '='
|
232
232
|
- !ruby/object:Gem::Version
|
233
|
-
version:
|
233
|
+
version: 3.3.0
|
234
234
|
type: :runtime
|
235
235
|
prerelease: false
|
236
236
|
version_requirements: !ruby/object:Gem::Requirement
|
237
237
|
requirements:
|
238
|
-
- -
|
238
|
+
- - '='
|
239
239
|
- !ruby/object:Gem::Version
|
240
|
-
version:
|
240
|
+
version: 3.3.0
|
241
241
|
- !ruby/object:Gem::Dependency
|
242
242
|
name: bundler
|
243
243
|
requirement: !ruby/object:Gem::Requirement
|
@@ -357,6 +357,8 @@ files:
|
|
357
357
|
- lib/cfnguardian/resources/internal_port.rb
|
358
358
|
- lib/cfnguardian/resources/internal_sftp.rb
|
359
359
|
- lib/cfnguardian/resources/jenkins.rb
|
360
|
+
- lib/cfnguardian/resources/kafka_cluster.rb
|
361
|
+
- lib/cfnguardian/resources/kafka_topic.rb
|
360
362
|
- lib/cfnguardian/resources/lambda.rb
|
361
363
|
- lib/cfnguardian/resources/log_group.rb
|
362
364
|
- lib/cfnguardian/resources/network_targetgroup.rb
|
@@ -388,7 +390,7 @@ metadata:
|
|
388
390
|
homepage_uri: https://github.com/base2Services/cfn-guardian
|
389
391
|
source_code_uri: https://github.com/base2Services/cfn-guardian
|
390
392
|
changelog_uri: https://github.com/base2Services/cfn-guardian
|
391
|
-
post_install_message:
|
393
|
+
post_install_message:
|
392
394
|
rdoc_options: []
|
393
395
|
require_paths:
|
394
396
|
- lib
|
@@ -404,7 +406,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
404
406
|
version: '0'
|
405
407
|
requirements: []
|
406
408
|
rubygems_version: 3.1.6
|
407
|
-
signing_key:
|
409
|
+
signing_key:
|
408
410
|
specification_version: 4
|
409
411
|
summary: Manages AWS cloudwatch alarms with default templates using cloudformation
|
410
412
|
test_files: []
|