You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/03/29 09:02:25 UTC

[servicecomb-service-center] branch master updated: 新增统计服务计数api (#924)

This is an automated email from the ASF dual-hosted git repository.

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 2aaf912  新增统计服务计数api (#924)
2aaf912 is described below

commit 2aaf912ae1d68d972713cba52829658e3ad9be60
Author: jindongxia <71...@users.noreply.github.com>
AuthorDate: Mon Mar 29 17:02:13 2021 +0800

    新增统计服务计数api (#924)
    
    Co-authored-by: jindongxia <jd...@163.com>
---
 datasource/etcd/ms.go               |  18 ++++++
 datasource/etcd/ms_test.go          | 114 ++++++++++++++++++++++++++++++++++++
 datasource/mongo/ms.go              |  17 ++++++
 datasource/ms.go                    |   1 +
 docs/openapi/v4.yaml                |  33 +++++++++++
 go.mod                              |   2 +-
 pkg/proto/service.go                |   1 +
 server/rest/govern/controller_v4.go |  10 ++++
 server/rest/govern/service.go       |   6 ++
 9 files changed, 201 insertions(+), 1 deletion(-)

diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 57af234..0300495 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -345,6 +345,24 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *pb.GetServic
 	}, nil
 }
 
+func (ds *DataSource) GetServicesStatistics(ctx context.Context, request *pb.GetServicesRequest) (
+	*pb.GetServicesInfoStatisticsResponse, error) {
+	ctx = util.WithCacheOnly(ctx)
+	var st *pb.Statistics
+	var err error
+	st, err = statistics(ctx, true)
+	if err != nil {
+		return &pb.GetServicesInfoStatisticsResponse{
+			Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
+		}, err
+	}
+	return &pb.GetServicesInfoStatisticsResponse{
+		Response:          pb.CreateResponse(pb.ResponseSuccess, "Get services statistics successfully."),
+		Statistics:        st,
+	}, nil
+}
+
+
 func (ds *DataSource) GetApplications(ctx context.Context, request *pb.GetAppsRequest) (*pb.GetAppsResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 	key := path.GetServiceAppKey(domainProject, request.Environment, "")
diff --git a/datasource/etcd/ms_test.go b/datasource/etcd/ms_test.go
index 8d8c7a6..80230ec 100644
--- a/datasource/etcd/ms_test.go
+++ b/datasource/etcd/ms_test.go
@@ -1763,6 +1763,120 @@ func TestInstance_Query(t *testing.T) {
 	})
 }
 
