From a896ada8d6b493280edb74af5dda4741bcb2e82b Mon Sep 17 00:00:00 2001 From: Pei Hsuan Tsai Date: Mon, 16 Jul 2018 14:11:54 +0800 Subject: [PATCH 1/2] add list nics API for certain node --- API.md | 72 +++++++++++++++++++++ src/entity/metrics_node.go | 10 +++ src/prometheuscontroller/expression.go | 22 +++++++ src/prometheuscontroller/expression_test.go | 19 ++++-- src/server/handler_prometheus.go | 15 +++++ src/server/route.go | 1 + 6 files changed, 135 insertions(+), 4 deletions(-) diff --git a/API.md b/API.md index 1734e45d..a1e0325b 100644 --- a/API.md +++ b/API.md @@ -643,6 +643,78 @@ Response Data: } ``` +### List NICs of certain node + +**Get /v1/monitoring/nodes/{id}/nics** + +Example: +``` +curl -X GET http://localhost:7890/v1/monitoring/nodes/vortex-dev/nics +``` + +Response Data: +``` json +{ + "nics": [ + { + "name": "cni0", + "default": "false", + "type": "virtual" + }, + { + "name": "docker0", + "default": "false", + "type": "virtual" + }, + { + "name": "enp0s8", + "default": "false", + "type": "physical" + }, + { + "name": "flannel.1", + "default": "false", + "type": "virtual" + }, + { + "name": "lo", + "default": "false", + "type": "virtual" + }, + { + "name": "veth22ed2ac7", + "default": "false", + "type": "virtual" + }, + { + "name": "veth256ca549", + "default": "false", + "type": "virtual" + }, + { + "name": "veth734c84cf", + "default": "false", + "type": "virtual" + }, + { + "name": "vethd7819e83", + "default": "false", + "type": "virtual" + }, + { + "name": "vethdc767f86", + "default": "false", + "type": "virtual" + }, + { + "name": "enp0s3", + "default": "true", + "type": "physical" + } + ] + } +``` + ### List Pod **GET /v1/monitoring/pods?namespace=\.\*&node=\.\*&deployment=\.*** diff --git a/src/entity/metrics_node.go b/src/entity/metrics_node.go index 60d20487..dc76deb0 100644 --- a/src/entity/metrics_node.go +++ b/src/entity/metrics_node.go @@ -14,6 +14,12 @@ type NICMetrics struct { NICNetworkTraffic NICNetworkTrafficMetrics `json:"nicNetworkTraffic"` } +type NICOverviewMetrics struct { + Name string `json:"name"` + Default string `json:"default"` + Type string `json:"type"` +} + type NodeResourceMetrics struct { CPURequests float32 `json:"cpuRequests"` CPULimits float32 `json:"cpuLimits"` @@ -40,6 +46,10 @@ type NodeDetailMetrics struct { Labels map[string]string `json:"labels"` } +type NodeNICsMetrics struct { + NICs []NICOverviewMetrics `json:"nics"` +} + type NodeMetrics struct { Detail NodeDetailMetrics `json:"detail"` Resource NodeResourceMetrics `json:"resource"` diff --git a/src/prometheuscontroller/expression.go b/src/prometheuscontroller/expression.go index a67efdce..07b95bcc 100644 --- a/src/prometheuscontroller/expression.go +++ b/src/prometheuscontroller/expression.go @@ -22,6 +22,28 @@ func ListResource(sp *serviceprovider.Container, resource model.LabelName, expre return resourceList, nil } +func ListNodeNICs(sp *serviceprovider.Container, id string) (entity.NodeNICsMetrics, error) { + nicList := entity.NodeNICsMetrics{} + expression := Expression{} + expression.Metrics = []string{"node_network_interface"} + expression.QueryLabels = map[string]string{"node": id} + + results, err := getElements(sp, expression) + if err != nil { + return nicList, err + } + + for _, result := range results { + nic := entity.NICOverviewMetrics{} + nic.Name = string(result.Metric["device"]) + nic.Default = string(result.Metric["default"]) + nic.Type = string(result.Metric["type"]) + nicList.NICs = append(nicList.NICs, nic) + } + + return nicList, nil +} + func GetPod(sp *serviceprovider.Container, id string) (entity.PodMetrics, error) { pod := entity.PodMetrics{} pod.Labels = map[string]string{} diff --git a/src/prometheuscontroller/expression_test.go b/src/prometheuscontroller/expression_test.go index 21d65d2f..f009ed70 100644 --- a/src/prometheuscontroller/expression_test.go +++ b/src/prometheuscontroller/expression_test.go @@ -1,14 +1,15 @@ package prometheuscontroller import ( - "github.com/linkernetworks/vortex/src/config" - "github.com/linkernetworks/vortex/src/serviceprovider" - "github.com/prometheus/common/model" - "github.com/stretchr/testify/suite" "math/rand" "os" "testing" "time" + + "github.com/linkernetworks/vortex/src/config" + "github.com/linkernetworks/vortex/src/serviceprovider" + "github.com/prometheus/common/model" + "github.com/stretchr/testify/suite" ) func init() { @@ -57,6 +58,16 @@ func (suite *PrometheusExpressionTestSuite) TestListResourceFail() { suite.Error(err) } +func (suite *PrometheusExpressionTestSuite) TestListNodeNICs() { + nodes, err := suite.sp.KubeCtl.GetNodes() + suite.NoError(err) + nodeName := nodes[0].GetName() + + nicList, err := ListNodeNICs(suite.sp, nodeName) + suite.NoError(err) + suite.NotEqual(0, len(nicList)) +} + func (suite *PrometheusExpressionTestSuite) TestGetPod() { pods, err := suite.sp.KubeCtl.GetPods() suite.NoError(err) diff --git a/src/server/handler_prometheus.go b/src/server/handler_prometheus.go index 7597302b..f85ed50c 100644 --- a/src/server/handler_prometheus.go +++ b/src/server/handler_prometheus.go @@ -200,6 +200,21 @@ func listNodeMetricsHandler(ctx *web.Context) { resp.WriteEntity(containerList) } +func listNodeNicsMetricsHandler(ctx *web.Context) { + sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response + + nicList := entity.NodeNICsMetrics{} + id := req.PathParameter("id") + + nicList, err := pc.ListNodeNICs(sp, id) + if err != nil { + response.InternalServerError(req.Request, resp.ResponseWriter, err) + return + } + + resp.WriteEntity(nicList) +} + func getNodeMetricsHandler(ctx *web.Context) { sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response diff --git a/src/server/route.go b/src/server/route.go index c18d1527..8fc2d3f4 100644 --- a/src/server/route.go +++ b/src/server/route.go @@ -76,6 +76,7 @@ func newMonitoringService(sp *serviceprovider.Container) *restful.WebService { // node webService.Route(webService.GET("/nodes").To(handler.RESTfulServiceHandler(sp, listNodeMetricsHandler))) webService.Route(webService.GET("/nodes/{id}").To(handler.RESTfulServiceHandler(sp, getNodeMetricsHandler))) + webService.Route(webService.GET("/nodes/{id}/nics").To(handler.RESTfulServiceHandler(sp, listNodeNicsMetricsHandler))) // pod webService.Route(webService.GET("/pods").To(handler.RESTfulServiceHandler(sp, listPodMetricsHandler))) webService.Route(webService.GET("/pods/{id}").To(handler.RESTfulServiceHandler(sp, getPodMetricsHandler))) From 977cbf01cc76eba8fa3a28ad66d52faea1f20536 Mon Sep 17 00:00:00 2001 From: Pei Hsuan Tsai Date: Mon, 16 Jul 2018 14:34:11 +0800 Subject: [PATCH 2/2] fix type error --- src/prometheuscontroller/expression_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prometheuscontroller/expression_test.go b/src/prometheuscontroller/expression_test.go index f009ed70..c5179cc9 100644 --- a/src/prometheuscontroller/expression_test.go +++ b/src/prometheuscontroller/expression_test.go @@ -65,7 +65,7 @@ func (suite *PrometheusExpressionTestSuite) TestListNodeNICs() { nicList, err := ListNodeNICs(suite.sp, nodeName) suite.NoError(err) - suite.NotEqual(0, len(nicList)) + suite.NotEqual(0, len(nicList.NICs)) } func (suite *PrometheusExpressionTestSuite) TestGetPod() {