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 2020/01/14 01:08:38 UTC

[servicecomb-service-center] branch master updated: add prometheus for framework, easy to get data from prometheus record (#623)

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 214b429  add prometheus for framework, easy to get data from prometheus record (#623)
214b429 is described below

commit 214b429503ec8927d84285be411c4811daecdbed
Author: aseTo2016 <14...@qq.com>
AuthorDate: Tue Jan 14 09:08:32 2020 +0800

    add prometheus for framework, easy to get data from prometheus record (#623)
    
    * add prometheus for framework, easy to get data from prometheus record
    
    * add prometheus for framework, easy to get data from prometheus record
    
    * add prometheus for framework, easy to get data from prometheus record
    
    * add prometheus for framework, easy to get data from prometheus record
---
 server/metric/metrics.go          | 47 ++++++++++++++++++++++++++++++++++++++-
 server/metric/metrics_test.go     | 23 +++++++++++++++++++
 server/service/metrics/metrics.go | 26 +++++++++++++++++-----
 3 files changed, 90 insertions(+), 6 deletions(-)

diff --git a/server/metric/metrics.go b/server/metric/metrics.go
index 4987d7c..ea4c01b 100644
--- a/server/metric/metrics.go
+++ b/server/metric/metrics.go
@@ -17,9 +17,11 @@
 package metric
 
 import (
+	"reflect"
+	"strings"
+
 	"github.com/apache/servicecomb-service-center/pkg/buffer"
 	dto "github.com/prometheus/client_model/go"
-	"strings"
 )
 
 func NewMetrics() *Metrics {
@@ -119,3 +121,46 @@ func (cm *Metrics) Summary(key string) (sum float64) {
 	}
 	return
 }
+
+const (
+	tagJson = "json"
+)
+
+// ToRawData parses result form labels
+func ToRawData(result interface{}, labels []*dto.LabelPair) {
+	t := reflect.TypeOf(result)
+	if t.Kind() != reflect.Ptr {
+		return
+	}
+
+	elem := t.Elem()
+	value := reflect.ValueOf(result).Elem()
+
+	for i := 0; i < elem.NumField(); i++ {
+		if elem.Field(i).Type.Kind() != reflect.String {
+			continue
+		}
+		tag := elem.Field(i).Tag.Get(tagJson)
+		for _, label := range labels {
+			if *label.Name == tag {
+				value.Field(i).SetString(*label.Value)
+			}
+		}
+	}
+}
+
+// ToLabelNames returns label names, count is special label of v of func ForEach
+func ToLabelNames(structure interface{}) []string {
+	t := reflect.TypeOf(structure)
+	if t.Kind() != reflect.Struct {
+		return nil
+	}
+
+	num := t.NumField()
+	labelNames := make([]string, 0, num)
+	for i := 0; i < num; i++ {
+		tag := t.Field(i).Tag.Get(tagJson)
+		labelNames = append(labelNames, tag)
+	}
+	return labelNames
+}
diff --git a/server/metric/metrics_test.go b/server/metric/metrics_test.go
index 2720369..fd678c5 100644
--- a/server/metric/metrics_test.go
+++ b/server/metric/metrics_test.go
@@ -18,6 +18,7 @@ package metric
 
 import (
 	dto "github.com/prometheus/client_model/go"
+	"reflect"
 	"testing"
 )
 
@@ -93,3 +94,25 @@ func TestDetails_ForEach(t *testing.T) {
 		t.Fatalf("TestMetrics_ForEach failed")
 	}
 }
+
+func TestToRawData(t *testing.T) {
+	type Hello struct {
+		A string `json:"a"`
+	}
+	result := new(Hello)
+	a := "a"
+	b := "b"
+	labels := []*dto.LabelPair{
+		{Name: &a, Value: &b},
+	}
+	ToRawData(result, labels)
+
+	if result.A != "b" {
+		t.Fatalf("To raw data failed, %v", *result)
+	}
+
+	data := ToLabelNames(Hello{})
+	if !reflect.DeepEqual(data, []string{"a"}) {
+		t.Fatalf("to label names failed")
+	}
+}
diff --git a/server/service/metrics/metrics.go b/server/service/metrics/metrics.go
index 018e8c0..2e99f3d 100644
--- a/server/service/metrics/metrics.go
+++ b/server/service/metrics/metrics.go
@@ -17,6 +17,7 @@
 package metrics
 
 import (
+	"github.com/apache/servicecomb-service-center/pkg/util"
 	"github.com/apache/servicecomb-service-center/server/metric"
 	"github.com/prometheus/client_golang/prometheus"
 )
@@ -28,13 +29,20 @@ const (
 	KeyInstanceTotal  = "instance_total"
 	KeySchemaTotal    = "schema_total"
 	KeyFrameworkTotal = "framework_total"
+
+	SubSystem = "db"
 )
 
+// Key return metrics key
+func Key(name string) string {
+	return util.StringJoin([]string{SubSystem, name}, "_")
+}
+
 var (
 	domainCounter = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
 			Namespace: metric.FamilyName,
-			Subsystem: "db",
+			Subsystem: SubSystem,
 			Name:      KeyDomainTotal,
 			Help:      "Gauge of domain created in Service Center",
 		}, []string{"instance"})
@@ -50,7 +58,7 @@ var (
 	instanceCounter = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
 			Namespace: metric.FamilyName,
-			Subsystem: "db",
+			Subsystem: SubSystem,
 			Name:      KeyInstanceTotal,
 			Help:      "Gauge of microservice created in Service Center",
 		}, []string{"instance", "domain"})
@@ -58,7 +66,7 @@ var (
 	schemaCounter = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
 			Namespace: metric.FamilyName,
-			Subsystem: "db",
+			Subsystem: SubSystem,
 			Name:      KeySchemaTotal,
 			Help:      "Gauge of schema created in Service Center",
 		}, []string{"instance", "domain"})
@@ -66,12 +74,20 @@ var (
 	frameworkCounter = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
 			Namespace: metric.FamilyName,
-			Subsystem: "db",
+			Subsystem: SubSystem,
 			Name:      KeyFrameworkTotal,
 			Help:      "Gauge of client framework info in Service Center",
-		}, []string{"domainName", "projectName", "framework", "frameworkVersion"})
+		}, metric.ToLabelNames(Framework{}))
 )
 
+// Framework return framework info.
+type Framework struct {
+	DomainName       string `json:"domainName"`
+	ProjectName      string `json:"projectName"`
+	FrameWork        string `json:"framework"`
+	FrameworkVersion string `json:"frameworkVersion"`
+}
+
 func init() {
 	prometheus.MustRegister(domainCounter, serviceCounter, instanceCounter, schemaCounter, frameworkCounter)
 }