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