pkg/admin/handler/overview.go (169 lines of code) (raw):

/* * 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 handler import ( "net/http" ) 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" ) func GetInstances(rt core_runtime.Runtime) gin.HandlerFunc { return func(c *gin.Context) { 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 } c.JSON(http.StatusOK, model.NewSuccessResp(dataplaneList)) } } func GetMetas(rt core_runtime.Runtime) gin.HandlerFunc { return func(c *gin.Context) { manager := rt.ResourceManager() metadataList := &mesh.MetaDataResourceList{} if err := manager.List(rt.AppContext(), metadataList); err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } c.JSON(http.StatusOK, model.NewSuccessResp(metadataList)) } } func GetMappings(rt core_runtime.Runtime) gin.HandlerFunc { return func(c *gin.Context) { manager := rt.ResourceManager() mappingList := &mesh.MappingResourceList{} if err := manager.List(rt.AppContext(), mappingList); err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": err.Error(), }) return } 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.Address 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 }