You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/11/08 00:47:19 UTC

[servicecomb-service-center] branch master updated: Optimize: Add service/instance usage metrics (#1165)

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 <su...@qq.com>
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()
 }