From 758daf5f947f8c5d66baafce4110019004136c47 Mon Sep 17 00:00:00 2001 From: kenanfarukcakir Date: Mon, 4 Dec 2023 14:39:24 +0000 Subject: [PATCH 1/2] get cloudProvider and kernel, k8s versions --- datastore/backend.go | 71 +++++++++++++++++++++++++++++++++++++++++++- k8s/informer.go | 13 ++++++++ main.go | 4 ++- 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/datastore/backend.go b/datastore/backend.go index 9f78629..370af77 100644 --- a/datastore/backend.go +++ b/datastore/backend.go @@ -11,6 +11,7 @@ import ( "os" "sort" "strconv" + "strings" "time" "github.com/ddosify/alaz/config" @@ -36,6 +37,8 @@ var NodeID string // set from ldflags var tag string +var kernelVersion string +var cloudProvider CloudProvider func init() { MonitoringID = os.Getenv("MONITORING_ID") @@ -52,6 +55,67 @@ func init() { log.Logger.Fatal().Msg("tag is not set") } log.Logger.Info().Str("tag", tag).Msg("alaz tag") + + kernelVersion = extractKernelVersion() + cloudProvider = getCloudProvider() +} + +func extractKernelVersion() string { + // Path to the /proc/version file + filePath := "/proc/version" + file, err := os.Open(filePath) + if err != nil { + log.Logger.Fatal().AnErr("error", err).Msgf("Unable to open file %s", filePath) + } + + // Read the content of the file + content, err := io.ReadAll(file) + if err != nil { + log.Logger.Fatal().AnErr("error", err).Msgf("Unable to read file %s", filePath) + } + + // Convert the content to a string + versionInfo := string(content) + + // Split the versionInfo string into lines + lines := strings.Split(versionInfo, "\n") + + // Extract the kernel version from the first line + // Assuming the kernel version is the first word in the first line + if len(lines) > 0 { + fields := strings.Fields(lines[0]) + if len(fields) > 2 { + return fields[2] + } + } + + return "Unable to extract kernel version" +} + +type CloudProvider string + +const ( + CloudProviderAWS CloudProvider = "AWS" + CloudProviderGCP CloudProvider = "GCP" + CloudProviderAzure CloudProvider = "Azure" + CloudProviderDigitalOcean CloudProvider = "DigitalOcean" + CloudProviderUnknown CloudProvider = "" +) + +func getCloudProvider() CloudProvider { + if vendor, err := os.ReadFile("/sys/class/dmi/id/board_vendor"); err == nil { + switch strings.TrimSpace(string(vendor)) { + case "Amazon EC2": + return CloudProviderAWS + case "Google": + return CloudProviderGCP + case "Microsoft Corporation": + return CloudProviderAzure + case "DigitalOcean": + return CloudProviderDigitalOcean + } + } + return CloudProviderUnknown } var resourceBatchSize int64 = 50 @@ -527,10 +591,15 @@ func (b *BackendDS) PersistContainer(c Container, eventType string) error { return nil } -func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool) { +func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool, k8sVersion string) { t := time.NewTicker(10 * time.Second) defer t.Stop() + // TODO: add new fields to health check payload + // kernelVersion + // k8sVersion + // cloudProvider + createHealthCheckPayload := func() HealthCheckPayload { return HealthCheckPayload{ Metadata: Metadata{ diff --git a/k8s/informer.go b/k8s/informer.go index 496f4d5..2983781 100644 --- a/k8s/informer.go +++ b/k8s/informer.go @@ -41,6 +41,8 @@ const ( DELETE = "Delete" ) +var k8sVersion string + type K8sCollector struct { ctx context.Context informersFactory informers.SharedInformerFactory @@ -178,6 +180,13 @@ func NewK8sCollector(parentCtx context.Context) (*K8sCollector, error) { return nil, fmt.Errorf("unable to create clientset: %w", err) } + version, err := clientset.ServerVersion() + if err != nil { + return nil, fmt.Errorf("unable to get k8s server version: %w", err) + } + + k8sVersion = version.String() + factory := informers.NewSharedInformerFactory(clientset, 0) collector := &K8sCollector{ @@ -196,6 +205,10 @@ func NewK8sCollector(parentCtx context.Context) (*K8sCollector, error) { return collector, nil } +func (k *K8sCollector) GetK8sVersion() string { + return k8sVersion +} + func (k *K8sCollector) close() { log.Logger.Info().Msg("k8sCollector closing...") close(k.stopper) // stop informers diff --git a/main.go b/main.go index 960d6a1..9ab5b4e 100644 --- a/main.go +++ b/main.go @@ -35,6 +35,7 @@ func main() { var k8sCollector *k8s.K8sCollector kubeEvents := make(chan interface{}, 1000) + var k8sVersion string if os.Getenv("K8S_COLLECTOR_ENABLED") != "false" { // k8s collector var err error @@ -42,6 +43,7 @@ func main() { if err != nil { panic(err) } + k8sVersion = k8sCollector.GetK8sVersion() go k8sCollector.Init(kubeEvents) } @@ -55,7 +57,7 @@ func main() { MetricsExport: metricsEnabled, MetricsExportInterval: 10, }) - go dsBackend.SendHealthCheck(ebpfEnabled, metricsEnabled) + go dsBackend.SendHealthCheck(ebpfEnabled, metricsEnabled, k8sVersion) // deploy ebpf programs var ec *ebpf.EbpfCollector From 07c9758ae34ddf9123f3662ca7dcd361c4c97caf Mon Sep 17 00:00:00 2001 From: kenanfarukcakir Date: Tue, 5 Dec 2023 12:18:10 +0000 Subject: [PATCH 2/2] add fields on healtcheck --- datastore/backend.go | 14 +++++++++----- datastore/payload.go | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/datastore/backend.go b/datastore/backend.go index 370af77..55b9b74 100644 --- a/datastore/backend.go +++ b/datastore/backend.go @@ -595,11 +595,6 @@ func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool, k8sVersion string) t := time.NewTicker(10 * time.Second) defer t.Stop() - // TODO: add new fields to health check payload - // kernelVersion - // k8sVersion - // cloudProvider - createHealthCheckPayload := func() HealthCheckPayload { return HealthCheckPayload{ Metadata: Metadata{ @@ -615,6 +610,15 @@ func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool, k8sVersion string) EbpfEnabled: ebpf, MetricsEnabled: metrics, }, + Telemetry: struct { + KernelVersion string `json:"kernel_version"` + K8sVersion string `json:"k8s_version"` + CloudProvider string `json:"cloud_provider"` + }{ + KernelVersion: kernelVersion, + K8sVersion: k8sVersion, + CloudProvider: string(cloudProvider), + }, } } diff --git a/datastore/payload.go b/datastore/payload.go index c06e70a..722783d 100644 --- a/datastore/payload.go +++ b/datastore/payload.go @@ -13,6 +13,11 @@ type HealthCheckPayload struct { EbpfEnabled bool `json:"ebpf"` MetricsEnabled bool `json:"metrics"` } `json:"alaz_info"` + Telemetry struct { + KernelVersion string `json:"kernel_version"` + K8sVersion string `json:"k8s_version"` + CloudProvider string `json:"cloud_provider"` + } `json:"telemetry"` } type EventPayload struct {