Skip to content

Commit 1d34fa0

Browse files
authored
Merge pull request #55 from ddosify/develop
Develop
2 parents fc8e607 + 4d3e0b1 commit 1d34fa0

File tree

4 files changed

+95
-2
lines changed

4 files changed

+95
-2
lines changed

datastore/backend.go

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"os"
1212
"sort"
1313
"strconv"
14+
"strings"
1415
"time"
1516

1617
"github.com/ddosify/alaz/config"
@@ -36,6 +37,8 @@ var NodeID string
3637

3738
// set from ldflags
3839
var tag string
40+
var kernelVersion string
41+
var cloudProvider CloudProvider
3942

4043
func init() {
4144
MonitoringID = os.Getenv("MONITORING_ID")
@@ -52,6 +55,67 @@ func init() {
5255
log.Logger.Fatal().Msg("tag is not set")
5356
}
5457
log.Logger.Info().Str("tag", tag).Msg("alaz tag")
58+
59+
kernelVersion = extractKernelVersion()
60+
cloudProvider = getCloudProvider()
61+
}
62+
63+
func extractKernelVersion() string {
64+
// Path to the /proc/version file
65+
filePath := "/proc/version"
66+
file, err := os.Open(filePath)
67+
if err != nil {
68+
log.Logger.Fatal().AnErr("error", err).Msgf("Unable to open file %s", filePath)
69+
}
70+
71+
// Read the content of the file
72+
content, err := io.ReadAll(file)
73+
if err != nil {
74+
log.Logger.Fatal().AnErr("error", err).Msgf("Unable to read file %s", filePath)
75+
}
76+
77+
// Convert the content to a string
78+
versionInfo := string(content)
79+
80+
// Split the versionInfo string into lines
81+
lines := strings.Split(versionInfo, "\n")
82+
83+
// Extract the kernel version from the first line
84+
// Assuming the kernel version is the first word in the first line
85+
if len(lines) > 0 {
86+
fields := strings.Fields(lines[0])
87+
if len(fields) > 2 {
88+
return fields[2]
89+
}
90+
}
91+
92+
return "Unable to extract kernel version"
93+
}
94+
95+
type CloudProvider string
96+
97+
const (
98+
CloudProviderAWS CloudProvider = "AWS"
99+
CloudProviderGCP CloudProvider = "GCP"
100+
CloudProviderAzure CloudProvider = "Azure"
101+
CloudProviderDigitalOcean CloudProvider = "DigitalOcean"
102+
CloudProviderUnknown CloudProvider = ""
103+
)
104+
105+
func getCloudProvider() CloudProvider {
106+
if vendor, err := os.ReadFile("/sys/class/dmi/id/board_vendor"); err == nil {
107+
switch strings.TrimSpace(string(vendor)) {
108+
case "Amazon EC2":
109+
return CloudProviderAWS
110+
case "Google":
111+
return CloudProviderGCP
112+
case "Microsoft Corporation":
113+
return CloudProviderAzure
114+
case "DigitalOcean":
115+
return CloudProviderDigitalOcean
116+
}
117+
}
118+
return CloudProviderUnknown
55119
}
56120

57121
var resourceBatchSize int64 = 50
@@ -527,7 +591,7 @@ func (b *BackendDS) PersistContainer(c Container, eventType string) error {
527591
return nil
528592
}
529593

530-
func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool) {
594+
func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool, k8sVersion string) {
531595
t := time.NewTicker(10 * time.Second)
532596
defer t.Stop()
533597

@@ -546,6 +610,15 @@ func (b *BackendDS) SendHealthCheck(ebpf bool, metrics bool) {
546610
EbpfEnabled: ebpf,
547611
MetricsEnabled: metrics,
548612
},
613+
Telemetry: struct {
614+
KernelVersion string `json:"kernel_version"`
615+
K8sVersion string `json:"k8s_version"`
616+
CloudProvider string `json:"cloud_provider"`
617+
}{
618+
KernelVersion: kernelVersion,
619+
K8sVersion: k8sVersion,
620+
CloudProvider: string(cloudProvider),
621+
},
549622
}
550623
}
551624

datastore/payload.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ type HealthCheckPayload struct {
1313
EbpfEnabled bool `json:"ebpf"`
1414
MetricsEnabled bool `json:"metrics"`
1515
} `json:"alaz_info"`
16+
Telemetry struct {
17+
KernelVersion string `json:"kernel_version"`
18+
K8sVersion string `json:"k8s_version"`
19+
CloudProvider string `json:"cloud_provider"`
20+
} `json:"telemetry"`
1621
}
1722

1823
type EventPayload struct {

k8s/informer.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ const (
4141
DELETE = "Delete"
4242
)
4343

44+
var k8sVersion string
45+
4446
type K8sCollector struct {
4547
ctx context.Context
4648
informersFactory informers.SharedInformerFactory
@@ -178,6 +180,13 @@ func NewK8sCollector(parentCtx context.Context) (*K8sCollector, error) {
178180
return nil, fmt.Errorf("unable to create clientset: %w", err)
179181
}
180182

183+
version, err := clientset.ServerVersion()
184+
if err != nil {
185+
return nil, fmt.Errorf("unable to get k8s server version: %w", err)
186+
}
187+
188+
k8sVersion = version.String()
189+
181190
factory := informers.NewSharedInformerFactory(clientset, 0)
182191

183192
collector := &K8sCollector{
@@ -196,6 +205,10 @@ func NewK8sCollector(parentCtx context.Context) (*K8sCollector, error) {
196205
return collector, nil
197206
}
198207

208+
func (k *K8sCollector) GetK8sVersion() string {
209+
return k8sVersion
210+
}
211+
199212
func (k *K8sCollector) close() {
200213
log.Logger.Info().Msg("k8sCollector closing...")
201214
close(k.stopper) // stop informers

main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ func main() {
3535

3636
var k8sCollector *k8s.K8sCollector
3737
kubeEvents := make(chan interface{}, 1000)
38+
var k8sVersion string
3839
if os.Getenv("K8S_COLLECTOR_ENABLED") != "false" {
3940
// k8s collector
4041
var err error
4142
k8sCollector, err = k8s.NewK8sCollector(ctx)
4243
if err != nil {
4344
panic(err)
4445
}
46+
k8sVersion = k8sCollector.GetK8sVersion()
4547
go k8sCollector.Init(kubeEvents)
4648
}
4749

@@ -55,7 +57,7 @@ func main() {
5557
MetricsExport: metricsEnabled,
5658
MetricsExportInterval: 10,
5759
})
58-
go dsBackend.SendHealthCheck(ebpfEnabled, metricsEnabled)
60+
go dsBackend.SendHealthCheck(ebpfEnabled, metricsEnabled, k8sVersion)
5961

6062
// deploy ebpf programs
6163
var ec *ebpf.EbpfCollector

0 commit comments

Comments
 (0)