Skip to content

Commit a32c63b

Browse files
feat(kafka): add client-based topic management and enhance monitoring UI
- Integrate kafka-go client for topic operations (describe, delete, create) with TLS support - Add new API endpoints for recreating enabled topics using client and truncating ClickHouse tables - Enhance K6 handler with module configuration reading and dashboard updates - Update UI with streamlined design, remove dark mode, and add 4-step sync process - Modify configuration files for reduced unique key counts in test data BREAKING CHANGE: NewKafkaHandler now returns an error, requiring error handling in callers
1 parent c9e992b commit a32c63b

File tree

16 files changed

+1385
-934
lines changed

16 files changed

+1385
-934
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ require (
66
github.com/gorilla/mux v1.8.0
77
github.com/gorilla/websocket v1.5.0
88
github.com/rs/cors v1.10.1
9+
github.com/segmentio/kafka-go v0.4.47
910
)
1011

1112
require (
1213
github.com/ClickHouse/clickhouse-go/v2 v2.40.3
1314
github.com/rs/zerolog v1.34.0
1415
go.yaml.in/yaml/v3 v3.0.4
15-
golang.org/x/sync v0.16.0
1616
gopkg.in/yaml.v3 v3.0.1
1717
)
1818

go.sum

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
2929
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
3030
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
3131
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
32+
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
3233
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
3334
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
3435
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
@@ -46,6 +47,7 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJ
4647
github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU=
4748
github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
4849
github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
50+
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
4951
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
5052
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
5153
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -58,21 +60,32 @@ github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
5860
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
5961
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
6062
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
63+
github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0=
64+
github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg=
6165
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
6266
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
6367
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
68+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
6469
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
70+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
71+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
6572
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
6673
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
6774
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
75+
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
6876
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
6977
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
78+
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
79+
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
7080
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
81+
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
82+
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
7183
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
7284
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
7385
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
7486
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
7587
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
88+
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
7689
go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
7790
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
7891
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
@@ -83,40 +96,67 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
8396
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
8497
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
8598
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
99+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
86100
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
101+
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
87102
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
88103
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
104+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
105+
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
89106
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
90107
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
91108
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
92109
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
110+
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
93111
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
112+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
113+
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
114+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
115+
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
116+
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
117+
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
94118
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
95119
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
96120
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
97121
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
98-
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
99-
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
122+
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
123+
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
100124
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
101125
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
102126
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
103127
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
104128
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
105129
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
130+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
131+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
106132
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
133+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
107134
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
135+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
108136
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
137+
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
109138
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
110139
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
111140
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
141+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
142+
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
143+
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
144+
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
112145
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
113146
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
114147
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
115148
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
149+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
150+
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
151+
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
152+
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
153+
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
116154
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
117155
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
118156
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
119157
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
158+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
159+
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
120160
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
121161
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
122162
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
base_urls:
2-
dashboard_api: "https://qa.vunetsystems.com/vui/api/dashboards/uid/"
3-
panel: "https://qa.vunetsystems.com/vui/d/"
4-
2+
dashboard_api: https://qa.vunetsystems.com/vui/api/dashboards/uid/
3+
panel: https://qa.vunetsystems.com/vui/d/
54
dashboards:
6-
- id: "b1ec2dfd-6a8e-456b-869e-1f8df644e614"
7-
name: "MSSQL Overview Dashboard"
8-
slug: "mssql-overview-dashboard"
9-
enabled: true
10-
11-
- id: "b95b768c-bb56-4faf-af9e-2db19d50c149"
12-
name: "Linux Server Insights"
13-
slug: "linux-server-insights"
14-
enabled: false
15-
5+
- id: b1ec2dfd-6a8e-456b-869e-1f8df644e614
6+
name: MSSQL Overview Dashboard
7+
slug: mssql-overview-dashboard
8+
enabled: true
9+
- id: b95b768c-bb56-4faf-af9e-2db19d50c149
10+
name: Linux Server Insights
11+
slug: linux-server-insights
12+
enabled: true

