pkg/source/gcp/task/gke/k8s_event/parser.go (60 lines of code) (raw):
// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package k8s_event
import (
"context"
"fmt"
"strings"
"github.com/GoogleCloudPlatform/khi/pkg/log"
"github.com/GoogleCloudPlatform/khi/pkg/model/enum"
"github.com/GoogleCloudPlatform/khi/pkg/model/history"
"github.com/GoogleCloudPlatform/khi/pkg/model/history/grouper"
"github.com/GoogleCloudPlatform/khi/pkg/model/history/resourcepath"
"github.com/GoogleCloudPlatform/khi/pkg/parser"
"github.com/GoogleCloudPlatform/khi/pkg/source/gcp/inspectiontype"
k8s_event_taskid "github.com/GoogleCloudPlatform/khi/pkg/source/gcp/task/gke/k8s_event/taskid"
"github.com/GoogleCloudPlatform/khi/pkg/task/taskid"
)
var GKEK8sEventLogParseJob = parser.NewParserTaskFromParser(k8s_event_taskid.GKEK8sEventLogParserTaskID, &k8sEventParser{}, true, inspectiontype.GCPK8sClusterInspectionTypes)
type k8sEventParser struct {
}
// TargetLogType implements parser.Parser.
func (k *k8sEventParser) TargetLogType() enum.LogType {
return enum.LogTypeEvent
}
// Description implements parser.Parser.
func (*k8sEventParser) Description() string {
return `Gather kubernetes event logs and visualize these on the associated resource timeline.`
}
// GetParserName implements parser.Parser.
func (*k8sEventParser) GetParserName() string {
return `Kubernetes Event Logs`
}
func (*k8sEventParser) Dependencies() []taskid.UntypedTaskReference {
return []taskid.UntypedTaskReference{}
}
func (*k8sEventParser) LogTask() taskid.TaskReference[[]*log.LogEntity] {
return k8s_event_taskid.GKEK8sEventLogQueryTaskID.Ref()
}
func (*k8sEventParser) Grouper() grouper.LogGrouper {
return grouper.AllDependentLogGrouper
}
// Parse implements parser.Parser.
func (*k8sEventParser) Parse(ctx context.Context, l *log.LogEntity, cs *history.ChangeSet, builder *history.Builder) error {
if kind, err := l.GetString("jsonPayload.kind"); err != nil {
// Event exporter ingests cluster scoped logs without jsonPayload
if textPayload, err := l.GetString("textPayload"); err == nil {
clusterName := l.GetStringOrDefault("resource.labels.cluster_name", "Unknown")
cs.RecordEvent(resourcepath.Cluster(clusterName))
cs.RecordLogSummary(textPayload)
return nil
}
return err
} else if kind != "Event" {
return fmt.Errorf("skipping kind:%s", kind)
}
apiVersion := l.GetStringOrDefault("jsonPayload.involvedObject.apiVersion", "v1")
kind := l.GetStringOrDefault("jsonPayload.involvedObject.kind", "Unknown")
name := l.GetStringOrDefault("jsonPayload.involvedObject.name", "Unknown")
namespace := l.GetStringOrDefault("jsonPayload.involvedObject.namespace", "cluster-scope")
if !strings.Contains(apiVersion, "/") {
apiVersion = "core/" + apiVersion
}
cs.RecordEvent(resourcepath.NameLayerGeneralItem(apiVersion, strings.ToLower(kind), namespace, name))
cs.RecordLogSummary(fmt.Sprintf("【%s】%s", l.GetStringOrDefault("jsonPayload.reason", "Unknown"), l.GetStringOrDefault("jsonPayload.message", "")))
return nil
}
var _ parser.Parser = (*k8sEventParser)(nil)