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