src/clickhouse/clickhouse.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,8 @@ func GetClickHouseHealth() (map[string]interface{}, error) {
166166
func GetMonitoredNodes() []string {
167167
return monitoredNodes
168168
}
169+
170+
// GetClickHouseClient returns the global ClickHouse client
171+
func GetClickHouseClient() *ClickHouseClient {
172+
return clickHouseClient
173+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Module to Dashboard Mapping Configuration
2+
# Maps vuDataSim modules to K6 dashboard configurations
3+
# This file defines which modules correspond to which dashboards in k6_config.yaml
4+
5+
module_dashboard_mapping:
6+
LinuxMonitor:
7+
dashboard_name: "Linux Server Insights"
8+
dashboard_slug: "linux-server-insights"
9+
Mssql:
10+
dashboard_name: "MSSQL Overview Dashboard"
11+
dashboard_slug: "mssql-overview-dashboard"

src/handlers/k6.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"sync"
1010
"time"
1111

12+
"gopkg.in/yaml.v3"
1213
"vuDataSim/src/logger"
1314
)
1415

@@ -33,6 +34,28 @@ type K6Status struct {
3334
LastError string `json:"lastError,omitempty"`
3435
}
3536

37+
// ModuleDashboardMapping represents the mapping between modules and dashboards
38+
type ModuleDashboardMapping struct {
39+
ModuleDashboardMapping map[string]struct {
40+
DashboardName string `yaml:"dashboard_name"`
41+
DashboardSlug string `yaml:"dashboard_slug"`
42+
} `yaml:"module_dashboard_mapping"`
43+
}
44+
45+
// K6DashboardConfig represents the structure of k6_config.yaml
46+
type K6DashboardConfig struct {
47+
BaseURLs struct {
48+
DashboardAPI string `yaml:"dashboard_api"`
49+
Panel string `yaml:"panel"`
50+
} `yaml:"base_urls"`
51+
Dashboards []struct {
52+
ID string `yaml:"id"`
53+
Name string `yaml:"name"`
54+
Slug string `yaml:"slug"`
55+
Enabled bool `yaml:"enabled"`
56+
} `yaml:"dashboards"`
57+
}
58+
3659
// K6Handler manages K6 load testing operations
3760
type K6Handler struct {
3861
config K6Config
@@ -516,6 +539,29 @@ func (h *K6Handler) executeCombinedScript(timeRange string, vus, iterations, int
516539

517540
logger.Info().Str("module", "k6").Msg("Starting combined.sh script execution")
518541

542+
// Step 1: Read module configuration
543+
logger.Info().Str("module", "k6").Msg("Step 1: Reading module configuration")
544+
enabledModules, err := h.readModuleConfig()
545+
if err != nil {
546+
logger.Error().Err(err).Str("module", "k6").Msg("Failed to read module configuration, continuing with test execution")
547+
} else {
548+
logger.Info().Str("module", "k6").Int("enabled_modules", len(enabledModules)).Msg("Module configuration read successfully")
549+
}
550+
551+
// Step 2: Update dashboard configuration based on enabled modules
552+
logger.Info().Str("module", "k6").Msg("Step 2: Updating dashboard configuration")
553+
if enabledModules != nil {
554+
err = h.updateDashboardConfig(enabledModules)
555+
if err != nil {
556+
logger.Error().Err(err).Str("module", "k6").Msg("Failed to update dashboard configuration, continuing with test execution")
557+
} else {
558+
logger.Info().Str("module", "k6").Msg("Dashboard configuration updated successfully")
559+
}
560+
}
561+
562+
// Step 3: Execute the combined.sh script
563+
logger.Info().Str("module", "k6").Msg("Step 3: Executing combined.sh script")
564+
519565
// Execute the script
520566
cmd := exec.Command("./combined.sh", timeRange, fmt.Sprintf("%d", vus), fmt.Sprintf("%d", iterations), fmt.Sprintf("%d", interval))
521567
cmd.Dir = "k6_final/k6_dashboard_name/linux-mssql-dashboard" // Working directory
@@ -542,6 +588,94 @@ func (h *K6Handler) executeCombinedScript(timeRange string, vus, iterations, int
542588
h.mutex.Unlock()
543589
}
544590

591+
// readModuleConfig reads the enabled modules from categories.yaml
592+
func (h *K6Handler) readModuleConfig() ([]string, error) {
593+
configPath := "src/configs/categories.yaml"
594+
data, err := os.ReadFile(configPath)
595+
if err != nil {
596+
return nil, fmt.Errorf("failed to read categories config: %v", err)
597+
}
598+
599+
var categoriesConfig struct {
600+
Categories map[string]struct {
601+
Name string `yaml:"name"`
602+
Description string `yaml:"description"`
603+
Sources []string `yaml:"sources"`
604+
MaxEpsPerNode int `yaml:"max_eps_per_node"`
605+
} `yaml:"categories"`
606+
}
607+
608+
if err := yaml.Unmarshal(data, &categoriesConfig); err != nil {
609+
return nil, fmt.Errorf("failed to parse categories config: %v", err)
610+
}
611+
612+
var enabledModules []string
613+
for _, category := range categoriesConfig.Categories {
614+
enabledModules = append(enabledModules, category.Sources...)
615+
}
616+
617+
return enabledModules, nil
618+
}
619+
620+
// updateDashboardConfig updates k6_config.yaml based on enabled modules
621+
func (h *K6Handler) updateDashboardConfig(enabledModules []string) error {
622+
// Read module-dashboard mapping
623+
mappingPath := "src/configs/module_dashboard_mapping.yaml"
624+
mappingData, err := os.ReadFile(mappingPath)
625+
if err != nil {
626+
return fmt.Errorf("failed to read module dashboard mapping: %v", err)
627+
}
628+
629+
var mappingConfig ModuleDashboardMapping
630+
if err := yaml.Unmarshal(mappingData, &mappingConfig); err != nil {
631+
return fmt.Errorf("failed to parse module dashboard mapping: %v", err)
632+
}
633+
634+
// Read current k6_config.yaml
635+
k6ConfigPath := "k6_final/k6_dashboard_name/k6_config.yaml"
636+
k6Data, err := os.ReadFile(k6ConfigPath)
637+
if err != nil {
638+
return fmt.Errorf("failed to read k6 config: %v", err)
639+
}
640+
641+
var k6Config K6DashboardConfig
642+
if err := yaml.Unmarshal(k6Data, &k6Config); err != nil {
643+
return fmt.Errorf("failed to parse k6 config: %v", err)
644+
}
645+
646+
// Create a set of enabled module names for quick lookup
647+
enabledModuleSet := make(map[string]bool)
648+
for _, module := range enabledModules {
649+
enabledModuleSet[module] = true
650+
}
651+
652+
// Update dashboard enabled status based on module availability
653+
for i := range k6Config.Dashboards {
654+
dashboard := &k6Config.Dashboards[i]
655+
// Check if any module maps to this dashboard
656+
enabled := false
657+
for moduleName, mapping := range mappingConfig.ModuleDashboardMapping {
658+
if mapping.DashboardSlug == dashboard.Slug && enabledModuleSet[moduleName] {
659+
enabled = true
660+
break
661+
}
662+
}
663+
dashboard.Enabled = enabled
664+
}
665+
666+
// Write updated config back to file
667+
updatedData, err := yaml.Marshal(&k6Config)
668+
if err != nil {
669+
return fmt.Errorf("failed to marshal updated k6 config: %v", err)
670+
}
671+
672+
if err := os.WriteFile(k6ConfigPath, updatedData, 0644); err != nil {
673+
return fmt.Errorf("failed to write updated k6 config: %v", err)
674+
}
675+
676+
return nil
677+
}
678+
545679
// GetK6Logs handles GET /api/k6/logs
546680
func (h *K6Handler) GetK6Logs(w http.ResponseWriter, r *http.Request) {
547681
// For now, return a simple message since we don't have persistent log storage

0 commit comments

Comments
 (0)