This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git
commit d7f4c18d405dd1f69aa005bb1a2a82051e2d16a3 Author: chickenlj <[email protected]> AuthorDate: Mon Oct 21 22:18:17 2024 +0800 add overview and metadata new apis --- pkg/admin/handler/overview.go | 141 +++++++++++++++++++++++++++++ pkg/admin/model/overview.go | 44 +++++++++ pkg/admin/server/router.go | 9 +- pkg/config/admin/config.go | 2 +- pkg/plugins/resources/traditional/store.go | 5 +- 5 files changed, 191 insertions(+), 10 deletions(-) diff --git a/pkg/admin/handler/overview.go b/pkg/admin/handler/overview.go index 2a993557..1e155a91 100644 --- a/pkg/admin/handler/overview.go +++ b/pkg/admin/handler/overview.go @@ -22,12 +22,17 @@ import ( ) import ( + gxset "github.com/dubbogo/gost/container/set" + "github.com/gin-gonic/gin" ) import ( + "github.com/apache/dubbo-kubernetes/api/mesh/v1alpha1" "github.com/apache/dubbo-kubernetes/pkg/admin/model" "github.com/apache/dubbo-kubernetes/pkg/core/resources/apis/mesh" + core_manager "github.com/apache/dubbo-kubernetes/pkg/core/resources/manager" + "github.com/apache/dubbo-kubernetes/pkg/core/resources/store" core_runtime "github.com/apache/dubbo-kubernetes/pkg/core/runtime" ) @@ -72,3 +77,139 @@ func GetMappings(rt core_runtime.Runtime) gin.HandlerFunc { c.JSON(http.StatusOK, model.NewSuccessResp(mappingList)) } } + +func AdminMetadata(rt core_runtime.Runtime) gin.HandlerFunc { + return func(c *gin.Context) { + res := model.NewAdminMetadata() + + config := rt.Config() + res.Registry = config.Store.Traditional.Registry.Address + res.Metadata = config.Store.Traditional.MetadataReport.Address + res.Config = config.Store.Traditional.ConfigCenter + res.Grafana = config.Admin.MetricDashboards.Application.BaseURL + res.Prometheus = config.Admin.Prometheus + res.Tracing = config.Admin.TraceDashboards.Application.BaseURL + + c.JSON(http.StatusOK, model.NewSuccessResp(res)) + } +} + +func ClusterOverview(rt core_runtime.Runtime) gin.HandlerFunc { + return func(c *gin.Context) { + res := model.NewOverviewResp() + + manager := rt.ResourceManager() + dataplaneList := &mesh.DataplaneResourceList{} + if err := manager.List(rt.AppContext(), dataplaneList); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": err.Error(), + }) + return + } + + calAppCount(res, dataplaneList) + err := calServiceInfo(res, dataplaneList, rt, manager) + if err != nil { + return + } + res.InsCount = len(dataplaneList.Items) + + c.JSON(http.StatusOK, model.NewSuccessResp(res)) + } +} + +func calAppCount(res *model.OverviewResp, list *mesh.DataplaneResourceList) { + set := gxset.NewSet() + for _, ins := range list.Items { + set.Add(ins.Spec.GetExtensions()[v1alpha1.Application]) + } + + res.AppCount = set.Size() +} + +func calServiceInfo(res *model.OverviewResp, list *mesh.DataplaneResourceList, rt core_runtime.Runtime, manager core_manager.ResourceManager) error { + revisions := make(map[string]*mesh.MetaDataResource, 0) + protocols := make(map[string]*gxset.HashSet) + releases := make(map[string]string) + services := make(map[string]string) + discoveries := make(map[string]*gxset.HashSet) + + for _, ins := range list.Items { + app := ins.Spec.GetExtensions()[v1alpha1.Application] + + t := ins.Spec.GetExtensions()["registry-type"] + if t == "" { + t = "instance" + } + if set, ok := discoveries[t]; ok { + set.Add(app) + } else { + newSet := gxset.NewSet() + newSet.Add(app) + discoveries[t] = newSet + } + + rev, exists := ins.Spec.GetExtensions()[v1alpha1.Revision] + if exists { + metadata, cached := revisions[rev] + if !cached { + metadata = &mesh.MetaDataResource{ + Spec: &v1alpha1.MetaData{}, + } + if err := manager.Get(rt.AppContext(), metadata, store.GetByRevision(rev), store.GetByType(ins.Spec.GetExtensions()["registry-type"])); err != nil { + return err + } + revisions[rev] = metadata + + for _, serviceInfo := range metadata.Spec.Services { + // proKey := serviceInfo.Protocol + strconv.Itoa(int(serviceInfo.Port)) + proKey := serviceInfo.Protocol + if extProtocols, ok := serviceInfo.GetParams()["ext.protocol"]; ok { + proKey = proKey + extProtocols + } + if set, ok := protocols[proKey]; ok { + set.Add(serviceInfo.Name) + } else { + newSet := gxset.NewSet() + protocols[proKey] = newSet + newSet.Add(serviceInfo.Name) + } + + if _, ok := releases[app]; !ok { + releases[app] = serviceInfo.Params["release"] + } + + if _, ok := services[serviceInfo.Name]; !ok { + services[serviceInfo.Name] = serviceInfo.Name + } + } + } + } + } + + releaseCount := make(map[string]int) + for _, ver := range releases { + if n, ok := releaseCount[ver]; ok { + releaseCount[ver] = n + 1 + } else { + releaseCount[ver] = 1 + } + } + + protocolCount := make(map[string]int) + for p, set := range protocols { + protocolCount[p] = set.Size() + } + + discoveryCount := make(map[string]int) + for d, set := range discoveries { + discoveryCount[d] = set.Size() + } + + res.ServiceCount = len(services) + res.Releases = releaseCount + res.Protocols = protocolCount + res.Discoveries = discoveryCount + + return nil +} diff --git a/pkg/admin/model/overview.go b/pkg/admin/model/overview.go new file mode 100644 index 00000000..2a467a92 --- /dev/null +++ b/pkg/admin/model/overview.go @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package model + +type OverviewResp struct { + AppCount int `json:"appCount"` + ServiceCount int `json:"serviceCount"` + InsCount int `json:"insCount"` + Protocols map[string]int `json:"protocols"` + Releases map[string]int `json:"releases"` + Discoveries map[string]int `json:"discoveries"` +} + +func NewOverviewResp() *OverviewResp { + return &OverviewResp{} +} + +type AdminMetadata struct { + Registry string `json:"registry"` + Metadata string `json:"metadata"` + Config string `json:"config"` + Prometheus string `json:"prometheus"` + Grafana string `json:"grafana"` + Tracing string `json:"tracing"` +} + +func NewAdminMetadata() *AdminMetadata { + return &AdminMetadata{} +} diff --git a/pkg/admin/server/router.go b/pkg/admin/server/router.go index b76f0141..523cf424 100644 --- a/pkg/admin/server/router.go +++ b/pkg/admin/server/router.go @@ -86,13 +86,6 @@ func initRouter(r *gin.Engine, rt core_runtime.Runtime) { service.GET("/trace-dashboard", handler.GetTraceDashBoard(rt, handler.ServiceDimension)) } - { - dev := router.Group("/dev") - dev.GET("/instances", handler.GetInstances(rt)) - dev.GET("/metas", handler.GetMetas(rt)) - dev.GET("/mappings", handler.GetMappings(rt)) - } - { service := router.Group("/service") service.GET("/distribution", handler.GetServiceTabDistribution(rt)) @@ -130,4 +123,6 @@ func initRouter(r *gin.Engine, rt core_runtime.Runtime) { router.GET("/prometheus", handler.GetPrometheus(rt)) router.GET("/search", handler.BannerGlobalSearch(rt)) + router.GET("/overview", handler.ClusterOverview(rt)) + router.GET("/metadata", handler.AdminMetadata(rt)) } diff --git a/pkg/config/admin/config.go b/pkg/config/admin/config.go index a89e0249..d8e42d3c 100644 --- a/pkg/config/admin/config.go +++ b/pkg/config/admin/config.go @@ -31,7 +31,7 @@ type Admin struct { Port int `json:"port" envconfig:"DUBBO_ADMIN_PORT"` MetricDashboards *MetricDashboardConfig `json:"metric_dashboards"` TraceDashboards *TraceDashboardConfig `json:"trace_dashboards"` - Prometheus *PrometheusConfig `json:"prometheus"` + Prometheus string `json:"prometheus"` } func (s *Admin) PostProcess() error { diff --git a/pkg/plugins/resources/traditional/store.go b/pkg/plugins/resources/traditional/store.go index c07b3aea..87a8daa1 100644 --- a/pkg/plugins/resources/traditional/store.go +++ b/pkg/plugins/resources/traditional/store.go @@ -825,8 +825,9 @@ func (c *traditionalStore) Get(_ context.Context, resource core_model.Resource, params = serviceInfo.Params } service[key] = &mesh_proto.ServiceInfo{ - Name: serviceInfo.Name, - Group: serviceInfo.Group, + Name: serviceInfo.Name, + Group: serviceInfo.Group, + Version: serviceInfo.Version, Protocol: serviceInfo.Protocol, Path: serviceInfo.Path,
