package amwebhook import ( "context" "encoding/json" "net/http" "strings" "github.com/go-logr/logr" "github.com/prometheus/alertmanager/template" "edge-infra.dev/pkg/lib/logging" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" controllerruntime "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" corev1 "k8s.io/api/core/v1" ) // +kubebuilder:rbac:groups=apps,resources=daemonsets,verbs=get;patch // +kubebuilder:rbac:groups="",resources=pods,verbs=get;delete func AlertWebhook(_ http.ResponseWriter, req *http.Request) { log := logging.NewLogger().WithName("am-webhook") defer req.Body.Close() data := template.Data{} if err := json.NewDecoder(req.Body).Decode(&data); err != nil { log.Error(err, "Alerts: GroupLabels", data.GroupLabels, "CommonLabels", data.CommonLabels) } for _, alert := range data.Alerts { severity := strings.ToUpper(alert.Labels["severity"]) switch severity { case "CRITICAL": if _, ok := alert.Labels["action"]; ok { if err := action(req.Context(), alert, &log); err != nil { log.Error(err, "action executed unsuccessfully") } else { log.Info("action executed successfully") } } default: log.Info("no action on app") } } } func action(ctx context.Context, alert template.Alert, log *logr.Logger) error { // Getting the config to use with the client config, err := controllerruntime.GetConfig() if err != nil { log.Error(err, "could not get kube config") return err } // Creating the client alertClient, err := client.New(config, client.Options{}) if err != nil { log.Error(err, "could not create the client") return err } action := alert.Labels["action"] switch action { case "restart-pod": pod := &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: alert.Labels["pod"], Namespace: alert.Labels["namespace"], }, } if err := alertClient.Delete(ctx, pod); err != nil { log.Error(err, "failed to delete pod") return err } default: log.Info("no action to perform") } return nil }