+func TestServicesStatistics_Get(t *testing.T) {
+	var ctx context.Context
+	var serviceId1 string
+	var serviceId2 string
+
+	t.Run("register services and instances for TestServicesStatistics_Get", func(t *testing.T) {
+
+		//service1
+		ctx =  util.WithNoCache(util.SetDomainProject(context.Background(), "default", "Project1"))
+		respCreateService, err := datasource.Instance().RegisterService(ctx, &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "query_statistics1",
+				ServiceName: "service1",
+				Version:     "1.0.0",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
+		serviceId1 = respCreateService.ServiceId
+
+		respCreateInstance, err := datasource.Instance().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
+			Instance: &pb.MicroServiceInstance{
+				ServiceId: serviceId1,
+				HostName:  "UT-HOST-MS1",
+				Endpoints: []string{
+					"find:127.0.0.1:8080",
+				},
+				Status: pb.MSI_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
+
+		respCreateInstance, err = datasource.Instance().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
+			Instance: &pb.MicroServiceInstance{
+				ServiceId: serviceId1,
+				HostName:  "UT-HOST-MS2",
+				Endpoints: []string{
+					"find:127.0.0.1:8080",
+				},
+				Status: pb.MSI_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
+
+        //service2
+		ctx =  util.WithNoCache(util.SetDomainProject(context.Background(), "DomainTest1", "Project1"))
+		respCreateService, err = datasource.Instance().RegisterService(ctx, &pb.CreateServiceRequest{
+			Service: &pb.MicroService{
+				AppId:       "query_statistics2",
+				ServiceName: "service2-DomainTest1",
+				Version:     "1.0.5",
+				Level:       "FRONT",
+				Status:      pb.MS_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
+		serviceId2 = respCreateService.ServiceId
+
+		respCreateInstance, err = datasource.Instance().RegisterInstance(ctx, &pb.RegisterInstanceRequest{
+			Instance: &pb.MicroServiceInstance{
+				ServiceId: serviceId2,
+				HostName:  "UT-HOST-MS1",
+				Endpoints: []string{
+					"find:127.0.0.1:8080",
+				},
+				Status: pb.MSI_UP,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respCreateInstance.Response.GetCode())
+	})
+
+	t.Run("query services statistics", func(t *testing.T) {
+
+		ctx =  util.WithNoCache(util.SetDomainProject(context.Background(), "default", "Project1"))
+		log.Info("query services default domain statistics")
+		respFind, err := datasource.Instance().GetServicesStatistics(ctx, &pb.GetServicesRequest{})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
+		assert.Equal(t, int64(2), respFind.Statistics.Instances.CountByDomain)
+
+		log.Info("query services domain statistics")
+		ctx =  util.WithNoCache(util.SetDomainProject(context.Background(), "DomainTest1", "Project1"))
+		respFind, err = datasource.Instance().GetServicesStatistics(ctx, &pb.GetServicesRequest{})
+		assert.NoError(t, err)
+		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
+		assert.Equal(t, int64(1), respFind.Statistics.Instances.CountByDomain)
+		})
+
+	t.Run("delete a service ", func(t *testing.T) {
+		ctx =  util.WithNoCache(util.SetDomainProject(context.Background(), "default", "Project1"))
+		resp, err := datasource.Instance().UnregisterService(ctx, &pb.DeleteServiceRequest{
+			ServiceId: serviceId1,
+			Force:     false,
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
+
+		ctx =  util.WithNoCache(util.SetDomainProject(context.Background(), "DomainTest1", "Project1"))
+		resp, err = datasource.Instance().UnregisterService(ctx, &pb.DeleteServiceRequest{
+			ServiceId: serviceId2,
+			Force:     false,
+		})
+		assert.NoError(t, err)
+		assert.NotEqual(t, pb.ResponseSuccess, resp.Response.GetCode())
+	})
+
+}
+
 func TestInstance_GetOne(t *testing.T) {
 	var (
 		serviceId1  string
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 185f14c..7b30d31 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -530,6 +530,23 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.Ge
 	}, nil
 }
 
+func (ds *DataSource) GetServicesStatistics(ctx context.Context, request *discovery.GetServicesRequest) (
+	*discovery.GetServicesInfoStatisticsResponse, error) {
+	ctx = util.WithCacheOnly(ctx)
+	var st *discovery.Statistics
+	var err error
+	st, err  = statistics(ctx, true)
+	if err != nil {
+		return &discovery.GetServicesInfoStatisticsResponse{
+			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
+		}, err
+	}
+	return &discovery.GetServicesInfoStatisticsResponse{
+		Response:          discovery.CreateResponse(discovery.ResponseSuccess, "Get services statistics successfully."),
+		Statistics:        st,
+	}, nil
+}
+
 func (ds *DataSource) AddTags(ctx context.Context, request *discovery.AddServiceTagsRequest) (*discovery.AddServiceTagsResponse, error) {
 	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
 	setFilter := mutil.NewFilter(
diff --git a/datasource/ms.go b/datasource/ms.go
index 3124991..5c63200 100644
--- a/datasource/ms.go
+++ b/datasource/ms.go
@@ -36,6 +36,7 @@ type MetadataManager interface {
 
 	GetServiceDetail(ctx context.Context, request *pb.GetServiceRequest) (*pb.GetServiceDetailResponse, error)
 	GetServicesInfo(ctx context.Context, request *pb.GetServicesInfoRequest) (*pb.GetServicesInfoResponse, error)
+	GetServicesStatistics(ctx context.Context, request *pb.GetServicesRequest) (*pb.GetServicesInfoStatisticsResponse, error)
 	GetApplications(ctx context.Context, request *pb.GetAppsRequest) (*pb.GetAppsResponse, error)
 
 	ExistServiceByID(ctx context.Context, request *pb.GetExistenceByIDRequest) (*pb.GetExistenceByIDResponse, error)
diff --git a/docs/openapi/v4.yaml b/docs/openapi/v4.yaml
index 0819343..c2477e1 100644
--- a/docs/openapi/v4.yaml
+++ b/docs/openapi/v4.yaml
@@ -1574,6 +1574,36 @@ paths:
           description: 内部错误
           schema:
             $ref: '#/definitions/Error'
+  /v4/{project}/govern/microservices/statistics:
+    get:
+      description: |
+        查询服务的统计信息信息。
+      operationId: GetServicesInfoStatistics
+      parameters:
+        - name: x-domain-name
+          in: header
+          type: string
+          default: default
+          required: true
+        - name: project
+          in: path
+          required: true
+          type: string       
+      tags:
+        - governance
+      responses:
+        200:
+          description: 单个服务的信息
+          schema:
+            $ref: '#/definitions/Statistics'
+        400:
+          description: 错误的请求
+          schema:
+            $ref: '#/definitions/Error'
+        500:
+          description: 内部错误
+          schema:
+            $ref: '#/definitions/Error'
   /v4/{project}/govern/relations:
     get:
       description: |
@@ -2713,6 +2743,9 @@ definitions:
        count:
          description: 实例个数
          type: integer
+       countByDomain:
+         description: 实例个数
+         type: integer
   StApp:
      type: object
      properties:
diff --git a/go.mod b/go.mod
index cd8f53b..7cd7604 100644
--- a/go.mod
+++ b/go.mod
@@ -19,7 +19,7 @@ require (
 	github.com/dustin/go-humanize v1.0.0 // indirect
 	github.com/elithrar/simple-scrypt v1.3.0
 	github.com/ghodss/yaml v1.0.0
-	github.com/go-chassis/cari v0.2.0
+	github.com/go-chassis/cari v0.2.1-0.20210324065859-014086287a4b
 	github.com/go-chassis/foundation v0.3.0
 	github.com/go-chassis/go-archaius v1.5.1
 	github.com/go-chassis/go-chassis/v2 v2.1.2-0.20210310004133-c9bc42149a18
diff --git a/pkg/proto/service.go b/pkg/proto/service.go
index 459aec0..3fa0b62 100644
--- a/pkg/proto/service.go
+++ b/pkg/proto/service.go
@@ -70,4 +70,5 @@ type GovernServiceCtrlServer interface {
 	GetServiceDetail(context.Context, *discovery.GetServiceRequest) (*discovery.GetServiceDetailResponse, error)
 	GetServicesInfo(context.Context, *discovery.GetServicesInfoRequest) (*discovery.GetServicesInfoResponse, error)
 	GetApplications(context.Context, *discovery.GetAppsRequest) (*discovery.GetAppsResponse, error)
+	GetServicesStatistics(context.Context, *discovery.GetServicesRequest) (*discovery.GetServicesInfoStatisticsResponse, error)
 }
diff --git a/server/rest/govern/controller_v4.go b/server/rest/govern/controller_v4.go
index 659f015..51e376f 100644
--- a/server/rest/govern/controller_v4.go
+++ b/server/rest/govern/controller_v4.go
@@ -42,6 +42,7 @@ func (governService *ResourceV4) URLPatterns() []rest.Route {
 		{Method: rest.HTTPMethodGet, Path: "/v4/:project/govern/relations", Func: governService.GetGraph},
 		{Method: rest.HTTPMethodGet, Path: "/v4/:project/govern/microservices", Func: governService.GetAllServicesInfo},
 		{Method: rest.HTTPMethodGet, Path: "/v4/:project/govern/apps", Func: governService.GetAllApplications},
+		{Method: rest.HTTPMethodGet, Path: "/v4/:project/govern/statistics", Func: governService.GetAllServicesStatistics},
 	}
 }
 
@@ -162,6 +163,15 @@ func (governService *ResourceV4) GetAllServicesInfo(w http.ResponseWriter, r *ht
 	controller.WriteResponse(w, r, respInternal, resp)
 }
 
+func (governService *ResourceV4) GetAllServicesStatistics(w http.ResponseWriter, r *http.Request) {
+	request := &pb.GetServicesRequest{}
+	ctx := r.Context()
+	resp, _ := ServiceAPI.GetServicesStatistics(ctx, request)
+	respInternal := resp.Response
+	resp.Response = nil
+	controller.WriteResponse(w, r, respInternal, resp)
+}
+
 func (governService *ResourceV4) GetAllApplications(w http.ResponseWriter, r *http.Request) {
 	request := &pb.GetAppsRequest{}
 	ctx := r.Context()
diff --git a/server/rest/govern/service.go b/server/rest/govern/service.go
index 4363f40..e155c6c 100644
--- a/server/rest/govern/service.go
+++ b/server/rest/govern/service.go
@@ -59,3 +59,9 @@ func (governService *Service) GetApplications(ctx context.Context, in *pb.GetApp
 
 	return datasource.Instance().GetApplications(ctx, in)
 }
+
+func (governService *Service) GetServicesStatistics(ctx context.Context, in *pb.GetServicesRequest) (*pb.GetServicesInfoStatisticsResponse, error) {
+	ctx = util.WithCacheOnly(ctx)
+	return datasource.Instance().GetServicesStatistics(ctx, in)
+}
+