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

Reply via email to