From f873cf317fd7ff511702c35aa012b293ec7e4b38 Mon Sep 17 00:00:00 2001 From: AlexsJones Date: Wed, 22 Mar 2023 15:13:34 +0000 Subject: [PATCH] reads the event stream to correlate against OOMKill events Signed-off-by: AlexsJones --- pkg/analyzer/analyzer.go | 14 ++++++++++++++ pkg/analyzer/events.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 pkg/analyzer/events.go diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index 1e504a5..5610a24 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -47,6 +47,18 @@ func RunAnalysis(ctx context.Context, client *kubernetes.Client, aiClient *ai.Cl failureDetails = append(failureDetails, containerStatus.State.Waiting.Message) brokenPods[fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)] = failureDetails } + // This represents a container that is still being created or blocked due to conditions such as OOMKilled + if containerStatus.State.Waiting.Reason == "ContainerCreating" && pod.Status.Phase == "Pending" { + + // parse the event log and append details + evt, err := FetchLatestPodEvent(ctx, client, &pod) + if err != nil { + continue + } + + failureDetails = append(failureDetails, evt.Message) + brokenPods[fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)] = failureDetails + } } } @@ -97,6 +109,8 @@ func RunAnalysis(ctx context.Context, client *kubernetes.Client, aiClient *ai.Cl return err } } + + color.Green(response) } } diff --git a/pkg/analyzer/events.go b/pkg/analyzer/events.go new file mode 100644 index 0000000..ec93074 --- /dev/null +++ b/pkg/analyzer/events.go @@ -0,0 +1,33 @@ +package analyzer + +import ( + "context" + + "github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func FetchLatestPodEvent(ctx context.Context, kubernetesClient *kubernetes.Client, pod *v1.Pod) (*v1.Event, error) { + + // get the list of events + events, err := kubernetesClient.GetClient().CoreV1().Events(pod.Namespace).List(ctx, + metav1.ListOptions{ + FieldSelector: "involvedObject.name=" + pod.Name, + }) + + if err != nil { + return nil, err + } + // find most recent event + var latestEvent *v1.Event + for _, event := range events.Items { + if latestEvent == nil { + latestEvent = &event + } + if event.LastTimestamp.After(latestEvent.LastTimestamp.Time) { + latestEvent = &event + } + } + return latestEvent, nil +}