Skip to content

Commit 6d67df7

Browse files
Merge pull request #2 from AdminTurnedDevOps/feat/scan-data
feat: Mock data removed and real queries to Envoy
2 parents f5c3f72 + 54a05a6 commit 6d67df7

File tree

7 files changed

+697
-64
lines changed

7 files changed

+697
-64
lines changed

cmd/monitor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func performMonitoring(ctx context.Context) error {
6161
}
6262

6363
// Initialize service discovery
64-
serviceDiscovery := istio.NewServiceDiscovery(k8sClient.Clientset)
64+
serviceDiscovery := istio.NewServiceDiscovery(k8sClient.Clientset, k8sClient.RestConfig)
6565

6666
// Initialize output formatter
6767
formatter := output.NewFormatter(outputFormat)

cmd/scan.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"log"
7+
"strings"
78
"time"
89

910
"smanalyzer/pkg/anomaly"
@@ -69,9 +70,14 @@ func performScan(ctx context.Context) error {
6970
}
7071

7172
fmt.Println("✓ Connected to Kubernetes cluster")
73+
fmt.Println("Initializing Envoy metrics collection...")
74+
75+
discovery := istio.NewServiceDiscovery(k8sClient.Clientset, k8sClient.RestConfig)
76+
config := config.DefaultConfig()
77+
78+
fmt.Println("✓ Ready to collect metrics from Envoy sidecars")
7279
fmt.Println("Discovering Services in Mesh...")
7380

74-
discovery := istio.NewServiceDiscovery(k8sClient.Clientset)
7581
services, err := discovery.DiscoverServices(ctx, namespace)
7682
if err != nil {
7783
return fmt.Errorf("failed to discover services: %w", err)
@@ -80,7 +86,6 @@ func performScan(ctx context.Context) error {
8086
fmt.Printf("✓ Found %d services with Istio sidecars\n", len(services))
8187

8288
storage := timeseries.NewStorage()
83-
config := config.DefaultConfig()
8489
mlConfig := config.ToMLConfig()
8590
detectionConfig := config.ToAnomalyDetectionConfig()
8691

@@ -92,16 +97,32 @@ func performScan(ctx context.Context) error {
9297

9398
var allAnomalies []anomaly.Anomaly
9499

95-
for _, serviceName := range services {
96-
metrics, err := discovery.CollectMetrics(ctx, namespace, serviceName)
100+
for _, serviceKey := range services {
101+
// Parse service.namespace format
102+
parts := strings.Split(serviceKey, ".")
103+
if len(parts) != 2 {
104+
fmt.Printf("Warning: invalid service key format: %s\n", serviceKey)
105+
continue
106+
}
107+
serviceName := parts[0]
108+
serviceNamespace := parts[1]
109+
110+
fmt.Printf("Debug: Collecting metrics for service %s in namespace %s\n", serviceName, serviceNamespace)
111+
metrics, err := discovery.CollectMetrics(ctx, serviceNamespace, serviceName)
97112
if err != nil {
98113
fmt.Printf("Warning: failed to collect metrics for %s: %v\n", serviceName, err)
99114
continue
100115
}
101116

102-
storage.Store(serviceName, "request_count", float64(metrics.RequestCount), metrics.Labels)
103-
storage.Store(serviceName, "error_rate", metrics.ErrorRate, metrics.Labels)
104-
storage.Store(serviceName, "response_time", float64(metrics.ResponseTime.Milliseconds()), metrics.Labels)
117+
// Store Istio's Four Golden Signals
118+
storage.Store(serviceName, "traffic_rps", metrics.Traffic.RequestsPerSecond, metrics.Labels)
119+
storage.Store(serviceName, "latency_p99", float64(metrics.Latency.P99.Milliseconds()), metrics.Labels)
120+
storage.Store(serviceName, "error_rate", metrics.Errors.ErrorRate, metrics.Labels)
121+
storage.Store(serviceName, "saturation_cpu", metrics.Saturation.CPUUsage, metrics.Labels)
122+
123+
// Legacy compatibility
124+
storage.Store(serviceName, "request_count", float64(metrics.Traffic.TotalRequests), metrics.Labels)
125+
storage.Store(serviceName, "response_time", float64(metrics.Latency.Mean.Milliseconds()), metrics.Labels)
105126

106127
recentPoints := storage.GetLatestN(serviceName, "request_count", 50)
107128

go.mod

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,21 @@ require (
2323
github.com/google/gnostic-models v0.6.9 // indirect
2424
github.com/google/go-cmp v0.7.0 // indirect
2525
github.com/google/uuid v1.6.0 // indirect
26+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
2627
github.com/inconshreveable/mousetrap v1.1.0 // indirect
2728
github.com/josharian/intern v1.0.0 // indirect
2829
github.com/json-iterator/go v1.1.12 // indirect
2930
github.com/mailru/easyjson v0.7.7 // indirect
31+
github.com/moby/spdystream v0.5.0 // indirect
3032
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3133
github.com/modern-go/reflect2 v1.0.2 // indirect
3234
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
35+
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
3336
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
3437
github.com/pkg/errors v0.9.1 // indirect
38+
github.com/prometheus/client_golang v1.23.0 // indirect
39+
github.com/prometheus/client_model v0.6.2 // indirect
40+
github.com/prometheus/common v0.65.0 // indirect
3541
github.com/sagikazarmark/locafero v0.7.0 // indirect
3642
github.com/sourcegraph/conc v0.3.0 // indirect
3743
github.com/spf13/afero v1.12.0 // indirect
@@ -41,11 +47,11 @@ require (
4147
github.com/x448/float16 v0.8.4 // indirect
4248
go.uber.org/atomic v1.9.0 // indirect
4349
go.uber.org/multierr v1.9.0 // indirect
44-
golang.org/x/net v0.38.0 // indirect
45-
golang.org/x/oauth2 v0.27.0 // indirect
46-
golang.org/x/sys v0.31.0 // indirect
47-
golang.org/x/term v0.30.0 // indirect
48-
golang.org/x/text v0.23.0 // indirect
50+
golang.org/x/net v0.40.0 // indirect
51+
golang.org/x/oauth2 v0.30.0 // indirect
52+
golang.org/x/sys v0.33.0 // indirect
53+
golang.org/x/term v0.32.0 // indirect
54+
golang.org/x/text v0.25.0 // indirect
4955
golang.org/x/time v0.9.0 // indirect
5056
google.golang.org/protobuf v1.36.6 // indirect
5157
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect

go.sum

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgY
3838
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
3939
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
4040
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
41+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
42+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
4143
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
4244
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
4345
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -55,13 +57,17 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
5557
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
5658
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
5759
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
60+
github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU=
61+
github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
5862
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
5963
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
6064
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
6165
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
6266
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
6367
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
6468
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
69+
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
70+
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
6571
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
6672
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
6773
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
@@ -72,6 +78,12 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
7278
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
7379
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
7480
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
81+
github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
82+
github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
83+
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
84+
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
85+
github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
86+
github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
7587
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
7688
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
7789
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -121,8 +133,12 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
121133
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
122134
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
123135
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
136+
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
137+
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
124138
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
125139
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
140+
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
141+
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
126142
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
127143
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
128144
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -131,12 +147,18 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
131147
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
132148
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
133149
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
150+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
151+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
134152
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
135153
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
154+
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
155+
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
136156
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
137157
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
138158
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
139159
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
160+
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
161+
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
140162
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
141163
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
142164
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

0 commit comments

Comments
 (0)