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 ef2b4d2  Optimize: Add service/instance usage metrics (#1165)
ef2b4d2 is described below

commit ef2b4d27409975c5776b2fe834864f5f4cfcd917
Author: little-cui <[email protected]>
AuthorDate: Mon Nov 8 08:47:11 2021 +0800

    Optimize: Add service/instance usage metrics (#1165)
    
    * Add service/instance usage metrics
    
    * Add service/instance usage metrics
    
    * Add UT
---
 docs/user-guides/metrics.md                        |  4 +-
 server/metrics/meta.go                             | 16 +++++
 .../metrics/{reporter_meta.go => meta_reporter.go} | 44 +++++++++++++
 server/metrics/meta_reporter_test.go               | 74 ++++++++++++++++++++++
 server/metrics/reporter.go                         | 11 +---
 test/test.go                                       | 15 +++--
 6 files changed, 147 insertions(+), 17 deletions(-)

diff --git a/docs/user-guides/metrics.md b/docs/user-guides/metrics.md
index f8f654a..a9607c0 100644
--- a/docs/user-guides/metrics.md
+++ b/docs/user-guides/metrics.md
@@ -48,9 +48,11 @@ metrics:
 |:---|:---:|:---|
 |db_heartbeat_total|counter|The total number of received instance heartbeats.|
 |db_heartbeat_durations_microseconds|summary|The latency of received instance 
heartbeats.|
-|db_service_total|counter|The total number of micro-services.|
 |db_domain_total|counter|The total number of domains.|
+|db_service_total|counter|The total number of micro-services.|
+|db_service_usage|gauge|The usage percentage of service quota.|
 |db_instance_total|counter|The total number of instances.|
+|db_instance_usage|gauge|The usage percentage of instances.|
 |db_schema_total|counter|The total number of schemas.|
 |db_framework_total|counter|The total number of SDK frameworks.|
 
diff --git a/server/metrics/meta.go b/server/metrics/meta.go
index eaf7903..909d64a 100644
--- a/server/metrics/meta.go
+++ b/server/metrics/meta.go
@@ -31,6 +31,8 @@ const (
        SubSystem            = "db"
        KeyServiceTotal      = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"service_total"
        KeyInstanceTotal     = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"instance_total"
+       KeyServiceUsage      = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"service_usage"
+       KeyInstanceUsage     = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"instance_usage"
        KeyDomainTotal       = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"domain_total"
        KeySchemaTotal       = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"schema_total"
        KeyFrameworkTotal    = metricsvc.FamilyName + "_" + SubSystem + "_" + 
"framework_total"
@@ -71,6 +73,20 @@ func InitMetaMetrics() (err error) {
                return
        }
        if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyServiceUsage,
+               Help:   "Gauge of microservice usage in Service Center",
+               Labels: []string{"instance"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
+               Key:    KeyInstanceUsage,
+               Help:   "Gauge of microservice instance usage in Service 
Center",
+               Labels: []string{"instance"},
+       }); err != nil {
+               return
+       }
+       if err = metrics.CreateGauge(metrics.GaugeOpts{
                Key:    KeySchemaTotal,
                Help:   "Counter of schema created in Service Center",
                Labels: []string{"instance", "domain", "project"},
diff --git a/server/metrics/reporter_meta.go b/server/metrics/meta_reporter.go
similarity index 75%
rename from server/metrics/reporter_meta.go
rename to server/metrics/meta_reporter.go
index d8e7cca..97ef861 100644
--- a/server/metrics/reporter_meta.go
+++ b/server/metrics/meta_reporter.go
@@ -18,9 +18,13 @@
 package metrics
 
 import (
+       "context"
+
        "github.com/apache/servicecomb-service-center/datasource"
        "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/apache/servicecomb-service-center/server/plugin/quota"
        "github.com/go-chassis/go-chassis/v2/pkg/metrics"
 )
 
@@ -51,6 +55,20 @@ func (m *MetaReporter) ServiceAdd(delta float64, ml 
datasource.MetricsLabels) {
                log.Error("gauge add failed", err)
        }
 }
+func (m *MetaReporter) ServiceUsageSet() {
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance": instance,
+       }
+       used := promutil.GaugeValue(KeyServiceTotal, labels)
+       total := float64(quota.DefaultServiceQuota)
+       if total <= 0 {
+               return
+       }
+       if err := metrics.GaugeSet(KeyServiceUsage, used/total, labels); err != 
nil {
+               log.Error("gauge set failed", err)
+       }
+}
 func (m *MetaReporter) InstanceAdd(delta float64, ml datasource.MetricsLabels) 
{
        instance := metricsvc.InstanceName()
        labels := map[string]string{
@@ -64,6 +82,20 @@ func (m *MetaReporter) InstanceAdd(delta float64, ml 
datasource.MetricsLabels) {
                log.Error("gauge add failed", err)
        }
 }
+func (m *MetaReporter) InstanceUsageSet() {
+       instance := metricsvc.InstanceName()
+       labels := map[string]string{
+               "instance": instance,
+       }
+       used := promutil.GaugeValue(KeyInstanceTotal, labels)
+       total := float64(quota.DefaultInstanceQuota)
+       if total <= 0 {
+               return
+       }
+       if err := metrics.GaugeSet(KeyInstanceUsage, used/total, labels); err 
!= nil {
+               log.Error("gauge set failed", err)
+       }
+}
 func (m *MetaReporter) SchemaAdd(delta float64, ml datasource.MetricsLabels) {
        instance := metricsvc.InstanceName()
        labels := map[string]string{
@@ -114,3 +146,15 @@ func ResetMetaMetrics() {
                return
        }
 }
+
+func ReportMetaMetrics() {
+       ResetMetaMetrics()
+       r := GetMetaReporter()
+       err := datasource.GetMetricsManager().Report(context.Background(), r)
+       if err != nil {
+               log.Error("report metrics failed", err)
+               return
+       }
+       r.ServiceUsageSet()
+       r.InstanceUsageSet()
+}
diff --git a/server/metrics/meta_reporter_test.go 
b/server/metrics/meta_reporter_test.go
new file mode 100644
index 0000000..29639da
--- /dev/null
+++ b/server/metrics/meta_reporter_test.go
@@ -0,0 +1,74 @@
+/*
+ * 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_test
+
+import (
+       "testing"
+
+       _ "github.com/apache/servicecomb-service-center/test"
+
+       "github.com/apache/servicecomb-service-center/datasource"
+       promutil "github.com/apache/servicecomb-service-center/pkg/prometheus"
+       "github.com/apache/servicecomb-service-center/server/metrics"
+       "github.com/apache/servicecomb-service-center/server/plugin/quota"
+       "github.com/stretchr/testify/assert"
+)
+
+func TestMetaReporter_ServiceUsageSet(t *testing.T) {
+       labels := map[string]string{}
+
+       reporter := metrics.MetaReporter{}
+       assert.Equal(t, float64(0), 
promutil.GaugeValue(metrics.KeyServiceUsage, labels))
+
+       old := quota.DefaultServiceQuota
+       quota.DefaultServiceQuota = 0
+       reporter.ServiceUsageSet()
+       assert.Equal(t, float64(0), 
promutil.GaugeValue(metrics.KeyServiceUsage, labels))
+       quota.DefaultServiceQuota = old
+
+       reporter.ServiceAdd(1, datasource.MetricsLabels{Domain: "D1", Project: 
"P1"})
+       reporter.ServiceUsageSet()
+       assert.Equal(t, 1/float64(quota.DefaultServiceQuota), 
promutil.GaugeValue(metrics.KeyServiceUsage, labels))
+
+       reporter.ServiceAdd(1, datasource.MetricsLabels{Domain: "D1", Project: 
"P2"})
+       reporter.ServiceAdd(1, datasource.MetricsLabels{Domain: "D2", Project: 
"P3"})
+       reporter.ServiceUsageSet()
+       assert.Equal(t, 3/float64(quota.DefaultServiceQuota), 
promutil.GaugeValue(metrics.KeyServiceUsage, labels))
+}
+
+func TestMetaReporter_InstanceUsageSet(t *testing.T) {
+       labels := map[string]string{}
+
+       reporter := metrics.MetaReporter{}
+       assert.Equal(t, float64(0), 
promutil.GaugeValue(metrics.KeyInstanceUsage, labels))
+
+       old := quota.DefaultInstanceQuota
+       quota.DefaultInstanceQuota = 0
+       reporter.InstanceUsageSet()
+       assert.Equal(t, float64(0), 
promutil.GaugeValue(metrics.KeyInstanceUsage, labels))
+       quota.DefaultInstanceQuota = old
+
+       reporter.InstanceAdd(1, datasource.MetricsLabels{Domain: "D1", Project: 
"P1"})
+       reporter.InstanceUsageSet()
+       assert.Equal(t, 1/float64(quota.DefaultInstanceQuota), 
promutil.GaugeValue(metrics.KeyInstanceUsage, labels))
+
+       reporter.InstanceAdd(1, datasource.MetricsLabels{Domain: "D1", Project: 
"P2"})
+       reporter.InstanceAdd(1, datasource.MetricsLabels{Domain: "D2", Project: 
"P3"})
+       reporter.InstanceUsageSet()
+       assert.Equal(t, 3/float64(quota.DefaultInstanceQuota), 
promutil.GaugeValue(metrics.KeyInstanceUsage, labels))
+}
diff --git a/server/metrics/reporter.go b/server/metrics/reporter.go
index fe29d07..bcab5aa 100644
--- a/server/metrics/reporter.go
+++ b/server/metrics/reporter.go
@@ -18,10 +18,6 @@
 package metrics
 
 import (
-       "context"
-
-       "github.com/apache/servicecomb-service-center/datasource"
-       "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/metrics"
 )
 
@@ -33,10 +29,5 @@ 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
-       }
+       ReportMetaMetrics()
 }
diff --git a/test/test.go b/test/test.go
index 3a42d3c..6caee42 100644
--- a/test/test.go
+++ b/test/test.go
@@ -25,6 +25,7 @@ import (
 
        "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/server/core"
+       "github.com/apache/servicecomb-service-center/server/metrics"
        "github.com/apache/servicecomb-service-center/server/service/disco"
        "github.com/go-chassis/go-archaius"
        "github.com/little-cui/etcdadpt"
@@ -32,20 +33,22 @@ import (
 
 func init() {
        var kind = "etcd"
-       archaius.Set("rbac.releaseLockAfter", "3s")
+       _ = archaius.Set("rbac.releaseLockAfter", "3s")
        if IsETCD() {
-               archaius.Set("registry.cache.mode", 0)
-               archaius.Set("discovery.kind", "etcd")
-               archaius.Set("registry.kind", "etcd")
+               _ = archaius.Set("registry.cache.mode", 0)
+               _ = archaius.Set("discovery.kind", "etcd")
+               _ = archaius.Set("registry.kind", "etcd")
        } else {
-               archaius.Set("registry.heartbeat.kind", "checker")
+               _ = archaius.Set("registry.heartbeat.kind", "checker")
                kind = "mongo"
        }
-       datasource.Init(datasource.Options{
+       _ = datasource.Init(datasource.Options{
                Config: etcdadpt.Config{
                        Kind: kind,
                },
        })
+       _ = metrics.Init(metrics.Options{})
+
        core.ServiceAPI = disco.AssembleResources()
 }
 

Reply via email to