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,

Reply via email to