@@ -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
105185func generateAlertMsg (pods []v1.Pod ) string {
0 commit comments