This is an automated email from the ASF dual-hosted git repository.
asifdxtreme 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 6285f2b SCB-1050 Metrics cache does not clean (#500)
6285f2b is described below
commit 6285f2bb9cb4b6ad7195dfaf931bfb0ba89561de
Author: little-cui <[email protected]>
AuthorDate: Wed Nov 28 17:31:51 2018 +0800
SCB-1050 Metrics cache does not clean (#500)
---
server/metric/calculator.go | 8 +++----
server/metric/gatherer.go | 6 +++++-
server/metric/metrics.go | 49 +++++++++++++++++++++----------------------
server/metric/metrics_test.go | 10 ++++-----
4 files changed, 38 insertions(+), 35 deletions(-)
diff --git a/server/metric/calculator.go b/server/metric/calculator.go
index 7f0a890..fea89dd 100644
--- a/server/metric/calculator.go
+++ b/server/metric/calculator.go
@@ -55,14 +55,14 @@ func (c *CommonCalculator) Calc(mf *dto.MetricFamily)
*Details {
func metricGaugeOf(details *Details, m []*dto.Metric) {
for _, d := range m {
details.Summary += d.GetGauge().GetValue()
- details.Put(d.GetLabel(), d.GetGauge().GetValue())
+ details.put(d.GetLabel(), d.GetGauge().GetValue())
}
}
func metricCounterOf(details *Details, m []*dto.Metric) {
for _, d := range m {
details.Summary += d.GetCounter().GetValue()
- details.Put(d.GetLabel(), d.GetCounter().GetValue())
+ details.put(d.GetLabel(), d.GetCounter().GetValue())
}
}
@@ -74,7 +74,7 @@ func metricSummaryOf(details *Details, m []*dto.Metric) {
for _, d := range m {
count += d.GetSummary().GetSampleCount()
sum += d.GetSummary().GetSampleSum()
- details.Put(d.GetLabel(),
d.GetSummary().GetSampleSum()/float64(d.GetSummary().GetSampleCount()))
+ details.put(d.GetLabel(),
d.GetSummary().GetSampleSum()/float64(d.GetSummary().GetSampleCount()))
}
if count == 0 {
@@ -92,7 +92,7 @@ func metricHistogramOf(details *Details, m []*dto.Metric) {
for _, d := range m {
count += d.GetHistogram().GetSampleCount()
sum += d.GetHistogram().GetSampleSum()
- details.Put(d.GetLabel(),
d.GetHistogram().GetSampleSum()/float64(d.GetHistogram().GetSampleCount()))
+ details.put(d.GetLabel(),
d.GetHistogram().GetSampleSum()/float64(d.GetHistogram().GetSampleCount()))
}
if count == 0 {
diff --git a/server/metric/gatherer.go b/server/metric/gatherer.go
index 52e2a59..48a1eed 100644
--- a/server/metric/gatherer.go
+++ b/server/metric/gatherer.go
@@ -26,6 +26,7 @@ import (
"time"
)
+// Gatherer is the reader of sc metrics
var Gatherer *MetricsGatherer
func init() {
@@ -83,13 +84,16 @@ func (mm *MetricsGatherer) Collect() error {
return err
}
+ records := NewMetrics()
for _, mf := range mfs {
name := mf.GetName()
if _, ok := SysMetrics.Get(name); strings.Index(name,
familyNamePrefix) == 0 || ok {
if d := Calculate(mf); d != nil {
- mm.Records.Put(strings.TrimPrefix(name,
familyNamePrefix), d)
+ records.put(strings.TrimPrefix(name,
familyNamePrefix), d)
}
}
}
+ // clean the old cache here
+ mm.Records = records
return nil
}
diff --git a/server/metric/metrics.go b/server/metric/metrics.go
index 738b813..4987d7c 100644
--- a/server/metric/metrics.go
+++ b/server/metric/metrics.go
@@ -18,20 +18,19 @@ package metric
import (
"github.com/apache/servicecomb-service-center/pkg/buffer"
- "github.com/apache/servicecomb-service-center/pkg/util"
dto "github.com/prometheus/client_model/go"
"strings"
)
func NewMetrics() *Metrics {
return &Metrics{
- mapper: util.NewConcurrentMap(0),
+ mapper: make(map[string]*Details),
}
}
func NewDetails() *Details {
return &Details{
- mapper: util.NewConcurrentMap(0),
+ mapper: make(map[string]float64),
buffer: buffer.NewPool(bufferSize),
}
}
@@ -41,7 +40,7 @@ type Details struct {
// Summary is the calculation results of the details
Summary float64
- mapper *util.ConcurrentMap
+ mapper map[string]float64
buffer *buffer.Pool
}
@@ -71,52 +70,52 @@ func (cm *Details) toLabels(key string) (p
[]*dto.LabelPair) {
}
func (cm *Details) Get(labels []*dto.LabelPair) (val float64) {
- if v, ok := cm.mapper.Get(cm.toKey(labels)); ok {
- val = v.(float64)
+ if v, ok := cm.mapper[cm.toKey(labels)]; ok {
+ val = v
}
return
}
-func (cm *Details) Put(labels []*dto.LabelPair, val float64) {
- cm.mapper.Put(cm.toKey(labels), val)
+func (cm *Details) put(labels []*dto.LabelPair, val float64) {
+ cm.mapper[cm.toKey(labels)] = val
return
}
func (cm *Details) ForEach(f func(labels []*dto.LabelPair, v float64) (next
bool)) {
- cm.mapper.ForEach(func(item util.MapItem) (next bool) {
- k, _ := item.Key.(string)
- v, _ := item.Value.(float64)
- return f(cm.toLabels(k), v)
- })
+ for k, v := range cm.mapper {
+ if !f(cm.toLabels(k), v) {
+ break
+ }
+ }
}
// Metrics is the struct to hold the Details objects store and index by metric
name
type Metrics struct {
- mapper *util.ConcurrentMap
+ mapper map[string]*Details
}
-func (cm *Metrics) Put(key string, val *Details) {
- cm.mapper.Put(key, val)
+func (cm *Metrics) put(key string, val *Details) {
+ cm.mapper[key] = val
}
func (cm *Metrics) Get(key string) (val *Details) {
- if v, ok := cm.mapper.Get(key); ok {
- val = v.(*Details)
+ if v, ok := cm.mapper[key]; ok {
+ val = v
}
return
}
func (cm *Metrics) ForEach(f func(k string, v *Details) (next bool)) {
- cm.mapper.ForEach(func(item util.MapItem) (next bool) {
- k, _ := item.Key.(string)
- v, _ := item.Value.(*Details)
- return f(k, v)
- })
+ for k, v := range cm.mapper {
+ if !f(k, v) {
+ break
+ }
+ }
}
func (cm *Metrics) Summary(key string) (sum float64) {
- if v, ok := cm.mapper.Get(key); ok {
- sum = v.(*Details).Summary
+ if v, ok := cm.mapper[key]; ok {
+ sum = v.Summary
}
return
}
diff --git a/server/metric/metrics_test.go b/server/metric/metrics_test.go
index 2f3b4b1..2720369 100644
--- a/server/metric/metrics_test.go
+++ b/server/metric/metrics_test.go
@@ -28,16 +28,16 @@ func TestDetails_ForEach(t *testing.T) {
t.Fatalf("TestDetails_ForEach failed")
return true
})
- d.Put([]*dto.LabelPair{{Name: &n, Value: &v}, {Name: &n, Value: &v}}, 1)
+ d.put([]*dto.LabelPair{{Name: &n, Value: &v}, {Name: &n, Value: &v}}, 1)
d.ForEach(func(labels []*dto.LabelPair, v float64) (next bool) {
if len(labels) != 2 || v != 1 {
t.Fatalf("TestDetails_ForEach failed")
}
return true
})
- d.Put([]*dto.LabelPair{{}}, 3)
- d.Put([]*dto.LabelPair{{}}, 4)
- d.Put(nil, 2)
+ d.put([]*dto.LabelPair{{}}, 3)
+ d.put([]*dto.LabelPair{{}}, 4)
+ d.put(nil, 2)
l := 0
d.ForEach(func(labels []*dto.LabelPair, v float64) (next bool) {
switch {
@@ -78,7 +78,7 @@ func TestDetails_ForEach(t *testing.T) {
if find {
t.Fatalf("TestMetrics_ForEach failed")
}
- ms.Put("a", d)
+ ms.put("a", d)
if ms.Summary("a") != 0 {
t.Fatalf("TestMetrics_Summary failed")
}