mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-09-17 15:21:54 +00:00
new render endpoint to render the graph in real time
This commit is contained in:
@@ -8,6 +8,7 @@ require (
|
|||||||
github.com/getkin/kin-openapi v0.76.0
|
github.com/getkin/kin-openapi v0.76.0
|
||||||
github.com/gin-contrib/static v0.0.1
|
github.com/gin-contrib/static v0.0.1
|
||||||
github.com/gin-gonic/gin v1.7.7
|
github.com/gin-gonic/gin v1.7.7
|
||||||
|
github.com/go-echarts/go-echarts/v2 v2.2.4
|
||||||
github.com/go-playground/locales v0.13.0
|
github.com/go-playground/locales v0.13.0
|
||||||
github.com/go-playground/universal-translator v0.17.0
|
github.com/go-playground/universal-translator v0.17.0
|
||||||
github.com/go-playground/validator/v10 v10.5.0
|
github.com/go-playground/validator/v10 v10.5.0
|
||||||
|
@@ -129,6 +129,8 @@ github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs=
|
|||||||
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
|
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
|
||||||
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||||
|
github.com/go-echarts/go-echarts/v2 v2.2.4 h1:SKJpdyNIyD65XjbUZjzg6SwccTNXEgmh+PlaO23g2H0=
|
||||||
|
github.com/go-echarts/go-echarts/v2 v2.2.4/go.mod h1:6TOomEztzGDVDkOSCFBq3ed7xOYfbOqhaBzD0YV771A=
|
||||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||||
github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
@@ -441,6 +443,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
|
|||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
|
github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
@@ -5,9 +5,88 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/go-echarts/go-echarts/v2/charts"
|
||||||
|
"github.com/go-echarts/go-echarts/v2/components"
|
||||||
|
"github.com/go-echarts/go-echarts/v2/opts"
|
||||||
"github.com/up9inc/mizu/shared"
|
"github.com/up9inc/mizu/shared"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func calcNodeSize(value float32) float32 {
|
||||||
|
//TODO: Linear interpolation
|
||||||
|
if value < 1 {
|
||||||
|
value = 1
|
||||||
|
}
|
||||||
|
if value > 300 {
|
||||||
|
value = 300
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildGraph() *components.Page {
|
||||||
|
page := components.NewPage()
|
||||||
|
page.SetLayout(components.PageFlexLayout)
|
||||||
|
page.PageTitle = "Mizu Service Map"
|
||||||
|
|
||||||
|
graph := charts.NewGraph()
|
||||||
|
graph.SetGlobalOptions(
|
||||||
|
charts.WithInitializationOpts(opts.Initialization{
|
||||||
|
PageTitle: "MIZU",
|
||||||
|
Width: "1800px",
|
||||||
|
Height: "1000px",
|
||||||
|
//Theme: types.ThemeInfographic,
|
||||||
|
}),
|
||||||
|
charts.WithTitleOpts(opts.Title{
|
||||||
|
Title: "Service Map Graph",
|
||||||
|
}))
|
||||||
|
|
||||||
|
// TODO: Sort nodes by name
|
||||||
|
// TODO: Add protocol color
|
||||||
|
|
||||||
|
var graphNodes []opts.GraphNode
|
||||||
|
for _, n := range api.GetServiceMapInstance().GetNodes() {
|
||||||
|
graphNodes = append(graphNodes, opts.GraphNode{
|
||||||
|
Name: n.Name,
|
||||||
|
Value: float32(n.Count),
|
||||||
|
Fixed: true,
|
||||||
|
SymbolSize: calcNodeSize(float32(n.Count)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var graphEdges []opts.GraphLink
|
||||||
|
for _, e := range api.GetServiceMapInstance().GetEdges() {
|
||||||
|
graphEdges = append(graphEdges, opts.GraphLink{
|
||||||
|
Source: e.Source,
|
||||||
|
Target: e.Destination,
|
||||||
|
Value: float32(e.Count),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.AddSeries("graph", graphNodes, graphEdges).
|
||||||
|
SetSeriesOptions(
|
||||||
|
charts.WithGraphChartOpts(opts.GraphChart{
|
||||||
|
Layout: "circular",
|
||||||
|
Force: &opts.GraphForce{Repulsion: 8000},
|
||||||
|
Roam: true,
|
||||||
|
FocusNodeAdjacency: true,
|
||||||
|
}),
|
||||||
|
charts.WithEmphasisOpts(opts.Emphasis{
|
||||||
|
Label: &opts.Label{
|
||||||
|
Show: true,
|
||||||
|
Color: "red",
|
||||||
|
Position: "top",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
charts.WithLineStyleOpts(opts.LineStyle{
|
||||||
|
Curveness: 0.3,
|
||||||
|
Width: 2,
|
||||||
|
Type: "dotted",
|
||||||
|
}),
|
||||||
|
charts.WithLabelOpts(opts.Label{Show: true, Position: "top"}),
|
||||||
|
)
|
||||||
|
|
||||||
|
return page.AddCharts(graph)
|
||||||
|
}
|
||||||
|
|
||||||
type ServiceMapController struct{}
|
type ServiceMapController struct{}
|
||||||
|
|
||||||
func NewServiceMapController() *ServiceMapController {
|
func NewServiceMapController() *ServiceMapController {
|
||||||
@@ -34,6 +113,21 @@ func (s *ServiceMapController) Get(c *gin.Context) {
|
|||||||
c.JSON(http.StatusOK, response)
|
c.JSON(http.StatusOK, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ServiceMapController) Render(c *gin.Context) {
|
||||||
|
w := c.Writer
|
||||||
|
header := w.Header()
|
||||||
|
header.Set("Content-Type", "text/html")
|
||||||
|
|
||||||
|
err := buildGraph().Render(w)
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
} else {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.(http.Flusher).Flush()
|
||||||
|
}
|
||||||
|
|
||||||
func (s *ServiceMapController) Reset(c *gin.Context) {
|
func (s *ServiceMapController) Reset(c *gin.Context) {
|
||||||
serviceMap := api.GetServiceMapInstance()
|
serviceMap := api.GetServiceMapInstance()
|
||||||
serviceMap.Reset()
|
serviceMap.Reset()
|
||||||
|
@@ -13,5 +13,6 @@ func ServiceMapRoutes(ginApp *gin.Engine) {
|
|||||||
|
|
||||||
routeGroup.GET("/status", controller.Status)
|
routeGroup.GET("/status", controller.Status)
|
||||||
routeGroup.GET("/get", controller.Get)
|
routeGroup.GET("/get", controller.Get)
|
||||||
|
routeGroup.GET("/render", controller.Render)
|
||||||
routeGroup.GET("/reset", controller.Reset)
|
routeGroup.GET("/reset", controller.Reset)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user