Skip to content

Commit efc79e2

Browse files
authored
Merge pull request #2 from iaoiui/dev-replica_number
observe replica number #1
2 parents 1ecee07 + f27f3b2 commit efc79e2

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed

app/main.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import (
1212
"strings"
1313
"time"
1414

15+
appsv1 "k8s.io/api/apps/v1"
1516
v1 "k8s.io/api/core/v1"
17+
1618
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1719
"k8s.io/client-go/kubernetes"
1820
"k8s.io/client-go/rest"
@@ -100,6 +102,84 @@ func listPod(clientset *kubernetes.Clientset) {
100102
sendAlertToTeams("Pod Defect Alert", msg, teamsEndpoint)
101103
}
102104

105+
// https://github.com/iaoiui/PodMonitoringTool/issues/1
106+
observeReplicaNumbers(clientset)
107+
108+
}
109+
110+
// observe replica number of deployment and statefulsets
111+
func observeReplicaNumbers(clientset *kubernetes.Clientset) {
112+
// get not ready deployment
113+
notReadyDeployments := getNotReadyDeployments(clientset)
114+
msg := generateAlertMsgForDeployment(notReadyDeployments)
115+
sendAlertToTeams("Deployment Defect Alert", msg, teamsEndpoint)
116+
117+
// get not ready statefulsets
118+
notReadyStatefulsets := getNotReadyStatefulsets(clientset)
119+
msg = generateAlertMsgForStatefulset(notReadyStatefulsets)
120+
sendAlertToTeams("Statefulsets Defect Alert", msg, teamsEndpoint)
121+
}
122+
123+
func getNotReadyStatefulsets(clientset *kubernetes.Clientset) []appsv1.StatefulSet {
124+
statefulsets, err := clientset.AppsV1().StatefulSets(namespace).List(context.TODO(), metav1.ListOptions{})
125+
if err != nil {
126+
panic(err.Error())
127+
}
128+
notReadyStatefulsets := []appsv1.StatefulSet{}
129+
130+
for _, s := range statefulsets.Items {
131+
desiredReplicas := s.Status.Replicas
132+
availableReplicas := s.Status.ReadyReplicas
133+
if desiredReplicas != availableReplicas {
134+
notReadyStatefulsets = append(notReadyStatefulsets, s)
135+
}
136+
137+
}
138+
139+
return notReadyStatefulsets
140+
}
141+
142+
func getNotReadyDeployments(clientset *kubernetes.Clientset) []appsv1.Deployment {
143+
deployments, err := clientset.AppsV1().Deployments(namespace).List(context.TODO(), metav1.ListOptions{})
144+
if err != nil {
145+
panic(err.Error())
146+
}
147+
notReadyDeployments := []appsv1.Deployment{}
148+
149+
for _, d := range deployments.Items {
150+
desiredReplicas := d.Status.Replicas
151+
availableReplicas := d.Status.AvailableReplicas
152+
if desiredReplicas != availableReplicas {
153+
notReadyDeployments = append(notReadyDeployments, d)
154+
}
155+
156+
}
157+
158+
return notReadyDeployments
159+
}
160+
161+
func generateAlertMsgForStatefulset(statefulsets []appsv1.StatefulSet) string {
162+
msg := ""
163+
log.Printf("%v statefulsets is not ready \n", len(statefulsets))
164+
msg += fmt.Sprintf("# **%v statefulset is not ready** \n", len(statefulsets)) + "\n"
165+
for i, sts := range statefulsets {
166+
log.Println(i + 1)
167+
log.Println("\t", sts.Name, "\t")
168+
msg += fmt.Sprintln("\t Namespace: \t", sts.Namespace, "StatefulSet: \t", sts.Name, ", availableReplicas: \t", sts.Status.ReadyReplicas, ", desiredReplicas: \t", sts.Status.Replicas) + "\n"
169+
}
170+
return msg
171+
}
172+
173+
func generateAlertMsgForDeployment(deployments []appsv1.Deployment) string {
174+
msg := ""
175+
log.Printf("%v deployments is not ready \n", len(deployments))
176+
msg += fmt.Sprintf("# **%v deployment is not ready** \n", len(deployments)) + "\n"
177+
for i, deploy := range deployments {
178+
log.Println(i + 1)
179+
log.Println("\t", deploy.Name, "\t")
180+
msg += fmt.Sprintln("\t Namespace: \t", deploy.Namespace, "Deployment: \t", deploy.Name, ", availableReplicas: \t", deploy.Status.AvailableReplicas, ", desiredReplicas: \t", deploy.Status.Replicas) + "\n"
181+
}
182+
return msg
103183
}
104184

105185
func generateAlertMsg(pods []v1.Pod) string {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
apiVersion: apps/v1
2+
kind: StatefulSet
3+
metadata:
4+
name: stateful
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: stateful
10+
serviceName: stateful
11+
template:
12+
metadata:
13+
labels:
14+
app: stateful
15+
spec:
16+
containers:
17+
- image: busybox
18+
name: stateful
19+
command: ["sh", "-c"]
20+
args:
21+
- |
22+
touch /data/hostname
23+
while true; do
24+
echo "`date`: `hostname`" >> /data/hostname
25+
sleep 1
26+
done
27+
touch /data/ready
28+
volumeMounts:
29+
- name: data
30+
mountPath: /data
31+
readinessProbe:
32+
exec:
33+
command:
34+
- cat
35+
- /data/ready
36+
initialDelaySeconds: 5
37+
periodSeconds: 5
38+
volumeClaimTemplates:
39+
- metadata:
40+
name: data
41+
spec:
42+
accessModes: ["ReadWriteOnce"]
43+
resources:
44+
requests:
45+
storage: 10Mi

0 commit comments

Comments
 (0)