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

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


The following commit(s) were added to refs/heads/dev by this push:
     new f9ae11cf 添加指标microservice_total,记录不区分版本的微服务数量 (#1522)
f9ae11cf is described below

commit f9ae11cfb211c490c6a9402d00f4f298be062c03
Author: hzp-excellent <[email protected]>
AuthorDate: Sat Jan 17 17:08:36 2026 +0800

    添加指标microservice_total,记录不区分版本的微服务数量 (#1522)
    
    * 添加指标microservice_total,记录不区分版本的微服务数量
---
 datasource/etcd/metrics.go      | 11 +++++++++++
 datasource/etcd/metrics_test.go |  5 +++++
 datasource/metrics.go           |  1 +
 server/metrics/meta.go          | 14 ++++++++++++--
 server/metrics/meta_reporter.go | 18 ++++++++++++++++++
 5 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/datasource/etcd/metrics.go b/datasource/etcd/metrics.go
index 37c89c2d..2d4ed894 100644
--- a/datasource/etcd/metrics.go
+++ b/datasource/etcd/metrics.go
@@ -88,6 +88,10 @@ func reportSchemas(ctx context.Context, r 
datasource.MetricsReporter) {
        }
 }
 
+func getServiceKey(service *discovery.MicroService) string {
+       return  fmt.Sprintf("%s/%s/%s", service.Environment, service.AppId, 
service.ServiceName)
+}
+
 func reportServices(ctx context.Context, r datasource.MetricsReporter) {
        key := path.GetServiceRootKey("")
        servicesResp, err := sd.Service().Search(ctx,
@@ -99,6 +103,7 @@ func reportServices(ctx context.Context, r 
datasource.MetricsReporter) {
                return
        }
        isMetricSet := false
+       recordedMetricsMicroservicesWithoutVersion := make(map[string]struct{}, 
len(servicesResp.Kvs))
        for _, keyValue := range servicesResp.Kvs {
                service := keyValue.Value.(*discovery.MicroService)
                _, domainProject := path.GetInfoFromSvcKV(keyValue.Key)
@@ -113,6 +118,11 @@ func reportServices(ctx context.Context, r 
datasource.MetricsReporter) {
                        Framework:        frameworkName,
                        FrameworkVersion: frameworkVersion,
                }
+               _, exist := 
recordedMetricsMicroservicesWithoutVersion[getServiceKey(service)]
+               if !exist {
+                       r.MicroServiceAdd(1, labels)
+                       
recordedMetricsMicroservicesWithoutVersion[getServiceKey(service)] = struct{}{}
+               }
                r.ServiceAdd(1, labels)
                instanceCount := getInstanceCount4Service(ctx, domainProject, 
service)
                r.FrameworkSet(labels)
@@ -121,6 +131,7 @@ func reportServices(ctx context.Context, r 
datasource.MetricsReporter) {
        }
        // 0也应该是有效的指标,无指标是异常场景
        if !isMetricSet {
+               r.MicroServiceAdd(0, defaultLabel)
                r.ServiceAdd(0, defaultLabel)
                r.SetFrameworkValue(0, defaultLabel)
                r.InstanceAdd(0, defaultLabel)
diff --git a/datasource/etcd/metrics_test.go b/datasource/etcd/metrics_test.go
index 28a2dbd9..c0399b47 100644
--- a/datasource/etcd/metrics_test.go
+++ b/datasource/etcd/metrics_test.go
@@ -34,6 +34,11 @@ func TestMetricsManager_Report(t *testing.T) {
        assert.True(t, len(domainTotal.Metric) == 1)
        assert.True(t, labelEqual(domainTotal.Metric[0].Label, 
map[string]string{"instance": pkgmetrics.InstanceName()}))
 
+       microserviceTotal, err := 
pkgmetrics.GetMetrics(metrics.KeyMicroserviceTotal)
+       assert.NoError(t, err)
+       assert.NotNil(t, microserviceTotal)
+       assert.True(t, labelEqual(microserviceTotal.Metric[0].Label, 
expectedLabels))
+
        serviceTotal, err := pkgmetrics.GetMetrics(metrics.KeyServiceTotal)
        assert.NoError(t, err)
        assert.NotNil(t, serviceTotal)
diff --git a/datasource/metrics.go b/datasource/metrics.go
index 8b1bf0f9..d30b9a45 100644
--- a/datasource/metrics.go
+++ b/datasource/metrics.go
@@ -28,6 +28,7 @@ type MetricsLabels struct {
 
 type MetricsReporter interface {
        DomainAdd(delta float64)
+       MicroServiceAdd(delta float64, labels MetricsLabels)
        ServiceAdd(delta float64, labels MetricsLabels)
        InstanceAdd(delta float64, labels MetricsLabels)
        SchemaAdd(delta float64, labels MetricsLabels)
diff --git a/server/metrics/meta.go b/server/metrics/meta.go
index 909d64a5..5f8029e9 100644
--- a/server/metrics/meta.go
+++ b/server/metrics/meta.go
@@ -28,7 +28,10 @@ import (
 )
 
 const (
-       SubSystem            = "db"
+       SubSystem = "db"
+       // 微服务数量:环境-应用-服务名称 相同的认为是同一个服务
+       KeyMicroserviceTotal = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"microservice_total"
+       // 微服务版本数量:环境-应用-服务名称-版本
        KeyServiceTotal      = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"service_total"
        KeyInstanceTotal     = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"instance_total"
        KeyServiceUsage      = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"service_usage"
@@ -58,9 +61,16 @@ func InitMetaMetrics() (err error) {
        }); err != nil {
                return
        }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyMicroserviceTotal,
+               Help:   "Gauge of version-independent microservice created in 
Service Center",
+               Labels: []string{"instance", "framework", "frameworkVersion", 
"domain", "project"},
+       }); err != nil {
+               return
+       }
        if err = metrics.CreateGauge(metrics.GaugeOpts{
                Key:    KeyServiceTotal,
-               Help:   "Gauge of microservice created in Service Center",
+               Help:   "Gauge of microservice with version created in Service 
Center",
                Labels: []string{"instance", "framework", "frameworkVersion", 
"domain", "project"},
        }); err != nil {
                return
diff --git a/server/metrics/meta_reporter.go b/server/metrics/meta_reporter.go
index 284da7dc..e33b06f0 100644
--- a/server/metrics/meta_reporter.go
+++ b/server/metrics/meta_reporter.go
@@ -43,6 +43,19 @@ func (m *MetaReporter) DomainAdd(delta float64) {
                log.Error("gauge add failed", err)
        }
 }
+func (m *MetaReporter) MicroServiceAdd(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(KeyMicroserviceTotal, 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{
@@ -135,6 +148,11 @@ func ResetMetaMetrics() {
                log.Error("reset metrics failed", err)
                return
        }
+       err = metrics.Reset(KeyMicroserviceTotal)
+       if err != nil {
+               log.Error("reset metrics failed", err)
+               return
+       }
        err = metrics.Reset(KeyServiceTotal)
        if err != nil {
                log.Error("reset metrics failed", err)

Reply via email to