kubernetes_health_checker 0.0.0.3 → 0.0.0.4
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/bin/kubernetes_health_checker +76 -36
- data/bin/kubernetes_health_checkerd +5 -0
- metadata +17 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a44862baa23546298cbe135442791f9413b092f
|
4
|
+
data.tar.gz: 158d714234ec07627bd6e9fce0834aa906506ce8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55c4048409051f6b23a8760be6640d6441673eb4b90a6df9e88cf7700b836ed5c93e5549df2d08eef30bd19639a1ef1ef564d549a4f08bec5057f52073b1da31
|
7
|
+
data.tar.gz: cae075720d0244dadc3e9c3a529afb09d4766f779a9d78d3792083338e01093bab0393da590c2ca70fe1c4a668013d0878b75ae2f4e6fb9ebba94ff557400be4
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'thor'
|
5
|
+
require 'byebug'
|
5
6
|
require 'json'
|
6
7
|
|
7
8
|
module KubernetesHealthChecker
|
@@ -17,34 +18,19 @@ module KubernetesHealthChecker
|
|
17
18
|
|
18
19
|
ALERT_STATUSES = ['CrashLoopBackOff'].freeze
|
19
20
|
|
20
|
-
|
21
|
-
opts = options.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
|
22
|
-
@alert_threshold = opts[:alert_threshold] || 5
|
23
|
-
@slack_channel = opts[:channel] || '@rohan'
|
24
|
-
@namespace = opts[:namespace] || 'default'
|
25
|
-
@test = opts[:test] || false
|
26
|
-
|
27
|
-
raise 'must provide a url to POST alert to' if !opts[:url]
|
28
|
-
@url = opts[:url]
|
29
|
-
|
30
|
-
if @test
|
31
|
-
path = File.expand_path('../mock_output.txt', __FILE__)
|
32
|
-
output = File.read(path)
|
33
|
-
else
|
34
|
-
output = `kubectl get pods --namespace #{options[:namespace]}`
|
35
|
-
end
|
36
|
-
|
37
|
-
message = ''
|
38
|
-
rows = output.split("\n")
|
39
|
-
rows.each_with_index do |row, index|
|
40
|
-
next if index == 0
|
41
|
-
row = row.split(" ")
|
42
|
-
response = check_pod_state(pod_name: row[0], status: row[2], restarts: row[3].to_i)
|
21
|
+
RUN_INTERVAL = 10
|
43
22
|
|
44
|
-
|
23
|
+
def start
|
24
|
+
set_defaults(options)
|
25
|
+
run_validations if !@test
|
26
|
+
while true
|
27
|
+
puts 'starting...'
|
28
|
+
output = get_cli_output
|
29
|
+
message = construct_message(output)
|
30
|
+
send_alert(message) if !message.empty?
|
31
|
+
puts 'sleeping...'
|
32
|
+
sleep RUN_INTERVAL
|
45
33
|
end
|
46
|
-
|
47
|
-
send_alert(message) if !message.empty?
|
48
34
|
end
|
49
35
|
|
50
36
|
desc 'version', 'Prints version'
|
@@ -53,7 +39,36 @@ module KubernetesHealthChecker
|
|
53
39
|
end
|
54
40
|
|
55
41
|
no_commands do
|
42
|
+
def set_defaults(options)
|
43
|
+
opts = options.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
|
44
|
+
@alert_threshold = opts[:alert_threshold] || 5
|
45
|
+
@slack_channel = opts[:channel] || '@rohan'
|
46
|
+
@namespace = opts[:namespace] || 'default'
|
47
|
+
@test = opts[:test] || false
|
48
|
+
@url = opts[:url]
|
49
|
+
@pods_data = {}
|
50
|
+
end
|
51
|
+
|
52
|
+
def run_validations
|
53
|
+
raise 'must provide a url to POST alert to' if !@url
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_cli_output
|
57
|
+
if @test
|
58
|
+
# so hacky, but pulls from second mock output if
|
59
|
+
# it's the second time running to test state changes
|
60
|
+
file_name = @pods_data.empty? ? '../mock_output.txt' : '../mock_output_two.txt'
|
61
|
+
path = File.expand_path(file_name, __FILE__)
|
62
|
+
output = File.read(path)
|
63
|
+
else
|
64
|
+
output = `kubectl get pods --namespace #{@namespace}`
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
56
68
|
def send_alert(message)
|
69
|
+
puts "Sending message: #{message}"
|
70
|
+
return if @test
|
71
|
+
|
57
72
|
payload = {
|
58
73
|
channel: @slack_channel,
|
59
74
|
username: 'kubernetes_health_check_bot',
|
@@ -64,19 +79,44 @@ module KubernetesHealthChecker
|
|
64
79
|
`curl -X POST --data-urlencode 'payload=#{JSON.generate(payload)}' #{@url}`
|
65
80
|
end
|
66
81
|
|
67
|
-
def
|
68
|
-
|
69
|
-
|
82
|
+
def get_pod_message(pod_name:, new_status:, new_restarts:)
|
83
|
+
old_restarts = @pods_data[pod_name][:restarts]
|
84
|
+
old_status = @pods_data[pod_name][:status]
|
85
|
+
text = ""
|
86
|
+
|
87
|
+
if !@pods_data[pod_name].empty? && old_restarts == new_restarts && old_status == new_status
|
88
|
+
# we've already alerted from this state, skip
|
89
|
+
elsif ALERT_STATUSES.include?(new_status)
|
90
|
+
text = "Pod *#{pod_name}* is in status: *#{new_status}*.\n"
|
91
|
+
elsif new_restarts > @alert_threshold
|
92
|
+
text = "Pod *#{pod_name}* has restarted *#{new_restarts}* times and has status: *#{new_status}*.\n"
|
93
|
+
end
|
94
|
+
|
95
|
+
text
|
96
|
+
end
|
97
|
+
|
98
|
+
def construct_message(output)
|
99
|
+
message = ''
|
100
|
+
new_pod_store = {}
|
101
|
+
|
102
|
+
rows = output.split("\n")
|
103
|
+
rows.each_with_index do |row, index|
|
104
|
+
next if index == 0
|
105
|
+
|
106
|
+
row = row.split(" ")
|
107
|
+
pod_name = row[0]
|
108
|
+
status = row[2]
|
109
|
+
restarts = row[3].to_i
|
110
|
+
|
111
|
+
@pods_data[pod_name] ||= {}
|
112
|
+
message += get_pod_message(pod_name: pod_name, new_status: status, new_restarts: restarts)
|
70
113
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
elsif restarts > @alert_threshold
|
75
|
-
should_alert = true
|
76
|
-
text = "Pod *#{pod_name}* has restarted *#{restarts}* times and has status: *#{status}*.\n"
|
114
|
+
# update our data store for the pods
|
115
|
+
@pods_data[pod_name][:status] = status
|
116
|
+
@pods_data[pod_name][:restarts] = restarts
|
77
117
|
end
|
78
118
|
|
79
|
-
|
119
|
+
message
|
80
120
|
end
|
81
121
|
end
|
82
122
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubernetes_health_checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.0.
|
4
|
+
version: 0.0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rohan Sahai
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: daemons
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: byebug
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,10 +57,12 @@ description: Simple script to send slack notifications for pods that are crashin
|
|
43
57
|
email: rohan@sah.ai
|
44
58
|
executables:
|
45
59
|
- kubernetes_health_checker
|
60
|
+
- kubernetes_health_checkerd
|
46
61
|
extensions: []
|
47
62
|
extra_rdoc_files: []
|
48
63
|
files:
|
49
64
|
- bin/kubernetes_health_checker
|
65
|
+
- bin/kubernetes_health_checkerd
|
50
66
|
- bin/mock_output.txt
|
51
67
|
homepage: http://rubygems.org/gems/kubernetes_health_checker
|
52
68
|
licenses:
|