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 c288a03  Fix: Etcd metrics not correct (#1069)
c288a03 is described below

commit c288a031f37da32ea615559eabe130543c0c3cbe
Author: little-cui <[email protected]>
AuthorDate: Thu Jul 1 09:26:18 2021 +0800

    Fix: Etcd metrics not correct (#1069)
    
    * Fix: Etcd metrics not correct
    
    * Add mongo metrics impl
    
    * Upgrade CARI v0.5.0
    
    * Upgrade Go-chassis
    
    * Fix: UT failures
---
 datasource/common.go                               |  10 +-
 datasource/datasource.go                           |   1 +
 datasource/etcd/etcd.go                            |   6 +
 datasource/etcd/event/domain_event_handler.go      |  48 -----
 datasource/etcd/event/event.go                     |   2 -
 datasource/etcd/event/instance_event_handler.go    |  39 +---
 .../etcd/event/schema_summary_event_handler.go     |  57 ------
 datasource/etcd/event/service_event_handler.go     |  27 +--
 datasource/etcd/kv/types.go                        |   2 +-
 datasource/etcd/metrics.go                         | 129 ++++++++++++
 datasource/etcd/ms.go                              |   6 +-
 datasource/etcd/path/key_convertor.go              |   9 +-
 datasource/etcd/path/key_generator.go              |  53 ++---
 datasource/etcd/path/key_generator_test.go         |   4 +-
 datasource/etcd/sd/k8s/adaptor/convertor.go        |   2 +-
 datasource/etcd/util/domain_util.go                |  10 +-
 datasource/etcd/util/rule_util.go                  |   3 +-
 datasource/manager.go                              |   3 +
 datasource/{datasource.go => metrics.go}           |  28 ++-
 datasource/mongo/client/dao/domain.go              |   5 +
 datasource/mongo/client/dao/schema.go              |   5 +
 datasource/mongo/event/domain_event_handler.go     |  48 -----
 datasource/mongo/event/event.go                    |   7 -
 datasource/mongo/event/instance_event_handler.go   |  11 +-
 .../mongo/event/schema_summary_event_handler.go    |  55 -----
 datasource/mongo/event/service_event_handler.go    |  16 --
 datasource/mongo/metrics.go                        | 113 +++++++++++
 datasource/mongo/mongo.go                          |   6 +
 datasource/mongo/ms.go                             |   8 +-
 datasource/mongo/util/db.go                        |   2 +-
 datasource/ms_util.go                              |  27 ++-
 datasource/service_test.go                         |   2 +-
 examples/mongodb_data_struct.yaml                  |   2 +-
 go.mod                                             |   4 +-
 go.sum                                             |   4 +
 pkg/{metrics => prometheus}/common.go              |  34 ++--
 pkg/prometheus/decorator.go                        |  12 +-
 scctl/pkg/model/types.go                           |   6 +-
 scctl/pkg/plugin/get/schema/schema_cmd.go          |   6 +-
 server/core/microservice.go                        |  40 +---
 server/core/microservice_test.go                   |  15 +-
 server/handler/context/v3.go                       |   4 +-
 server/handler/context/v4.go                       |   4 +-
 server/metrics/meta.go                             | 226 ++++++++++-----------
 .../metrics/prometheus.go => metrics/metrics.go}   |  29 ++-
 datasource/common.go => server/metrics/options.go  |  13 +-
 .../event/event.go => server/metrics/reporter.go   |  31 +--
 server/metrics/reporter_meta.go                    | 116 +++++++++++
 server/plugin/quota/quota.go                       |   4 +-
 server/rest/admin/service.go                       |   3 +-
 server/rest/govern/controller_v4.go                |   4 +-
 server/rest/metrics/prometheus.go                  |   4 +-
 server/server.go                                   |  15 +-
 server/service/disco/instance.go                   |   2 +-
 server/service/disco/microservice_test.go          |  12 +-
 syncer/plugins/servicecenter/transform.go          |   8 +-
 syncer/proto/sc/servicecenter.pb.go                |  30 +--
 syncer/proto/sc/servicecenter.proto                |   4 +-
 ux/package-lock.json                               |   8 +
 59 files changed, 747 insertions(+), 637 deletions(-)

diff --git a/datasource/common.go b/datasource/common.go
index b732eb8..13b82cd 100644
--- a/datasource/common.go
+++ b/datasource/common.go
@@ -18,7 +18,11 @@
 package datasource
 
 const (
-       ServiceKeyPrefix  = "/cse-sr/ms/files"
-       InstanceKeyPrefix = "/cse-sr/inst/files"
-       SPLIT             = "/"
+       SPLIT                 = "/"
+       ServiceKeyPrefix      = "/cse-sr/ms/files"
+       InstanceKeyPrefix     = "/cse-sr/inst/files"
+       RegistryDomain        = "default"
+       RegistryProject       = "default"
+       RegistryDomainProject = "default/default"
+       RegistryAppID         = "default"
 )
diff --git a/datasource/datasource.go b/datasource/datasource.go
index 7909178..cc1efce 100644
--- a/datasource/datasource.go
+++ b/datasource/datasource.go
@@ -26,4 +26,5 @@ type DataSource interface {
        DependencyManager() DependencyManager
        MetadataManager() MetadataManager
        SCManager() SCManager
+       MetricsManager() MetricsManager
 }
diff --git a/datasource/etcd/etcd.go b/datasource/etcd/etcd.go
index 37fd951..ce6faa2 100644
--- a/datasource/etcd/etcd.go
+++ b/datasource/etcd/etcd.go
@@ -48,6 +48,7 @@ type DataSource struct {
        sysManager         datasource.SystemManager
        depManager         datasource.DependencyManager
        scManager          datasource.SCManager
+       metricsManager     datasource.MetricsManager
 }
 
 func (ds *DataSource) AccountLockManager() datasource.AccountLockManager {
@@ -78,6 +79,10 @@ func (ds *DataSource) SCManager() datasource.SCManager {
        return ds.scManager
 }
 
+func (ds *DataSource) MetricsManager() datasource.MetricsManager {
+       return ds.metricsManager
+}
+
 func NewDataSource(opts datasource.Options) (datasource.DataSource, error) {
        // TODO: construct a reasonable DataSource instance
        log.Warnf("data source enable etcd mode")
@@ -100,6 +105,7 @@ func NewDataSource(opts datasource.Options) 
(datasource.DataSource, error) {
        inst.sysManager = newSysManager()
        inst.depManager = &DepManager{}
        inst.scManager = &SCManager{}
+       inst.metricsManager = &MetricsManager{}
        return inst, nil
 }
 
diff --git a/datasource/etcd/event/domain_event_handler.go 
b/datasource/etcd/event/domain_event_handler.go
deleted file mode 100644
index 8e1cce3..0000000
--- a/datasource/etcd/event/domain_event_handler.go
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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 event
-
-import (
-       "github.com/go-chassis/cari/discovery"
-
-       "github.com/apache/servicecomb-service-center/datasource/etcd/kv"
-       "github.com/apache/servicecomb-service-center/datasource/etcd/sd"
-       "github.com/apache/servicecomb-service-center/server/metrics"
-)
-
-// DomainEventHandler report domain & project total number
-type DomainEventHandler struct {
-}
-
-func (h *DomainEventHandler) Type() sd.Type {
-       return kv.DOMAIN
-}
-
-func (h *DomainEventHandler) OnEvent(evt sd.KvEvent) {
-       action := evt.Type
-       switch action {
-       case discovery.EVT_INIT, discovery.EVT_CREATE:
-               metrics.ReportDomains(1)
-       case discovery.EVT_DELETE:
-               metrics.ReportDomains(-1)
-       }
-}
-
-func NewDomainEventHandler() *DomainEventHandler {
-       return &DomainEventHandler{}
-}
diff --git a/datasource/etcd/event/event.go b/datasource/etcd/event/event.go
index 9b1e6c5..92c00fa 100644
--- a/datasource/etcd/event/event.go
+++ b/datasource/etcd/event/event.go
@@ -22,12 +22,10 @@ import (
 )
 
 func Initialize() {
-       sd.AddEventHandler(NewDomainEventHandler())
        sd.AddEventHandler(NewServiceEventHandler())
        sd.AddEventHandler(NewInstanceEventHandler())
        sd.AddEventHandler(NewRuleEventHandler())
        sd.AddEventHandler(NewTagEventHandler())
        sd.AddEventHandler(NewDependencyEventHandler())
        sd.AddEventHandler(NewDependencyRuleEventHandler())
-       sd.AddEventHandler(NewSchemaSummaryEventHandler())
 }
diff --git a/datasource/etcd/event/instance_event_handler.go 
b/datasource/etcd/event/instance_event_handler.go
index b6dd461..ce7f9a1 100644
--- a/datasource/etcd/event/instance_event_handler.go
+++ b/datasource/etcd/event/instance_event_handler.go
@@ -20,9 +20,6 @@ package event
 import (
        "context"
        "fmt"
-       "strings"
-
-       pb "github.com/go-chassis/cari/discovery"
 
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/datasource/etcd/cache"
@@ -33,15 +30,12 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/dump"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
-       "github.com/apache/servicecomb-service-center/server/core"
        "github.com/apache/servicecomb-service-center/server/event"
-       "github.com/apache/servicecomb-service-center/server/metrics"
        "github.com/apache/servicecomb-service-center/server/syncernotify"
+       pb "github.com/go-chassis/cari/discovery"
 )
 
 const (
-       increaseOne = 1
-       decreaseOne = -1
        msKeyPrefix = "/cse-sr/ms/files/"
        sep         = "/"
 )
@@ -66,33 +60,16 @@ func (h *InstanceEventHandler) OnEvent(evt sd.KvEvent) {
                return
        }
        providerID, providerInstanceID, domainProject := 
path.GetInfoFromInstKV(evt.KV.Key)
-       idx := strings.Index(domainProject, "/")
-       domainName := domainProject[:idx]
-       projectName := domainProject[idx+1:]
-
        ctx := util.WithGlobal(util.WithCacheOnly(context.Background()))
 
-       var count float64 = increaseOne
        if action == pb.EVT_INIT {
-               metrics.ReportInstances(domainName, count)
-               ms, err := serviceUtil.GetService(ctx, domainProject, 
providerID)
-               if err != nil {
-                       log.Warnf("caught [%s] instance[%s/%s] event, endpoints 
%v, get cached provider's file failed",
-                               action, providerID, providerInstanceID, 
instance.Endpoints)
-                       return
-               }
-               frameworkName, frameworkVersion := getFramework(ms)
-               metrics.ReportFramework(domainName, projectName, frameworkName, 
frameworkVersion, count)
                return
        }
 
-       if action == pb.EVT_DELETE {
-               count = decreaseOne
-               if !core.IsDefaultDomainProject(domainProject) {
-                       projectName := domainProject[idx+1:]
-                       serviceUtil.RemandInstanceQuota(
-                               util.SetDomainProject(context.Background(), 
domainName, projectName))
-               }
+       if action == pb.EVT_DELETE && 
!datasource.IsDefaultDomainProject(domainProject) {
+               domain, project := path.SplitDomainProject(domainProject)
+               serviceUtil.RemandInstanceQuota(
+                       util.SetDomainProject(context.Background(), domain, 
project))
        }
 
        // 查询服务版本信息
@@ -113,12 +90,6 @@ func (h *InstanceEventHandler) OnEvent(evt sd.KvEvent) {
                return
        }
 
-       if action != pb.EVT_UPDATE {
-               frameworkName, frameworkVersion := getFramework(ms)
-               metrics.ReportInstances(domainName, count)
-               metrics.ReportFramework(domainName, projectName, frameworkName, 
frameworkVersion, count)
-       }
-
        log.Infof("caught [%s] service[%s][%s/%s/%s/%s] instance[%s] event, 
endpoints %v",
                action, providerID, ms.Environment, ms.AppId, ms.ServiceName, 
ms.Version,
                providerInstanceID, instance.Endpoints)
diff --git a/datasource/etcd/event/schema_summary_event_handler.go 
b/datasource/etcd/event/schema_summary_event_handler.go
deleted file mode 100644
index f15db70..0000000
--- a/datasource/etcd/event/schema_summary_event_handler.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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 event
-
-import (
-       "strings"
-
-       pb "github.com/go-chassis/cari/discovery"
-
-       "github.com/apache/servicecomb-service-center/datasource/etcd/kv"
-       "github.com/apache/servicecomb-service-center/datasource/etcd/path"
-       "github.com/apache/servicecomb-service-center/datasource/etcd/sd"
-       "github.com/apache/servicecomb-service-center/server/metrics"
-)
-
-// SchemaSummaryEventHandler report schema metrics
-type SchemaSummaryEventHandler struct {
-}
-
-func (h *SchemaSummaryEventHandler) Type() sd.Type {
-       return kv.SchemaSummary
-}
-
-func (h *SchemaSummaryEventHandler) OnEvent(evt sd.KvEvent) {
-       action := evt.Type
-       switch action {
-       case pb.EVT_INIT, pb.EVT_CREATE, pb.EVT_DELETE:
-               domainProject, _, _ := 
path.GetInfoFromSchemaSummaryKV(evt.KV.Key)
-               idx := strings.Index(domainProject, "/")
-               newDomain := domainProject[:idx]
-               if pb.EVT_DELETE == action {
-                       metrics.ReportSchemas(newDomain, -1)
-               } else {
-                       metrics.ReportSchemas(newDomain, 1)
-               }
-       default:
-       }
-}
-
-func NewSchemaSummaryEventHandler() *SchemaSummaryEventHandler {
-       return &SchemaSummaryEventHandler{}
-}
diff --git a/datasource/etcd/event/service_event_handler.go 
b/datasource/etcd/event/service_event_handler.go
index b4ee26b..cd9e479 100644
--- a/datasource/etcd/event/service_event_handler.go
+++ b/datasource/etcd/event/service_event_handler.go
@@ -19,9 +19,6 @@ package event
 
 import (
        "context"
-       "strings"
-
-       pb "github.com/go-chassis/cari/discovery"
 
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/datasource/etcd/cache"
@@ -30,11 +27,10 @@ import (
        "github.com/apache/servicecomb-service-center/datasource/etcd/sd"
        serviceUtil 
"github.com/apache/servicecomb-service-center/datasource/etcd/util"
        "github.com/apache/servicecomb-service-center/pkg/log"
-       "github.com/apache/servicecomb-service-center/server/metrics"
+       pb "github.com/go-chassis/cari/discovery"
 )
 
 // ServiceEventHandler is the handler to handle:
-// 1. report service metrics
 // 2. save the new domain & project mapping
 // 3. reset the find instance cache
 type ServiceEventHandler struct {
@@ -51,22 +47,14 @@ func (h *ServiceEventHandler) OnEvent(evt sd.KvEvent) {
                return
        }
        _, domainProject := path.GetInfoFromSvcKV(evt.KV.Key)
-       fn, fv := getFramework(ms)
 
        switch evt.Type {
        case pb.EVT_INIT, pb.EVT_CREATE:
-               idx := strings.Index(domainProject, "/")
-               newDomain := domainProject[:idx]
-               newProject := domainProject[idx+1:]
+               newDomain, newProject := path.SplitDomainProject(domainProject)
                err := serviceUtil.NewDomainProject(context.Background(), 
newDomain, newProject)
                if err != nil {
                        log.Errorf(err, "new domain[%s] or project[%s] failed", 
newDomain, newProject)
                }
-               metrics.ReportServices(newDomain, fn, fv, 1)
-       case pb.EVT_DELETE:
-               domainName := domainProject[:strings.Index(domainProject, "/")]
-               metrics.ReportServices(domainName, fn, fv, -1)
-       default:
        }
 
        if evt.Type == pb.EVT_INIT {
@@ -81,17 +69,6 @@ func (h *ServiceEventHandler) OnEvent(evt sd.KvEvent) {
        cache.FindInstances.Remove(providerKey)
 }
 
-func getFramework(ms *pb.MicroService) (string, string) {
-       if ms.Framework != nil && len(ms.Framework.Name) > 0 {
-               version := ms.Framework.Version
-               if len(ms.Framework.Version) == 0 {
-                       version = "UNKNOWN"
-               }
-               return ms.Framework.Name, version
-       }
-       return "UNKNOWN", "UNKNOWN"
-}
-
 func NewServiceEventHandler() *ServiceEventHandler {
        return &ServiceEventHandler{}
 }
diff --git a/datasource/etcd/kv/types.go b/datasource/etcd/kv/types.go
index fe88425..752c464 100644
--- a/datasource/etcd/kv/types.go
+++ b/datasource/etcd/kv/types.go
@@ -59,7 +59,7 @@ func registerInnerTypes() {
                        WithInitSize(1000).WithParser(value.InstanceParser).
                        WithDeferHandler(NewInstanceEventDeferHandler())))
        DOMAIN = Store().MustInstall(NewAddOn("DOMAIN",
-               sd.Configure().WithPrefix(path.GetDomainRootKey()+path.SPLIT).
+               sd.Configure().WithPrefix(path.GenerateDomainKey("")).
                        WithInitSize(100).WithParser(value.StringParser)))
        SCHEMA = Store().MustInstall(NewAddOn("SCHEMA",
                sd.Configure().WithPrefix(path.GetServiceSchemaRootKey("")).
diff --git a/datasource/etcd/metrics.go b/datasource/etcd/metrics.go
new file mode 100644
index 0000000..2e8cccc
--- /dev/null
+++ b/datasource/etcd/metrics.go
@@ -0,0 +1,129 @@
+/*
+ * 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 etcd
+
+import (
+       "context"
+       "fmt"
+
+       "github.com/apache/servicecomb-service-center/datasource"
+       "github.com/apache/servicecomb-service-center/datasource/etcd/client"
+       "github.com/apache/servicecomb-service-center/datasource/etcd/kv"
+       "github.com/apache/servicecomb-service-center/datasource/etcd/path"
+       "github.com/apache/servicecomb-service-center/pkg/log"
+       "github.com/go-chassis/cari/discovery"
+)
+
+type MetricsManager struct {
+}
+
+func (m *MetricsManager) Report(ctx context.Context, r 
datasource.MetricsReporter) error {
+       reportDomains(ctx, r)
+       reportServices(ctx, r)
+       reportSchemas(ctx, r)
+       return nil
+}
+
+func reportDomains(ctx context.Context, r datasource.MetricsReporter) {
+       key := path.GenerateDomainKey("")
+       domainsResp, err := kv.Store().Domain().Search(ctx,
+               client.WithCacheOnly(), client.WithCountOnly(),
+               client.WithStrKey(key),
+               client.WithPrefix())
+       if err != nil {
+               log.Error("query all domains failed", err)
+               return
+       }
+       r.DomainAdd(float64(domainsResp.Count))
+}
+
+func reportSchemas(ctx context.Context, r datasource.MetricsReporter) {
+       key := path.GetServiceSchemaSummaryRootKey("")
+       schemaKeysResp, err := kv.Store().SchemaSummary().Search(ctx,
+               client.WithCacheOnly(), client.WithKeyOnly(),
+               client.WithStrKey(key),
+               client.WithPrefix())
+       if err != nil {
+               log.Error("query all schemas failed", err)
+               return
+       }
+       for _, keyValue := range schemaKeysResp.Kvs {
+               domainProject, _, _ := 
path.GetInfoFromSchemaSummaryKV(keyValue.Key)
+               domain, project := path.SplitDomainProject(domainProject)
+               labels := datasource.MetricsLabels{
+                       Domain:  domain,
+                       Project: project,
+               }
+               r.SchemaAdd(1, labels)
+       }
+}
+
+func reportServices(ctx context.Context, r datasource.MetricsReporter) {
+       key := path.GetServiceRootKey("")
+       servicesResp, err := kv.Store().Service().Search(ctx,
+               client.WithCacheOnly(),
+               client.WithStrKey(key),
+               client.WithPrefix())
+       if err != nil {
+               log.Error("query all microservices failed", err)
+               return
+       }
+       for _, keyValue := range servicesResp.Kvs {
+               service := keyValue.Value.(*discovery.MicroService)
+               _, domainProject := path.GetInfoFromSvcKV(keyValue.Key)
+               if 
datasource.IsGlobal(discovery.MicroServiceToKey(domainProject, service)) {
+                       continue
+               }
+               domain, project := path.SplitDomainProject(domainProject)
+               frameworkName, frameworkVersion := 
discovery.ToFrameworkLabel(service)
+               labels := datasource.MetricsLabels{
+                       Domain:           domain,
+                       Project:          project,
+                       Framework:        frameworkName,
+                       FrameworkVersion: frameworkVersion,
+               }
+               r.ServiceAdd(1, labels)
+
+               reportInstances(ctx, r, domainProject, service)
+       }
+}
+
+func reportInstances(ctx context.Context, r datasource.MetricsReporter, 
domainProject string, service *discovery.MicroService) {
+       instancesResp, err := kv.Store().Instance().Search(ctx,
+               client.WithCacheOnly(), client.WithCountOnly(),
+               client.WithStrKey(path.GenerateInstanceKey(domainProject, 
service.ServiceId, "")),
+               client.WithPrefix())
+       if err != nil {
+               log.Error(fmt.Sprintf("query microservice %s isntances failed", 
service.ServiceId), err)
+               return
+       }
+       if instancesResp.Count == 0 {
+               return
+       }
+       count := float64(instancesResp.Count)
+       domain, project := path.SplitDomainProject(domainProject)
+       frameworkName, frameworkVersion := discovery.ToFrameworkLabel(service)
+       labels := datasource.MetricsLabels{
+               Domain:           domain,
+               Project:          project,
+               Framework:        frameworkName,
+               FrameworkVersion: frameworkVersion,
+       }
+       r.FrameworkSet(labels)
+       r.InstanceAdd(count, labels)
+}
diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 11298a7..93f2c12 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -353,7 +353,7 @@ func (ds *MetadataManager) GetServicesInfo(ctx 
context.Context, request *pb.GetS
 }
 
 func (ds *MetadataManager) filterServices(domainProject string, request 
*pb.GetServicesInfoRequest, service *pb.MicroService) bool {
-       if !request.WithShared && 
core.IsGlobal(pb.MicroServiceToKey(domainProject, service)) {
+       if !request.WithShared && 
datasource.IsGlobal(pb.MicroServiceToKey(domainProject, service)) {
                return false
        }
        if len(request.Environment) > 0 && request.Environment != 
service.Environment {
@@ -409,7 +409,7 @@ func (ds *MetadataManager) GetApplications(ctx 
context.Context, request *pb.GetA
        appMap := make(map[string]struct{}, l)
        for _, keyValue := range resp.Kvs {
                key := path.GetInfoFromSvcIndexKV(keyValue.Key)
-               if !request.WithShared && core.IsGlobal(key) {
+               if !request.WithShared && datasource.IsGlobal(key) {
                        continue
                }
                if _, ok := appMap[key.AppId]; ok {
@@ -927,7 +927,7 @@ func (ds *MetadataManager) FindInstances(ctx 
context.Context, request *pb.FindIn
                }, err
        }
 
-       if core.IsGlobal(provider) {
+       if datasource.IsGlobal(provider) {
                return ds.findSharedServiceInstance(ctx, request, provider, rev)
        }
        return ds.findInstance(ctx, request, provider, rev)
diff --git a/datasource/etcd/path/key_convertor.go 
b/datasource/etcd/path/key_convertor.go
index 1a652d0..774a6cb 100644
--- a/datasource/etcd/path/key_convertor.go
+++ b/datasource/etcd/path/key_convertor.go
@@ -21,9 +21,8 @@ import (
        "fmt"
        "strings"
 
-       "github.com/go-chassis/cari/discovery"
-
        "github.com/apache/servicecomb-service-center/pkg/util"
+       "github.com/go-chassis/cari/discovery"
 )
 
 func ToResponse(key []byte) (keys []string) {
@@ -169,3 +168,9 @@ func GetInfoFromDependencyRuleKV(key []byte) (t string, _ 
*discovery.MicroServic
                Version:     keys[l-1],
        }
 }
+
+func SplitDomainProject(domainProject string) (string, string) {
+       domain := domainProject[:strings.Index(domainProject, SPLIT)]
+       project := domainProject[strings.Index(domainProject, SPLIT)+1:]
+       return domain, project
+}
diff --git a/datasource/etcd/path/key_generator.go 
b/datasource/etcd/path/key_generator.go
index 228f808..d95563c 100644
--- a/datasource/etcd/path/key_generator.go
+++ b/datasource/etcd/path/key_generator.go
@@ -53,11 +53,11 @@ func GetRootKey() string {
        return SPLIT + RegistryRootKey
 }
 
-func GenerateRBACAccountKey(name string) string {
+func GenerateDomainKey(domain string) string {
        return util.StringJoin([]string{
                GetRootKey(),
-               "accounts",
-               name,
+               RegistryDomainKey,
+               domain,
        }, SPLIT)
 }
 
@@ -69,6 +69,20 @@ func GetProjectRootKey(domain string) string {
        }, SPLIT)
 }
 
+func GenerateProjectKey(domain, project string) string {
+       return util.StringJoin([]string{
+               GetProjectRootKey(domain),
+               project,
+       }, SPLIT)
+}
+
+func GenerateRBACAccountKey(name string) string {
+       return util.StringJoin([]string{
+               GetRootKey(),
+               "accounts",
+               name,
+       }, SPLIT)
+}
 func GenerateRBACRoleKey(name string) string {
        return util.StringJoin([]string{
                GetRootKey(),
@@ -90,19 +104,6 @@ func GenRoleAccountPrefixIdxKey(role string) string {
                role,
        }, SPLIT)
 }
-func GenerateETCDProjectKey(domain, project string) string {
-       return util.StringJoin([]string{
-               GetProjectRootKey(domain),
-               project,
-       }, SPLIT)
-}
-
-func GenerateETCDDomainKey(domain string) string {
-       return util.StringJoin([]string{
-               GetDomainRootKey(),
-               domain,
-       }, SPLIT)
-}
 
 func GetServiceRootKey(domainProject string) string {
        return util.StringJoin([]string{
@@ -353,19 +354,6 @@ func GetServiceDependencyRootKey(domainProject string) 
string {
        }, SPLIT)
 }
 
-func GetDomainRootKey() string {
-       return util.StringJoin([]string{
-               GetRootKey(),
-               RegistryDomainKey,
-       }, SPLIT)
-}
-
-func GenerateDomainKey(domain string) string {
-       return util.StringJoin([]string{
-               GetDomainRootKey(),
-               domain,
-       }, SPLIT)
-}
 func GenerateAccountKey(name string) string {
        return util.StringJoin([]string{
                GetRootKey(),
@@ -408,10 +396,3 @@ func GenerateMetricsKey(name, utc, domain string) string {
                domain,
        }, SPLIT)
 }
-
-func GenerateProjectKey(domain, project string) string {
-       return util.StringJoin([]string{
-               GetProjectRootKey(domain),
-               project,
-       }, SPLIT)
-}
diff --git a/datasource/etcd/path/key_generator_test.go 
b/datasource/etcd/path/key_generator_test.go
index 76a8ea3..2614ae1 100644
--- a/datasource/etcd/path/key_generator_test.go
+++ b/datasource/etcd/path/key_generator_test.go
@@ -31,11 +31,11 @@ func TestGenerateRBACAccountKey(t *testing.T) {
 }
 
 func TestGenerateETCDProjectKey(t *testing.T) {
-       assert.Equal(t, "/cse-sr/projects/domain/project", 
path.GenerateETCDProjectKey("domain", "project"))
+       assert.Equal(t, "/cse-sr/projects/domain/project", 
path.GenerateProjectKey("domain", "project"))
 }
 
 func TestGenerateETCDDomainKey(t *testing.T) {
-       assert.Equal(t, "/cse-sr/domains/domain", 
path.GenerateETCDDomainKey("domain"))
+       assert.Equal(t, "/cse-sr/domains/domain", 
path.GenerateDomainKey("domain"))
 }
 
 func TestGenerateAccountKey(t *testing.T) {
diff --git a/datasource/etcd/sd/k8s/adaptor/convertor.go 
b/datasource/etcd/sd/k8s/adaptor/convertor.go
index 2f58a58..4bd2c8b 100644
--- a/datasource/etcd/sd/k8s/adaptor/convertor.go
+++ b/datasource/etcd/sd/k8s/adaptor/convertor.go
@@ -99,7 +99,7 @@ func FromK8sService(domainProject string, svc *v1.Service) 
(ms *pb.MicroService)
                Version:     getLabel(svc.Labels, LabelVersion, pb.VERSION),
                Level:       "BACK",
                Status:      pb.MS_UP,
-               Framework: &pb.FrameWorkProperty{
+               Framework: &pb.FrameWork{
                        Name: Name,
                },
                RegisterBy: pb.REGISTERBY_PLATFORM,
diff --git a/datasource/etcd/util/domain_util.go 
b/datasource/etcd/util/domain_util.go
index 5a5efb9..525f6ca 100644
--- a/datasource/etcd/util/domain_util.go
+++ b/datasource/etcd/util/domain_util.go
@@ -32,7 +32,7 @@ import (
 
 func GetAllDomainRawData(ctx context.Context) ([]*sd.KeyValue, error) {
        opts := append(FromContext(ctx),
-               client.WithStrKey(path.GenerateETCDDomainKey("")),
+               client.WithStrKey(path.GenerateDomainKey("")),
                client.WithPrefix())
        rsp, err := kv.Store().Domain().Search(ctx, opts...)
        if err != nil {
@@ -67,7 +67,7 @@ func GetAllDomain(ctx context.Context) ([]string, error) {
 
 func AddDomain(ctx context.Context, domain string) (bool, error) {
        ok, err := client.Instance().PutNoOverride(ctx,
-               client.WithStrKey(path.GenerateETCDDomainKey(domain)))
+               client.WithStrKey(path.GenerateDomainKey(domain)))
        if err != nil {
                return false, err
        }
@@ -76,7 +76,7 @@ func AddDomain(ctx context.Context, domain string) (bool, 
error) {
 
 func DomainExist(ctx context.Context, domain string) (bool, error) {
        opts := append(FromContext(ctx),
-               client.WithStrKey(path.GenerateETCDDomainKey(domain)),
+               client.WithStrKey(path.GenerateDomainKey(domain)),
                client.WithCountOnly())
        rsp, err := kv.Store().Domain().Search(ctx, opts...)
        if err != nil {
@@ -87,7 +87,7 @@ func DomainExist(ctx context.Context, domain string) (bool, 
error) {
 
 func AddProject(ctx context.Context, domain, project string) (bool, error) {
        ok, err := client.Instance().PutNoOverride(ctx,
-               client.WithStrKey(path.GenerateETCDProjectKey(domain, project)))
+               client.WithStrKey(path.GenerateProjectKey(domain, project)))
        if err != nil {
                return ok, err
        }
@@ -96,7 +96,7 @@ func AddProject(ctx context.Context, domain, project string) 
(bool, error) {
 
 func ProjectExist(ctx context.Context, domain, project string) (bool, error) {
        opts := append(FromContext(ctx),
-               client.WithStrKey(path.GenerateETCDProjectKey(domain, project)),
+               client.WithStrKey(path.GenerateProjectKey(domain, project)),
                client.WithCountOnly())
        rsp, err := kv.Store().Project().Search(ctx, opts...)
        if err != nil {
diff --git a/datasource/etcd/util/rule_util.go 
b/datasource/etcd/util/rule_util.go
index 6588820..8ebff79 100644
--- a/datasource/etcd/util/rule_util.go
+++ b/datasource/etcd/util/rule_util.go
@@ -34,7 +34,6 @@ import (
        "github.com/apache/servicecomb-service-center/datasource/etcd/path"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
-       apt "github.com/apache/servicecomb-service-center/server/core"
 )
 
 type RuleFilter struct {
@@ -164,7 +163,7 @@ func AllowAcrossDimension(ctx context.Context, 
providerService *discovery.MicroS
                }
        }
 
-       if 
!apt.IsGlobal(discovery.MicroServiceToKey(util.ParseTargetDomainProject(ctx), 
providerService)) &&
+       if 
!datasource.IsGlobal(discovery.MicroServiceToKey(util.ParseTargetDomainProject(ctx),
 providerService)) &&
                providerService.Environment != consumerService.Environment {
                return fmt.Errorf("not allow across environment access")
        }
diff --git a/datasource/manager.go b/datasource/manager.go
index 9cd2f23..abfdf07 100644
--- a/datasource/manager.go
+++ b/datasource/manager.go
@@ -87,3 +87,6 @@ func GetAccountLockManager() AccountLockManager {
 func GetDependencyManager() DependencyManager {
        return dataSourceInst.DependencyManager()
 }
+func GetMetricsManager() MetricsManager {
+       return dataSourceInst.MetricsManager()
+}
diff --git a/datasource/datasource.go b/datasource/metrics.go
similarity index 57%
copy from datasource/datasource.go
copy to datasource/metrics.go
index 7909178..914d432 100644
--- a/datasource/datasource.go
+++ b/datasource/metrics.go
@@ -17,13 +17,23 @@
 
 package datasource
 
-// DataSource is the DAO layer
-type DataSource interface {
-       SystemManager() SystemManager
-       AccountManager() AccountManager
-       AccountLockManager() AccountLockManager
-       RoleManager() RoleManager
-       DependencyManager() DependencyManager
-       MetadataManager() MetadataManager
-       SCManager() SCManager
+import "context"
+
+type MetricsLabels struct {
+       Domain           string `json:"domain,omitempty"`
+       Project          string `json:"project,omitempty"`
+       Framework        string `json:"framework,omitempty"`
+       FrameworkVersion string `json:"frameworkVersion,omitempty"`
+}
+
+type MetricsReporter interface {
+       DomainAdd(delta float64)
+       ServiceAdd(delta float64, labels MetricsLabels)
+       InstanceAdd(delta float64, labels MetricsLabels)
+       SchemaAdd(delta float64, labels MetricsLabels)
+       FrameworkSet(labels MetricsLabels)
+}
+
+type MetricsManager interface {
+       Report(ctx context.Context, r MetricsReporter) error
 }
diff --git a/datasource/mongo/client/dao/domain.go 
b/datasource/mongo/client/dao/domain.go
index 6e3cd1f..20cda4b 100644
--- a/datasource/mongo/client/dao/domain.go
+++ b/datasource/mongo/client/dao/domain.go
@@ -23,6 +23,7 @@ import (
 
        "github.com/apache/servicecomb-service-center/datasource/mongo/client"
        
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+       mutil 
"github.com/apache/servicecomb-service-center/datasource/mongo/util"
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
@@ -40,3 +41,7 @@ func AddDomain(ctx context.Context, domain string) error {
 func ExistDomain(ctx context.Context, filter interface{}) (bool, error) {
        return client.GetMongoClient().DocExist(ctx, model.CollectionDomain, 
filter)
 }
+
+func CountDomain(ctx context.Context) (int64, error) {
+       return client.GetMongoClient().Count(ctx, model.CollectionDomain, 
mutil.NewFilter())
+}
diff --git a/datasource/mongo/client/dao/schema.go 
b/datasource/mongo/client/dao/schema.go
index c7d41e8..6cf10ea 100644
--- a/datasource/mongo/client/dao/schema.go
+++ b/datasource/mongo/client/dao/schema.go
@@ -80,3 +80,8 @@ func SchemaSummaryExist(ctx context.Context, serviceID, 
schemaID string) (bool,
        }
        return len(s.SchemaSummary) != 0, nil
 }
+
+func CountSchema(ctx context.Context, serviceID string) (int64, error) {
+       filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(serviceID))
+       return client.Count(ctx, model.CollectionSchema, filter)
+}
diff --git a/datasource/mongo/event/domain_event_handler.go 
b/datasource/mongo/event/domain_event_handler.go
deleted file mode 100644
index c3311ce..0000000
--- a/datasource/mongo/event/domain_event_handler.go
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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 event
-
-import (
-       "github.com/go-chassis/cari/discovery"
-
-       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
-       "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
-       "github.com/apache/servicecomb-service-center/server/metrics"
-)
-
-// DomainEventHandler report domain & project total number
-type DomainEventHandler struct {
-}
-
-func NewDomainEventHandler() *DomainEventHandler {
-       return &DomainEventHandler{}
-}
-
-func (h *DomainEventHandler) Type() string {
-       return model.ColumnDomain
-}
-
-func (h *DomainEventHandler) OnEvent(evt sd.MongoEvent) {
-       action := evt.Type
-       switch action {
-       case discovery.EVT_INIT, discovery.EVT_CREATE:
-               metrics.ReportDomains(increaseOne)
-       case discovery.EVT_DELETE:
-               metrics.ReportDomains(decreaseOne)
-       }
-}
diff --git a/datasource/mongo/event/event.go b/datasource/mongo/event/event.go
index 8889e84..3d77b38 100644
--- a/datasource/mongo/event/event.go
+++ b/datasource/mongo/event/event.go
@@ -22,16 +22,9 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
-const (
-       increaseOne = 1
-       decreaseOne = -1
-)
-
 func init() {
        log.Info("event init")
        instanceEventHandler := NewInstanceEventHandler()
        
sd.EventProxy(instanceEventHandler.Type()).AddHandleFunc(instanceEventHandler.OnEvent)
        sd.AddEventHandler(NewServiceEventHandler())
-       sd.AddEventHandler(NewSchemaSummaryEventHandler())
-       sd.AddEventHandler(NewDomainEventHandler())
 }
diff --git a/datasource/mongo/event/instance_event_handler.go 
b/datasource/mongo/event/instance_event_handler.go
index 908e251..6e2ceb1 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -35,7 +35,6 @@ import (
        simple "github.com/apache/servicecomb-service-center/pkg/time"
        "github.com/apache/servicecomb-service-center/pkg/util"
        "github.com/apache/servicecomb-service-center/server/event"
-       "github.com/apache/servicecomb-service-center/server/metrics"
        "github.com/apache/servicecomb-service-center/server/syncernotify"
 )
 
@@ -72,16 +71,8 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
                return
        }
        microService := res.Service
-       switch action {
-       case discovery.EVT_INIT:
-               metrics.ReportInstances(instance.Domain, increaseOne)
-               frameworkName, frameworkVersion := getFramework(microService)
-               metrics.ReportFramework(instance.Domain, instance.Project, 
frameworkName, frameworkVersion, increaseOne)
+       if action == discovery.EVT_INIT {
                return
-       case discovery.EVT_CREATE:
-               metrics.ReportInstances(instance.Domain, increaseOne)
-       case discovery.EVT_DELETE:
-               metrics.ReportInstances(instance.Domain, decreaseOne)
        }
        if !syncernotify.GetSyncerNotifyCenter().Closed() {
                NotifySyncerInstanceEvent(evt, microService)
diff --git a/datasource/mongo/event/schema_summary_event_handler.go 
b/datasource/mongo/event/schema_summary_event_handler.go
deleted file mode 100644
index ad79856..0000000
--- a/datasource/mongo/event/schema_summary_event_handler.go
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 event
-
-import (
-       pb "github.com/go-chassis/cari/discovery"
-
-       "github.com/apache/servicecomb-service-center/datasource"
-       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
-       "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
-       "github.com/apache/servicecomb-service-center/pkg/log"
-       "github.com/apache/servicecomb-service-center/server/metrics"
-)
-
-type SchemaSummaryEventHandler struct {
-}
-
-func NewSchemaSummaryEventHandler() *SchemaSummaryEventHandler {
-       return &SchemaSummaryEventHandler{}
-}
-
-func (h *SchemaSummaryEventHandler) Type() string {
-       return model.ColumnSchema
-}
-
-func (h *SchemaSummaryEventHandler) OnEvent(evt sd.MongoEvent) {
-       schema, ok := evt.Value.(model.Schema)
-       if !ok {
-               log.Error("failed to assert schema", datasource.ErrAssertFail)
-               return
-       }
-       action := evt.Type
-       switch action {
-       case pb.EVT_INIT, pb.EVT_CREATE:
-               metrics.ReportSchemas(schema.Domain, increaseOne)
-       case pb.EVT_DELETE:
-               metrics.ReportSchemas(schema.Domain, decreaseOne)
-       default:
-       }
-}
diff --git a/datasource/mongo/event/service_event_handler.go 
b/datasource/mongo/event/service_event_handler.go
index 6e32136..5c7b196 100644
--- a/datasource/mongo/event/service_event_handler.go
+++ b/datasource/mongo/event/service_event_handler.go
@@ -29,7 +29,6 @@ import (
        "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
        "github.com/apache/servicecomb-service-center/datasource/mongo/util"
        "github.com/apache/servicecomb-service-center/pkg/log"
-       "github.com/apache/servicecomb-service-center/server/metrics"
 )
 
 type ServiceEventHandler struct {
@@ -48,7 +47,6 @@ func (h *ServiceEventHandler) OnEvent(evt sd.MongoEvent) {
                log.Error("failed to assert service", datasource.ErrAssertFail)
                return
        }
-       fn, fv := getFramework(ms.Service)
        switch evt.Type {
        case pb.EVT_INIT, pb.EVT_CREATE:
                ctx := context.Background()
@@ -60,9 +58,6 @@ func (h *ServiceEventHandler) OnEvent(evt sd.MongoEvent) {
                if err != nil {
                        log.Error(fmt.Sprintf("new project %s failed", 
ms.Project), err)
                }
-               metrics.ReportServices(ms.Domain, fn, fv, increaseOne)
-       case pb.EVT_DELETE:
-               metrics.ReportServices(ms.Domain, fn, fv, decreaseOne)
        default:
        }
        if evt.Type == pb.EVT_INIT {
@@ -73,17 +68,6 @@ func (h *ServiceEventHandler) OnEvent(evt sd.MongoEvent) {
                evt.Type, ms.Service.ServiceId, ms.Service.Environment, 
ms.Service.AppId, ms.Service.ServiceName, ms.Service.Version)
 }
 
-func getFramework(ms *pb.MicroService) (string, string) {
-       if ms.Framework != nil && len(ms.Framework.Name) > 0 {
-               version := ms.Framework.Version
-               if len(ms.Framework.Version) == 0 {
-                       version = "UNKNOWN"
-               }
-               return ms.Framework.Name, version
-       }
-       return "UNKNOWN", "UNKNOWN"
-}
-
 func newDomain(ctx context.Context, domain string) error {
        filter := util.NewFilter(util.Domain(domain))
        exist, err := dao.ExistDomain(ctx, filter)
diff --git a/datasource/mongo/metrics.go b/datasource/mongo/metrics.go
new file mode 100644
index 0000000..aa394ab
--- /dev/null
+++ b/datasource/mongo/metrics.go
@@ -0,0 +1,113 @@
+/*
+ * 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 mongo
+
+import (
+       "context"
+       "fmt"
+
+       "github.com/apache/servicecomb-service-center/datasource"
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+       
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+       mutil 
"github.com/apache/servicecomb-service-center/datasource/mongo/util"
+       "github.com/apache/servicecomb-service-center/pkg/log"
+       "github.com/apache/servicecomb-service-center/pkg/util"
+       "github.com/go-chassis/cari/discovery"
+)
+
+var globalServiceNames []string
+
+func init() {
+       for name := range datasource.GlobalServiceNames {
+               globalServiceNames = append(globalServiceNames, name)
+       }
+}
+
+type MetricsManager struct {
+}
+
+func (m *MetricsManager) Report(ctx context.Context, r 
datasource.MetricsReporter) error {
+       reportDomains(ctx, r)
+       reportServices(ctx, r)
+       return nil
+}
+
+func reportDomains(ctx context.Context, r datasource.MetricsReporter) {
+       count, err := dao.CountDomain(ctx)
+       if err != nil {
+               log.Error("count domains failed", err)
+               return
+       }
+       r.DomainAdd(float64(count))
+}
+
+func reportServices(ctx context.Context, r datasource.MetricsReporter) {
+       services, err := dao.GetServices(ctx, mutil.NewFilter())
+       if err != nil {
+               log.Error("query all services failed", err)
+               return
+       }
+       for _, service := range services {
+               key := 
discovery.MicroServiceToKey(service.Domain+datasource.SPLIT+service.Project, 
service.Service)
+               if datasource.IsGlobal(key) {
+                       continue
+               }
+
+               frameworkName, frameworkVersion := 
discovery.ToFrameworkLabel(service.Service)
+               labels := datasource.MetricsLabels{
+                       Domain:           service.Domain,
+                       Project:          service.Project,
+                       Framework:        frameworkName,
+                       FrameworkVersion: frameworkVersion,
+               }
+               r.ServiceAdd(1, labels)
+               r.FrameworkSet(labels)
+
+               reportInstances(ctx, r, service)
+               reportSchemas(ctx, r, service)
+       }
+}
+
+func reportInstances(ctx context.Context, r datasource.MetricsReporter, 
service *model.Service) {
+       serviceID := service.Service.ServiceId
+       count, err := dao.CountInstance(ctx, 
mutil.NewFilter(mutil.InstanceServiceID(serviceID)))
+       if err != nil {
+               log.Error(fmt.Sprintf("count service %s instance failed", 
serviceID), err)
+               return
+       }
+       frameworkName, frameworkVersion := 
discovery.ToFrameworkLabel(service.Service)
+       r.InstanceAdd(float64(count), datasource.MetricsLabels{
+               Domain:           service.Domain,
+               Project:          service.Project,
+               Framework:        frameworkName,
+               FrameworkVersion: frameworkVersion,
+       })
+}
+
+func reportSchemas(ctx context.Context, r datasource.MetricsReporter, service 
*model.Service) {
+       serviceID := service.Service.ServiceId
+       count, err := dao.CountSchema(util.SetDomainProject(ctx, 
service.Domain, service.Project), serviceID)
+       if err != nil {
+               log.Error(fmt.Sprintf("count service %s schema failed", 
serviceID), err)
+               return
+       }
+       r.SchemaAdd(float64(count), datasource.MetricsLabels{
+               Domain:  service.Domain,
+               Project: service.Project,
+       })
+}
diff --git a/datasource/mongo/mongo.go b/datasource/mongo/mongo.go
index 311eb19..38d03c6 100644
--- a/datasource/mongo/mongo.go
+++ b/datasource/mongo/mongo.go
@@ -44,6 +44,7 @@ type DataSource struct {
        sysManager         datasource.SystemManager
        depManager         datasource.DependencyManager
        scManager          datasource.SCManager
+       metricsManager     datasource.MetricsManager
 }
 
 func (ds *DataSource) AccountLockManager() datasource.AccountLockManager {
@@ -74,6 +75,10 @@ func (ds *DataSource) SCManager() datasource.SCManager {
        return ds.scManager
 }
 
+func (ds *DataSource) MetricsManager() datasource.MetricsManager {
+       return ds.metricsManager
+}
+
 func NewDataSource(opts datasource.Options) (datasource.DataSource, error) {
        // TODO: construct a reasonable DataSource instance
        inst := &DataSource{}
@@ -88,6 +93,7 @@ func NewDataSource(opts datasource.Options) 
(datasource.DataSource, error) {
        inst.metadataManager = &MetadataManager{SchemaEditable: 
opts.SchemaEditable, InstanceTTL: opts.InstanceTTL}
        inst.accountManager = &AccountManager{}
        inst.accountLockManager = 
NewAccountLockManager(opts.ReleaseAccountAfter)
+       inst.metricsManager = &MetricsManager{}
        return inst, nil
 }
 
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index ede7578..235452b 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -189,7 +189,7 @@ func (ds *MetadataManager) GetApplications(ctx 
context.Context, request *discove
        apps := make([]string, 0, l)
        hash := make(map[string]struct{}, l)
        for _, svc := range services {
-               if !request.WithShared && 
apt.IsGlobal(discovery.MicroServiceToKey(util.ParseDomainProject(ctx), svc)) {
+               if !request.WithShared && 
datasource.IsGlobal(discovery.MicroServiceToKey(util.ParseDomainProject(ctx), 
svc)) {
                        continue
                }
                if _, ok := hash[svc.AppId]; ok {
@@ -501,7 +501,7 @@ func (ds *MetadataManager) GetServicesInfo(ctx 
context.Context, request *discove
        allServiceDetails := make([]*discovery.ServiceDetail, 0, len(services))
        domainProject := util.ParseDomainProject(ctx)
        for _, mgSvc := range services {
-               if !request.WithShared && 
apt.IsGlobal(discovery.MicroServiceToKey(domainProject, mgSvc.Service)) {
+               if !request.WithShared && 
datasource.IsGlobal(discovery.MicroServiceToKey(domainProject, mgSvc.Service)) {
                        continue
                }
 
@@ -1826,7 +1826,7 @@ func (ds *MetadataManager) FindInstances(ctx 
context.Context, request *discovery
                }, err
        }
 
-       if apt.IsGlobal(provider) {
+       if datasource.IsGlobal(provider) {
                return ds.findSharedServiceInstance(ctx, request, provider, rev)
        }
 
@@ -2738,7 +2738,7 @@ func allowAcrossDimension(ctx context.Context, 
providerService *model.Service, c
                        return fmt.Errorf("not allow across app access")
                }
        }
-       if 
!apt.IsGlobal(discovery.MicroServiceToKey(util.ParseTargetDomainProject(ctx), 
providerService.Service)) &&
+       if 
!datasource.IsGlobal(discovery.MicroServiceToKey(util.ParseTargetDomainProject(ctx),
 providerService.Service)) &&
                providerService.Service.Environment != 
consumerService.Service.Environment {
                return fmt.Errorf("not allow across environment access")
        }
diff --git a/datasource/mongo/util/db.go b/datasource/mongo/util/db.go
index f58cc99..c5c4c8f 100644
--- a/datasource/mongo/util/db.go
+++ b/datasource/mongo/util/db.go
@@ -127,7 +127,7 @@ func Set(data interface{}) Option {
        }
 }
 
-func NewFilter(options ...func(filter bson.M)) bson.M {
+func NewFilter(options ...Option) bson.M {
        filter := bson.M{}
        for _, option := range options {
                option(filter)
diff --git a/datasource/ms_util.go b/datasource/ms_util.go
index 769e544..16735e4 100644
--- a/datasource/ms_util.go
+++ b/datasource/ms_util.go
@@ -19,10 +19,11 @@ package datasource
 
 import (
        "github.com/apache/servicecomb-service-center/pkg/util"
-       "github.com/apache/servicecomb-service-center/server/core"
        "github.com/go-chassis/cari/discovery"
 )
 
+var GlobalServiceNames = make(map[string]struct{})
+
 type GetInstanceCountByDomainResponse struct {
        Err           error
        CountByDomain int64
@@ -50,7 +51,7 @@ func SetStaticServices(statistics *discovery.Statistics, 
svcKeys []*discovery.Mi
        svcWithNonVersion := make(map[string]struct{}, l)
        svcIDToNonVerKey := make(map[string]string, l)
        for index, svc := range svcKeys {
-               if !withShared && core.IsGlobal(svc) {
+               if !withShared && IsGlobal(svc) {
                        continue
                }
                if _, ok := app[svc.AppId]; !ok {
@@ -102,3 +103,25 @@ func TransServiceToKey(domainProject string, service 
*discovery.MicroService) *d
                Version:     service.Version,
        }
 }
+
+func RegisterGlobalService(serviceName string) {
+       GlobalServiceNames[serviceName] = struct{}{}
+}
+
+func IsGlobal(key *discovery.MicroServiceKey) bool {
+       if !IsDefaultDomainProject(key.Tenant) {
+               return false
+       }
+       if key.AppId != RegistryAppID {
+               return false
+       }
+       _, ok := GlobalServiceNames[key.ServiceName]
+       if !ok {
+               _, ok = GlobalServiceNames[key.Alias]
+       }
+       return ok
+}
+
+func IsDefaultDomainProject(domainProject string) bool {
+       return domainProject == RegistryDomainProject
+}
diff --git a/datasource/service_test.go b/datasource/service_test.go
index 6d79504..0c84147 100644
--- a/datasource/service_test.go
+++ b/datasource/service_test.go
@@ -53,7 +53,7 @@ func TestService_Register(t *testing.T) {
                                Schemas:     []string{"service-ms-schema"},
                                Paths:       paths,
                                Properties:  properties,
-                               Framework: &pb.FrameWorkProperty{
+                               Framework: &pb.FrameWork{
                                        Name:    "service-ms-frameworkName",
                                        Version: "service-ms-frameworkVersion",
                                },
diff --git a/examples/mongodb_data_struct.yaml 
b/examples/mongodb_data_struct.yaml
index d82eab9..c30a46f 100644
--- a/examples/mongodb_data_struct.yaml
+++ b/examples/mongodb_data_struct.yaml
@@ -23,7 +23,7 @@
 #  ModTimestamp string             `protobuf:"bytes,15,opt,name=modTimestamp" 
json:"modTimestamp,omitempty" bson:"mod_timestamp"`
 #  Environment  string             `protobuf:"bytes,16,opt,name=environment" 
json:"environment,omitempty" bson:"env"`
 #  RegisterBy   string             `protobuf:"bytes,17,opt,name=registerBy" 
json:"registerBy,omitempty" bson:"register_by"`
-#  Framework    *FrameWorkProperty `protobuf:"bytes,18,opt,name=framework" 
json:"framework,omitempty"`
+#  Framework    *FrameWork `protobuf:"bytes,18,opt,name=framework" 
json:"framework,omitempty"`
 #}
 
 #collection: service
diff --git a/go.mod b/go.mod
index 2cf2973..da0cb2d 100644
--- a/go.mod
+++ b/go.mod
@@ -15,10 +15,10 @@ require (
        github.com/dgrijalva/jwt-go v3.2.0+incompatible
        github.com/elithrar/simple-scrypt v1.3.0
        github.com/ghodss/yaml v1.0.0
-       github.com/go-chassis/cari v0.4.1-0.20210601163026-bb6a506e336a
+       github.com/go-chassis/cari v0.5.0
        github.com/go-chassis/foundation v0.3.1-0.20210513015331-b54416b66bcd
        github.com/go-chassis/go-archaius v1.5.1
-       github.com/go-chassis/go-chassis/v2 v2.2.1-0.20210624120130-77f4a4157de6
+       github.com/go-chassis/go-chassis/v2 v2.2.1-0.20210630123055-6b4c31c5ad02
        github.com/go-chassis/kie-client v0.1.0
        github.com/golang/protobuf v1.4.3
        github.com/gorilla/websocket v1.4.3-0.20210424162022-e8629af678b7
diff --git a/go.sum b/go.sum
index 93e1175..5deafc7 100644
--- a/go.sum
+++ b/go.sum
@@ -165,6 +165,8 @@ github.com/go-chassis/cari 
v0.0.0-20201210041921-7b6fbef2df11/go.mod h1:MgtsEI0A
 github.com/go-chassis/cari v0.4.0/go.mod 
h1:av/19fqwEP4eOC8unL/z67AAbFDwXUCko6SKa4Avrd8=
 github.com/go-chassis/cari v0.4.1-0.20210601163026-bb6a506e336a 
h1:vIG+7IEYeeswrPK8/SM6rDK312M7/7N7sLlYcJ1j6AQ=
 github.com/go-chassis/cari v0.4.1-0.20210601163026-bb6a506e336a/go.mod 
h1:av/19fqwEP4eOC8unL/z67AAbFDwXUCko6SKa4Avrd8=
+github.com/go-chassis/cari v0.5.0 
h1:KMkHtVJuFeqd9NtlcJm27ZBJYhQja909+rgR5CaCs00=
+github.com/go-chassis/cari v0.5.0/go.mod 
h1:av/19fqwEP4eOC8unL/z67AAbFDwXUCko6SKa4Avrd8=
 github.com/go-chassis/foundation v0.2.2-0.20201210043510-9f6d3de40234/go.mod 
h1:2PjwqpVwYEVaAldl5A58a08viH8p27pNeYaiE3ZxOBA=
 github.com/go-chassis/foundation v0.2.2/go.mod 
h1:2PjwqpVwYEVaAldl5A58a08viH8p27pNeYaiE3ZxOBA=
 github.com/go-chassis/foundation v0.3.0/go.mod 
h1:2PjwqpVwYEVaAldl5A58a08viH8p27pNeYaiE3ZxOBA=
@@ -174,6 +176,8 @@ github.com/go-chassis/go-archaius v1.5.1 
h1:1FrNyzzmD6o6BIjPF8uQ4Cc+u7qYIgQTpDk8
 github.com/go-chassis/go-archaius v1.5.1/go.mod 
h1:QPwvvtBxvwiC48rmydoAqxopqOr93RCQ6syWsIkXPXQ=
 github.com/go-chassis/go-chassis/v2 v2.2.1-0.20210624120130-77f4a4157de6 
h1:jya7lekMZBG/2H+PlG79Px5D7DQyITp7gjfi015nf9k=
 github.com/go-chassis/go-chassis/v2 
v2.2.1-0.20210624120130-77f4a4157de6/go.mod 
h1:xB09l3WEWp1gncinwDMo0G7n6j826Dp0UyuJ0Tu8axI=
+github.com/go-chassis/go-chassis/v2 v2.2.1-0.20210630123055-6b4c31c5ad02 
h1:biwxeKtaF7Bb9A25YsC6sUCJsYWPEy7E13EnCD87RSo=
+github.com/go-chassis/go-chassis/v2 
v2.2.1-0.20210630123055-6b4c31c5ad02/go.mod 
h1:En6f0eHHR3IfnLjboMjsddhrt/WUqQmFKzNgwbVj7WY=
 github.com/go-chassis/go-restful-swagger20 v1.0.3 
h1:kWfeLwMwJZVkXP1zNyFpkmR41UZ55UTcOptTteXhvEs=
 github.com/go-chassis/go-restful-swagger20 v1.0.3/go.mod 
h1:eW62fYuzlNFDvIacB6AV8bhUDCTy4myfTCv0bT9Gbb0=
 github.com/go-chassis/kie-client v0.0.0-20201210060018-938c7680a9ab/go.mod 
h1:UTdbtyN5ge/v9DmQzdVRxQP7z51Q4z6hyl+W6ZpUHFM=
diff --git a/pkg/metrics/common.go b/pkg/prometheus/common.go
similarity index 70%
rename from pkg/metrics/common.go
rename to pkg/prometheus/common.go
index 56b4d47..239b602 100644
--- a/pkg/metrics/common.go
+++ b/pkg/prometheus/common.go
@@ -15,23 +15,13 @@
  * limitations under the License.
  */
 
-package metrics
+package prometheus
 
 import (
-       helper "github.com/apache/servicecomb-service-center/pkg/prometheus"
-       "github.com/prometheus/client_golang/prometheus"
        dto "github.com/prometheus/client_model/go"
 )
 
-// keys of gauge
-const (
-       KeyServiceTotal  = "service_total"
-       KeyInstanceTotal = "instance_total"
-
-       SubSystem = "db"
-)
-
-func getValue(name string, labels prometheus.Labels) float64 {
+func getValue(name string, labels map[string]string, getV func(m *dto.Metric) 
float64) float64 {
        f := Family(name)
        if f == nil {
                return 0
@@ -42,16 +32,24 @@ func getValue(name string, labels prometheus.Labels) 
float64 {
                if !matchAll && !MatchLabels(m, labels) {
                        continue
                }
-               sum += m.GetGauge().GetValue()
+               sum += getV(m)
        }
        return sum
 }
 
-func GaugeValue(name string, labels prometheus.Labels) int64 {
-       return int64(getValue(name, labels))
+func GaugeValue(name string, labels map[string]string) float64 {
+       return getValue(name, labels, func(m *dto.Metric) float64 {
+               return m.GetGauge().GetValue()
+       })
+}
+
+func CounterValue(name string, labels map[string]string) float64 {
+       return getValue(name, labels, func(m *dto.Metric) float64 {
+               return m.GetCounter().GetValue()
+       })
 }
 
-func MatchLabels(m *dto.Metric, labels prometheus.Labels) bool {
+func MatchLabels(m *dto.Metric, labels map[string]string) bool {
        count := 0
        for _, label := range m.GetLabel() {
                v, ok := labels[label.GetName()]
@@ -66,12 +64,12 @@ func MatchLabels(m *dto.Metric, labels prometheus.Labels) 
bool {
 }
 
 func Family(name string) *dto.MetricFamily {
-       families, err := helper.Gather()
+       families, err := Gather()
        if err != nil {
                return nil
        }
        for _, f := range families {
-               if f.GetName() == familyNamePrefix+name {
+               if f.GetName() == name {
                        return f
                }
        }
diff --git a/pkg/prometheus/decorator.go b/pkg/prometheus/decorator.go
index 318c456..d7ce170 100644
--- a/pkg/prometheus/decorator.go
+++ b/pkg/prometheus/decorator.go
@@ -18,9 +18,13 @@
 package prometheus
 
 import (
+       "net/http"
+
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
+       "github.com/go-chassis/go-chassis/v2/pkg/metrics"
        "github.com/prometheus/client_golang/prometheus"
+       "github.com/prometheus/client_golang/prometheus/promhttp"
        dto "github.com/prometheus/client_model/go"
 )
 
@@ -31,7 +35,7 @@ func registerMetrics(name string, vec prometheus.Collector) {
        if _, ok := Vectors[name]; ok {
                log.Warnf("found duplicate metrics name[%s], override!", name)
        }
-       if err := prometheus.Register(vec); err != nil {
+       if err := metrics.GetSystemPrometheusRegistry().Register(vec); err != 
nil {
                log.Fatalf(err, "register prometheus metrics[%s] failed", name)
        }
        Vectors[name] = vec
@@ -59,5 +63,9 @@ func NewSummaryVec(opts prometheus.SummaryOpts, labelNames 
[]string) *prometheus
 }
 
 func Gather() ([]*dto.MetricFamily, error) {
-       return prometheus.DefaultGatherer.Gather()
+       return metrics.GetSystemPrometheusRegistry().Gather()
+}
+
+func HTTPHandler() http.Handler {
+       return promhttp.HandlerFor(metrics.GetSystemPrometheusRegistry(), 
promhttp.HandlerOpts{})
 }
diff --git a/scctl/pkg/model/types.go b/scctl/pkg/model/types.go
index c21719e..ec85fd0 100644
--- a/scctl/pkg/model/types.go
+++ b/scctl/pkg/model/types.go
@@ -43,7 +43,7 @@ type Service struct {
        AppId         string
        ServiceName   string
        Versions      []string
-       Frameworks    []*discovery.FrameWorkProperty
+       Frameworks    []*discovery.FrameWork
        Endpoints     []string
        Timestamp     int64 // the seconds from 0 to now
 }
@@ -52,7 +52,7 @@ func (s *Service) AppendVersion(v string) {
        s.Versions = append(s.Versions, v)
 }
 
-func (s *Service) AppendFramework(property *discovery.FrameWorkProperty) {
+func (s *Service) AppendFramework(property *discovery.FrameWork) {
        if property == nil || property.Name == "" {
                return
        }
@@ -90,7 +90,7 @@ type Instance struct {
        AppId         string
        ServiceName   string
        Version       string
-       Framework     *discovery.FrameWorkProperty
+       Framework     *discovery.FrameWork
        Lease         int64 // seconds
        Timestamp     int64 // the seconds from 0 to now
 }
diff --git a/scctl/pkg/plugin/get/schema/schema_cmd.go 
b/scctl/pkg/plugin/get/schema/schema_cmd.go
index f1a9bb5..a783a80 100644
--- a/scctl/pkg/plugin/get/schema/schema_cmd.go
+++ b/scctl/pkg/plugin/get/schema/schema_cmd.go
@@ -18,6 +18,7 @@ package schema
 import (
        "context"
        "fmt"
+       "github.com/apache/servicecomb-service-center/datasource"
        "io"
        "io/ioutil"
        "os"
@@ -33,7 +34,6 @@ import (
        "github.com/apache/servicecomb-service-center/scctl/pkg/cmd"
        "github.com/apache/servicecomb-service-center/scctl/pkg/model"
        "github.com/apache/servicecomb-service-center/scctl/pkg/plugin/get"
-       "github.com/apache/servicecomb-service-center/server/core"
        "github.com/spf13/cobra"
 )
 
@@ -71,10 +71,10 @@ func saveDirectory(root string, ms *dump.Microservice) 
string {
                return ""
        }
        domain, project := util.FromDomainProject(model.GetDomainProject(ms))
-       if domain == core.RegistryDomain {
+       if domain == datasource.RegistryDomain {
                domain = ""
        }
-       if project == core.RegistryDomain {
+       if project == datasource.RegistryDomain {
                project = ""
        }
        return filepath.Join(root, "schemas", domain, project, 
ms.Value.Environment, ms.Value.AppId, 
ms.Value.ServiceName+".v"+ms.Value.Version)
diff --git a/server/core/microservice.go b/server/core/microservice.go
index 10e936c..6661dbf 100644
--- a/server/core/microservice.go
+++ b/server/core/microservice.go
@@ -21,6 +21,7 @@ import (
        "context"
        "strings"
 
+       "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/proto"
        "github.com/apache/servicecomb-service-center/pkg/util"
        "github.com/apache/servicecomb-service-center/server/config"
@@ -29,18 +30,12 @@ import (
 )
 
 var (
-       ServiceAPI         proto.ServiceCtrlServer
-       Service            *discovery.MicroService
-       Instance           *discovery.MicroServiceInstance
-       globalServiceNames map[string]struct{}
+       ServiceAPI proto.ServiceCtrlServer
+       Service    *discovery.MicroService
+       Instance   *discovery.MicroServiceInstance
 )
 
 const (
-       RegistryDomain        = "default"
-       RegistryProject       = "default"
-       RegistryDomainProject = "default/default"
-
-       RegistryAppID        = "default"
        RegistryServiceName  = "SERVICECENTER"
        RegistryServiceAlias = "SERVICECENTER"
 
@@ -57,7 +52,7 @@ func init() {
 func prepareSelfRegistration() {
        Service = &discovery.MicroService{
                Environment: discovery.ENV_PROD,
-               AppId:       RegistryAppID,
+               AppId:       datasource.RegistryAppID,
                ServiceName: RegistryServiceName,
                Alias:       RegistryServiceAlias,
                Version:     version.Ver().Version,
@@ -87,36 +82,17 @@ func prepareSelfRegistration() {
 
 func AddDefaultContextValue(ctx context.Context) context.Context {
        return util.WithNoCache(util.SetContext(util.SetDomainProject(ctx,
-               RegistryDomain, RegistryProject),
+               datasource.RegistryDomain, datasource.RegistryProject),
                CtxScSelf, true))
 }
 
-func IsDefaultDomainProject(domainProject string) bool {
-       return domainProject == RegistryDomainProject
-}
-
 func RegisterGlobalServices() {
-       globalServiceNames = make(map[string]struct{})
        for _, s := range strings.Split(config.GetRegistry().GlobalVisible, 
",") {
                if len(s) > 0 {
-                       globalServiceNames[s] = struct{}{}
+                       datasource.RegisterGlobalService(s)
                }
        }
-       globalServiceNames[Service.ServiceName] = struct{}{}
-}
-
-func IsGlobal(key *discovery.MicroServiceKey) bool {
-       if !IsDefaultDomainProject(key.Tenant) {
-               return false
-       }
-       if key.AppId != RegistryAppID {
-               return false
-       }
-       _, ok := globalServiceNames[key.ServiceName]
-       if !ok {
-               _, ok = globalServiceNames[key.Alias]
-       }
-       return ok
+       datasource.RegisterGlobalService(Service.ServiceName)
 }
 
 func IsSCInstance(ctx context.Context) bool {
diff --git a/server/core/microservice_test.go b/server/core/microservice_test.go
index 5e57650..ecf6f52 100644
--- a/server/core/microservice_test.go
+++ b/server/core/microservice_test.go
@@ -17,6 +17,7 @@ package core
 
 import (
        "context"
+       "github.com/apache/servicecomb-service-center/datasource"
        "testing"
 
        "github.com/apache/servicecomb-service-center/server/config"
@@ -58,28 +59,28 @@ func TestPrepareSelfRegistration(t *testing.T) {
 
 func TestSetSharedMode(t *testing.T) {
        RegisterGlobalServices()
-       if IsGlobal(&discovery.MicroServiceKey{}) {
+       if datasource.IsGlobal(&discovery.MicroServiceKey{}) {
                t.Fatalf("TestSetSharedMode failed")
        }
-       if IsGlobal(&discovery.MicroServiceKey{Tenant: "default"}) {
+       if datasource.IsGlobal(&discovery.MicroServiceKey{Tenant: "default"}) {
                t.Fatalf("TestSetSharedMode failed")
        }
-       if IsGlobal(&discovery.MicroServiceKey{Tenant: "default/default"}) {
+       if datasource.IsGlobal(&discovery.MicroServiceKey{Tenant: 
"default/default"}) {
                t.Fatalf("TestSetSharedMode failed")
        }
-       if IsGlobal(&discovery.MicroServiceKey{Tenant: "default/default", 
AppId: "default"}) {
+       if datasource.IsGlobal(&discovery.MicroServiceKey{Tenant: 
"default/default", AppId: "default"}) {
                t.Fatalf("TestSetSharedMode failed")
        }
 
        config.Server.Config.GlobalVisible = "shared"
        RegisterGlobalServices()
-       if IsGlobal(&discovery.MicroServiceKey{Tenant: "default/default", 
AppId: "default", ServiceName: "no-shared"}) {
+       if datasource.IsGlobal(&discovery.MicroServiceKey{Tenant: 
"default/default", AppId: "default", ServiceName: "no-shared"}) {
                t.Fatalf("TestSetSharedMode failed")
        }
-       if !IsGlobal(&discovery.MicroServiceKey{Tenant: "default/default", 
AppId: "default", ServiceName: "shared"}) {
+       if !datasource.IsGlobal(&discovery.MicroServiceKey{Tenant: 
"default/default", AppId: "default", ServiceName: "shared"}) {
                t.Fatalf("TestSetSharedMode failed")
        }
-       if !IsGlobal(&discovery.MicroServiceKey{Tenant: "default/default", 
AppId: "default", Alias: "shared"}) {
+       if !datasource.IsGlobal(&discovery.MicroServiceKey{Tenant: 
"default/default", AppId: "default", Alias: "shared"}) {
                t.Fatalf("TestSetSharedMode failed")
        }
 }
diff --git a/server/handler/context/v3.go b/server/handler/context/v3.go
index 14f9bae..4190ed1 100644
--- a/server/handler/context/v3.go
+++ b/server/handler/context/v3.go
@@ -21,8 +21,8 @@ import (
        "net/http"
        "strings"
 
+       "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/util"
-       "github.com/apache/servicecomb-service-center/server/core"
 )
 
 type v3Context struct {
@@ -50,6 +50,6 @@ func (v *v3Context) Write(r *http.Request) {
        }
 
        if len(project) == 0 {
-               util.SetRequestContext(r, util.CtxProject, core.RegistryProject)
+               util.SetRequestContext(r, util.CtxProject, 
datasource.RegistryProject)
        }
 }
diff --git a/server/handler/context/v4.go b/server/handler/context/v4.go
index 8ffca5f..f953c2c 100644
--- a/server/handler/context/v4.go
+++ b/server/handler/context/v4.go
@@ -21,8 +21,8 @@ import (
        "net/http"
        "strings"
 
+       "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/util"
-       "github.com/apache/servicecomb-service-center/server/core"
 )
 
 type v4Context struct {
@@ -48,7 +48,7 @@ func (v *v4Context) Write(r *http.Request) {
        if len(project) == 0 {
                project = r.URL.Query().Get(":project")
                if len(project) == 0 {
-                       project = core.RegistryProject
+                       project = datasource.RegistryProject
                }
                util.SetRequestContext(r, util.CtxProject, project)
        }
diff --git a/server/metrics/meta.go b/server/metrics/meta.go
index 7d17744..eaf7903 100644
--- a/server/metrics/meta.go
+++ b/server/metrics/meta.go
@@ -18,144 +18,136 @@
 package metrics
 
 import (
-       "strings"
        "time"
 
-       "github.com/apache/servicecomb-service-center/pkg/metrics"
-       helper "github.com/apache/servicecomb-service-center/pkg/prometheus"
-       "github.com/apache/servicecomb-service-center/pkg/util"
+       "github.com/apache/servicecomb-service-center/pkg/log"
+       metricsvc "github.com/apache/servicecomb-service-center/pkg/metrics"
+       promutil "github.com/apache/servicecomb-service-center/pkg/prometheus"
+       "github.com/go-chassis/go-chassis/v2/pkg/metrics"
        "github.com/prometheus/client_golang/prometheus"
 )
 
-// keys of gauge
 const (
-       KeyDomainTotal    = "domain_total"
-       KeySchemaTotal    = "schema_total"
-       KeyFrameworkTotal = "framework_total"
+       SubSystem            = "db"
+       KeyServiceTotal      = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"service_total"
+       KeyInstanceTotal     = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"instance_total"
+       KeyDomainTotal       = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"domain_total"
+       KeySchemaTotal       = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"schema_total"
+       KeyFrameworkTotal    = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"framework_total"
+       KeyHeartbeatTotal    = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"heartbeat_total"
+       KeyHeartbeatDuration = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"heartbeat_durations_microseconds"
+       KeySCTotal           = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"sc_total"
 )
 
-// Key return metrics key
-func Key(name string) string {
-       return util.StringJoin([]string{metrics.SubSystem, name}, "_")
-}
-
-var (
-       domainCounter = helper.NewGaugeVec(
-               prometheus.GaugeOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: metrics.SubSystem,
-                       Name:      KeyDomainTotal,
-                       Help:      "Gauge of domain created in Service Center",
-               }, []string{"instance"})
-
-       serviceCounter = helper.NewGaugeVec(
-               prometheus.GaugeOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: "db",
-                       Name:      metrics.KeyServiceTotal,
-                       Help:      "Gauge of microservice created in Service 
Center",
-               }, []string{"instance", "framework", "frameworkVersion", 
"domain"})
-
-       instanceCounter = helper.NewGaugeVec(
-               prometheus.GaugeOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: metrics.SubSystem,
-                       Name:      metrics.KeyInstanceTotal,
-                       Help:      "Gauge of microservice created in Service 
Center",
-               }, []string{"instance", "domain"})
-
-       schemaCounter = helper.NewGaugeVec(
-               prometheus.GaugeOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: metrics.SubSystem,
-                       Name:      KeySchemaTotal,
-                       Help:      "Gauge of schema created in Service Center",
-               }, []string{"instance", "domain"})
-
-       frameworkCounter = helper.NewGaugeVec(
-               prometheus.GaugeOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: metrics.SubSystem,
-                       Name:      KeyFrameworkTotal,
-                       Help:      "Gauge of client framework info in Service 
Center",
-               }, metrics.ToLabelNames(Framework{}))
-
-       scCounter = helper.NewCounterVec(
-               prometheus.CounterOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: "db",
-                       Name:      "sc_total",
-                       Help:      "Counter of the Service Center instance",
-               }, []string{"instance"})
-
-       heartbeatCounter = helper.NewCounterVec(
-               prometheus.CounterOpts{
-                       Namespace: metrics.FamilyName,
-                       Subsystem: "db",
-                       Name:      "heartbeat_total",
-                       Help:      "Counter of heartbeat renew",
-               }, []string{"instance", "status"})
-
-       heartbeatLatency = helper.NewSummaryVec(
-               prometheus.SummaryOpts{
-                       Namespace:  metrics.FamilyName,
-                       Subsystem:  "db",
-                       Name:       "heartbeat_durations_microseconds",
-                       Help:       "Latency of heartbeat renew",
-                       Objectives: metrics.Pxx,
-               }, []string{"instance", "status"})
-)
-
-// Framework return framework info.
-type Framework struct {
-       DomainName       string `json:"domainName"`
-       ProjectName      string `json:"projectName"`
-       FrameWork        string `json:"framework"`
-       FrameworkVersion string `json:"frameworkVersion"`
-}
-
-func ReportDomains(c float64) {
-       instance := metrics.InstanceName()
-       domainCounter.WithLabelValues(instance).Add(c)
+var metaEnabled = false
+
+func InitMetaMetrics() (err error) {
+       defer func() {
+               if err != nil {
+                       log.Error("init metadata metrics failed", err)
+               } else {
+                       metaEnabled = true
+               }
+       }()
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyDomainTotal,
+               Help:   "Gauge of domain created in Service Center",
+               Labels: []string{"instance"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyServiceTotal,
+               Help:   "Gauge of microservice created in Service Center",
+               Labels: []string{"instance", "framework", "frameworkVersion", 
"domain", "project"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyInstanceTotal,
+               Help:   "Gauge of microservice instance created in Service 
Center",
+               Labels: []string{"instance", "framework", "frameworkVersion", 
"domain", "project"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeySchemaTotal,
+               Help:   "Counter of schema created in Service Center",
+               Labels: []string{"instance", "domain", "project"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyFrameworkTotal,
+               Help:   "Gauge of client framework info in Service Center",
+               Labels: []string{"instance", "framework", "frameworkVersion", 
"domain", "project"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeySCTotal,
+               Help:   "Counter of the Service Center instance",
+               Labels: []string{"instance"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateCounter(metrics.CounterOpts{
+               Key:    KeyHeartbeatTotal,
+               Help:   "Counter of heartbeat renew",
+               Labels: []string{"instance", "status"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateSummary(metrics.SummaryOpts{
+               Key:        KeyHeartbeatDuration,
+               Help:       "Latency of heartbeat renew",
+               Labels:     []string{"instance", "status"},
+               Objectives: metricsvc.Pxx,
+       }); err != nil {
+               return
+       }
+       return
 }
 
-func ReportServices(domain, framework, frameworkVersion string, c float64) {
-       instance := metrics.InstanceName()
-       serviceCounter.WithLabelValues(instance, framework, frameworkVersion, 
domain).Add(c)
-}
-func GetTotalService(domain string) int64 {
-       return metrics.GaugeValue(strings.Join([]string{metrics.SubSystem, 
metrics.KeyServiceTotal}, "_"), prometheus.Labels{"domain": domain})
-}
-func ReportInstances(domain string, c float64) {
-       instance := metrics.InstanceName()
-       instanceCounter.WithLabelValues(instance, domain).Add(c)
-}
-func GetTotalInstance(domain string) int64 {
-       mn := strings.Join([]string{metrics.SubSystem, 
metrics.KeyInstanceTotal}, "_")
-       usage := metrics.GaugeValue(mn, prometheus.Labels{"domain": domain})
-       return usage
-}
-func ReportSchemas(domain string, c float64) {
-       instance := metrics.InstanceName()
-       schemaCounter.WithLabelValues(instance, domain).Add(c)
+func GetTotalService(domain, project string) int64 {
+       labels := prometheus.Labels{"domain": domain}
+       if len(project) > 0 {
+               labels["project"] = project
+       }
+       return int64(promutil.GaugeValue(KeyServiceTotal, labels))
 }
 
-func ReportFramework(domainName, projectName string, framework, 
frameworkVersion string, c float64) {
-       frameworkCounter.WithLabelValues(domainName, projectName, framework, 
frameworkVersion).Add(c)
+func GetTotalInstance(domain, project string) int64 {
+       labels := prometheus.Labels{"domain": domain}
+       if len(project) > 0 {
+               labels["project"] = project
+       }
+       return int64(promutil.GaugeValue(KeyInstanceTotal, labels))
 }
 
 func ReportScInstance() {
-       instance := metrics.InstanceName()
-       scCounter.WithLabelValues(instance).Add(1)
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{"instance": instance}
+       if err := metrics.GaugeSet(KeySCTotal, 1, labels); err != nil {
+               log.Error("gauge set failed", err)
+       }
 }
 
 func ReportHeartbeatCompleted(err error, start time.Time) {
-       instance := metrics.InstanceName()
+       if !metaEnabled {
+               return
+       }
+       instance := metricsvc.InstanceName()
        elapsed := float64(time.Since(start).Nanoseconds()) / 
float64(time.Microsecond)
        status := success
        if err != nil {
                status = failure
        }
-       heartbeatLatency.WithLabelValues(instance, status).Observe(elapsed)
-       heartbeatCounter.WithLabelValues(instance, status).Inc()
+       labels := map[string]string{"instance": instance, "status": status}
+       if err := metrics.SummaryObserve(KeyHeartbeatDuration, elapsed, 
labels); err != nil {
+               log.Error("summary observe failed", err)
+       }
+       if err = metrics.CounterAdd(KeyHeartbeatTotal, 1, labels); err != nil {
+               log.Error("counter add failed", err)
+       }
 }
diff --git a/server/rest/metrics/prometheus.go b/server/metrics/metrics.go
similarity index 59%
copy from server/rest/metrics/prometheus.go
copy to server/metrics/metrics.go
index c96cd70..629421c 100644
--- a/server/rest/metrics/prometheus.go
+++ b/server/metrics/metrics.go
@@ -18,16 +18,29 @@
 package metrics
 
 import (
-       "github.com/apache/servicecomb-service-center/server/config"
-       "github.com/apache/servicecomb-service-center/server/rest"
-       "github.com/prometheus/client_golang/prometheus/promhttp"
+       metricsvc "github.com/apache/servicecomb-service-center/pkg/metrics"
+       "github.com/go-chassis/go-chassis/v2/pkg/metrics"
 )
 
-const exporterPrometheus = "prometheus"
+func Init(options Options) error {
+       if err := metrics.Init(); err != nil {
+               return err
+       }
+       if err := metricsvc.Init(metricsvc.Options{
+               Interval:     options.Interval,
+               InstanceName: options.Instance,
+               SysMetrics: []string{
+                       "process_resident_memory_bytes",
+                       "process_cpu_seconds_total",
+                       "go_threads",
+                       "go_goroutines",
+               },
+       }); err != nil {
+               return err
+       }
 
-func init() {
-       if config.GetString("metrics.exporter", "") != exporterPrometheus {
-               return
+       if err := InitMetaMetrics(); err != nil {
+               return err
        }
-       rest.RegisterServerHandler("/metrics", promhttp.Handler())
+       return nil
 }
diff --git a/datasource/common.go b/server/metrics/options.go
similarity index 85%
copy from datasource/common.go
copy to server/metrics/options.go
index b732eb8..701eb81 100644
--- a/datasource/common.go
+++ b/server/metrics/options.go
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package datasource
+package metrics
 
-const (
-       ServiceKeyPrefix  = "/cse-sr/ms/files"
-       InstanceKeyPrefix = "/cse-sr/inst/files"
-       SPLIT             = "/"
-)
+import "time"
+
+type Options struct {
+       Instance string
+       Interval time.Duration
+}
diff --git a/datasource/mongo/event/event.go b/server/metrics/reporter.go
similarity index 67%
copy from datasource/mongo/event/event.go
copy to server/metrics/reporter.go
index 8889e84..fe29d07 100644
--- a/datasource/mongo/event/event.go
+++ b/server/metrics/reporter.go
@@ -15,23 +15,28 @@
  * limitations under the License.
  */
 
-package event
+package metrics
 
 import (
-       "github.com/apache/servicecomb-service-center/datasource/mongo/sd"
-       "github.com/apache/servicecomb-service-center/pkg/log"
-)
+       "context"
 
-const (
-       increaseOne = 1
-       decreaseOne = -1
+       "github.com/apache/servicecomb-service-center/datasource"
+       "github.com/apache/servicecomb-service-center/pkg/log"
+       "github.com/apache/servicecomb-service-center/pkg/metrics"
 )
 
 func init() {
-       log.Info("event init")
-       instanceEventHandler := NewInstanceEventHandler()
-       
sd.EventProxy(instanceEventHandler.Type()).AddHandleFunc(instanceEventHandler.OnEvent)
-       sd.AddEventHandler(NewServiceEventHandler())
-       sd.AddEventHandler(NewSchemaSummaryEventHandler())
-       sd.AddEventHandler(NewDomainEventHandler())
+       metrics.RegisterReporter("job", &Reporter{})
+}
+
+type Reporter struct {
+}
+
+func (r *Reporter) Report() {
+       ResetMetaMetrics()
+       err := datasource.GetMetricsManager().Report(context.Background(), 
GetMetaReporter())
+       if err != nil {
+               log.Error("report metrics failed", err)
+               return
+       }
 }
diff --git a/server/metrics/reporter_meta.go b/server/metrics/reporter_meta.go
new file mode 100644
index 0000000..d8e7cca
--- /dev/null
+++ b/server/metrics/reporter_meta.go
@@ -0,0 +1,116 @@
+/*
+ * 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 metrics
+
+import (
+       "github.com/apache/servicecomb-service-center/datasource"
+       "github.com/apache/servicecomb-service-center/pkg/log"
+       metricsvc "github.com/apache/servicecomb-service-center/pkg/metrics"
+       "github.com/go-chassis/go-chassis/v2/pkg/metrics"
+)
+
+var metaReporter = &MetaReporter{}
+
+type MetaReporter struct {
+}
+
+func (m *MetaReporter) DomainAdd(delta float64) {
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance": instance,
+       }
+       if err := metrics.GaugeAdd(KeyDomainTotal, delta, labels); err != nil {
+               log.Error("gauge add failed", err)
+       }
+}
+func (m *MetaReporter) ServiceAdd(delta float64, ml datasource.MetricsLabels) {
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance":         instance,
+               "framework":        ml.Framework,
+               "frameworkVersion": ml.FrameworkVersion,
+               "domain":           ml.Domain,
+               "project":          ml.Project,
+       }
+       if err := metrics.GaugeAdd(KeyServiceTotal, delta, labels); err != nil {
+               log.Error("gauge add failed", err)
+       }
+}
+func (m *MetaReporter) InstanceAdd(delta float64, ml datasource.MetricsLabels) 
{
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance":         instance,
+               "framework":        ml.Framework,
+               "frameworkVersion": ml.FrameworkVersion,
+               "domain":           ml.Domain,
+               "project":          ml.Project,
+       }
+       if err := metrics.GaugeAdd(KeyInstanceTotal, delta, labels); err != nil 
{
+               log.Error("gauge add failed", err)
+       }
+}
+func (m *MetaReporter) SchemaAdd(delta float64, ml datasource.MetricsLabels) {
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance": instance,
+               "domain":   ml.Domain,
+               "project":  ml.Project,
+       }
+       if err := metrics.GaugeAdd(KeySchemaTotal, delta, labels); err != nil {
+               log.Error("gauge add failed", err)
+       }
+}
+func (m *MetaReporter) FrameworkSet(ml datasource.MetricsLabels) {
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance":         instance,
+               "framework":        ml.Framework,
+               "frameworkVersion": ml.FrameworkVersion,
+               "domain":           ml.Domain,
+               "project":          ml.Project,
+       }
+       if err := metrics.GaugeSet(KeyFrameworkTotal, 1, labels); err != nil {
+               log.Error("gauge set failed", err)
+       }
+}
+func GetMetaReporter() *MetaReporter {
+       return metaReporter
+}
+
+func ResetMetaMetrics() {
+       err := metrics.Reset(KeyDomainTotal)
+       if err != nil {
+               log.Error("reset metrics failed", err)
+               return
+       }
+       err = metrics.Reset(KeyServiceTotal)
+       if err != nil {
+               log.Error("reset metrics failed", err)
+               return
+       }
+       err = metrics.Reset(KeyInstanceTotal)
+       if err != nil {
+               log.Error("reset metrics failed", err)
+               return
+       }
+       err = metrics.Reset(KeySchemaTotal)
+       if err != nil {
+               log.Error("reset metrics failed", err)
+               return
+       }
+}
diff --git a/server/plugin/quota/quota.go b/server/plugin/quota/quota.go
index 1de41f3..b378ce7 100644
--- a/server/plugin/quota/quota.go
+++ b/server/plugin/quota/quota.go
@@ -150,9 +150,9 @@ func GetResourceUsage(ctx context.Context, res 
*ApplyQuotaResource) (int64, erro
        serviceID := res.ServiceID
        switch res.QuotaType {
        case TypeService:
-               return metrics.GetTotalService(util.ParseDomain(ctx)), nil
+               return metrics.GetTotalService(util.ParseDomain(ctx), ""), nil
        case TypeInstance:
-               usage := metrics.GetTotalInstance(util.ParseDomain(ctx))
+               usage := metrics.GetTotalInstance(util.ParseDomain(ctx), "")
                return usage, nil
        case TypeRule:
                {
diff --git a/server/rest/admin/service.go b/server/rest/admin/service.go
index 728c606..7986957 100644
--- a/server/rest/admin/service.go
+++ b/server/rest/admin/service.go
@@ -25,7 +25,6 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
        "github.com/apache/servicecomb-service-center/server/alarm"
-       "github.com/apache/servicecomb-service-center/server/core"
        "github.com/apache/servicecomb-service-center/version"
        "github.com/go-chassis/cari/discovery"
        "github.com/go-chassis/go-archaius"
@@ -41,7 +40,7 @@ type Service struct {
 func (service *Service) Dump(ctx context.Context, in *dump.Request) 
(*dump.Response, error) {
        domainProject := util.ParseDomainProject(ctx)
 
-       if !core.IsDefaultDomainProject(domainProject) {
+       if !datasource.IsDefaultDomainProject(domainProject) {
                return &dump.Response{
                        Response: 
discovery.CreateResponse(discovery.ErrForbidden, "Required admin permission"),
                }, nil
diff --git a/server/rest/govern/controller_v4.go 
b/server/rest/govern/controller_v4.go
index 75dd986..db07436 100644
--- a/server/rest/govern/controller_v4.go
+++ b/server/rest/govern/controller_v4.go
@@ -19,9 +19,9 @@ package govern
 
 import (
        "net/http"
-
        "strings"
 
+       "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/rest"
        "github.com/apache/servicecomb-service-center/pkg/util"
@@ -121,7 +121,7 @@ func (governService *ResourceV4) 
genLinesFromNode(withShared bool, domainProject
 }
 
 func (governService *ResourceV4) isSkipped(withShared bool, domainProject 
string, service *pb.MicroService) bool {
-       return !withShared && core.IsGlobal(pb.MicroServiceToKey(domainProject, 
service))
+       return !withShared && 
datasource.IsGlobal(pb.MicroServiceToKey(domainProject, service))
 }
 
 // GetServiceDetail 查询服务详细信息
diff --git a/server/rest/metrics/prometheus.go 
b/server/rest/metrics/prometheus.go
index c96cd70..5e2869a 100644
--- a/server/rest/metrics/prometheus.go
+++ b/server/rest/metrics/prometheus.go
@@ -18,9 +18,9 @@
 package metrics
 
 import (
+       promutil "github.com/apache/servicecomb-service-center/pkg/prometheus"
        "github.com/apache/servicecomb-service-center/server/config"
        "github.com/apache/servicecomb-service-center/server/rest"
-       "github.com/prometheus/client_golang/prometheus/promhttp"
 )
 
 const exporterPrometheus = "prometheus"
@@ -29,5 +29,5 @@ func init() {
        if config.GetString("metrics.exporter", "") != exporterPrometheus {
                return
        }
-       rest.RegisterServerHandler("/metrics", promhttp.Handler())
+       rest.RegisterServerHandler("/metrics", promutil.HTTPHandler())
 }
diff --git a/server/server.go b/server/server.go
index 7f3954f..61ce4d6 100644
--- a/server/server.go
+++ b/server/server.go
@@ -24,19 +24,18 @@ import (
        "strings"
        "time"
 
-       "github.com/apache/servicecomb-service-center/server/event"
-
        "github.com/apache/servicecomb-service-center/datasource"
        nf "github.com/apache/servicecomb-service-center/pkg/event"
        "github.com/apache/servicecomb-service-center/pkg/gopool"
        "github.com/apache/servicecomb-service-center/pkg/log"
-       "github.com/apache/servicecomb-service-center/pkg/metrics"
        "github.com/apache/servicecomb-service-center/pkg/plugin"
        "github.com/apache/servicecomb-service-center/pkg/signal"
        "github.com/apache/servicecomb-service-center/pkg/util"
        "github.com/apache/servicecomb-service-center/server/command"
        "github.com/apache/servicecomb-service-center/server/config"
        "github.com/apache/servicecomb-service-center/server/core"
+       "github.com/apache/servicecomb-service-center/server/event"
+       "github.com/apache/servicecomb-service-center/server/metrics"
        
"github.com/apache/servicecomb-service-center/server/plugin/security/tlsconf"
        "github.com/apache/servicecomb-service-center/server/service/gov"
        "github.com/apache/servicecomb-service-center/server/service/rbac"
@@ -150,14 +149,8 @@ func (s *ServiceCenterServer) initMetrics() {
        }
 
        if err := metrics.Init(metrics.Options{
-               Interval:     interval,
-               InstanceName: instance,
-               SysMetrics: []string{
-                       "process_resident_memory_bytes",
-                       "process_cpu_seconds_total",
-                       "go_threads",
-                       "go_goroutines",
-               },
+               Interval: interval,
+               Instance: instance,
        }); err != nil {
                log.Fatal("init metrics failed", err)
        }
diff --git a/server/service/disco/instance.go b/server/service/disco/instance.go
index 201ecd4..d9cd324 100644
--- a/server/service/disco/instance.go
+++ b/server/service/disco/instance.go
@@ -185,7 +185,7 @@ func ClusterHealth(ctx context.Context) 
(*pb.GetInstancesResponse, error) {
                        Response: pb.CreateResponse(pb.ErrUnhealthy, 
err.Error()),
                }, nil
        }
-       cloneContext := util.SetDomainProject(util.CloneContext(ctx), 
apt.RegistryDomain, apt.RegistryProject)
+       cloneContext := util.SetDomainProject(util.CloneContext(ctx), 
datasource.RegistryDomain, datasource.RegistryProject)
        svcResp, err := 
datasource.GetMetadataManager().ExistService(cloneContext, 
&pb.GetExistenceRequest{
                Type:        pb.ExistenceMicroservice,
                AppId:       apt.Service.AppId,
diff --git a/server/service/disco/microservice_test.go 
b/server/service/disco/microservice_test.go
index ee8eb3f..5677224 100644
--- a/server/service/disco/microservice_test.go
+++ b/server/service/disco/microservice_test.go
@@ -73,7 +73,7 @@ var _ = Describe("'Micro-service' service", func() {
                                                Schemas:     
[]string{TOO_LONG_SCHEMAID[:len(TOO_LONG_SCHEMAID)-1]},
                                                Paths:       paths,
                                                Properties:  properties,
-                                               Framework: 
&pb.FrameWorkProperty{
+                                               Framework: &pb.FrameWork{
                                                        Name:    
TOO_LONG_FRAMEWORK[:len(TOO_LONG_FRAMEWORK)-1],
                                                        Version: 
TOO_LONG_FRAMEWORK[:len(TOO_LONG_FRAMEWORK)-1],
                                                },
@@ -592,7 +592,7 @@ var _ = Describe("'Micro-service' service", func() {
                                                AppId:       "default",
                                                Version:     "1.0.4",
                                                Level:       "BACK",
-                                               Framework: 
&pb.FrameWorkProperty{
+                                               Framework: &pb.FrameWork{
                                                        Version: 
TOO_LONG_FRAMEWORK,
                                                },
                                                Properties: 
make(map[string]string),
@@ -610,7 +610,7 @@ var _ = Describe("'Micro-service' service", func() {
                                                AppId:       "default",
                                                Version:     "1.0.5",
                                                Level:       "BACK",
-                                               Framework: 
&pb.FrameWorkProperty{
+                                               Framework: &pb.FrameWork{
                                                        Name: 
TOO_LONG_FRAMEWORK,
                                                },
                                                Properties: 
make(map[string]string),
@@ -628,7 +628,7 @@ var _ = Describe("'Micro-service' service", func() {
                                                AppId:       "default",
                                                Version:     "1.0.5",
                                                Level:       "BACK",
-                                               Framework: 
&pb.FrameWorkProperty{
+                                               Framework: &pb.FrameWork{
                                                        Name: "test@$",
                                                },
                                                Properties: 
make(map[string]string),
@@ -724,7 +724,7 @@ var _ = Describe("'Micro-service' service", func() {
                                                AppId:       "default",
                                                Version:     "1.0.1",
                                                Level:       "BACK",
-                                               Framework: 
&pb.FrameWorkProperty{
+                                               Framework: &pb.FrameWork{
                                                        Version: "1.0.0",
                                                },
                                                Properties: 
make(map[string]string),
@@ -742,7 +742,7 @@ var _ = Describe("'Micro-service' service", func() {
                                                AppId:       "default",
                                                Version:     "1.0.2",
                                                Level:       "BACK",
-                                               Framework: 
&pb.FrameWorkProperty{
+                                               Framework: &pb.FrameWork{
                                                        Name: "framework",
                                                },
                                                Properties: 
make(map[string]string),
diff --git a/syncer/plugins/servicecenter/transform.go 
b/syncer/plugins/servicecenter/transform.go
index 3680970..b4f7d32 100644
--- a/syncer/plugins/servicecenter/transform.go
+++ b/syncer/plugins/servicecenter/transform.go
@@ -319,9 +319,9 @@ func ServiceCopy(service *scpb.MicroService) 
*pbsc.MicroService {
                                providers[i].Version = provider.Version
                        }
                }
-               var frameWorkProperty pbsc.FrameWorkProperty
+               var frameWorkProperty pbsc.FrameWork
                if service.Framework != nil {
-                       frameWorkProperty = pbsc.FrameWorkProperty{
+                       frameWorkProperty = pbsc.FrameWork{
                                Name:    service.Framework.Name,
                                Version: service.Framework.Version,
                        }
@@ -371,9 +371,9 @@ func ServiceCopyRe(service *pbsc.MicroService) 
*scpb.MicroService {
                                providers[i].Version = provider.Version
                        }
                }
-               var frameWorkProperty scpb.FrameWorkProperty
+               var frameWorkProperty scpb.FrameWork
                if service.Framework != nil {
-                       frameWorkProperty = scpb.FrameWorkProperty{
+                       frameWorkProperty = scpb.FrameWork{
                                Name:    service.Framework.Name,
                                Version: service.Framework.Version,
                        }
diff --git a/syncer/proto/sc/servicecenter.pb.go 
b/syncer/proto/sc/servicecenter.pb.go
index 897fba4..1a2864f 100644
--- a/syncer/proto/sc/servicecenter.pb.go
+++ b/syncer/proto/sc/servicecenter.pb.go
@@ -130,7 +130,7 @@ type MicroService struct {
        ModTimestamp string             
`protobuf:"bytes,15,opt,name=modTimestamp,proto3" json:"modTimestamp,omitempty"`
        Environment  string             
`protobuf:"bytes,16,opt,name=environment,proto3" json:"environment,omitempty"`
        RegisterBy   string             
`protobuf:"bytes,17,opt,name=registerBy,proto3" json:"registerBy,omitempty"`
-       Framework    *FrameWorkProperty 
`protobuf:"bytes,18,opt,name=framework,proto3" json:"framework,omitempty"`
+       Framework    *FrameWork         
`protobuf:"bytes,18,opt,name=framework,proto3" json:"framework,omitempty"`
 }
 
 func (x *MicroService) Reset() {
@@ -284,7 +284,7 @@ func (x *MicroService) GetRegisterBy() string {
        return ""
 }
 
-func (x *MicroService) GetFramework() *FrameWorkProperty {
+func (x *MicroService) GetFramework() *FrameWork {
        if x != nil {
                return x.Framework
        }
@@ -560,7 +560,7 @@ func (x *MicroServiceKey) GetVersion() string {
        return ""
 }
 
-type FrameWorkProperty struct {
+type FrameWork struct {
        state         protoimpl.MessageState
        sizeCache     protoimpl.SizeCache
        unknownFields protoimpl.UnknownFields
@@ -569,8 +569,8 @@ type FrameWorkProperty struct {
        Version string `protobuf:"bytes,2,opt,name=version,proto3" 
json:"version,omitempty"`
 }
 
-func (x *FrameWorkProperty) Reset() {
-       *x = FrameWorkProperty{}
+func (x *FrameWork) Reset() {
+       *x = FrameWork{}
        if protoimpl.UnsafeEnabled {
                mi := &file_servicecenter_proto_msgTypes[5]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -578,13 +578,13 @@ func (x *FrameWorkProperty) Reset() {
        }
 }
 
-func (x *FrameWorkProperty) String() string {
+func (x *FrameWork) String() string {
        return protoimpl.X.MessageStringOf(x)
 }
 
-func (*FrameWorkProperty) ProtoMessage() {}
+func (*FrameWork) ProtoMessage() {}
 
-func (x *FrameWorkProperty) ProtoReflect() protoreflect.Message {
+func (x *FrameWork) ProtoReflect() protoreflect.Message {
        mi := &file_servicecenter_proto_msgTypes[5]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -596,19 +596,19 @@ func (x *FrameWorkProperty) ProtoReflect() 
protoreflect.Message {
        return mi.MessageOf(x)
 }
 
-// Deprecated: Use FrameWorkProperty.ProtoReflect.Descriptor instead.
-func (*FrameWorkProperty) Descriptor() ([]byte, []int) {
+// Deprecated: Use FrameWork.ProtoReflect.Descriptor instead.
+func (*FrameWork) Descriptor() ([]byte, []int) {
        return file_servicecenter_proto_rawDescGZIP(), []int{5}
 }
 
-func (x *FrameWorkProperty) GetName() string {
+func (x *FrameWork) GetName() string {
        if x != nil {
                return x.Name
        }
        return ""
 }
 
-func (x *FrameWorkProperty) GetVersion() string {
+func (x *FrameWork) GetVersion() string {
        if x != nil {
                return x.Version
        }
@@ -910,7 +910,7 @@ var file_servicecenter_proto_goTypes = []interface{}{
        (*MicroServiceInstance)(nil), // 2: sc.MicroServiceInstance
        (*ServicePath)(nil),          // 3: sc.ServicePath
        (*MicroServiceKey)(nil),      // 4: sc.MicroServiceKey
-       (*FrameWorkProperty)(nil),    // 5: sc.FrameWorkProperty
+       (*FrameWork)(nil),            // 5: sc.FrameWork
        (*HealthCheck)(nil),          // 6: sc.HealthCheck
        (*DataCenterInfo)(nil),       // 7: sc.DataCenterInfo
        nil,                          // 8: sc.MicroService.PropertiesEntry
@@ -923,7 +923,7 @@ var file_servicecenter_proto_depIdxs = []int32{
        8,  // 1: sc.MicroService.properties:type_name -> 
sc.MicroService.PropertiesEntry
        4,  // 2: sc.MicroService.providers:type_name -> sc.MicroServiceKey
        9,  // 3: sc.MicroService.LBStrategy:type_name -> 
sc.MicroService.LBStrategyEntry
-       5,  // 4: sc.MicroService.framework:type_name -> sc.FrameWorkProperty
+       5,  // 4: sc.MicroService.framework:type_name -> sc.FrameWork
        10, // 5: sc.MicroServiceInstance.properties:type_name -> 
sc.MicroServiceInstance.PropertiesEntry
        6,  // 6: sc.MicroServiceInstance.healthCheck:type_name -> 
sc.HealthCheck
        7,  // 7: sc.MicroServiceInstance.dataCenterInfo:type_name -> 
sc.DataCenterInfo
@@ -1002,7 +1002,7 @@ func file_servicecenter_proto_init() {
                        }
                }
                file_servicecenter_proto_msgTypes[5].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*FrameWorkProperty); i {
+                       switch v := v.(*FrameWork); i {
                        case 0:
                                return &v.state
                        case 1:
diff --git a/syncer/proto/sc/servicecenter.proto 
b/syncer/proto/sc/servicecenter.proto
index 1f42673..6738642 100644
--- a/syncer/proto/sc/servicecenter.proto
+++ b/syncer/proto/sc/servicecenter.proto
@@ -26,7 +26,7 @@ message MicroService {
   string modTimestamp = 15;
   string environment = 16;
   string registerBy = 17;
-  FrameWorkProperty framework = 18;
+  FrameWork framework = 18;
 }
 
 message MicroServiceInstance {
@@ -57,7 +57,7 @@ message MicroServiceKey {
     string version = 6;
 }
 
-message FrameWorkProperty {
+message FrameWork {
   string name = 1;
   string version = 2;
 }
diff --git a/ux/package-lock.json b/ux/package-lock.json
index 46466a1..9431ed0 100644
--- a/ux/package-lock.json
+++ b/ux/package-lock.json
@@ -14000,6 +14000,7 @@
           "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz";,
           "integrity": 
"sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
           "dev": true,
+          "optional": true,
           "requires": {
             "arr-flatten": "^1.1.0",
             "array-unique": "^0.3.2",
@@ -14018,6 +14019,7 @@
               "resolved": 
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";,
               "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
               "dev": true,
+              "optional": true,
               "requires": {
                 "is-extendable": "^0.1.0"
               }
@@ -14050,6 +14052,7 @@
           "resolved": 
"https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz";,
           "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
           "dev": true,
+          "optional": true,
           "requires": {
             "extend-shallow": "^2.0.1",
             "is-number": "^3.0.0",
@@ -14062,6 +14065,7 @@
               "resolved": 
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";,
               "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
               "dev": true,
+              "optional": true,
               "requires": {
                 "is-extendable": "^0.1.0"
               }
@@ -14117,6 +14121,7 @@
           "resolved": 
"https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz";,
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "dev": true,
+          "optional": true,
           "requires": {
             "kind-of": "^3.0.2"
           },
@@ -14126,6 +14131,7 @@
               "resolved": 
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";,
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
+              "optional": true,
               "requires": {
                 "is-buffer": "^1.1.5"
               }
@@ -14137,6 +14143,7 @@
           "resolved": 
"https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";,
           "integrity": 
"sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
           "dev": true,
+          "optional": true,
           "requires": {
             "arr-diff": "^4.0.0",
             "array-unique": "^0.3.2",
@@ -14196,6 +14203,7 @@
           "resolved": 
"https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz";,
           "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
           "dev": true,
+          "optional": true,
           "requires": {
             "is-number": "^3.0.0",
             "repeat-string": "^1.6.1"

Reply via email to