diff --git a/core/base/metric_item.go b/core/base/metric_item.go index a2ac248b9..1915d930e 100644 --- a/core/base/metric_item.go +++ b/core/base/metric_item.go @@ -13,12 +13,12 @@ const metricPartSeparator = "|" // MetricItem represents the data of metric log per line. type MetricItem struct { - Resource string - Classification int32 - Timestamp uint64 - + Resource string + Classification int32 + Timestamp uint64 PassQps uint64 BlockQps uint64 + MonitorBlockQps uint64 CompleteQps uint64 ErrorQps uint64 AvgRt uint64 @@ -35,10 +35,10 @@ func (m *MetricItem) ToFatString() (string, error) { timeStr := util.FormatTimeMillis(m.Timestamp) // All "|" in the resource name will be replaced with "_" finalName := strings.ReplaceAll(m.Resource, "|", "_") - _, err := fmt.Fprintf(&b, "%d|%s|%s|%d|%d|%d|%d|%d|%d|%d|%d", + _, err := fmt.Fprintf(&b, "%d|%s|%s|%d|%d|%d|%d|%d|%d|%d|%d|%d", m.Timestamp, timeStr, finalName, m.PassQps, m.BlockQps, m.CompleteQps, m.ErrorQps, m.AvgRt, - m.OccupiedPassQps, m.Concurrency, m.Classification) + m.OccupiedPassQps, m.Concurrency, m.Classification, m.MonitorBlockQps) if err != nil { return "", err } @@ -48,10 +48,10 @@ func (m *MetricItem) ToFatString() (string, error) { func (m *MetricItem) ToThinString() (string, error) { b := strings.Builder{} finalName := strings.ReplaceAll(m.Resource, "|", "_") - _, err := fmt.Fprintf(&b, "%d|%s|%d|%d|%d|%d|%d|%d|%d|%d", + _, err := fmt.Fprintf(&b, "%d|%s|%d|%d|%d|%d|%d|%d|%d|%d|%d", m.Timestamp, finalName, m.PassQps, m.BlockQps, m.CompleteQps, m.ErrorQps, m.AvgRt, - m.OccupiedPassQps, m.Concurrency, m.Classification) + m.OccupiedPassQps, m.Concurrency, m.Classification, m.MonitorBlockQps) if err != nil { return "", err } @@ -120,5 +120,12 @@ func MetricItemFromFatString(line string) (*MetricItem, error) { } item.Classification = int32(cl) } + if len(arr) >= 12 { + mb, err := strconv.ParseUint(arr[11], 10, 64) + if err != nil { + return nil, err + } + item.MonitorBlockQps = mb + } return item, nil } diff --git a/core/base/metric_item_test.go b/core/base/metric_item_test.go index 2b34c6028..7ec69ca9b 100644 --- a/core/base/metric_item_test.go +++ b/core/base/metric_item_test.go @@ -1,12 +1,13 @@ package base import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestMetricItemFromFatStringLegal(t *testing.T) { - line1 := "1564382218000|2019-07-29 14:36:58|/foo/*|4|9|3|0|25|0|2|1" + line1 := "1564382218000|2019-07-29 14:36:58|/foo/*|4|9|3|0|25|0|2|1|10" item1, err := MetricItemFromFatString(line1) assert.NoError(t, err) assert.Equal(t, uint64(1564382218000), item1.Timestamp) @@ -17,6 +18,7 @@ func TestMetricItemFromFatStringLegal(t *testing.T) { assert.Equal(t, uint64(25), item1.AvgRt) assert.Equal(t, "/foo/*", item1.Resource) assert.Equal(t, int32(1), item1.Classification) + assert.Equal(t, uint64(10), item1.MonitorBlockQps) } func TestMetricItemFromFatStringIllegal(t *testing.T) { diff --git a/core/stat/base/metric_bucket_test.go b/core/stat/base/metric_bucket_test.go index 3a60d50ab..c4ae1c027 100644 --- a/core/stat/base/metric_bucket_test.go +++ b/core/stat/base/metric_bucket_test.go @@ -1,17 +1,19 @@ package base import ( - "github.com/alibaba/sentinel-golang/core/base" + "fmt" "sync" "testing" "unsafe" + + "github.com/alibaba/sentinel-golang/core/base" ) func Test_metricBucket_MemSize(t *testing.T) { mb := NewMetricBucket() size := unsafe.Sizeof(*mb) - if size != 48 { - t.Error("unexpect memory size of MetricBucket") + if size != 56 { + t.Error(fmt.Sprintf("unexpect memory size of MetricBucket: %d", size)) } } diff --git a/core/stat/base/sliding_window_metric.go b/core/stat/base/sliding_window_metric.go index 0b2ddc958..997d002b7 100644 --- a/core/stat/base/sliding_window_metric.go +++ b/core/stat/base/sliding_window_metric.go @@ -2,9 +2,10 @@ package base import ( "fmt" + "sync/atomic" + "github.com/alibaba/sentinel-golang/core/base" "github.com/alibaba/sentinel-golang/util" - "sync/atomic" ) // SlidingWindowMetric represents the sliding window metric wrapper. @@ -215,6 +216,7 @@ func (m *SlidingWindowMetric) metricItemFromBuckets(ts uint64, ws []*bucketWrap) item.BlockQps += uint64(mb.Get(base.MetricEventBlock)) item.ErrorQps += uint64(mb.Get(base.MetricEventError)) item.CompleteQps += uint64(mb.Get(base.MetricEventComplete)) + item.MonitorBlockQps += uint64(mb.Get(base.MetricEventMonitorBlock)) allRt += mb.Get(base.MetricEventRt) } if item.CompleteQps > 0 { @@ -238,11 +240,12 @@ func (m *SlidingWindowMetric) metricItemFromBucket(w *bucketWrap) *base.MetricIt } completeQps := mb.Get(base.MetricEventComplete) item := &base.MetricItem{ - PassQps: uint64(mb.Get(base.MetricEventPass)), - BlockQps: uint64(mb.Get(base.MetricEventBlock)), - ErrorQps: uint64(mb.Get(base.MetricEventError)), - CompleteQps: uint64(completeQps), - Timestamp: w.bucketStart, + PassQps: uint64(mb.Get(base.MetricEventPass)), + BlockQps: uint64(mb.Get(base.MetricEventBlock)), + MonitorBlockQps: uint64(mb.Get(base.MetricEventMonitorBlock)), + ErrorQps: uint64(mb.Get(base.MetricEventError)), + CompleteQps: uint64(completeQps), + Timestamp: w.bucketStart, } if completeQps > 0 { item.AvgRt = uint64(mb.Get(base.MetricEventRt) / completeQps)