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)
+}
+